<?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>176271</bug_id>
          
          <creation_ts>2017-09-02 00:36:27 -0700</creation_ts>
          <short_desc>Move Web Process part of the Remote Layer Tree code out of a Mac-specific directory</short_desc>
          <delta_ts>2017-09-27 12:41:00 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>173644</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Tim Horton">thorton</reporter>
          <assigned_to name="Tim Horton">thorton</assigned_to>
          <cc>buildbot</cc>
    
    <cc>commit-queue</cc>
    
    <cc>mitz</cc>
    
    <cc>mkwst</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1344758</commentid>
    <comment_count>0</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2017-09-02 00:36:27 -0700</bug_when>
    <thetext>Move Web Process part of the Remote Layer Tree code out of a Mac-specific directory</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1344759</commentid>
    <comment_count>1</comment_count>
      <attachid>319699</attachid>
    <who name="Tim Horton">thorton</who>
    <bug_when>2017-09-02 00:38:10 -0700</bug_when>
    <thetext>Created attachment 319699
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1344760</commentid>
    <comment_count>2</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-09-02 00:40:23 -0700</bug_when>
    <thetext>Attachment 319699 did not pass style-queue:


ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/PlatformCALayerRemoteCustom.mm:114:  No space between ^ and block definition.  [whitespace/brackets] [4]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/PlatformCALayerRemoteTiledBacking.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/PlatformCALayerRemote.h:198:  The parameter name &quot;context&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/PlatformCAAnimationRemote.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/RemoteLayerTreeContext.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/RemoteScrollingCoordinator.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/GraphicsLayerCARemote.cpp:27:  You should add a blank line after implementation file&apos;s own header.  [build/include_order] [4]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/PlatformCALayerRemote.cpp:280:  &apos;layerProtector&apos; is incorrectly named. It should be named &apos;protector&apos; or &apos;protectedLayer&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/PlatformCALayerRemote.cpp:290:  &apos;layerProtector&apos; is incorrectly named. It should be named &apos;protector&apos; or &apos;protectedLayer&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/PlatformCALayerRemote.cpp:301:  &apos;layerProtector&apos; is incorrectly named. It should be named &apos;protector&apos; or &apos;protectedLayer&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/PlatformCAAnimationRemote.mm:603:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/PlatformCAAnimationRemote.mm:617:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/PlatformCAAnimationRemote.mm:631:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/PlatformCAAnimationRemote.mm:647:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/RemoteScrollingCoordinator.mm:39:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/RemoteScrollingCoordinator.mm:40:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/WebKit/WebProcess/WebPage/Cocoa/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm:349:  &apos;retainedPage&apos; is incorrectly named. It should be named &apos;protector&apos; or &apos;protectedWebPage&apos;.  [readability/naming/protected] [4]
Total errors found: 17 in 21 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1344761</commentid>
    <comment_count>3</comment_count>
      <attachid>319699</attachid>
    <who name="">mitz</who>
    <bug_when>2017-09-02 00:40:48 -0700</bug_when>
    <thetext>Comment on attachment 319699
Patch

rs=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1344769</commentid>
    <comment_count>4</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2017-09-02 01:06:11 -0700</bug_when>
    <thetext>Anyone have thoughts about moving to WebProcess/WebPage/RemoteLayerTree instead? That would make it easier to parallel the UI process patch, which has platform-specific things in it (so then you can have UIProcess/RemoteLayerTree/ios instead of UIProcess/ios/RemoteLayerTree in addition to UIProcess/RemoteLayerTree -- locality is better in the former).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1344773</commentid>
    <comment_count>5</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2017-09-02 01:10:19 -0700</bug_when>
    <thetext>Weird, builds for me, but it ought not.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1344777</commentid>
    <comment_count>6</comment_count>
      <attachid>319706</attachid>
    <who name="Tim Horton">thorton</who>
    <bug_when>2017-09-02 01:17:20 -0700</bug_when>
    <thetext>Created attachment 319706
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1344779</commentid>
    <comment_count>7</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-09-02 01:19:55 -0700</bug_when>
    <thetext>Attachment 319706 did not pass style-queue:


ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/GraphicsLayerCARemote.cpp:27:  You should add a blank line after implementation file&apos;s own header.  [build/include_order] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCAAnimationRemote.mm:603:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCAAnimationRemote.mm:617:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCAAnimationRemote.mm:631:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCAAnimationRemote.mm:647:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.h:198:  The parameter name &quot;context&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCAAnimationRemote.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeContext.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemoteCustom.mm:114:  No space between ^ and block definition.  [whitespace/brackets] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.cpp:280:  &apos;layerProtector&apos; is incorrectly named. It should be named &apos;protector&apos; or &apos;protectedLayer&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.cpp:290:  &apos;layerProtector&apos; is incorrectly named. It should be named &apos;protector&apos; or &apos;protectedLayer&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.cpp:301:  &apos;layerProtector&apos; is incorrectly named. It should be named &apos;protector&apos; or &apos;protectedLayer&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm:349:  &apos;retainedPage&apos; is incorrectly named. It should be named &apos;protector&apos; or &apos;protectedWebPage&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteScrollingCoordinator.mm:39:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteScrollingCoordinator.mm:40:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemoteTiledBacking.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteScrollingCoordinator.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
Total errors found: 17 in 23 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1344785</commentid>
    <comment_count>8</comment_count>
      <attachid>319710</attachid>
    <who name="Tim Horton">thorton</who>
    <bug_when>2017-09-02 01:41:26 -0700</bug_when>
    <thetext>Created attachment 319710
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1344788</commentid>
    <comment_count>9</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-09-02 01:44:26 -0700</bug_when>
    <thetext>Attachment 319710 did not pass style-queue:


ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/GraphicsLayerCARemote.cpp:27:  You should add a blank line after implementation file&apos;s own header.  [build/include_order] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCAAnimationRemote.mm:603:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCAAnimationRemote.mm:617:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCAAnimationRemote.mm:631:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCAAnimationRemote.mm:647:  Multi line control clauses should use braces.  [whitespace/braces] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.h:198:  The parameter name &quot;context&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCAAnimationRemote.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeContext.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemoteCustom.mm:114:  No space between ^ and block definition.  [whitespace/brackets] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.cpp:280:  &apos;layerProtector&apos; is incorrectly named. It should be named &apos;protector&apos; or &apos;protectedLayer&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.cpp:290:  &apos;layerProtector&apos; is incorrectly named. It should be named &apos;protector&apos; or &apos;protectedLayer&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemote.cpp:301:  &apos;layerProtector&apos; is incorrectly named. It should be named &apos;protector&apos; or &apos;protectedLayer&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteLayerTreeDrawingArea.mm:349:  &apos;retainedPage&apos; is incorrectly named. It should be named &apos;protector&apos; or &apos;protectedWebPage&apos;.  [readability/naming/protected] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteScrollingCoordinator.mm:39:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteScrollingCoordinator.mm:40:  Alphabetical sorting problem.  [build/include_order] [4]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/PlatformCALayerRemoteTiledBacking.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
ERROR: Source/WebKit/WebProcess/WebPage/RemoteLayerTree/RemoteScrollingCoordinator.h:26:  Use #pragma once instead of #ifndef for header guard.  [build/header_guard] [5]
Total errors found: 17 in 23 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1344789</commentid>
    <comment_count>10</comment_count>
      <attachid>319710</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-09-02 02:38:17 -0700</bug_when>
    <thetext>Comment on attachment 319710
Patch

Clearing flags on attachment: 319710

Committed r221536: &lt;http://trac.webkit.org/changeset/221536&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1344790</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-09-02 02:38:19 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1345521</commentid>
    <comment_count>12</comment_count>
      <attachid>319710</attachid>
    <who name="Simon Fraser (smfr)">simon.fraser</who>
    <bug_when>2017-09-05 11:02:55 -0700</bug_when>
    <thetext>Comment on attachment 319710
Patch

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

&gt; Source/WebKit/ChangeLog:15
&gt; +        * WebProcess/WebPage/RemoteLayerTree/GraphicsLayerCARemote.cpp: Renamed from WebProcess/WebPage/mac/GraphicsLayerCARemote.cpp.

The WebPage directory doesn&apos;t really make any sense. Would it be better to parallel WebCore platform/ and do something like WebProcess/graphics/, WebProcess/scrolling/ ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1345523</commentid>
    <comment_count>13</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2017-09-05 11:08:58 -0700</bug_when>
    <thetext>(In reply to Simon Fraser (smfr) from comment #12)
&gt; Comment on attachment 319710 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=319710&amp;action=review
&gt; 
&gt; &gt; Source/WebKit/ChangeLog:15
&gt; &gt; +        * WebProcess/WebPage/RemoteLayerTree/GraphicsLayerCARemote.cpp: Renamed from WebProcess/WebPage/mac/GraphicsLayerCARemote.cpp.
&gt; 
&gt; The WebPage directory doesn&apos;t really make any sense. Would it be better to
&gt; parallel WebCore platform/ and do something like WebProcess/graphics/,
&gt; WebProcess/scrolling/ ?

The UI process and Shared directories have a lot of stuff directly in them, so maybe that is the place to go (just move up one level)... I&apos;m not sure why historically stuff has gotten stuck inside WebProcess/WebPage/... in this patch I left it there because e.g. DrawingArea itself is in WebProcess/WebPage, and it didn&apos;t seem to make sense to move a DrawingArea subclass to a directory above the base class.

We could follow WebCore... would we then fold e.g. the CoordinatedGraphics directory into WebProcess/graphics?

(Mostly the motivation here was to get it out of mac/, but we can do more cleanup!)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1353592</commentid>
    <comment_count>14</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2017-09-27 12:41:00 -0700</bug_when>
    <thetext>&lt;rdar://problem/34693744&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319699</attachid>
            <date>2017-09-02 00:38:10 -0700</date>
            <delta_ts>2017-09-02 01:17:19 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-176271-20170902003809.patch</filename>
            <type>text/plain</type>
            <size>329778</size>
            <attacher name="Tim Horton">thorton</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjIxNTE0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDIxMDE0YmM0N2FjNjEwZWNj
OTNhNTM3YzQ4OWRhZGRmODQ0ZTA4MmIuLmFhYmE3NjBjNzBjNGZlYmJlMTZjOTc3YTdkOWE4MjJj
ZWIwNTY5OTUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzUgQEAKKzIwMTctMDktMDIgIFRpbSBIb3J0
b24gIDx0aW1vdGh5X2hvcnRvbkBhcHBsZS5jb20+CisKKyAgICAgICAgTW92ZSBXZWIgUHJvY2Vz
cyBwYXJ0IG9mIHRoZSBSZW1vdGUgTGF5ZXIgVHJlZSBjb2RlIG91dCBvZiBhIE1hYy1zcGVjaWZp
YyBkaXJlY3RvcnkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE3NjI3MQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFVJLXNpZGUgY29tcG9zaXRpbmcgd29ya3Mgb24gYWxsIENvY29hIHBsYXRmb3Jtcywgc28g
dGhlIGNvZGUgc2hvdWxkCisgICAgICAgIGxpdmUgaW5zaWRlIENvY29hLywgbm90IE1hYy8uIEFs
c28gbWVyZ2UgdGhlIFNjcm9sbGluZyBkaXJlY3RvcnkgaW4gaGVyZSwKKyAgICAgICAgc2luY2Ug
dGhvc2UgZmlsZXMgYXJlIHZlcnkgcmVsYXRlZC4KKworICAgICAgICAqIFdlYktpdC54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9S
ZW1vdGVMYXllclRyZWUvR3JhcGhpY3NMYXllckNBUmVtb3RlLmNwcDogUmVuYW1lZCBmcm9tIFdl
YlByb2Nlc3MvV2ViUGFnZS9tYWMvR3JhcGhpY3NMYXllckNBUmVtb3RlLmNwcC4KKyAgICAgICAg
KiBXZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlL0dyYXBoaWNzTGF5ZXJD
QVJlbW90ZS5oOiBSZW5hbWVkIGZyb20gV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9HcmFwaGljc0xh
eWVyQ0FSZW1vdGUuaC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3Rl
TGF5ZXJUcmVlL1BsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUuaDogUmVuYW1lZCBmcm9tIFdlYlBy
b2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5oLgorICAgICAgICAq
IFdlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUFuaW1h
dGlvblJlbW90ZS5tbTogUmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZv
cm1DQUFuaW1hdGlvblJlbW90ZS5tbS4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvQ29j
b2EvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5jcHA6IFJlbmFtZWQgZnJv
bSBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5jcHAuCisgICAg
ICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNB
TGF5ZXJSZW1vdGUuaDogUmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZv
cm1DQUxheWVyUmVtb3RlLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1Jl
bW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20uaDogUmVuYW1lZCBmcm9t
IFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tLmguCisg
ICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVDdXN0b20ubW06IFJlbmFtZWQgZnJvbSBXZWJQcm9jZXNzL1dlYlBhZ2Uv
bWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5tbS4KKyAgICAgICAgKiBXZWJQcm9jZXNz
L1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVk
QmFja2luZy5jcHA6IFJlbmFtZWQgZnJvbSBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3Jt
Q0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5jcHAuCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQ
YWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tp
bmcuaDogUmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVy
UmVtb3RlVGlsZWRCYWNraW5nLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29h
L1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVDb250ZXh0Lmg6IFJlbmFtZWQgZnJvbSBX
ZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1JlbW90ZUxheWVyVHJlZUNvbnRleHQuaC4KKyAgICAgICAg
KiBXZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJl
ZUNvbnRleHQubW06IFJlbmFtZWQgZnJvbSBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1JlbW90ZUxh
eWVyVHJlZUNvbnRleHQubW0uCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1Jl
bW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IuaDogUmVu
YW1lZCBmcm9tIFdlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWVEaXNwbGF5
UmVmcmVzaE1vbml0b3IuaC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVt
b3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5tbTogUmVu
YW1lZCBmcm9tIFdlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWVEaXNwbGF5
UmVmcmVzaE1vbml0b3IubW0uCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1Jl
bW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5oOiBSZW5hbWVkIGZyb20g
V2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5oLgorICAg
ICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5
ZXJUcmVlRHJhd2luZ0FyZWEubW06IFJlbmFtZWQgZnJvbSBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFj
L1JlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhLm1tLgorICAgICAgICAqIFdlYlByb2Nlc3MvV2Vi
UGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaDog
UmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5h
dG9yLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJl
ZS9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdlcy5pbjogUmVuYW1lZCBmcm9tIFdl
YlByb2Nlc3MvU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1lc3NhZ2VzLmlu
LgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUmVt
b3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubW06IFJlbmFtZWQgZnJvbSBXZWJQcm9jZXNzL1Njcm9s
bGluZy9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tbS4KKwogMjAxNy0wOS0wMiAgQ2FybG9z
IEdhcmNpYSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5jb20+CiAKICAgICAgICAgW0dUS11bV2F5
bGFuZF0gT3BlbmluZyBGZWRvcmFQcm9qZWN0J3MgcGFzdGViaW4gY2hld3MgQ1BVCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L1dlYktpdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvU291
cmNlL1dlYktpdC9XZWJLaXQueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagppbmRleCBhZWJjNDc2
YjBjYzcwNDM3ZmM0OThjNDllMjUxYWI5YjhjYTc3OTU5Li5lMmQwOWEyYjMwMTU1MTYwZjc3NzVh
YzRlYmI5ODA4MDhhYmE2Yjc2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYktpdC54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViS2l0Lnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oKQEAgLTIyNzcsOSArMjI3Nyw5IEBACiAJCTBGMTc0QUE2MTQyQUFD
NjEwMDM5MjUwRiAvKiBXS0dlb21ldHJ5LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IFdLR2VvbWV0cnkuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkw
RjNDNzI1NzE5NkY1RjUwMDBBRUREMEMgLyogV0tJbnNwZWN0b3JIaWdobGlnaHRWaWV3Lm1tICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gV0tJbnNwZWN0b3JIaWdobGln
aHRWaWV3Lm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQkwRjNDNzI1OTE5NkY1RjY4
MDBBRUREMEMgLyogV0tJbnNwZWN0b3JIaWdobGlnaHRWaWV3LmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgcGF0aCA9IFdLSW5zcGVjdG9ySGlnaGxpZ2h0Vmlldy5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwotCQkwRjU5NDc4RDE4N0IzQjNBMDA0Mzc4NTcgLyogUmVtb3RlU2Nyb2xs
aW5nQ29vcmRpbmF0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gUmVtb3Rl
U2Nyb2xsaW5nQ29vcmRpbmF0b3IuaDsgcGF0aCA9IFNjcm9sbGluZy9SZW1vdGVTY3JvbGxpbmdD
b29yZGluYXRvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQkwRjU5NDc4RTE4N0Iz
QjNBMDA0Mzc4NTcgLyogUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMuaW4gKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSB0ZXh0OyBuYW1lID0gUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMu
aW47IHBhdGggPSBTY3JvbGxpbmcvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMu
aW47IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTBGNTk0NzhGMTg3QjNCM0EwMDQzNzg1
NyAvKiBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLm9iamNwcDsgbmFtZSA9IFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1tOyBwYXRoID0g
U2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1tOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQkwRjU5NDc4RDE4N0IzQjNBMDA0Mzc4NTcgLyogUmVtb3RlU2Nyb2xsaW5n
Q29vcmRpbmF0b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVtb3RlU2Ny
b2xsaW5nQ29vcmRpbmF0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJMEY1OTQ3
OEUxODdCM0IzQTAwNDM3ODU3IC8qIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1lc3NhZ2Vz
LmluICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gdGV4dDsgcGF0aCA9IFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1l
c3NhZ2VzLmluOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRjU5NDc4RjE4N0IzQjNB
MDA0Mzc4NTcgLyogUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubW0gKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tbTsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY1OTQ3OTQxODdCM0I2MDAwNDM3ODU3IC8q
IFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yUHJveHkuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBuYW1lID0gUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JQcm94eS5jcHA7IHBh
dGggPSBTY3JvbGxpbmcvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JQcm94eS5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGNTk0Nzk1MTg3QjNCNjAwMDQzNzg1NyAvKiBSZW1v
dGVTY3JvbGxpbmdDb29yZGluYXRvclByb3h5LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
bmFtZSA9IFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yUHJveHkuaDsgcGF0aCA9IFNjcm9sbGlu
Zy9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvclByb3h5Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCTBGNTk0Nzk2MTg3QjNCNjAwMDQzNzg1NyAvKiBSZW1vdGVTY3JvbGxpbmdUcmVl
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IFJlbW90ZVNjcm9sbGlu
Z1RyZWUuY3BwOyBwYXRoID0gU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ1RyZWUuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtNDYzMSwxNiArNDYzMSw2IEBACiAJCQl0YWJXaWR0
aCA9IDg7CiAJCQl1c2VzVGFicyA9IDA7CiAJCX07Ci0JCTBGNTk0NzhDMTg3QjNCMkEwMDQzNzg1
NyAvKiBTY3JvbGxpbmcgKi8gPSB7Ci0JCQlpc2EgPSBQQlhHcm91cDsKLQkJCWNoaWxkcmVuID0g
KAotCQkJCTBGNTk0NzhEMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1vdGVTY3JvbGxpbmdDb29yZGlu
YXRvci5oICovLAotCQkJCTBGNTk0NzhFMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1vdGVTY3JvbGxp
bmdDb29yZGluYXRvci5tZXNzYWdlcy5pbiAqLywKLQkJCQkwRjU5NDc4RjE4N0IzQjNBMDA0Mzc4
NTcgLyogUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubW0gKi8sCi0JCQkpOwotCQkJbmFtZSA9
IFNjcm9sbGluZzsKLQkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7Ci0JCX07CiAJCTBGNTk0Nzkz
MTg3QjNCNEMwMDQzNzg1NyAvKiBTY3JvbGxpbmcgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsK
IAkJCWNoaWxkcmVuID0gKApAQCAtNTQzMyw2ICs1NDIzLDMyIEBACiAJCQluYW1lID0gQ3VzdG9t
UHJvdG9jb2xzOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKIAkJfTsKKwkJMkQxNTUxQTgx
RjVBOTUyMjAwMDZFM0ZFIC8qIFJlbW90ZUxheWVyVHJlZSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdy
b3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJMkRBMDQ5QjUxODBDQ0QwQTAwQUFGQTlFIC8qIEdy
YXBoaWNzTGF5ZXJDQVJlbW90ZS5jcHAgKi8sCisJCQkJMkRBMDQ5QjYxODBDQ0QwQTAwQUFGQTlF
IC8qIEdyYXBoaWNzTGF5ZXJDQVJlbW90ZS5oICovLAorCQkJCTBGNUUyMDAyMThFNzcwNTEwMDNF
QzNFNSAvKiBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLmggKi8sCisJCQkJMEY1RTIwMDExOEU3
NzA1MTAwM0VDM0U1IC8qIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUubW0gKi8sCisJCQkJMkRB
MDQ5QjExODBDQ0NEMzAwQUFGQTlFIC8qIFBsYXRmb3JtQ0FMYXllclJlbW90ZS5jcHAgKi8sCisJ
CQkJMkRBMDQ5QjIxODBDQ0NEMzAwQUFGQTlFIC8qIFBsYXRmb3JtQ0FMYXllclJlbW90ZS5oICov
LAorCQkJCTJEODcxMDE1MTgyODQxNUQwMDE4RkEwMSAvKiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVD
dXN0b20uaCAqLywKKwkJCQkyRDg3MTAxNDE4Mjg0MTVEMDAxOEZBMDEgLyogUGxhdGZvcm1DQUxh
eWVyUmVtb3RlQ3VzdG9tLm1tICovLAorCQkJCTJEODk0OUVFMTgyMDQ0RjYwMEU4OThBQSAvKiBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuY3BwICovLAorCQkJCTJEODk0OUVGMTgy
MDQ0RjYwMEU4OThBQSAvKiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuaCAqLywK
KwkJCQkxQUIxNkFFODE2NEIzQTg4MDAyOTBENjIgLyogUmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5o
ICovLAorCQkJCTFBQjE2QUU3MTY0QjNBODgwMDI5MEQ2MiAvKiBSZW1vdGVMYXllclRyZWVDb250
ZXh0Lm1tICovLAorCQkJCTJEMjlFQ0NFMTkyRjJDMkUwMDk4NEI3OCAvKiBSZW1vdGVMYXllclRy
ZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IuaCAqLywKKwkJCQkyRDI5RUNDRjE5MkYyQzJFMDA5ODRC
NzggLyogUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yLm1tICovLAorCQkJCTFB
QjE2QURDMTY0ODU5ODQwMDI5MEQ2MiAvKiBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5oICov
LAorCQkJCTFBQjE2QURCMTY0ODU5ODQwMDI5MEQ2MiAvKiBSZW1vdGVMYXllclRyZWVEcmF3aW5n
QXJlYS5tbSAqLywKKwkJCQkwRjU5NDc4RDE4N0IzQjNBMDA0Mzc4NTcgLyogUmVtb3RlU2Nyb2xs
aW5nQ29vcmRpbmF0b3IuaCAqLywKKwkJCQkwRjU5NDc4RTE4N0IzQjNBMDA0Mzc4NTcgLyogUmVt
b3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMuaW4gKi8sCisJCQkJMEY1OTQ3OEYxODdC
M0IzQTAwNDM3ODU3IC8qIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1tICovLAorCQkJKTsK
KwkJCXBhdGggPSBSZW1vdGVMYXllclRyZWU7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwor
CQl9OwogCQkyRDI4RjNERjE4ODVDQ0I0MDA0QjlFQUUgLyogaW9zICovID0gewogCQkJaXNhID0g
UEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKQEAgLTU0NDgsOCArNTQ2NCw3IEBACiAJCTJEMjlF
Q0NEMTkyRjJDMkUwMDk4NEI3OCAvKiBDb2NvYSAqLyA9IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwog
CQkJY2hpbGRyZW4gPSAoCi0JCQkJMkQyOUVDQ0UxOTJGMkMyRTAwOTg0Qjc4IC8qIFJlbW90ZUxh
eWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5oICovLAotCQkJCTJEMjlFQ0NGMTkyRjJDMkUw
MDk4NEI3OCAvKiBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IubW0gKi8sCisJ
CQkJMkQxNTUxQTgxRjVBOTUyMjAwMDZFM0ZFIC8qIFJlbW90ZUxheWVyVHJlZSAqLywKIAkJCQky
REM0Q0Y3QTFEMkRFMjRCMDBFQ0NDOTQgLyogV2ViUGFnZUNvY29hLm1tICovLAogCQkJKTsKIAkJ
CXBhdGggPSBDb2NvYTsKQEAgLTY2OTEsNyArNjcwNiw2IEBACiAJCQkJNTEwNUIwRDIxNjJGN0E1
RTAwRTI3NzA5IC8qIE5ldHdvcmsgKi8sCiAJCQkJMzEwOTk5NzQxNDZDOEFBODAwMjlERUI5IC8q
IE5vdGlmaWNhdGlvbnMgKFVzZXIpICovLAogCQkJCTFBNkZCN0FBMTFFNjRCNDkwMERCMTM3MSAv
KiBQbHVnaW5zICovLAotCQkJCTBGNTk0NzhDMTg3QjNCMkEwMDQzNzg1NyAvKiBTY3JvbGxpbmcg
Ki8sCiAJCQkJNTExOEU5OTgxRjI5NTI1OTAwM0VGOUY1IC8qIFN0b3JhZ2UgKi8sCiAJCQkJMUFB
RjA4QUExOTI2OTMwQjAwQjYzOTBDIC8qIFVzZXJDb250ZW50ICovLAogCQkJCUJDMDMyRDVEMTBG
NDM3MjIwMDU4QzE1QSAvKiBXZWJDb3JlU3VwcG9ydCAqLywKQEAgLTc2MTAsMjEgKzc2MjQsNyBA
QAogCQlCQzk2M0Q2QzExM0REMTk1MDA1NzRCRTIgLyogbWFjICovID0gewogCQkJaXNhID0gUEJY
R3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKLQkJCQkyREEwNDlCNTE4MENDRDBBMDBBQUZBOUUgLyog
R3JhcGhpY3NMYXllckNBUmVtb3RlLmNwcCAqLywKLQkJCQkyREEwNDlCNjE4MENDRDBBMDBBQUZB
OUUgLyogR3JhcGhpY3NMYXllckNBUmVtb3RlLmggKi8sCiAJCQkJN0M2RDM3RkExNzJGNTU1RjAw
OUQyODQ3IC8qIFBhZ2VCYW5uZXJNYWMubW0gKi8sCi0JCQkJMEY1RTIwMDIxOEU3NzA1MTAwM0VD
M0U1IC8qIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUuaCAqLywKLQkJCQkwRjVFMjAwMTE4RTc3
MDUxMDAzRUMzRTUgLyogUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5tbSAqLywKLQkJCQkyREEw
NDlCMTE4MENDQ0QzMDBBQUZBOUUgLyogUGxhdGZvcm1DQUxheWVyUmVtb3RlLmNwcCAqLywKLQkJ
CQkyREEwNDlCMjE4MENDQ0QzMDBBQUZBOUUgLyogUGxhdGZvcm1DQUxheWVyUmVtb3RlLmggKi8s
Ci0JCQkJMkQ4NzEwMTUxODI4NDE1RDAwMThGQTAxIC8qIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1
c3RvbS5oICovLAotCQkJCTJEODcxMDE0MTgyODQxNUQwMDE4RkEwMSAvKiBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGVDdXN0b20ubW0gKi8sCi0JCQkJMkQ4OTQ5RUUxODIwNDRGNjAwRTg5OEFBIC8qIFBs
YXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5jcHAgKi8sCi0JCQkJMkQ4OTQ5RUYxODIw
NDRGNjAwRTg5OEFBIC8qIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5oICovLAot
CQkJCTFBQjE2QUU4MTY0QjNBODgwMDI5MEQ2MiAvKiBSZW1vdGVMYXllclRyZWVDb250ZXh0Lmgg
Ki8sCi0JCQkJMUFCMTZBRTcxNjRCM0E4ODAwMjkwRDYyIC8qIFJlbW90ZUxheWVyVHJlZUNvbnRl
eHQubW0gKi8sCi0JCQkJMUFCMTZBREMxNjQ4NTk4NDAwMjkwRDYyIC8qIFJlbW90ZUxheWVyVHJl
ZURyYXdpbmdBcmVhLmggKi8sCi0JCQkJMUFCMTZBREIxNjQ4NTk4NDAwMjkwRDYyIC8qIFJlbW90
ZUxheWVyVHJlZURyYXdpbmdBcmVhLm1tICovLAogCQkJCTFBQUYyNjM3MTQ2ODdDMzkwMDRBMUU4
QSAvKiBUaWxlZENvcmVBbmltYXRpb25EcmF3aW5nQXJlYS5oICovLAogCQkJCTFBQUYyNjM2MTQ2
ODdDMzkwMDRBMUU4QSAvKiBUaWxlZENvcmVBbmltYXRpb25EcmF3aW5nQXJlYS5tbSAqLywKIAkJ
CQkxQzhFMkRBRDEyNzhDNUIyMDBCQzdCRDAgLyogV2ViSW5zcGVjdG9yVUlNYWMubW0gKi8sCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU2Nyb2xsaW5nL1JlbW90ZVNjcm9s
bGluZ0Nvb3JkaW5hdG9yLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU2Nyb2xsaW5nL1Jl
bW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IGNmNWRjZWQzYjRjNzQyYmIwOTM2Y2YzZThlM2JlYzQzZDJkMjAxNzEuLjAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNz
L1Njcm9sbGluZy9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5oCisrKyAvZGV2L251bGwKQEAg
LTEsODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICog
YXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBSZW1vdGVTY3JvbGxpbmdD
b29yZGluYXRvcl9oCi0jZGVmaW5lIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yX2gKLQotI2lm
IEVOQUJMRShBU1lOQ19TQ1JPTExJTkcpCi0KLSNpbmNsdWRlICJNZXNzYWdlUmVjZWl2ZXIuaCIK
LSNpbmNsdWRlIDxXZWJDb3JlL0FzeW5jU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaD4KLSNpbmNsdWRl
IDxXZWJDb3JlL1Njcm9sbFR5cGVzLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9TY3JvbGxpbmdDb25z
dHJhaW50cy5oPgotI2luY2x1ZGUgPFdlYkNvcmUvVGltZXIuaD4KLQotbmFtZXNwYWNlIElQQyB7
Ci1jbGFzcyBEZWNvZGVyOwotY2xhc3MgRW5jb2RlcjsKLX0KLQotbmFtZXNwYWNlIFdlYktpdCB7
Ci0KLWNsYXNzIFdlYlBhZ2U7Ci1jbGFzcyBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvclRyYW5z
YWN0aW9uOwotCi1jbGFzcyBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvciA6IHB1YmxpYyBXZWJD
b3JlOjpBc3luY1Njcm9sbGluZ0Nvb3JkaW5hdG9yLCBwdWJsaWMgSVBDOjpNZXNzYWdlUmVjZWl2
ZXIgewotcHVibGljOgotICAgIHN0YXRpYyBSZWY8UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I+
IGNyZWF0ZShXZWJQYWdlKiBwYWdlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpu
ZXcgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IocGFnZSkpOwotICAgIH0KLQotICAgIHZvaWQg
YnVpbGRUcmFuc2FjdGlvbihSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvclRyYW5zYWN0aW9uJik7
Ci0KLXByaXZhdGU6Ci0gICAgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IoV2ViUGFnZSopOwot
ICAgIHZpcnR1YWwgflJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yKCk7Ci0KLSAgICBib29sIGlz
UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVl
OyB9Ci0gICAgCi0gICAgLy8gU2Nyb2xsaW5nQ29vcmRpbmF0b3IKLSAgICBib29sIGNvb3JkaW5h
dGVzU2Nyb2xsaW5nRm9yRnJhbWVWaWV3KGNvbnN0IFdlYkNvcmU6OkZyYW1lVmlldyYpIGNvbnN0
IG92ZXJyaWRlOwotICAgIHZvaWQgc2NoZWR1bGVUcmVlU3RhdGVDb21taXQoKSBvdmVycmlkZTsK
LQotICAgIGJvb2wgaXNSdWJiZXJCYW5kSW5Qcm9ncmVzcygpIGNvbnN0IG92ZXJyaWRlOwotICAg
IHZvaWQgc2V0U2Nyb2xsUGlubmluZ0JlaGF2aW9yKFdlYkNvcmU6OlNjcm9sbFBpbm5pbmdCZWhh
dmlvcikgb3ZlcnJpZGU7Ci0gICAgYm9vbCBpc1Njcm9sbFNuYXBJblByb2dyZXNzKCkgY29uc3Qg
b3ZlcnJpZGU7Ci0KLSAgICAvLyBJUEM6Ok1lc3NhZ2VSZWNlaXZlcgotICAgIHZvaWQgZGlkUmVj
ZWl2ZU1lc3NhZ2UoSVBDOjpDb25uZWN0aW9uJiwgSVBDOjpEZWNvZGVyJikgb3ZlcnJpZGU7Ci0g
ICAgCi0gICAgLy8gUmVzcG9uZCB0byBVSSBwcm9jZXNzIGNoYW5nZXMuCi0gICAgdm9pZCBzY3Jv
bGxQb3NpdGlvbkNoYW5nZWRGb3JOb2RlKFdlYkNvcmU6OlNjcm9sbGluZ05vZGVJRCwgY29uc3Qg
V2ViQ29yZTo6RmxvYXRQb2ludCYgc2Nyb2xsUG9zaXRpb24sIGJvb2wgc3luY0xheWVyUG9zaXRp
b24pOwotICAgIHZvaWQgY3VycmVudFNuYXBQb2ludEluZGljZXNDaGFuZ2VkRm9yTm9kZShXZWJD
b3JlOjpTY3JvbGxpbmdOb2RlSUQsIHVuc2lnbmVkIGhvcml6b250YWwsIHVuc2lnbmVkIHZlcnRp
Y2FsKTsKLQotICAgIFdlYlBhZ2UqIG1fd2ViUGFnZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdl
YktpdAotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX1NDUk9MTElOR19DT09SRElOQVRPUihXZWJL
aXQ6OlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLCBpc1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5h
dG9yKCkpOwotCi0jZW5kaWYgLy8gRU5BQkxFKEFTWU5DX1NDUk9MTElORykKLQotI2VuZGlmIC8v
IFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9TY3JvbGxpbmcvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMu
aW4gYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nv
b3JkaW5hdG9yLm1lc3NhZ2VzLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzA5
OGExMDk3MDIzNjdjMzgzMzcxZTg4ZTVhNzYxZDQ1ZTE5OWFkLi4wMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TY3Jv
bGxpbmcvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMuaW4KKysrIC9kZXYvbnVs
bApAQCAtMSwzMCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotIyBhcmUg
bWV0OgotIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCi0jICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotIyBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAotIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0jIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCi0j
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwKLSMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSMgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIK
LSMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KLQotI2lmIEVOQUJMRShBU1lOQ19TQ1JPTExJTkcpCi0KLW1lc3NhZ2VzIC0+IFJlbW90
ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yIHsKLSAgICBTY3JvbGxQb3NpdGlvbkNoYW5nZWRGb3JOb2Rl
KHVpbnQ2NF90IG5vZGVJRCwgV2ViQ29yZTo6RmxvYXRQb2ludCBzY3JvbGxQb3NpdGlvbiwgYm9v
bCBzeW5jTGF5ZXJQb3NpdGlvbik7Ci0gICAgQ3VycmVudFNuYXBQb2ludEluZGljZXNDaGFuZ2Vk
Rm9yTm9kZSh1aW50NjRfdCBub2RlSUQsIHVuc2lnbmVkIGhvcml6b250YWwsIHVuc2lnbmVkIHZl
cnRpY2FsKTsKLX0KLQotI2VuZGlmIC8vIEVOQUJMRShBU1lOQ19TQ1JPTExJTkcpCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nv
b3JkaW5hdG9yLm1tIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1Njcm9sbGluZy9SZW1vdGVT
Y3JvbGxpbmdDb29yZGluYXRvci5tbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2
NDE1MjVlNTJiOTc5ZGU0MDNhNmU2YTcxMDJjZDNhMjVkMzI1Mi4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU2Ny
b2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1tCisrKyAvZGV2L251bGwKQEAgLTEs
MTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFy
ZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5E
IEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbXBvcnQgImNvbmZpZy5oIgotI2ltcG9y
dCAiUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaCIKLQotI2lmIEVOQUJMRShBU1lOQ19TQ1JP
TExJTkcpCi0KLSNpbXBvcnQgIkFyZ3VtZW50Q29kZXJzLmgiCi0jaW1wb3J0ICJHcmFwaGljc0xh
eWVyQ0FSZW1vdGUuaCIKLSNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhLmgiCi0j
aW1wb3J0ICJSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvck1lc3NhZ2VzLmgiCi0jaW1wb3J0ICJS
ZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvclRyYW5zYWN0aW9uLmgiCi0jaW1wb3J0ICJXZWJDb3Jl
QXJndW1lbnRDb2RlcnMuaCIKLSNpbXBvcnQgIldlYlBhZ2UuaCIKLSNpbXBvcnQgIldlYlByb2Nl
c3MuaCIKLSNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NMYXllci5oPgotI2ltcG9ydCA8V2ViQ29y
ZS9GcmFtZVZpZXcuaD4KLSNpbXBvcnQgPFdlYkNvcmUvRnJhbWUuaD4KLSNpbXBvcnQgPFdlYkNv
cmUvUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL1JlbmRlclZpZXcu
aD4KLSNpbXBvcnQgPFdlYkNvcmUvU2Nyb2xsaW5nVHJlZUZpeGVkTm9kZS5oPgotI2ltcG9ydCA8
V2ViQ29yZS9TY3JvbGxpbmdUcmVlU3RpY2t5Tm9kZS5oPgotCi11c2luZyBuYW1lc3BhY2UgV2Vi
Q29yZTsKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLVJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9y
OjpSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcihXZWJQYWdlKiBwYWdlKQotICAgIDogQXN5bmNT
Y3JvbGxpbmdDb29yZGluYXRvcihwYWdlLT5jb3JlUGFnZSgpKQotICAgICwgbV93ZWJQYWdlKHBh
Z2UpCi17Ci0gICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkuYWRkTWVzc2FnZVJlY2VpdmVyKE1l
c3NhZ2VzOjpSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcjo6bWVzc2FnZVJlY2VpdmVyTmFtZSgp
LCBtX3dlYlBhZ2UtPnBhZ2VJRCgpLCAqdGhpcyk7Ci19Ci0KLVJlbW90ZVNjcm9sbGluZ0Nvb3Jk
aW5hdG9yOjp+UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IoKQotewotICAgIFdlYlByb2Nlc3M6
OnNpbmdsZXRvbigpLnJlbW92ZU1lc3NhZ2VSZWNlaXZlcihNZXNzYWdlczo6UmVtb3RlU2Nyb2xs
aW5nQ29vcmRpbmF0b3I6Om1lc3NhZ2VSZWNlaXZlck5hbWUoKSwgbV93ZWJQYWdlLT5wYWdlSUQo
KSk7Ci19Ci0KLXZvaWQgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I6OnNjaGVkdWxlVHJlZVN0
YXRlQ29tbWl0KCkKLXsKLSAgICBtX3dlYlBhZ2UtPmRyYXdpbmdBcmVhKCktPnNjaGVkdWxlQ29t
cG9zaXRpbmdMYXllckZsdXNoKCk7Ci19Ci0KLWJvb2wgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0
b3I6OmNvb3JkaW5hdGVzU2Nyb2xsaW5nRm9yRnJhbWVWaWV3KGNvbnN0IEZyYW1lVmlldyYgZnJh
bWVWaWV3KSBjb25zdAotewotICAgIFJlbmRlclZpZXcqIHJlbmRlclZpZXcgPSBmcmFtZVZpZXcu
cmVuZGVyVmlldygpOwotICAgIHJldHVybiByZW5kZXJWaWV3ICYmIHJlbmRlclZpZXctPnVzZXND
b21wb3NpdGluZygpOwotfQotCi1ib29sIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yOjppc1J1
YmJlckJhbmRJblByb2dyZXNzKCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogbmVlZCB0byBtYWlu
dGFpbiBzdGF0ZSBpbiB0aGUgd2ViIHByb2Nlc3M/Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1i
b29sIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yOjppc1Njcm9sbFNuYXBJblByb2dyZXNzKCkg
Y29uc3QKLXsKLSAgICAvLyBGSVhNRTogbmVlZCB0byBtYWludGFpbiBzdGF0ZSBpbiB0aGUgd2Vi
IHByb2Nlc3M/Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFJlbW90ZVNjcm9sbGluZ0Nv
b3JkaW5hdG9yOjpzZXRTY3JvbGxQaW5uaW5nQmVoYXZpb3IoU2Nyb2xsUGlubmluZ0JlaGF2aW9y
KQotewotICAgIC8vIEZJWE1FOiBzZW5kIHRvIHRoZSBVSSBwcm9jZXNzLgotfQotCi12b2lkIFJl
bW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yOjpidWlsZFRyYW5zYWN0aW9uKFJlbW90ZVNjcm9sbGlu
Z0Nvb3JkaW5hdG9yVHJhbnNhY3Rpb24mIHRyYW5zYWN0aW9uKQotewotICAgIHdpbGxDb21taXRU
cmVlKCk7Ci0gICAgdHJhbnNhY3Rpb24uc2V0U3RhdGVUcmVlVG9FbmNvZGUoc2Nyb2xsaW5nU3Rh
dGVUcmVlKCktPmNvbW1pdChMYXllclJlcHJlc2VudGF0aW9uOjpQbGF0Zm9ybUxheWVySURSZXBy
ZXNlbnRhdGlvbikpOwotfQotCi0vLyBOb3RpZmljYXRpb24gZnJvbSB0aGUgVUkgcHJvY2VzcyB0
aGF0IHdlIHNjcm9sbGVkLgotdm9pZCBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcjo6c2Nyb2xs
UG9zaXRpb25DaGFuZ2VkRm9yTm9kZShTY3JvbGxpbmdOb2RlSUQgbm9kZUlELCBjb25zdCBGbG9h
dFBvaW50JiBzY3JvbGxQb3NpdGlvbiwgYm9vbCBzeW5jTGF5ZXJQb3NpdGlvbikKLXsKLSAgICBz
Y2hlZHVsZVVwZGF0ZVNjcm9sbFBvc2l0aW9uQWZ0ZXJBc3luY1Njcm9sbChub2RlSUQsIHNjcm9s
bFBvc2l0aW9uLCBzdGQ6Om51bGxvcHQsIGZhbHNlIC8qIEZJWE1FICovLCBzeW5jTGF5ZXJQb3Np
dGlvbiA/IFNjcm9sbGluZ0xheWVyUG9zaXRpb25BY3Rpb246OlN5bmMgOiBTY3JvbGxpbmdMYXll
clBvc2l0aW9uQWN0aW9uOjpTZXQpOwotfQotCi12b2lkIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5h
dG9yOjpjdXJyZW50U25hcFBvaW50SW5kaWNlc0NoYW5nZWRGb3JOb2RlKFNjcm9sbGluZ05vZGVJ
RCBub2RlSUQsIHVuc2lnbmVkIGhvcml6b250YWwsIHVuc2lnbmVkIHZlcnRpY2FsKQotewotICAg
IHNldEFjdGl2ZVNjcm9sbFNuYXBJbmRpY2VzKG5vZGVJRCwgaG9yaXpvbnRhbCwgdmVydGljYWwp
OwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKLQotI2VuZGlmIC8vIEVOQUJMRShBU1lOQ19T
Q1JPTExJTkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9D
b2NvYS9SZW1vdGVMYXllclRyZWUvR3JhcGhpY3NMYXllckNBUmVtb3RlLmNwcCBiL1NvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9HcmFwaGljc0xh
eWVyQ0FSZW1vdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjJkZjQyZTk0NzMwZjE2MzgzZjliNWE3MzJlODI5
NmNiNWMxYTI1ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3Mv
V2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvR3JhcGhpY3NMYXllckNBUmVtb3RlLmNwcApA
QCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJDQVJlbW90
ZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUuaCIKKyNpbmNsdWRlICJQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtU2NyZWVu
Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKwor
R3JhcGhpY3NMYXllckNBUmVtb3RlOjp+R3JhcGhpY3NMYXllckNBUmVtb3RlKCkKK3sKK30KKwor
Ym9vbCBHcmFwaGljc0xheWVyQ0FSZW1vdGU6OmZpbHRlcnNDYW5CZUNvbXBvc2l0ZWQoY29uc3Qg
RmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycykKK3sKKyAgICByZXR1cm4gUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjpmaWx0ZXJzQ2FuQmVDb21wb3NpdGVkKGZpbHRlcnMpOworfQorCitSZWY8UGxhdGZv
cm1DQUxheWVyPiBHcmFwaGljc0xheWVyQ0FSZW1vdGU6OmNyZWF0ZVBsYXRmb3JtQ0FMYXllcihQ
bGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSBsYXllclR5cGUsIFBsYXRmb3JtQ0FMYXllckNsaWVu
dCogb3duZXIpCit7CisgICAgYXV0byByZXN1bHQgPSBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNy
ZWF0ZShsYXllclR5cGUsIG93bmVyLCBtX2NvbnRleHQpOworCisgICAgaWYgKHJlc3VsdC0+Y2Fu
SGF2ZUJhY2tpbmdTdG9yZSgpKQorICAgICAgICByZXN1bHQtPnNldFdhbnRzRGVlcENvbG9yQmFj
a2luZ1N0b3JlKHNjcmVlblN1cHBvcnRzRXh0ZW5kZWRDb2xvcigpKTsKKworICAgIHJldHVybiBX
VEZNb3ZlKHJlc3VsdCk7Cit9CisKK1JlZjxQbGF0Zm9ybUNBTGF5ZXI+IEdyYXBoaWNzTGF5ZXJD
QVJlbW90ZTo6Y3JlYXRlUGxhdGZvcm1DQUxheWVyKFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5
ZXIsIFBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIpCit7CisgICAgcmV0dXJuIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6Y3JlYXRlKHBsYXRmb3JtTGF5ZXIsIG93bmVyLCBtX2NvbnRleHQpOwor
fQorCitSZWY8UGxhdGZvcm1DQUFuaW1hdGlvbj4gR3JhcGhpY3NMYXllckNBUmVtb3RlOjpjcmVh
dGVQbGF0Zm9ybUNBQW5pbWF0aW9uKFBsYXRmb3JtQ0FBbmltYXRpb246OkFuaW1hdGlvblR5cGUg
dHlwZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoKQoreworICAgIHJldHVybiBQbGF0Zm9ybUNBQW5p
bWF0aW9uUmVtb3RlOjpjcmVhdGUodHlwZSwga2V5UGF0aCk7Cit9CisKK30gLy8gbmFtZXNwYWNl
IFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29j
b2EvUmVtb3RlTGF5ZXJUcmVlL0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5oIGIvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlL0dyYXBoaWNzTGF5ZXJD
QVJlbW90ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLmU0YTkyNTdhNjlhYjJhZWZkMWVhODZkMGM4YmM1NmM4NTY3
OGE3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFn
ZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvR3JhcGhpY3NMYXllckNBUmVtb3RlLmgKQEAgLTAsMCAr
MSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNw
cmFnbWEgb25jZQorCisjaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0xheWVyQ0EuaD4KKyNpbmNs
dWRlIDxXZWJDb3JlL1BsYXRmb3JtTGF5ZXIuaD4KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2Ns
YXNzIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ7CisKK2NsYXNzIEdyYXBoaWNzTGF5ZXJDQVJlbW90
ZSBmaW5hbCA6IHB1YmxpYyBXZWJDb3JlOjpHcmFwaGljc0xheWVyQ0EgeworcHVibGljOgorICAg
IEdyYXBoaWNzTGF5ZXJDQVJlbW90ZShUeXBlIGxheWVyVHlwZSwgV2ViQ29yZTo6R3JhcGhpY3NM
YXllckNsaWVudCYgY2xpZW50LCBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250ZXh0KQorICAg
ICAgICA6IEdyYXBoaWNzTGF5ZXJDQShsYXllclR5cGUsIGNsaWVudCkKKyAgICAgICAgLCBtX2Nv
bnRleHQoY29udGV4dCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB+R3JhcGhpY3NMYXll
ckNBUmVtb3RlKCk7CisKKyAgICBib29sIGZpbHRlcnNDYW5CZUNvbXBvc2l0ZWQoY29uc3QgV2Vi
Q29yZTo6RmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6Cisg
ICAgYm9vbCBpc0dyYXBoaWNzTGF5ZXJDQVJlbW90ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJu
IHRydWU7IH0KKworICAgIFJlZjxXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI+IGNyZWF0ZVBsYXRm
b3JtQ0FMYXllcihXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSwgV2ViQ29yZTo6
UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikgb3ZlcnJpZGU7CisgICAgUmVmPFdlYkNvcmU6
OlBsYXRmb3JtQ0FMYXllcj4gY3JlYXRlUGxhdGZvcm1DQUxheWVyKFBsYXRmb3JtTGF5ZXIqLCBX
ZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyKSBvdmVycmlkZTsKKyAgICBSZWY8
V2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbj4gY3JlYXRlUGxhdGZvcm1DQUFuaW1hdGlvbihX
ZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uOjpBbmltYXRpb25UeXBlLCBjb25zdCBTdHJpbmcm
IGtleVBhdGgpIG92ZXJyaWRlOworCisgICAgLy8gUGxhdGZvcm1DQUxheWVyUmVtb3RlIGNhbid0
IGN1cnJlbnRseSBwcm94eSBkaXJlY3RseSBjb21wb3NpdGVkIGltYWdlIGNvbnRlbnRzLCBzbyBv
cHQgb3V0IG9mIHRoaXMgb3B0aW1pemF0aW9uLgorICAgIGJvb2wgc2hvdWxkRGlyZWN0bHlDb21w
b3NpdGVJbWFnZShXZWJDb3JlOjpJbWFnZSopIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNl
OyB9CisgICAgCisgICAgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgbV9jb250ZXh0OworfTsKKwor
fSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfR1JBUEhJQ1NM
QVlFUihXZWJLaXQ6OkdyYXBoaWNzTGF5ZXJDQVJlbW90ZSwgaXNHcmFwaGljc0xheWVyQ0FSZW1v
dGUoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29h
L1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLmggYi9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmMyZDY4ZGU4NTI0MWEzMmU1ODIxZDhlN2YzYmNk
MGRlNzM1YTg3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3Mv
V2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5o
CkBAIC0wLDAgKzEsMzExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlX2gKKyNkZWZpbmUgUGxh
dGZvcm1DQUFuaW1hdGlvblJlbW90ZV9oCisKKyNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtQ0FB
bmltYXRpb24uaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNo
U2V0Lmg+CisKK25hbWVzcGFjZSBJUEMgeworY2xhc3MgRW5jb2RlcjsKK2NsYXNzIERlY29kZXI7
Cit9OworCituYW1lc3BhY2UgV1RGIHsKK2NsYXNzIFRleHRTdHJlYW07Cit9OworCitPQkpDX0NM
QVNTIENBTGF5ZXI7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBSZW1vdGVMYXllclRy
ZWVIb3N0OworCitjbGFzcyBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlIGZpbmFsIDogcHVibGlj
IFdlYkNvcmU6OlBsYXRmb3JtQ0FBbmltYXRpb24geworcHVibGljOgorICAgIHN0YXRpYyBSZWY8
UGxhdGZvcm1DQUFuaW1hdGlvbj4gY3JlYXRlKEFuaW1hdGlvblR5cGUsIGNvbnN0IFN0cmluZyYg
a2V5UGF0aCk7CisKKyAgICB2aXJ0dWFsIH5QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlKCkgeyB9
CisKKyAgICBib29sIGlzUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZSgpIGNvbnN0IG92ZXJyaWRl
IHsgcmV0dXJuIHRydWU7IH0KKworICAgIFJlZjxQbGF0Zm9ybUNBQW5pbWF0aW9uPiBjb3B5KCkg
Y29uc3Qgb3ZlcnJpZGU7CisKKyAgICBTdHJpbmcga2V5UGF0aCgpIGNvbnN0IG92ZXJyaWRlOwor
CisgICAgQ0ZUaW1lSW50ZXJ2YWwgYmVnaW5UaW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9p
ZCBzZXRCZWdpblRpbWUoQ0ZUaW1lSW50ZXJ2YWwpIG92ZXJyaWRlOworCisgICAgQ0ZUaW1lSW50
ZXJ2YWwgZHVyYXRpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldER1cmF0aW9uKENG
VGltZUludGVydmFsKSBvdmVycmlkZTsKKworICAgIGZsb2F0IHNwZWVkKCkgY29uc3Qgb3ZlcnJp
ZGU7CisgICAgdm9pZCBzZXRTcGVlZChmbG9hdCkgb3ZlcnJpZGU7CisKKyAgICBDRlRpbWVJbnRl
cnZhbCB0aW1lT2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRUaW1lT2Zmc2V0
KENGVGltZUludGVydmFsKSBvdmVycmlkZTsKKworICAgIGZsb2F0IHJlcGVhdENvdW50KCkgY29u
c3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRSZXBlYXRDb3VudChmbG9hdCkgb3ZlcnJpZGU7CisK
KyAgICBib29sIGF1dG9yZXZlcnNlcygpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0QXV0
b3JldmVyc2VzKGJvb2wpIG92ZXJyaWRlOworCisgICAgRmlsbE1vZGVUeXBlIGZpbGxNb2RlKCkg
Y29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRGaWxsTW9kZShGaWxsTW9kZVR5cGUpIG92ZXJy
aWRlOworCisgICAgdm9pZCBzZXRUaW1pbmdGdW5jdGlvbihjb25zdCBXZWJDb3JlOjpUaW1pbmdG
dW5jdGlvbiosIGJvb2wgcmV2ZXJzZSA9IGZhbHNlKSBvdmVycmlkZTsKKyAgICB2b2lkIGNvcHlU
aW1pbmdGdW5jdGlvbkZyb20oY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbiYpIG92
ZXJyaWRlOworCisgICAgYm9vbCBpc1JlbW92ZWRPbkNvbXBsZXRpb24oKSBjb25zdCBvdmVycmlk
ZTsKKyAgICB2b2lkIHNldFJlbW92ZWRPbkNvbXBsZXRpb24oYm9vbCkgb3ZlcnJpZGU7CisKKyAg
ICBib29sIGlzQWRkaXRpdmUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldEFkZGl0aXZl
KGJvb2wpIG92ZXJyaWRlOworCisgICAgVmFsdWVGdW5jdGlvblR5cGUgdmFsdWVGdW5jdGlvbigp
IGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0VmFsdWVGdW5jdGlvbihWYWx1ZUZ1bmN0aW9u
VHlwZSkgb3ZlcnJpZGU7CisKKyAgICAvLyBCYXNpYy1hbmltYXRpb24gcHJvcGVydGllcy4KKyAg
ICB2b2lkIHNldEZyb21WYWx1ZShmbG9hdCkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRGcm9tVmFs
dWUoY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgmKSBvdmVycmlkZTsKKyAgICB2
b2lkIHNldEZyb21WYWx1ZShjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50M0QmKSBvdmVycmlkZTsK
KyAgICB2b2lkIHNldEZyb21WYWx1ZShjb25zdCBXZWJDb3JlOjpDb2xvciYpIG92ZXJyaWRlOwor
ICAgIHZvaWQgc2V0RnJvbVZhbHVlKGNvbnN0IFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbiosIGlu
dCBpbnRlcm5hbEZpbHRlclByb3BlcnR5SW5kZXgpIG92ZXJyaWRlOworICAgIHZvaWQgY29weUZy
b21WYWx1ZUZyb20oY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbiYpIG92ZXJyaWRl
OworCisgICAgdm9pZCBzZXRUb1ZhbHVlKGZsb2F0KSBvdmVycmlkZTsKKyAgICB2b2lkIHNldFRv
VmFsdWUoY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgmKSBvdmVycmlkZTsKKyAg
ICB2b2lkIHNldFRvVmFsdWUoY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludDNEJikgb3ZlcnJpZGU7
CisgICAgdm9pZCBzZXRUb1ZhbHVlKGNvbnN0IFdlYkNvcmU6OkNvbG9yJikgb3ZlcnJpZGU7Cisg
ICAgdm9pZCBzZXRUb1ZhbHVlKGNvbnN0IFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbiosIGludCBp
bnRlcm5hbEZpbHRlclByb3BlcnR5SW5kZXgpIG92ZXJyaWRlOworICAgIHZvaWQgY29weVRvVmFs
dWVGcm9tKGNvbnN0IFdlYkNvcmU6OlBsYXRmb3JtQ0FBbmltYXRpb24mKSBvdmVycmlkZTsKKwor
ICAgIC8vIEtleWZyYW1lLWFuaW1hdGlvbiBwcm9wZXJ0aWVzLgorICAgIHZvaWQgc2V0VmFsdWVz
KGNvbnN0IFZlY3RvcjxmbG9hdD4mKSBvdmVycmlkZTsKKyAgICB2b2lkIHNldFZhbHVlcyhjb25z
dCBWZWN0b3I8V2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXg+Jikgb3ZlcnJpZGU7CisgICAg
dm9pZCBzZXRWYWx1ZXMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OkZsb2F0UG9pbnQzRD4mKSBvdmVy
cmlkZTsKKyAgICB2b2lkIHNldFZhbHVlcyhjb25zdCBWZWN0b3I8V2ViQ29yZTo6Q29sb3I+Jikg
b3ZlcnJpZGU7CisgICAgdm9pZCBzZXRWYWx1ZXMoY29uc3QgVmVjdG9yPFJlZlB0cjxXZWJDb3Jl
OjpGaWx0ZXJPcGVyYXRpb24+PiYsIGludCBpbnRlcm5hbEZpbHRlclByb3BlcnR5SW5kZXgpIG92
ZXJyaWRlOworICAgIHZvaWQgY29weVZhbHVlc0Zyb20oY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1D
QUFuaW1hdGlvbiYpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRLZXlUaW1lcyhjb25zdCBWZWN0
b3I8ZmxvYXQ+Jikgb3ZlcnJpZGU7CisgICAgdm9pZCBjb3B5S2V5VGltZXNGcm9tKGNvbnN0IFdl
YkNvcmU6OlBsYXRmb3JtQ0FBbmltYXRpb24mKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0VGlt
aW5nRnVuY3Rpb25zKGNvbnN0IFZlY3Rvcjxjb25zdCBXZWJDb3JlOjpUaW1pbmdGdW5jdGlvbio+
JiwgYm9vbCByZXZlcnNlID0gZmFsc2UpIG92ZXJyaWRlOworICAgIHZvaWQgY29weVRpbWluZ0Z1
bmN0aW9uc0Zyb20oY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbiYpIG92ZXJyaWRl
OworCisgICAgQW5pbWF0aW9uVHlwZSBhbmltYXRpb25UeXBlKCkgY29uc3QgeyByZXR1cm4gbV9w
cm9wZXJ0aWVzLmFuaW1hdGlvblR5cGU7IH0KKyAgICB2b2lkIHNldEhhc0V4cGxpY2l0QmVnaW5U
aW1lKGJvb2wgaGFzRXhwbGljaXRCZWdpblRpbWUpIHsgbV9wcm9wZXJ0aWVzLmhhc0V4cGxpY2l0
QmVnaW5UaW1lID0gaGFzRXhwbGljaXRCZWdpblRpbWU7IH0KKyAgICBib29sIGhhc0V4cGxpY2l0
QmVnaW5UaW1lKCkgY29uc3QgeyByZXR1cm4gbV9wcm9wZXJ0aWVzLmhhc0V4cGxpY2l0QmVnaW5U
aW1lOyB9CisKKyAgICB2b2lkIGRpZFN0YXJ0KENGVGltZUludGVydmFsIGJlZ2luVGltZSkgeyBt
X3Byb3BlcnRpZXMuYmVnaW5UaW1lID0gYmVnaW5UaW1lOyB9CisKKyAgICBjbGFzcyBLZXlmcmFt
ZVZhbHVlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gS2V5ZnJhbWVUeXBlIHsKKyAgICAg
ICAgICAgIE51bWJlcktleVR5cGUsCisgICAgICAgICAgICBDb2xvcktleVR5cGUsCisgICAgICAg
ICAgICBQb2ludEtleVR5cGUsCisgICAgICAgICAgICBUcmFuc2Zvcm1LZXlUeXBlLAorICAgICAg
ICAgICAgRmlsdGVyS2V5VHlwZSwKKyAgICAgICAgfTsKKworICAgICAgICB+S2V5ZnJhbWVWYWx1
ZSgpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEtleWZyYW1lVmFsdWUoZmxvYXQg
dmFsdWUgPSAwKQorICAgICAgICAgICAgOiBrZXlUeXBlKE51bWJlcktleVR5cGUpCisgICAgICAg
ICAgICAsIG51bWJlcih2YWx1ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgS2V5
ZnJhbWVWYWx1ZShXZWJDb3JlOjpDb2xvciB2YWx1ZSkKKyAgICAgICAgICAgIDoga2V5VHlwZShD
b2xvcktleVR5cGUpCisgICAgICAgICAgICAsIGNvbG9yKHZhbHVlKQorICAgICAgICB7CisgICAg
ICAgIH0KKworICAgICAgICBLZXlmcmFtZVZhbHVlKGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQz
RCYgdmFsdWUpCisgICAgICAgICAgICA6IGtleVR5cGUoUG9pbnRLZXlUeXBlKQorICAgICAgICAg
ICAgLCBwb2ludCh2YWx1ZSkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgS2V5ZnJh
bWVWYWx1ZShjb25zdCBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdmFsdWUpCisgICAg
ICAgICAgICA6IGtleVR5cGUoVHJhbnNmb3JtS2V5VHlwZSkKKyAgICAgICAgICAgICwgdHJhbnNm
b3JtKHZhbHVlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBLZXlmcmFtZVZhbHVl
KFJlZlB0cjxXZWJDb3JlOjpGaWx0ZXJPcGVyYXRpb24+JiYgdmFsdWUpCisgICAgICAgICAgICA6
IGtleVR5cGUoRmlsdGVyS2V5VHlwZSkKKyAgICAgICAgICAgICwgZmlsdGVyKFdURk1vdmUodmFs
dWUpKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBLZXlmcmFtZVZhbHVlKGNvbnN0
IEtleWZyYW1lVmFsdWUmIG90aGVyKQorICAgICAgICB7CisgICAgICAgICAgICAqdGhpcyA9IG90
aGVyOworICAgICAgICB9CisKKyAgICAgICAgS2V5ZnJhbWVWYWx1ZSYgb3BlcmF0b3I9KGNvbnN0
IEtleWZyYW1lVmFsdWUmIG90aGVyKQorICAgICAgICB7CisgICAgICAgICAgICBrZXlUeXBlID0g
b3RoZXIua2V5VHlwZTsKKyAgICAgICAgICAgIHN3aXRjaCAoa2V5VHlwZSkgeworICAgICAgICAg
ICAgY2FzZSBOdW1iZXJLZXlUeXBlOgorICAgICAgICAgICAgICAgIG51bWJlciA9IG90aGVyLm51
bWJlcjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ29sb3JLZXlU
eXBlOgorICAgICAgICAgICAgICAgIGNvbG9yID0gb3RoZXIuY29sb3I7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBvaW50S2V5VHlwZToKKyAgICAgICAgICAgICAg
ICBwb2ludCA9IG90aGVyLnBvaW50OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgY2FzZSBUcmFuc2Zvcm1LZXlUeXBlOgorICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9IG90
aGVyLnRyYW5zZm9ybTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ug
RmlsdGVyS2V5VHlwZToKKyAgICAgICAgICAgICAgICBmaWx0ZXIgPSBvdGhlci5maWx0ZXI7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVy
biAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEtleWZyYW1lVHlwZSBrZXlmcmFtZVR5cGUo
KSBjb25zdCB7IHJldHVybiBrZXlUeXBlOyB9CisKKyAgICAgICAgZmxvYXQgbnVtYmVyVmFsdWUo
KSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoa2V5VHlwZSA9PSBOdW1iZXJL
ZXlUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBudW1iZXI7CisgICAgICAgIH0KKworICAgICAg
ICBXZWJDb3JlOjpDb2xvciBjb2xvclZhbHVlKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAg
ICAgQVNTRVJUKGtleVR5cGUgPT0gQ29sb3JLZXlUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBj
b2xvcjsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQzRCYg
cG9pbnRWYWx1ZSgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChrZXlUeXBl
ID09IFBvaW50S2V5VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gcG9pbnQ7CisgICAgICAgIH0K
KworICAgICAgICBjb25zdCBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHJhbnNmb3Jt
VmFsdWUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoa2V5VHlwZSA9PSBU
cmFuc2Zvcm1LZXlUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm07CisgICAgICAg
IH0KKworICAgICAgICBjb25zdCBXZWJDb3JlOjpGaWx0ZXJPcGVyYXRpb24qIGZpbHRlclZhbHVl
KCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKGtleVR5cGUgPT0gRmlsdGVy
S2V5VHlwZSk7CisgICAgICAgICAgICByZXR1cm4gZmlsdGVyLmdldCgpOworICAgICAgICB9CisK
KyAgICAgICAgdm9pZCBlbmNvZGUoSVBDOjpFbmNvZGVyJikgY29uc3Q7CisgICAgICAgIHN0YXRp
YyBib29sIGRlY29kZShJUEM6OkRlY29kZXImLCBLZXlmcmFtZVZhbHVlJik7CisKKyAgICBwcml2
YXRlOgorICAgICAgICBLZXlmcmFtZVR5cGUga2V5VHlwZTsKKyAgICAgICAgdW5pb24geworICAg
ICAgICAgICAgZmxvYXQgbnVtYmVyOworICAgICAgICAgICAgV2ViQ29yZTo6Q29sb3IgY29sb3I7
CisgICAgICAgICAgICBXZWJDb3JlOjpGbG9hdFBvaW50M0QgcG9pbnQ7CisgICAgICAgICAgICBX
ZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm07CisgICAgICAgIH07CisgICAg
ICAgIFJlZlB0cjxXZWJDb3JlOjpGaWx0ZXJPcGVyYXRpb24+IGZpbHRlcjsKKyAgICB9OworCisg
ICAgc3RydWN0IFByb3BlcnRpZXMgeworICAgICAgICBQcm9wZXJ0aWVzKCkKKyAgICAgICAgICAg
IDogYW5pbWF0aW9uVHlwZShCYXNpYykKKyAgICAgICAgICAgICwgYmVnaW5UaW1lKDApCisgICAg
ICAgICAgICAsIGR1cmF0aW9uKDApCisgICAgICAgICAgICAsIHRpbWVPZmZzZXQoMCkKKyAgICAg
ICAgICAgICwgcmVwZWF0Q291bnQoMSkKKyAgICAgICAgICAgICwgc3BlZWQoMSkKKyAgICAgICAg
ICAgICwgZmlsbE1vZGUoTm9GaWxsTW9kZSkKKyAgICAgICAgICAgICwgdmFsdWVGdW5jdGlvbihO
b1ZhbHVlRnVuY3Rpb24pCisgICAgICAgICAgICAsIGF1dG9SZXZlcnNlcyhmYWxzZSkKKyAgICAg
ICAgICAgICwgcmVtb3ZlZE9uQ29tcGxldGlvbih0cnVlKQorICAgICAgICAgICAgLCBhZGRpdGl2
ZShmYWxzZSkKKyAgICAgICAgICAgICwgcmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyhmYWxzZSkKKyAg
ICAgICAgICAgICwgaGFzRXhwbGljaXRCZWdpblRpbWUoZmFsc2UpCisgICAgICAgIHsKKyAgICAg
ICAgfQorCisgICAgICAgIHZvaWQgZW5jb2RlKElQQzo6RW5jb2RlciYpIGNvbnN0OworICAgICAg
ICBzdGF0aWMgYm9vbCBkZWNvZGUoSVBDOjpEZWNvZGVyJiwgUHJvcGVydGllcyYpOworCisgICAg
ICAgIFN0cmluZyBrZXlQYXRoOworICAgICAgICBQbGF0Zm9ybUNBQW5pbWF0aW9uOjpBbmltYXRp
b25UeXBlIGFuaW1hdGlvblR5cGU7CisKKyAgICAgICAgZG91YmxlIGJlZ2luVGltZTsKKyAgICAg
ICAgZG91YmxlIGR1cmF0aW9uOworICAgICAgICBkb3VibGUgdGltZU9mZnNldDsKKyAgICAgICAg
ZmxvYXQgcmVwZWF0Q291bnQ7CisgICAgICAgIGZsb2F0IHNwZWVkOworCisgICAgICAgIFBsYXRm
b3JtQ0FBbmltYXRpb246OkZpbGxNb2RlVHlwZSBmaWxsTW9kZTsKKyAgICAgICAgUGxhdGZvcm1D
QUFuaW1hdGlvbjo6VmFsdWVGdW5jdGlvblR5cGUgdmFsdWVGdW5jdGlvbjsKKworICAgICAgICBi
b29sIGF1dG9SZXZlcnNlczsKKyAgICAgICAgYm9vbCByZW1vdmVkT25Db21wbGV0aW9uOworICAg
ICAgICBib29sIGFkZGl0aXZlOworICAgICAgICBib29sIHJldmVyc2VUaW1pbmdGdW5jdGlvbnM7
CisgICAgICAgIGJvb2wgaGFzRXhwbGljaXRCZWdpblRpbWU7CisKKyAgICAgICAgLy8gRm9yIGJh
c2ljIGFuaW1hdGlvbnMsIHRoZXNlIHZlY3RvcnMgaGF2ZSB0d28gZW50cmllcy4gRm9yIGtleWZy
YW1lIGFuaW1hdGlvbnMsIHR3byBvciBtb3JlLgorICAgICAgICAvLyB0aW1pbmdGdW5jdGlvbnMg
aGFzIG4tMSBlbnRyaWVzLgorICAgICAgICBWZWN0b3I8S2V5ZnJhbWVWYWx1ZT4ga2V5VmFsdWVz
OworICAgICAgICBWZWN0b3I8ZmxvYXQ+IGtleVRpbWVzOworICAgICAgICBWZWN0b3I8UmVmUHRy
PFdlYkNvcmU6OlRpbWluZ0Z1bmN0aW9uPj4gdGltaW5nRnVuY3Rpb25zOworICAgIH07CisKKyAg
ICBjb25zdCBQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKCkgY29uc3QgeyByZXR1cm4gbV9wcm9wZXJ0
aWVzOyB9CisKKyAgICB0eXBlZGVmIFZlY3RvcjxzdGQ6OnBhaXI8U3RyaW5nLCBQcm9wZXJ0aWVz
Pj4gQW5pbWF0aW9uc0xpc3Q7CisgICAgc3RhdGljIHZvaWQgdXBkYXRlTGF5ZXJBbmltYXRpb25z
KENBTGF5ZXIgKiwgUmVtb3RlTGF5ZXJUcmVlSG9zdCosIGNvbnN0IEFuaW1hdGlvbnNMaXN0JiBh
bmltYXRpb25zVG9BZGQsIGNvbnN0IEhhc2hTZXQ8U3RyaW5nPiYgYW5pbWF0aW9uc1RvUmVtb3Zl
KTsKKworcHJpdmF0ZToKKyAgICBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlKEFuaW1hdGlvblR5
cGUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCk7CisKKyAgICBQcm9wZXJ0aWVzIG1fcHJvcGVydGll
czsKK307CisKK1dURjo6VGV4dFN0cmVhbSYgb3BlcmF0b3I8PChXVEY6OlRleHRTdHJlYW0mLCBj
b25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVlJik7CitXVEY6OlRl
eHRTdHJlYW0mIG9wZXJhdG9yPDwoV1RGOjpUZXh0U3RyZWFtJiwgY29uc3QgUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZTo6UHJvcGVydGllcyYpOworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKwor
U1BFQ0lBTElaRV9UWVBFX1RSQUlUU19DQUFOSU1BVElPTihXZWJLaXQ6OlBsYXRmb3JtQ0FBbmlt
YXRpb25SZW1vdGUsIGlzUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZSgpKQorCisjZW5kaWYgLy8g
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dl
YlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUFuaW1hdGlv
blJlbW90ZS5tbSBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90
ZUxheWVyVHJlZS9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLm1tCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjA2ZTI3
M2MzYTcxOWU2OTEwMGQxNWY1YTMxYTFhMmQ0NWZmNmZmNDIKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUGxh
dGZvcm1DQUFuaW1hdGlvblJlbW90ZS5tbQpAQCAtMCwwICsxLDkzNCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bXBvcnQgIlBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUuaCIKKworI2ltcG9ydCAiQXJndW1lbnRD
b2RlcnMuaCIKKyNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZUhvc3QuaCIKKyNpbXBvcnQgIldlYkNv
cmVBcmd1bWVudENvZGVycy5oIgorI2ltcG9ydCA8UXVhcnR6Q29yZS9RdWFydHpDb3JlLmg+Cisj
aW1wb3J0IDxXZWJDb3JlL0dyYXBoaWNzTGF5ZXIuaD4KKyNpbXBvcnQgPFdlYkNvcmUvUGxhdGZv
cm1DQUFuaW1hdGlvbkNvY29hLmg+CisjaW1wb3J0IDxXZWJDb3JlL1BsYXRmb3JtQ0FGaWx0ZXJz
Lmg+CisjaW1wb3J0IDxXZWJDb3JlL1RpbWluZ0Z1bmN0aW9uLmg+CisjaW1wb3J0IDxwYWwvc3Bp
L2NvY29hL1F1YXJ0ekNvcmVTUEkuaD4KKyNpbXBvcnQgPHd0Zi9CbG9ja09iakNFeGNlcHRpb25z
Lmg+CisjaW1wb3J0IDx3dGYvQ3VycmVudFRpbWUuaD4KKyNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIu
aD4KKyNpbXBvcnQgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4KKwordXNpbmcgbmFtZXNwYWNlIFdU
RjsKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCitzdGF0aWMgZG91YmxlIG1lZGlhVGltZVRv
Q3VycmVudFRpbWUoQ0ZUaW1lSW50ZXJ2YWwgdCkKK3sKKyAgICByZXR1cm4gbW9ub3RvbmljYWxs
eUluY3JlYXNpbmdUaW1lKCkgKyB0IC0gQ0FDdXJyZW50TWVkaWFUaW1lKCk7Cit9CisKK3N0YXRp
YyBOU1N0cmluZyAqIGNvbnN0IFdLRXhwbGljaXRCZWdpblRpbWVGbGFnID0gQCJXS1BsYXRmb3Jt
Q0FBbmltYXRpb25FeHBsaWNpdEJlZ2luVGltZUZsYWciOworCitAaW50ZXJmYWNlIFdLQW5pbWF0
aW9uRGVsZWdhdGUgOiBOU09iamVjdCA8Q0FBbmltYXRpb25EZWxlZ2F0ZT4geworICAgIEdyYXBo
aWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCBfbGF5ZXJJRDsKKyAgICBXZWJLaXQ6OlJlbW90ZUxh
eWVyVHJlZUhvc3QqIF9sYXllclRyZWVIb3N0OworfQorCistIChpbnN0YW5jZXR5cGUpaW5pdFdp
dGhMYXllcklEOihHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQpbGF5ZXJJRCBsYXllclRy
ZWVIb3N0OihXZWJLaXQ6OlJlbW90ZUxheWVyVHJlZUhvc3QqKWxheWVyVHJlZUhvc3Q7CistICh2
b2lkKWludmFsaWRhdGU7CitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBXS0FuaW1hdGlvbkRlbGVn
YXRlCisKKy0gKGluc3RhbmNldHlwZSlpbml0V2l0aExheWVySUQ6KEdyYXBoaWNzTGF5ZXI6OlBs
YXRmb3JtTGF5ZXJJRClsYXllcklEIGxheWVyVHJlZUhvc3Q6KFdlYktpdDo6UmVtb3RlTGF5ZXJU
cmVlSG9zdCopbGF5ZXJUcmVlSG9zdAoreworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkp
IHsKKyAgICAgICAgX2xheWVySUQgPSBsYXllcklEOworICAgICAgICBfbGF5ZXJUcmVlSG9zdCA9
IGxheWVyVHJlZUhvc3Q7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistICh2b2lkKWlu
dmFsaWRhdGUKK3sKKyAgICBfbGF5ZXJUcmVlSG9zdCA9IG51bGxwdHI7Cit9CisKKy0gKHZvaWQp
YW5pbWF0aW9uRGlkU3RhcnQ6KENBQW5pbWF0aW9uICopYW5pbWF0aW9uCit7CisgICAgaWYgKCFf
bGF5ZXJUcmVlSG9zdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgYm9vbCBoYXNFeHBsaWNpdEJl
Z2luVGltZSA9IFtbYW5pbWF0aW9uIHZhbHVlRm9yS2V5OldLRXhwbGljaXRCZWdpblRpbWVGbGFn
XSBib29sVmFsdWVdOworICAgIENGVGltZUludGVydmFsIHN0YXJ0VGltZTsKKworICAgIGlmICho
YXNFeHBsaWNpdEJlZ2luVGltZSkgeworICAgICAgICAvLyBXZSBkb24ndCBrbm93IHdoYXQgdGlt
ZSBDQSB1c2VkIHRvIGNvbW1pdCB0aGUgYW5pbWF0aW9uLCBzbyBqdXN0IHVzZSB0aGUgY3VycmVu
dCB0aW1lCisgICAgICAgIC8vIChldmVuIHRob3VnaCB0aGlzIHdpbGwgYmUgc2xpZ2h0bHkgb2Zm
KS4KKyAgICAgICAgc3RhcnRUaW1lID0gbWVkaWFUaW1lVG9DdXJyZW50VGltZShDQUN1cnJlbnRN
ZWRpYVRpbWUoKSk7CisgICAgfSBlbHNlCisgICAgICAgIHN0YXJ0VGltZSA9IG1lZGlhVGltZVRv
Q3VycmVudFRpbWUoW2FuaW1hdGlvbiBiZWdpblRpbWVdKTsKKworICAgIF9sYXllclRyZWVIb3N0
LT5hbmltYXRpb25EaWRTdGFydChfbGF5ZXJJRCwgYW5pbWF0aW9uLCBzdGFydFRpbWUpOworfQor
CistICh2b2lkKWFuaW1hdGlvbkRpZFN0b3A6KENBQW5pbWF0aW9uICopYW5pbWF0aW9uIGZpbmlz
aGVkOihCT09MKWZpbmlzaGVkCit7CisgICAgaWYgKCFfbGF5ZXJUcmVlSG9zdCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgX2xheWVyVHJlZUhvc3QtPmFuaW1hdGlvbkRpZEVuZChfbGF5ZXJJRCwg
YW5pbWF0aW9uKTsKK30KKworQGVuZAorCituYW1lc3BhY2UgV2ViS2l0IHsKKwordm9pZCBQbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVlOjplbmNvZGUoSVBDOjpFbmNvZGVy
JiBlbmNvZGVyKSBjb25zdAoreworICAgIGVuY29kZXIuZW5jb2RlRW51bShrZXlUeXBlKTsKKwor
ICAgIHN3aXRjaCAoa2V5VHlwZSkgeworICAgIGNhc2UgTnVtYmVyS2V5VHlwZToKKyAgICAgICAg
ZW5jb2RlciA8PCBudW1iZXI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29sb3JLZXlUeXBl
OgorICAgICAgICBlbmNvZGVyIDw8IGNvbG9yOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBv
aW50S2V5VHlwZToKKyAgICAgICAgZW5jb2RlciA8PCBwb2ludDsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBUcmFuc2Zvcm1LZXlUeXBlOgorICAgICAgICBlbmNvZGVyIDw8IHRyYW5zZm9ybTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWx0ZXJLZXlUeXBlOgorICAgICAgICBlbmNvZGVy
IDw8ICpmaWx0ZXIuZ2V0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworYm9vbCBQbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVlOjpkZWNvZGUoSVBDOjpEZWNvZGVy
JiBkZWNvZGVyLCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVlJiB2YWx1
ZSkKK3sKKyAgICBpZiAoIWRlY29kZXIuZGVjb2RlRW51bSh2YWx1ZS5rZXlUeXBlKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgc3dpdGNoICh2YWx1ZS5rZXlUeXBlKSB7CisgICAgY2Fz
ZSBOdW1iZXJLZXlUeXBlOgorICAgICAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHZhbHVlLm51bWJl
cikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
Q29sb3JLZXlUeXBlOgorICAgICAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHZhbHVlLmNvbG9yKSkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQb2lu
dEtleVR5cGU6CisgICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUodmFsdWUucG9pbnQpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRyYW5zZm9y
bUtleVR5cGU6CisgICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUodmFsdWUudHJhbnNmb3JtKSkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWx0
ZXJLZXlUeXBlOgorICAgICAgICBpZiAoIWRlY29kZUZpbHRlck9wZXJhdGlvbihkZWNvZGVyLCB2
YWx1ZS5maWx0ZXIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsK
KyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlOjpQcm9wZXJ0aWVzOjplbmNvZGUoSVBDOjpFbmNvZGVyJiBlbmNvZGVyKSBjb25zdAor
eworICAgIGVuY29kZXIgPDwga2V5UGF0aDsKKyAgICBlbmNvZGVyLmVuY29kZUVudW0oYW5pbWF0
aW9uVHlwZSk7CisKKyAgICBlbmNvZGVyIDw8IGJlZ2luVGltZTsKKyAgICBlbmNvZGVyIDw8IGR1
cmF0aW9uOworICAgIGVuY29kZXIgPDwgdGltZU9mZnNldDsKKyAgICBlbmNvZGVyIDw8IHJlcGVh
dENvdW50OworICAgIGVuY29kZXIgPDwgc3BlZWQ7CisKKyAgICBlbmNvZGVyLmVuY29kZUVudW0o
ZmlsbE1vZGUpOworICAgIGVuY29kZXIuZW5jb2RlRW51bSh2YWx1ZUZ1bmN0aW9uKTsKKworICAg
IGVuY29kZXIgPDwgYXV0b1JldmVyc2VzOworICAgIGVuY29kZXIgPDwgcmVtb3ZlZE9uQ29tcGxl
dGlvbjsKKyAgICBlbmNvZGVyIDw8IGFkZGl0aXZlOworICAgIGVuY29kZXIgPDwgcmV2ZXJzZVRp
bWluZ0Z1bmN0aW9uczsKKyAgICBlbmNvZGVyIDw8IGhhc0V4cGxpY2l0QmVnaW5UaW1lOworICAg
IAorICAgIGVuY29kZXIgPDwga2V5VmFsdWVzOworICAgIGVuY29kZXIgPDwga2V5VGltZXM7Cisg
ICAgCisgICAgZW5jb2RlciA8PCBzdGF0aWNfY2FzdDx1aW50NjRfdD4odGltaW5nRnVuY3Rpb25z
LnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiB0aW1pbmdGdW5jdGlvbiA6IHRpbWluZ0Z1
bmN0aW9ucykgeworICAgICAgICBzd2l0Y2ggKHRpbWluZ0Z1bmN0aW9uLT50eXBlKCkpIHsKKyAg
ICAgICAgY2FzZSBUaW1pbmdGdW5jdGlvbjo6TGluZWFyRnVuY3Rpb246CisgICAgICAgICAgICBl
bmNvZGVyIDw8ICpzdGF0aWNfY2FzdDxMaW5lYXJUaW1pbmdGdW5jdGlvbio+KHRpbWluZ0Z1bmN0
aW9uLmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisgICAgICAgIGNh
c2UgVGltaW5nRnVuY3Rpb246OkN1YmljQmV6aWVyRnVuY3Rpb246CisgICAgICAgICAgICBlbmNv
ZGVyIDw8ICpzdGF0aWNfY2FzdDxDdWJpY0JlemllclRpbWluZ0Z1bmN0aW9uKj4odGltaW5nRnVu
Y3Rpb24uZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgICBjYXNl
IFRpbWluZ0Z1bmN0aW9uOjpTdGVwc0Z1bmN0aW9uOgorICAgICAgICAgICAgZW5jb2RlciA8PCAq
c3RhdGljX2Nhc3Q8U3RlcHNUaW1pbmdGdW5jdGlvbio+KHRpbWluZ0Z1bmN0aW9uLmdldCgpKTsK
KyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVGltaW5nRnVuY3Rpb246OlNwcmlu
Z0Z1bmN0aW9uOgorICAgICAgICAgICAgZW5jb2RlciA8PCAqc3RhdGljX2Nhc3Q8U3ByaW5nVGlt
aW5nRnVuY3Rpb24qPih0aW1pbmdGdW5jdGlvbi5nZXQoKSk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpQ
cm9wZXJ0aWVzOjpkZWNvZGUoSVBDOjpEZWNvZGVyJiBkZWNvZGVyLCBQbGF0Zm9ybUNBQW5pbWF0
aW9uUmVtb3RlOjpQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKQoreworICAgIGlmICghZGVjb2Rlci5k
ZWNvZGUocHJvcGVydGllcy5rZXlQYXRoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
aWYgKCFkZWNvZGVyLmRlY29kZUVudW0ocHJvcGVydGllcy5hbmltYXRpb25UeXBlKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmJl
Z2luVGltZSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghZGVjb2Rlci5kZWNv
ZGUocHJvcGVydGllcy5kdXJhdGlvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlm
ICghZGVjb2Rlci5kZWNvZGUocHJvcGVydGllcy50aW1lT2Zmc2V0KSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLnJlcGVhdENvdW50
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9w
ZXJ0aWVzLnNwZWVkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVy
LmRlY29kZUVudW0ocHJvcGVydGllcy5maWxsTW9kZSkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGlmICghZGVjb2Rlci5kZWNvZGVFbnVtKHByb3BlcnRpZXMudmFsdWVGdW5jdGlvbikp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghZGVjb2Rlci5kZWNvZGUocHJvcGVy
dGllcy5hdXRvUmV2ZXJzZXMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWRl
Y29kZXIuZGVjb2RlKHByb3BlcnRpZXMucmVtb3ZlZE9uQ29tcGxldGlvbikpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIGlmICghZGVjb2Rlci5kZWNvZGUocHJvcGVydGllcy5hZGRpdGl2
ZSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghZGVjb2Rlci5kZWNvZGUocHJv
cGVydGllcy5yZXZlcnNlVGltaW5nRnVuY3Rpb25zKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmhhc0V4cGxpY2l0QmVnaW5UaW1l
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9w
ZXJ0aWVzLmtleVZhbHVlcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghZGVj
b2Rlci5kZWNvZGUocHJvcGVydGllcy5rZXlUaW1lcykpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIHVpbnQ2NF90IG51bVRpbWluZ0Z1bmN0aW9uczsKKyAgICBpZiAoIWRlY29kZXIuZGVj
b2RlKG51bVRpbWluZ0Z1bmN0aW9ucykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAg
ICBpZiAobnVtVGltaW5nRnVuY3Rpb25zKSB7CisgICAgICAgIHByb3BlcnRpZXMudGltaW5nRnVu
Y3Rpb25zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobnVtVGltaW5nRnVuY3Rpb25zKTsKKworICAg
ICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVRpbWluZ0Z1bmN0aW9uczsgKytpKSB7Cisg
ICAgICAgIAorICAgICAgICAgICAgVGltaW5nRnVuY3Rpb246OlRpbWluZ0Z1bmN0aW9uVHlwZSB0
eXBlOworICAgICAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29kZUVudW0odHlwZSkpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBSZWZQdHI8VGltaW5nRnVuY3Rp
b24+IHRpbWluZ0Z1bmN0aW9uOworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAg
ICAgICBjYXNlIFRpbWluZ0Z1bmN0aW9uOjpMaW5lYXJGdW5jdGlvbjoKKyAgICAgICAgICAgICAg
ICB0aW1pbmdGdW5jdGlvbiA9IExpbmVhclRpbWluZ0Z1bmN0aW9uOjpjcmVhdGUoKTsKKyAgICAg
ICAgICAgICAgICBpZiAoIWRlY29kZXIuZGVjb2RlKCpzdGF0aWNfY2FzdDxMaW5lYXJUaW1pbmdG
dW5jdGlvbio+KHRpbWluZ0Z1bmN0aW9uLmdldCgpKSkpCisgICAgICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgIGNhc2UgVGltaW5nRnVuY3Rpb246OkN1YmljQmV6aWVyRnVuY3Rpb246CisgICAg
ICAgICAgICAgICAgdGltaW5nRnVuY3Rpb24gPSBDdWJpY0JlemllclRpbWluZ0Z1bmN0aW9uOjpj
cmVhdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRlY29kZXIuZGVjb2RlKCpzdGF0aWNfY2Fz
dDxDdWJpY0JlemllclRpbWluZ0Z1bmN0aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpKSkKKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIFRpbWluZ0Z1bmN0aW9uOjpTdGVwc0Z1bmN0
aW9uOgorICAgICAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9uID0gU3RlcHNUaW1pbmdGdW5jdGlv
bjo6Y3JlYXRlKCk7CisgICAgICAgICAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29kZSgqc3RhdGlj
X2Nhc3Q8U3RlcHNUaW1pbmdGdW5jdGlvbio+KHRpbWluZ0Z1bmN0aW9uLmdldCgpKSkpCisgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKwor
ICAgICAgICAgICAgY2FzZSBUaW1pbmdGdW5jdGlvbjo6U3ByaW5nRnVuY3Rpb246CisgICAgICAg
ICAgICAgICAgdGltaW5nRnVuY3Rpb24gPSBTcHJpbmdUaW1pbmdGdW5jdGlvbjo6Y3JlYXRlKCk7
CisgICAgICAgICAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29kZSgqc3RhdGljX2Nhc3Q8U3ByaW5n
VGltaW5nRnVuY3Rpb24qPih0aW1pbmdGdW5jdGlvbi5nZXQoKSkpKQorICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHByb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zLnVu
Y2hlY2tlZEFwcGVuZChXVEZNb3ZlKHRpbWluZ0Z1bmN0aW9uKSk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKyAgICAKK1JlZjxQbGF0Zm9ybUNBQW5pbWF0aW9uPiBQ
bGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpjcmVhdGUoUGxhdGZvcm1DQUFuaW1hdGlvbjo6QW5p
bWF0aW9uVHlwZSB0eXBlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgpCit7CisgICAgcmV0dXJuIGFk
b3B0UmVmKCpuZXcgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZSh0eXBlLCBrZXlQYXRoKSk7Cit9
CisKK1JlZjxQbGF0Zm9ybUNBQW5pbWF0aW9uPiBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpj
b3B5KCkgY29uc3QKK3sKKyAgICBhdXRvIGFuaW1hdGlvbiA9IGNyZWF0ZShhbmltYXRpb25UeXBl
KCksIGtleVBhdGgoKSk7CisgICAgCisgICAgYW5pbWF0aW9uLT5zZXRCZWdpblRpbWUoYmVnaW5U
aW1lKCkpOworICAgIGFuaW1hdGlvbi0+c2V0RHVyYXRpb24oZHVyYXRpb24oKSk7CisgICAgYW5p
bWF0aW9uLT5zZXRTcGVlZChzcGVlZCgpKTsKKyAgICBhbmltYXRpb24tPnNldFRpbWVPZmZzZXQo
dGltZU9mZnNldCgpKTsKKyAgICBhbmltYXRpb24tPnNldFJlcGVhdENvdW50KHJlcGVhdENvdW50
KCkpOworICAgIGFuaW1hdGlvbi0+c2V0QXV0b3JldmVyc2VzKGF1dG9yZXZlcnNlcygpKTsKKyAg
ICBhbmltYXRpb24tPnNldEZpbGxNb2RlKGZpbGxNb2RlKCkpOworICAgIGFuaW1hdGlvbi0+c2V0
UmVtb3ZlZE9uQ29tcGxldGlvbihpc1JlbW92ZWRPbkNvbXBsZXRpb24oKSk7CisgICAgYW5pbWF0
aW9uLT5zZXRBZGRpdGl2ZShpc0FkZGl0aXZlKCkpOworICAgIGFuaW1hdGlvbi0+Y29weVRpbWlu
Z0Z1bmN0aW9uRnJvbSgqdGhpcyk7CisgICAgYW5pbWF0aW9uLT5zZXRWYWx1ZUZ1bmN0aW9uKHZh
bHVlRnVuY3Rpb24oKSk7CisKKyAgICBkb3duY2FzdDxQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3Rl
PihhbmltYXRpb24uZ2V0KCkpLnNldEhhc0V4cGxpY2l0QmVnaW5UaW1lKGhhc0V4cGxpY2l0QmVn
aW5UaW1lKCkpOworICAgIAorICAgIC8vIENvcHkgdGhlIHNwZWNpZmljIEJhc2ljIG9yIEtleWZy
YW1lIHZhbHVlcy4KKyAgICBpZiAoYW5pbWF0aW9uVHlwZSgpID09IEtleWZyYW1lKSB7CisgICAg
ICAgIGFuaW1hdGlvbi0+Y29weVZhbHVlc0Zyb20oKnRoaXMpOworICAgICAgICBhbmltYXRpb24t
PmNvcHlLZXlUaW1lc0Zyb20oKnRoaXMpOworICAgICAgICBhbmltYXRpb24tPmNvcHlUaW1pbmdG
dW5jdGlvbnNGcm9tKCp0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhbmltYXRpb24tPmNv
cHlGcm9tVmFsdWVGcm9tKCp0aGlzKTsKKyAgICAgICAgYW5pbWF0aW9uLT5jb3B5VG9WYWx1ZUZy
b20oKnRoaXMpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gYW5pbWF0aW9uOworfQorCitQbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlKEFuaW1hdGlv
blR5cGUgdHlwZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoKQorICAgIDogUGxhdGZvcm1DQUFuaW1h
dGlvbih0eXBlKQoreworICAgIG1fcHJvcGVydGllcy5rZXlQYXRoID0ga2V5UGF0aDsKKyAgICBt
X3Byb3BlcnRpZXMuYW5pbWF0aW9uVHlwZSA9IHR5cGU7Cit9CisKK1N0cmluZyBQbGF0Zm9ybUNB
QW5pbWF0aW9uUmVtb3RlOjprZXlQYXRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0
aWVzLmtleVBhdGg7Cit9CisKK0NGVGltZUludGVydmFsIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU6OmJlZ2luVGltZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5iZWdpblRp
bWU7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0QmVnaW5UaW1lKENG
VGltZUludGVydmFsIHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5iZWdpblRpbWUgPSB2YWx1
ZTsKKyAgICAKKyAgICAvLyBBbHNvIHNldCBhIGZsYWcgdG8gdGVsbCB1cyBpZiB3ZSd2ZSBwYXNz
ZWQgaW4gYSAwIHZhbHVlLiAKKyAgICAvLyBUaGUgZmxhZyBpcyBuZWVkZWQgYmVjYXVzZSBsYXRl
ciBiZWdpblRpbWUgd2lsbCBnZXQgY2hhbmdlZAorICAgIC8vIHRvIHRoZSB0aW1lIGF0IHdoaWNo
IGl0IGZpcmVkIGFuZCB3ZSBuZWVkIHRvIGtub3cgd2hldGhlcgorICAgIC8vIG9yIG5vdCBpdCB3
YXMgMCB0byBiZWdpbiB3aXRoLgorICAgIGlmICh2YWx1ZSkKKyAgICAgICAgbV9wcm9wZXJ0aWVz
Lmhhc0V4cGxpY2l0QmVnaW5UaW1lID0gdmFsdWU7Cit9CisKK0NGVGltZUludGVydmFsIFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU6OmR1cmF0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9w
cm9wZXJ0aWVzLmR1cmF0aW9uOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6
OnNldER1cmF0aW9uKENGVGltZUludGVydmFsIHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5k
dXJhdGlvbiA9IHZhbHVlOworfQorCitmbG9hdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpz
cGVlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5zcGVlZDsKK30KKwordm9p
ZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRTcGVlZChmbG9hdCB2YWx1ZSkKK3sKKyAg
ICBtX3Byb3BlcnRpZXMuc3BlZWQgPSB2YWx1ZTsKK30KKworQ0ZUaW1lSW50ZXJ2YWwgUGxhdGZv
cm1DQUFuaW1hdGlvblJlbW90ZTo6dGltZU9mZnNldCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
cHJvcGVydGllcy50aW1lT2Zmc2V0OworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU6OnNldFRpbWVPZmZzZXQoQ0ZUaW1lSW50ZXJ2YWwgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0
aWVzLnRpbWVPZmZzZXQgPSB2YWx1ZTsKK30KKworZmxvYXQgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6cmVwZWF0Q291bnQoKSBjb25zdAoreworICAgIHJldHVybiBtX3Byb3BlcnRpZXMucmVw
ZWF0Q291bnQ7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0UmVwZWF0
Q291bnQoZmxvYXQgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLnJlcGVhdENvdW50ID0gdmFs
dWU7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6YXV0b3JldmVyc2VzKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmF1dG9SZXZlcnNlczsKK30KKwordm9p
ZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRBdXRvcmV2ZXJzZXMoYm9vbCB2YWx1ZSkK
K3sKKyAgICBtX3Byb3BlcnRpZXMuYXV0b1JldmVyc2VzID0gdmFsdWU7Cit9CisKK1BsYXRmb3Jt
Q0FBbmltYXRpb246OkZpbGxNb2RlVHlwZSBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpmaWxs
TW9kZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5maWxsTW9kZTsKK30KKwor
dm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRGaWxsTW9kZShGaWxsTW9kZVR5cGUg
dmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLmZpbGxNb2RlID0gdmFsdWU7Cit9CisKK3ZvaWQg
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VGltaW5nRnVuY3Rpb24oY29uc3QgVGltaW5n
RnVuY3Rpb24qIHZhbHVlLCBib29sIHJldmVyc2UpCit7CisgICAgVmVjdG9yPFJlZlB0cjxUaW1p
bmdGdW5jdGlvbj4+IHRpbWluZ0Z1bmN0aW9uczsKKyAgICB0aW1pbmdGdW5jdGlvbnMuYXBwZW5k
KHZhbHVlLT5jbG9uZSgpKTsKKworICAgIG1fcHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMgPSBX
VEZNb3ZlKHRpbWluZ0Z1bmN0aW9ucyk7CisgICAgbV9wcm9wZXJ0aWVzLnJldmVyc2VUaW1pbmdG
dW5jdGlvbnMgPSByZXZlcnNlOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6
OmNvcHlUaW1pbmdGdW5jdGlvbkZyb20oY29uc3QgUGxhdGZvcm1DQUFuaW1hdGlvbiYgdmFsdWUp
Cit7CisgICAgY29weVRpbWluZ0Z1bmN0aW9uc0Zyb20odmFsdWUpOworfQorCitib29sIFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU6OmlzUmVtb3ZlZE9uQ29tcGxldGlvbigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fcHJvcGVydGllcy5yZW1vdmVkT25Db21wbGV0aW9uOworfQorCit2b2lkIFBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFJlbW92ZWRPbkNvbXBsZXRpb24oYm9vbCB2YWx1
ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMucmVtb3ZlZE9uQ29tcGxldGlvbiA9IHZhbHVlOworfQor
Citib29sIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmlzQWRkaXRpdmUoKSBjb25zdAorewor
ICAgIHJldHVybiBtX3Byb3BlcnRpZXMuYWRkaXRpdmU7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZTo6c2V0QWRkaXRpdmUoYm9vbCB2YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRp
ZXMuYWRkaXRpdmUgPSB2YWx1ZTsKK30KKworUGxhdGZvcm1DQUFuaW1hdGlvbjo6VmFsdWVGdW5j
dGlvblR5cGUgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6dmFsdWVGdW5jdGlvbigpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy52YWx1ZUZ1bmN0aW9uOworfQorCit2b2lkIFBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFZhbHVlRnVuY3Rpb24oVmFsdWVGdW5jdGlvblR5
cGUgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLnZhbHVlRnVuY3Rpb24gPSB2YWx1ZTsKK30K
Kwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRGcm9tVmFsdWUoZmxvYXQgdmFs
dWUpCit7CisgICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKKyAgICAgICAgcmV0dXJu
OworCisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9wcm9wZXJ0
aWVzLmtleVZhbHVlc1swXSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOworfQorCit2b2lkIFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldEZyb21WYWx1ZShjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYgdmFsdWUpCit7CisgICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7CisgICAg
bV9wcm9wZXJ0aWVzLmtleVZhbHVlc1swXSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOworfQorCit2
b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldEZyb21WYWx1ZShjb25zdCBGbG9hdFBv
aW50M0QmIHZhbHVlKQoreworICAgIGlmIChhbmltYXRpb25UeXBlKCkgIT0gQmFzaWMpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMucmVzaXplKDIpOworICAg
IG1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMF0gPSBLZXlmcmFtZVZhbHVlKHZhbHVlKTsKK30KKwor
dm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRGcm9tVmFsdWUoY29uc3QgQ29sb3Im
IHZhbHVlKQoreworICAgIGlmIChhbmltYXRpb25UeXBlKCkgIT0gQmFzaWMpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMucmVzaXplKDIpOworICAgIG1fcHJv
cGVydGllcy5rZXlWYWx1ZXNbMF0gPSBLZXlmcmFtZVZhbHVlKHZhbHVlKTsKK30KKwordm9pZCBQ
bGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRGcm9tVmFsdWUoY29uc3QgRmlsdGVyT3BlcmF0
aW9uKiBvcGVyYXRpb24sIGludCBpbnRlcm5hbEZpbHRlclByb3BlcnR5SW5kZXgpCit7CisgICAg
aWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9w
cm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVl
c1swXSA9IEtleWZyYW1lVmFsdWUob3BlcmF0aW9uLT5jbG9uZSgpKTsKK30KKwordm9pZCBQbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpjb3B5RnJvbVZhbHVlRnJvbShjb25zdCBQbGF0Zm9ybUNB
QW5pbWF0aW9uJiB2YWx1ZSkKK3sKKyAgICBjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3Rl
JiBvdGhlciA9IGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KHZhbHVlKTsKKwor
ICAgIGlmIChvdGhlci5tX3Byb3BlcnRpZXMua2V5VmFsdWVzLmlzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuOworICAgIAorICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMucmVzaXplKDIpOworICAg
IG1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMF0gPSBvdGhlci5tX3Byb3BlcnRpZXMua2V5VmFsdWVz
WzBdOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFRvVmFsdWUoZmxv
YXQgdmFsdWUpCit7CisgICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9w
cm9wZXJ0aWVzLmtleVZhbHVlc1sxXSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOworfQorCit2b2lk
IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFRvVmFsdWUoY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmIHZhbHVlKQoreworICAgIGlmIChhbmltYXRpb25UeXBlKCkgIT0gQmFzaWMpCisg
ICAgICAgIHJldHVybjsKKworICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMucmVzaXplKDIpOwor
ICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMV0gPSBLZXlmcmFtZVZhbHVlKHZhbHVlKTsKK30K
Kwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRUb1ZhbHVlKGNvbnN0IEZsb2F0
UG9pbnQzRCYgdmFsdWUpCit7CisgICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7Cisg
ICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1sxXSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOworfQor
Cit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFRvVmFsdWUoY29uc3QgQ29sb3Im
IHZhbHVlKQoreworICAgIGlmIChhbmltYXRpb25UeXBlKCkgIT0gQmFzaWMpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMucmVzaXplKDIpOworICAgIG1fcHJv
cGVydGllcy5rZXlWYWx1ZXNbMV0gPSBLZXlmcmFtZVZhbHVlKHZhbHVlKTsKK30KKwordm9pZCBQ
bGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRUb1ZhbHVlKGNvbnN0IEZpbHRlck9wZXJhdGlv
biogb3BlcmF0aW9uLCBpbnQgaW50ZXJuYWxGaWx0ZXJQcm9wZXJ0eUluZGV4KQoreworICAgIGlm
IChhbmltYXRpb25UeXBlKCkgIT0gQmFzaWMpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBV
TlVTRURfUEFSQU0oaW50ZXJuYWxGaWx0ZXJQcm9wZXJ0eUluZGV4KTsKKyAgICBBU1NFUlQob3Bl
cmF0aW9uKTsKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKKyAgICBtX3By
b3BlcnRpZXMua2V5VmFsdWVzWzFdID0gS2V5ZnJhbWVWYWx1ZShvcGVyYXRpb24tPmNsb25lKCkp
OworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNvcHlUb1ZhbHVlRnJvbShj
b25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uJiB2YWx1ZSkKK3sKKyAgICBjb25zdCBQbGF0Zm9ybUNB
QW5pbWF0aW9uUmVtb3RlJiBvdGhlciA9IGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU+KHZhbHVlKTsKKworICAgIGlmIChvdGhlci5tX3Byb3BlcnRpZXMua2V5VmFsdWVzLnNpemUo
KSA8IDIpCisgICAgICAgIHJldHVybjsKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzLnJlc2l6
ZSgyKTsKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzFdID0gb3RoZXIubV9wcm9wZXJ0aWVz
LmtleVZhbHVlc1sxXTsKK30KKworLy8gS2V5ZnJhbWUtYW5pbWF0aW9uIHByb3BlcnRpZXMuCit2
b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFZhbHVlcyhjb25zdCBWZWN0b3I8Zmxv
YXQ+JiB2YWx1ZXMpCit7CisgICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBLZXlmcmFtZSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgVmVjdG9yPEtleWZyYW1lVmFsdWU+IGtleWZyYW1lczsKKyAg
ICBrZXlmcmFtZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eSh2YWx1ZXMuc2l6ZSgpKTsKKyAgICAK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7ICsraSkKKyAgICAgICAg
a2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlmcmFtZVZhbHVlKHZhbHVlc1tpXSkpOworICAg
IAorICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMgPSBXVEZNb3ZlKGtleWZyYW1lcyk7Cit9CisK
K3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxU
cmFuc2Zvcm1hdGlvbk1hdHJpeD4mIHZhbHVlcykKK3sKKyAgICBpZiAoYW5pbWF0aW9uVHlwZSgp
ICE9IEtleWZyYW1lKQorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIFZlY3RvcjxLZXlm
cmFtZVZhbHVlPiBrZXlmcmFtZXM7CisgICAga2V5ZnJhbWVzLnJlc2VydmVJbml0aWFsQ2FwYWNp
dHkodmFsdWVzLnNpemUoKSk7CisgICAgCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1
ZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIGtleWZyYW1lcy51bmNoZWNrZWRBcHBlbmQoS2V5ZnJh
bWVWYWx1ZSh2YWx1ZXNbaV0pKTsKKyAgICAKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzID0g
V1RGTW92ZShrZXlmcmFtZXMpOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6
OnNldFZhbHVlcyhjb25zdCBWZWN0b3I8RmxvYXRQb2ludDNEPiYgdmFsdWVzKQoreworICAgIGlm
IChhbmltYXRpb25UeXBlKCkgIT0gS2V5ZnJhbWUpCisgICAgICAgIHJldHVybjsKKyAgICAgICAg
CisgICAgVmVjdG9yPEtleWZyYW1lVmFsdWU+IGtleWZyYW1lczsKKyAgICBrZXlmcmFtZXMucmVz
ZXJ2ZUluaXRpYWxDYXBhY2l0eSh2YWx1ZXMuc2l6ZSgpKTsKKyAgICAKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7ICsraSkKKyAgICAgICAga2V5ZnJhbWVzLnVuY2hl
Y2tlZEFwcGVuZChLZXlmcmFtZVZhbHVlKHZhbHVlc1tpXSkpOworICAgIAorICAgIG1fcHJvcGVy
dGllcy5rZXlWYWx1ZXMgPSBXVEZNb3ZlKGtleWZyYW1lcyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1D
QUFuaW1hdGlvblJlbW90ZTo6c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxDb2xvcj4mIHZhbHVlcykK
K3sKKyAgICBpZiAoYW5pbWF0aW9uVHlwZSgpICE9IEtleWZyYW1lKQorICAgICAgICByZXR1cm47
CisgICAgICAgIAorICAgIFZlY3RvcjxLZXlmcmFtZVZhbHVlPiBrZXlmcmFtZXM7CisgICAga2V5
ZnJhbWVzLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkodmFsdWVzLnNpemUoKSk7CisgICAgCisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIGtleWZy
YW1lcy51bmNoZWNrZWRBcHBlbmQoS2V5ZnJhbWVWYWx1ZSh2YWx1ZXNbaV0pKTsKKyAgICAKKyAg
ICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzID0gV1RGTW92ZShrZXlmcmFtZXMpOworfQorCit2b2lk
IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFZhbHVlcyhjb25zdCBWZWN0b3I8UmVmUHRy
PEZpbHRlck9wZXJhdGlvbj4+JiB2YWx1ZXMsIGludCBpbnRlcm5hbEZpbHRlclByb3BlcnR5SW5k
ZXgpCit7CisgICAgVU5VU0VEX1BBUkFNKGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCk7Cisg
ICAgCisgICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBLZXlmcmFtZSkKKyAgICAgICAgcmV0dXJu
OworICAgICAgICAKKyAgICBWZWN0b3I8S2V5ZnJhbWVWYWx1ZT4ga2V5ZnJhbWVzOworICAgIGtl
eWZyYW1lcy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KHZhbHVlcy5zaXplKCkpOworICAgIAorICAg
IGZvciAoYXV0byYgdmFsdWUgOiB2YWx1ZXMpCisgICAgICAgIGtleWZyYW1lcy51bmNoZWNrZWRB
cHBlbmQoS2V5ZnJhbWVWYWx1ZSB7IHZhbHVlLmNvcHlSZWYoKSB9KTsKKyAgICAKKyAgICBtX3By
b3BlcnRpZXMua2V5VmFsdWVzID0gV1RGTW92ZShrZXlmcmFtZXMpOworfQorCit2b2lkIFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU6OmNvcHlWYWx1ZXNGcm9tKGNvbnN0IFBsYXRmb3JtQ0FBbmlt
YXRpb24mIHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMgPSBkb3duY2FzdDxQ
bGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlPih2YWx1ZSkubV9wcm9wZXJ0aWVzLmtleVZhbHVlczsK
K30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRLZXlUaW1lcyhjb25zdCBW
ZWN0b3I8ZmxvYXQ+JiBrZXlUaW1lcykKK3sKKyAgICBtX3Byb3BlcnRpZXMua2V5VGltZXMgPSBr
ZXlUaW1lczsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpjb3B5S2V5VGlt
ZXNGcm9tKGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb24mIHZhbHVlKQoreworICAgIG1fcHJvcGVy
dGllcy5rZXlUaW1lcyA9IGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KHZhbHVl
KS5tX3Byb3BlcnRpZXMua2V5VGltZXM7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6c2V0VGltaW5nRnVuY3Rpb25zKGNvbnN0IFZlY3Rvcjxjb25zdCBUaW1pbmdGdW5jdGlv
bio+JiB2YWx1ZXMsIGJvb2wgcmV2ZXJzZSkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPFdlYkNvcmU6
OlRpbWluZ0Z1bmN0aW9uPj4gdGltaW5nRnVuY3Rpb25zOworICAgIHRpbWluZ0Z1bmN0aW9ucy5y
ZXNlcnZlSW5pdGlhbENhcGFjaXR5KHZhbHVlcy5zaXplKCkpOworICAgIAorICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKTsgKytpKQorICAgICAgICB0aW1pbmdGdW5jdGlv
bnMudW5jaGVja2VkQXBwZW5kKHZhbHVlc1tpXS0+Y2xvbmUoKSk7CisgICAgCisgICAgbV9wcm9w
ZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucyA9IFdURk1vdmUodGltaW5nRnVuY3Rpb25zKTsKKyAgICBt
X3Byb3BlcnRpZXMucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyA9IHJldmVyc2U7Cit9CisKK3ZvaWQg
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6Y29weVRpbWluZ0Z1bmN0aW9uc0Zyb20oY29uc3Qg
UGxhdGZvcm1DQUFuaW1hdGlvbiYgdmFsdWUpCit7CisgICAgY29uc3QgUGxhdGZvcm1DQUFuaW1h
dGlvblJlbW90ZSYgb3RoZXIgPSBkb3duY2FzdDxQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlPih2
YWx1ZSk7CisKKyAgICBtX3Byb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zID0gb3RoZXIubV9wcm9w
ZXJ0aWVzLnRpbWluZ0Z1bmN0aW9uczsKKyAgICBtX3Byb3BlcnRpZXMucmV2ZXJzZVRpbWluZ0Z1
bmN0aW9ucyA9IG90aGVyLm1fcHJvcGVydGllcy5yZXZlcnNlVGltaW5nRnVuY3Rpb25zOworfQor
CitzdGF0aWMgTlNPYmplY3QqIGFuaW1hdGlvblZhbHVlRnJvbUtleWZyYW1lVmFsdWUoY29uc3Qg
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZSYga2V5ZnJhbWVWYWx1ZSkK
K3sKKyAgICBzd2l0Y2ggKGtleWZyYW1lVmFsdWUua2V5ZnJhbWVUeXBlKCkpIHsKKyAgICBjYXNl
IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6Ok51bWJlcktleVR5cGU6
CisgICAgICAgIHJldHVybiBAKGtleWZyYW1lVmFsdWUubnVtYmVyVmFsdWUoKSk7CisgICAgICAg
ICAgICAKKyAgICBjYXNlIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6
OkNvbG9yS2V5VHlwZTogeworICAgICAgICBDb2xvciBjb2xvciA9IGtleWZyYW1lVmFsdWUuY29s
b3JWYWx1ZSgpOworICAgICAgICByZXR1cm4gQFsgQChjb2xvci5yZWQoKSksIEAoY29sb3IuZ3Jl
ZW4oKSksIEAoY29sb3IuYmx1ZSgpKSwgQChjb2xvci5hbHBoYSgpKSBdOworICAgIH0KKworICAg
IGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6UG9pbnRLZXlU
eXBlOiB7CisgICAgICAgIEZsb2F0UG9pbnQzRCBwb2ludCA9IGtleWZyYW1lVmFsdWUucG9pbnRW
YWx1ZSgpOworICAgICAgICByZXR1cm4gQFsgQChwb2ludC54KCkpLCBAKHBvaW50LnkoKSksIEAo
cG9pbnQueigpKSBdOworICAgIH0KKyAgICBjYXNlIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6
OktleWZyYW1lVmFsdWU6OlRyYW5zZm9ybUtleVR5cGU6CisgICAgICAgIHJldHVybiBbTlNWYWx1
ZSB2YWx1ZVdpdGhDQVRyYW5zZm9ybTNEOmtleWZyYW1lVmFsdWUudHJhbnNmb3JtVmFsdWUoKV07
CisgICAgICAgICAgICAKKyAgICBjYXNlIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZy
YW1lVmFsdWU6OkZpbHRlcktleVR5cGU6CisgICAgICAgIHJldHVybiBQbGF0Zm9ybUNBRmlsdGVy
czo6ZmlsdGVyVmFsdWVGb3JPcGVyYXRpb24oa2V5ZnJhbWVWYWx1ZS5maWx0ZXJWYWx1ZSgpLCAw
IC8qIHVudXNlZCAqLykuYXV0b3JlbGVhc2UoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFk
ZEFuaW1hdGlvblRvTGF5ZXIoQ0FMYXllciAqbGF5ZXIsIFJlbW90ZUxheWVyVHJlZUhvc3QqIGxh
eWVyVHJlZUhvc3QsIGNvbnN0IFN0cmluZyYga2V5LCBjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlOjpQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKQoreworICAgIFJldGFpblB0cjxDQVByb3Bl
cnR5QW5pbWF0aW9uPiBjYUFuaW1hdGlvbjsKKyAgICBzd2l0Y2ggKHByb3BlcnRpZXMuYW5pbWF0
aW9uVHlwZSkgeworICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvbjo6QmFzaWM6IHsKKyAgICAg
ICAgUmV0YWluUHRyPENBQmFzaWNBbmltYXRpb24+IGJhc2ljQW5pbWF0aW9uOworICAgICAgICBi
YXNpY0FuaW1hdGlvbiA9IFtDQUJhc2ljQW5pbWF0aW9uIGFuaW1hdGlvbldpdGhLZXlQYXRoOnBy
b3BlcnRpZXMua2V5UGF0aF07CisgICAgICAgIAorICAgICAgICBpZiAocHJvcGVydGllcy5rZXlW
YWx1ZXMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgW2Jhc2ljQW5pbWF0aW9uIHNldEZyb21W
YWx1ZTphbmltYXRpb25WYWx1ZUZyb21LZXlmcmFtZVZhbHVlKHByb3BlcnRpZXMua2V5VmFsdWVz
WzBdKV07CisgICAgICAgICAgICBbYmFzaWNBbmltYXRpb24gc2V0VG9WYWx1ZTphbmltYXRpb25W
YWx1ZUZyb21LZXlmcmFtZVZhbHVlKHByb3BlcnRpZXMua2V5VmFsdWVzWzFdKV07CisgICAgICAg
IH0KKyAgICAgICAgCisgICAgICAgIGlmIChwcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucy5zaXpl
KCkpCisgICAgICAgICAgICBbYmFzaWNBbmltYXRpb24gc2V0VGltaW5nRnVuY3Rpb246dG9DQU1l
ZGlhVGltaW5nRnVuY3Rpb24ocHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnNbMF0uZ2V0KCksIHBy
b3BlcnRpZXMucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyldOworICAgICAgICAKKyAgICAgICAgY2FB
bmltYXRpb24gPSBiYXNpY0FuaW1hdGlvbjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNh
c2UgUGxhdGZvcm1DQUFuaW1hdGlvbjo6S2V5ZnJhbWU6IHsKKyAgICAgICAgUmV0YWluUHRyPENB
S2V5ZnJhbWVBbmltYXRpb24+IGtleWZyYW1lQW5pbWF0aW9uOworICAgICAgICBrZXlmcmFtZUFu
aW1hdGlvbiA9IFtDQUtleWZyYW1lQW5pbWF0aW9uIGFuaW1hdGlvbldpdGhLZXlQYXRoOnByb3Bl
cnRpZXMua2V5UGF0aF07CisKKyAgICAgICAgaWYgKHByb3BlcnRpZXMua2V5VmFsdWVzLnNpemUo
KSkgeworICAgICAgICAgICAgUmV0YWluUHRyPE5TTXV0YWJsZUFycmF5PiBrZXlmcmFtZXMgPSBh
ZG9wdE5TKFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6cHJvcGVydGll
cy5rZXlWYWx1ZXMuc2l6ZSgpXSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHZhbHVl
IDogcHJvcGVydGllcy5rZXlWYWx1ZXMpCisgICAgICAgICAgICAgICAgW2tleWZyYW1lcyBhZGRP
YmplY3Q6YW5pbWF0aW9uVmFsdWVGcm9tS2V5ZnJhbWVWYWx1ZSh2YWx1ZSldOworICAgICAgICAg
ICAgCisgICAgICAgICAgICBba2V5ZnJhbWVBbmltYXRpb24gc2V0VmFsdWVzOmtleWZyYW1lcy5n
ZXQoKV07CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvcGVydGllcy5rZXlUaW1lcy5zaXpl
KCkpIHsKKyAgICAgICAgICAgIFJldGFpblB0cjxOU011dGFibGVBcnJheT4ga2V5VGltZXMgPSBh
ZG9wdE5TKFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6cHJvcGVydGll
cy5rZXlUaW1lcy5zaXplKCldKTsKKyAgICAgICAgICAgIGZvciAoYXV0byBrZXlUaW1lIDogcHJv
cGVydGllcy5rZXlUaW1lcykKKyAgICAgICAgICAgICAgICBba2V5VGltZXMgYWRkT2JqZWN0OkAo
a2V5VGltZSldOworICAgICAgICAgICAgCisgICAgICAgICAgICBba2V5ZnJhbWVBbmltYXRpb24g
c2V0S2V5VGltZXM6a2V5VGltZXMuZ2V0KCldOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBy
b3BlcnRpZXMudGltaW5nRnVuY3Rpb25zLnNpemUoKSkgeworICAgICAgICAgICAgUmV0YWluUHRy
PE5TTXV0YWJsZUFycmF5PiB0aW1pbmdGdW5jdGlvbnMgPSBhZG9wdE5TKFtbTlNNdXRhYmxlQXJy
YXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6cHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMuc2l6
ZSgpXSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRpbWluZ0Z1bmN0aW9uIDogcHJv
cGVydGllcy50aW1pbmdGdW5jdGlvbnMpCisgICAgICAgICAgICAgICAgW3RpbWluZ0Z1bmN0aW9u
cyBhZGRPYmplY3Q6dG9DQU1lZGlhVGltaW5nRnVuY3Rpb24odGltaW5nRnVuY3Rpb24uZ2V0KCks
IHByb3BlcnRpZXMucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyldOworICAgICAgICAgICAgCisgICAg
ICAgICAgICBba2V5ZnJhbWVBbmltYXRpb24gc2V0VGltaW5nRnVuY3Rpb25zOnRpbWluZ0Z1bmN0
aW9ucy5nZXQoKV07CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGNhQW5pbWF0aW9uID0g
a2V5ZnJhbWVBbmltYXRpb247CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBsYXRm
b3JtQ0FBbmltYXRpb246OlNwcmluZzogeworICAgICAgICBSZXRhaW5QdHI8Q0FTcHJpbmdBbmlt
YXRpb24+IHNwcmluZ0FuaW1hdGlvbjsKKyAgICAgICAgc3ByaW5nQW5pbWF0aW9uID0gW0NBU3By
aW5nQW5pbWF0aW9uIGFuaW1hdGlvbldpdGhLZXlQYXRoOnByb3BlcnRpZXMua2V5UGF0aF07Cisg
ICAgICAgIAorICAgICAgICBpZiAocHJvcGVydGllcy5rZXlWYWx1ZXMuc2l6ZSgpID4gMSkgewor
ICAgICAgICAgICAgW3NwcmluZ0FuaW1hdGlvbiBzZXRGcm9tVmFsdWU6YW5pbWF0aW9uVmFsdWVG
cm9tS2V5ZnJhbWVWYWx1ZShwcm9wZXJ0aWVzLmtleVZhbHVlc1swXSldOworICAgICAgICAgICAg
W3NwcmluZ0FuaW1hdGlvbiBzZXRUb1ZhbHVlOmFuaW1hdGlvblZhbHVlRnJvbUtleWZyYW1lVmFs
dWUocHJvcGVydGllcy5rZXlWYWx1ZXNbMV0pXTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAg
ICAgaWYgKHByb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zLnNpemUoKSkgeworICAgICAgICAgICAg
YXV0byYgdGltaW5nRnVuY3Rpb24gPSBwcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9uc1swXTsKKyAg
ICAgICAgICAgIGlmICh0aW1pbmdGdW5jdGlvbi0+aXNTcHJpbmdUaW1pbmdGdW5jdGlvbigpKSB7
CisgICAgICAgICAgICAgICAgYXV0byYgZnVuY3Rpb24gPSAqc3RhdGljX2Nhc3Q8Y29uc3QgU3By
aW5nVGltaW5nRnVuY3Rpb24qPih0aW1pbmdGdW5jdGlvbi5nZXQoKSk7CisgICAgICAgICAgICAg
ICAgW3NwcmluZ0FuaW1hdGlvbiBzZXRNYXNzOmZ1bmN0aW9uLm1hc3MoKV07CisgICAgICAgICAg
ICAgICAgW3NwcmluZ0FuaW1hdGlvbiBzZXRTdGlmZm5lc3M6ZnVuY3Rpb24uc3RpZmZuZXNzKCld
OworICAgICAgICAgICAgICAgIFtzcHJpbmdBbmltYXRpb24gc2V0RGFtcGluZzpmdW5jdGlvbi5k
YW1waW5nKCldOworICAgICAgICAgICAgICAgIFtzcHJpbmdBbmltYXRpb24gc2V0SW5pdGlhbFZl
bG9jaXR5OmZ1bmN0aW9uLmluaXRpYWxWZWxvY2l0eSgpXTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgICBjYUFuaW1hdGlvbiA9IHNwcmluZ0FuaW1hdGlvbjsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorICAgIH0KKyAgICAKKyAgICBbY2FBbmltYXRpb24gc2V0QmVnaW5UaW1lOnBy
b3BlcnRpZXMuYmVnaW5UaW1lXTsKKyAgICBbY2FBbmltYXRpb24gc2V0RHVyYXRpb246cHJvcGVy
dGllcy5kdXJhdGlvbl07CisgICAgW2NhQW5pbWF0aW9uIHNldFRpbWVPZmZzZXQ6cHJvcGVydGll
cy50aW1lT2Zmc2V0XTsKKyAgICBbY2FBbmltYXRpb24gc2V0UmVwZWF0Q291bnQ6cHJvcGVydGll
cy5yZXBlYXRDb3VudF07CisgICAgW2NhQW5pbWF0aW9uIHNldFNwZWVkOnByb3BlcnRpZXMuc3Bl
ZWRdOworICAgIFtjYUFuaW1hdGlvbiBzZXRBdXRvcmV2ZXJzZXM6cHJvcGVydGllcy5hdXRvUmV2
ZXJzZXNdOworICAgIFtjYUFuaW1hdGlvbiBzZXRSZW1vdmVkT25Db21wbGV0aW9uOnByb3BlcnRp
ZXMucmVtb3ZlZE9uQ29tcGxldGlvbl07CisgICAgW2NhQW5pbWF0aW9uIHNldEFkZGl0aXZlOnBy
b3BlcnRpZXMuYWRkaXRpdmVdOworICAgIAorICAgIGlmIChwcm9wZXJ0aWVzLmZpbGxNb2RlICE9
IFBsYXRmb3JtQ0FBbmltYXRpb246Ok5vRmlsbE1vZGUpCisgICAgICAgIFtjYUFuaW1hdGlvbiBz
ZXRGaWxsTW9kZTp0b0NBRmlsbE1vZGVUeXBlKHByb3BlcnRpZXMuZmlsbE1vZGUpXTsKKworICAg
IGlmIChwcm9wZXJ0aWVzLnZhbHVlRnVuY3Rpb24gIT0gUGxhdGZvcm1DQUFuaW1hdGlvbjo6Tm9W
YWx1ZUZ1bmN0aW9uKQorICAgICAgICBbY2FBbmltYXRpb24gc2V0VmFsdWVGdW5jdGlvbjpbQ0FW
YWx1ZUZ1bmN0aW9uIGZ1bmN0aW9uV2l0aE5hbWU6dG9DQVZhbHVlRnVuY3Rpb25UeXBlKHByb3Bl
cnRpZXMudmFsdWVGdW5jdGlvbildXTsKKyAgICAKKyAgICBpZiAocHJvcGVydGllcy5oYXNFeHBs
aWNpdEJlZ2luVGltZSkKKyAgICAgICAgW2NhQW5pbWF0aW9uIHNldFZhbHVlOkBZRVMgZm9yS2V5
OldLRXhwbGljaXRCZWdpblRpbWVGbGFnXTsKKyAgICAKKyAgICBpZiAobGF5ZXJUcmVlSG9zdCkg
eworICAgICAgICBHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQgbGF5ZXJJRCA9IFJlbW90
ZUxheWVyVHJlZUhvc3Q6OmxheWVySUQobGF5ZXIpOworICAgIAorICAgICAgICBSZXRhaW5QdHI8
V0tBbmltYXRpb25EZWxlZ2F0ZT4mIGRlbGVnYXRlID0gbGF5ZXJUcmVlSG9zdC0+YW5pbWF0aW9u
RGVsZWdhdGVzKCkuYWRkKGxheWVySUQsIG51bGxwdHIpLml0ZXJhdG9yLT52YWx1ZTsKKyAgICAg
ICAgaWYgKCFkZWxlZ2F0ZSkKKyAgICAgICAgICAgIGRlbGVnYXRlID0gYWRvcHROUyhbW1dLQW5p
bWF0aW9uRGVsZWdhdGUgYWxsb2NdIGluaXRXaXRoTGF5ZXJJRDpsYXllcklEIGxheWVyVHJlZUhv
c3Q6bGF5ZXJUcmVlSG9zdF0pOworCisgICAgICAgIFtjYUFuaW1hdGlvbiBzZXREZWxlZ2F0ZTpk
ZWxlZ2F0ZS5nZXQoKV07CisgICAgfQorICAgIAorICAgIFtsYXllciBhZGRBbmltYXRpb246Y2FB
bmltYXRpb24uZ2V0KCkgZm9yS2V5OmtleV07Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlv
blJlbW90ZTo6dXBkYXRlTGF5ZXJBbmltYXRpb25zKENBTGF5ZXIgKmxheWVyLCBSZW1vdGVMYXll
clRyZWVIb3N0KiBsYXllclRyZWVIb3N0LCBjb25zdCBBbmltYXRpb25zTGlzdCYgYW5pbWF0aW9u
c1RvQWRkLCBjb25zdCBIYXNoU2V0PFN0cmluZz4mIGFuaW1hdGlvbnNUb1JlbW92ZSkKK3sKKyAg
ICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlM7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHZh
bHVlIDogYW5pbWF0aW9uc1RvUmVtb3ZlKQorICAgICAgICBbbGF5ZXIgcmVtb3ZlQW5pbWF0aW9u
Rm9yS2V5OnZhbHVlXTsKKworICAgIGZvciAoY29uc3QgYXV0byYga2V5QW5pbWF0aW9uUGFpciA6
IGFuaW1hdGlvbnNUb0FkZCkKKyAgICAgICAgYWRkQW5pbWF0aW9uVG9MYXllcihsYXllciwgbGF5
ZXJUcmVlSG9zdCwga2V5QW5pbWF0aW9uUGFpci5maXJzdCwga2V5QW5pbWF0aW9uUGFpci5zZWNv
bmQpOworCisgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUzsKK30KKworVGV4dFN0cmVhbSYg
b3BlcmF0b3I8PChUZXh0U3RyZWFtJnRzLCBjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3Rl
OjpLZXlmcmFtZVZhbHVlJiB2YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKHZhbHVlLmtleWZyYW1lVHlw
ZSgpKSB7CisgICAgY2FzZSBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVl
OjpOdW1iZXJLZXlUeXBlOgorICAgICAgICB0cyA8PCAibnVtYmVyPSIgPDwgdmFsdWUubnVtYmVy
VmFsdWUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVt
b3RlOjpLZXlmcmFtZVZhbHVlOjpDb2xvcktleVR5cGU6CisgICAgICAgIHRzIDw8ICJjb2xvcj0i
OworICAgICAgICB0cyA8PCB2YWx1ZS5jb2xvclZhbHVlKCk7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6UG9pbnRLZXlU
eXBlOgorICAgICAgICB0cyA8PCAicG9pbnQ9IjsKKyAgICAgICAgdHMgPDwgdmFsdWUucG9pbnRW
YWx1ZSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU6OktleWZyYW1lVmFsdWU6OlRyYW5zZm9ybUtleVR5cGU6CisgICAgICAgIHRzIDw8ICJ0cmFu
c2Zvcm09IjsKKyAgICAgICAgdHMgPDwgdmFsdWUudHJhbnNmb3JtVmFsdWUoKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVl
OjpGaWx0ZXJLZXlUeXBlOgorICAgICAgICB0cyA8PCAiZmlsdGVyPSI7CisgICAgICAgIGlmICh2
YWx1ZS5maWx0ZXJWYWx1ZSgpKQorICAgICAgICAgICAgdHMgPDwgKnZhbHVlLmZpbHRlclZhbHVl
KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRzIDw8ICJudWxsIjsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorICAgIHJldHVybiB0czsKK30KKworVGV4dFN0cmVhbSYgb3BlcmF0b3I8PChU
ZXh0U3RyZWFtJiB0cywgY29uc3QgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6UHJvcGVydGll
cyYgYW5pbWF0aW9uKQoreworICAgIHRzIDw8ICJ0eXBlPSI7CisgICAgdHMgPDwgYW5pbWF0aW9u
LmFuaW1hdGlvblR5cGU7CisgICAgdHMgPDwgIiBrZXlQYXRoPSI7CisgICAgdHMgPDwgYW5pbWF0
aW9uLmtleVBhdGg7CisKKyAgICBpZiAoYW5pbWF0aW9uLmJlZ2luVGltZSkKKyAgICAgICAgdHMu
ZHVtcFByb3BlcnR5KCJiZWdpblRpbWUiLCBhbmltYXRpb24uYmVnaW5UaW1lKTsKKworICAgIGlm
IChhbmltYXRpb24uZHVyYXRpb24pCisgICAgICAgIHRzLmR1bXBQcm9wZXJ0eSgiZHVyYXRpb24i
LCBhbmltYXRpb24uZHVyYXRpb24pOworCisgICAgaWYgKGFuaW1hdGlvbi50aW1lT2Zmc2V0KQor
ICAgICAgICB0cy5kdW1wUHJvcGVydHkoInRpbWVPZmZzZXQiLCBhbmltYXRpb24udGltZU9mZnNl
dCk7CisKKyAgICB0cy5kdW1wUHJvcGVydHkoInJlcGVhdENvdW50IiwgYW5pbWF0aW9uLnJlcGVh
dENvdW50KTsKKworICAgIGlmIChhbmltYXRpb24uc3BlZWQgIT0gMSkKKyAgICAgICAgdHMuZHVt
cFByb3BlcnR5KCJzcGVlZCIsIGFuaW1hdGlvbi5zcGVlZCk7CisKKyAgICB0cy5kdW1wUHJvcGVy
dHkoImZpbGxNb2RlIiwgYW5pbWF0aW9uLmZpbGxNb2RlKTsKKyAgICB0cy5kdW1wUHJvcGVydHko
InZhbHVlRnVuY3Rpb24iLCBhbmltYXRpb24udmFsdWVGdW5jdGlvbik7CisKKyAgICBpZiAoYW5p
bWF0aW9uLmF1dG9SZXZlcnNlcykKKyAgICAgICAgdHMuZHVtcFByb3BlcnR5KCJhdXRvUmV2ZXJz
ZXMiLCBhbmltYXRpb24uYXV0b1JldmVyc2VzKTsKKworICAgIGlmICghYW5pbWF0aW9uLnJlbW92
ZWRPbkNvbXBsZXRpb24pCisgICAgICAgIHRzLmR1bXBQcm9wZXJ0eSgicmVtb3ZlZE9uQ29tcGxl
dGlvbiIsIGFuaW1hdGlvbi5yZW1vdmVkT25Db21wbGV0aW9uKTsKKworICAgIGlmIChhbmltYXRp
b24uYWRkaXRpdmUpCisgICAgICAgIHRzLmR1bXBQcm9wZXJ0eSgiYWRkaXRpdmUiLCBhbmltYXRp
b24uYWRkaXRpdmUpOworCisgICAgaWYgKGFuaW1hdGlvbi5yZXZlcnNlVGltaW5nRnVuY3Rpb25z
KQorICAgICAgICB0cy5kdW1wUHJvcGVydHkoInJldmVyc2VUaW1pbmdGdW5jdGlvbnMiLCBhbmlt
YXRpb24ucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyk7CisKKyAgICBpZiAoYW5pbWF0aW9uLmhhc0V4
cGxpY2l0QmVnaW5UaW1lKQorICAgICAgICB0cy5kdW1wUHJvcGVydHkoImhhc0V4cGxpY2l0QmVn
aW5UaW1lIiwgYW5pbWF0aW9uLmhhc0V4cGxpY2l0QmVnaW5UaW1lKTsKKworICAgIHRzIDw8ICJc
biI7CisgICAgdHMuaW5jcmVhc2VJbmRlbnQoKTsKKyAgICB0cy53cml0ZUluZGVudCgpOworICAg
IHRzIDw8ICIoIiA8PCAia2V5ZnJhbWVzIjsKKyAgICB0cy5pbmNyZWFzZUluZGVudCgpOworCisg
ICAgc2l6ZV90IG1heEZyYW1lcyA9IHN0ZDo6bWF4KGFuaW1hdGlvbi5rZXlWYWx1ZXMuc2l6ZSgp
LCBhbmltYXRpb24ua2V5VGltZXMuc2l6ZSgpKTsKKyAgICBtYXhGcmFtZXMgPSBzdGQ6Om1heCht
YXhGcmFtZXMsIGFuaW1hdGlvbi50aW1pbmdGdW5jdGlvbnMuc2l6ZSgpKTsKKworICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgbWF4RnJhbWVzOyArK2kpIHsKKyAgICAgICAgdHMgPDwgIlxuIjsK
KyAgICAgICAgdHMud3JpdGVJbmRlbnQoKTsKKyAgICAgICAgdHMgPDwgIihrZXlmcmFtZSAiIDw8
IHVuc2lnbmVkKGkpOworICAgICAgICBpZiAoaSA8IGFuaW1hdGlvbi5rZXlUaW1lcy5zaXplKCkp
CisgICAgICAgICAgICB0cy5kdW1wUHJvcGVydHkoInRpbWUiLCBhbmltYXRpb24ua2V5VGltZXNb
aV0pOworCisgICAgICAgIGlmIChpIDwgYW5pbWF0aW9uLnRpbWluZ0Z1bmN0aW9ucy5zaXplKCkg
JiYgYW5pbWF0aW9uLnRpbWluZ0Z1bmN0aW9uc1tpXSkKKyAgICAgICAgICAgIHRzLmR1bXBQcm9w
ZXJ0eTxjb25zdCBUaW1pbmdGdW5jdGlvbiY+KCJ0aW1pbmcgZnVuY3Rpb24iLCAqYW5pbWF0aW9u
LnRpbWluZ0Z1bmN0aW9uc1tpXSk7CisKKyAgICAgICAgaWYgKGkgPCBhbmltYXRpb24ua2V5VmFs
dWVzLnNpemUoKSkKKyAgICAgICAgICAgIHRzLmR1bXBQcm9wZXJ0eSgidmFsdWUiLCBhbmltYXRp
b24ua2V5VmFsdWVzW2ldKTsKKworICAgICAgICB0cyA8PCAiKSI7CisgICAgfQorCisgICAgdHMu
ZGVjcmVhc2VJbmRlbnQoKTsKKyAgICB0cy5kZWNyZWFzZUluZGVudCgpOworCisgICAgcmV0dXJu
IHRzOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJL
aXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5
ZXJSZW1vdGUuY3BwIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVt
b3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGQxNGVl
ZDgxMTc3MGZmZDA0OTUxZTkyYjAxMjEzNTY2YzVlMGJkZgotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9QbGF0
Zm9ybUNBTGF5ZXJSZW1vdGUuY3BwCkBAIC0wLDAgKzEsODUzIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2ltcG9y
dCAiUGxhdGZvcm1DQUxheWVyUmVtb3RlLmgiCisKKyNpbXBvcnQgIlBsYXRmb3JtQ0FMYXllclJl
bW90ZUN1c3RvbS5oIgorI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5n
LmgiCisjaW1wb3J0ICJSZW1vdGVMYXllckJhY2tpbmdTdG9yZS5oIgorI2ltcG9ydCAiUmVtb3Rl
TGF5ZXJUcmVlQ29udGV4dC5oIgorI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlUHJvcGVydHlBcHBs
aWVyLmgiCisjaW1wb3J0IDxXZWJDb3JlL0FuaW1hdGlvblV0aWxpdGllcy5oPgorI2ltcG9ydCA8
V2ViQ29yZS9HcmFwaGljc0NvbnRleHQuaD4KKyNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NMYXll
ckNBLmg+CisjaW1wb3J0IDxXZWJDb3JlL0xlbmd0aEZ1bmN0aW9ucy5oPgorI2ltcG9ydCA8V2Vi
Q29yZS9QbGF0Zm9ybUNBRmlsdGVycy5oPgorI2ltcG9ydCA8V2ViQ29yZS9QbGF0Zm9ybUNBTGF5
ZXJDb2NvYS5oPgorI2ltcG9ydCA8V2ViQ29yZS9UaWxlZEJhY2tpbmcuaD4KKyNpbXBvcnQgPHd0
Zi9DdXJyZW50VGltZS5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNl
IFdlYktpdCB7CisKK1JlZjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+IFBsYXRmb3JtQ0FMYXllclJl
bW90ZTo6Y3JlYXRlKExheWVyVHlwZSBsYXllclR5cGUsIFBsYXRmb3JtQ0FMYXllckNsaWVudCog
b3duZXIsIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmIGNvbnRleHQpCit7CisgICAgUmVmUHRyPFBs
YXRmb3JtQ0FMYXllclJlbW90ZT4gbGF5ZXI7CisKKyAgICBpZiAobGF5ZXJUeXBlID09IExheWVy
VHlwZVRpbGVkQmFja2luZ0xheWVyIHx8ICBsYXllclR5cGUgPT0gTGF5ZXJUeXBlUGFnZVRpbGVk
QmFja2luZ0xheWVyKQorICAgICAgICBsYXllciA9IGFkb3B0UmVmKG5ldyBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGVUaWxlZEJhY2tpbmcobGF5ZXJUeXBlLCBvd25lciwgY29udGV4dCkpOworICAgIGVs
c2UKKyAgICAgICAgbGF5ZXIgPSBhZG9wdFJlZihuZXcgUGxhdGZvcm1DQUxheWVyUmVtb3RlKGxh
eWVyVHlwZSwgb3duZXIsIGNvbnRleHQpKTsKKworICAgIGNvbnRleHQubGF5ZXJXYXNDcmVhdGVk
KCpsYXllciwgbGF5ZXJUeXBlKTsKKworICAgIHJldHVybiBsYXllci5yZWxlYXNlTm9uTnVsbCgp
OworfQorCitSZWY8UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6
OmNyZWF0ZShQbGF0Zm9ybUxheWVyICpwbGF0Zm9ybUxheWVyLCBQbGF0Zm9ybUNBTGF5ZXJDbGll
bnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250ZXh0KQoreworICAgIHJldHVy
biBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b206OmNyZWF0ZShwbGF0Zm9ybUxheWVyLCBvd25l
ciwgY29udGV4dCk7Cit9CisKK1JlZjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+IFBsYXRmb3JtQ0FM
YXllclJlbW90ZTo6Y3JlYXRlKGNvbnN0IFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgb3RoZXIsIFdl
YkNvcmU6OlBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIsIFJlbW90ZUxheWVyVHJlZUNvbnRl
eHQmIGNvbnRleHQpCit7CisgICAgYXV0byBsYXllciA9IGFkb3B0UmVmKCpuZXcgUGxhdGZvcm1D
QUxheWVyUmVtb3RlKG90aGVyLCBvd25lciwgY29udGV4dCkpOworCisgICAgY29udGV4dC5sYXll
cldhc0NyZWF0ZWQobGF5ZXIuZ2V0KCksIG90aGVyLmxheWVyVHlwZSgpKTsKKworICAgIHJldHVy
biBsYXllcjsKK30KKworUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGUoTGF5ZXJUeXBlIGxheWVyVHlwZSwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVt
b3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCkKKyAgICA6IFBsYXRmb3JtQ0FMYXllcihsYXll
clR5cGUsIG93bmVyKQorICAgICwgbV9jb250ZXh0KCZjb250ZXh0KQoreworICAgIGlmIChvd25l
ciAmJiBsYXllclR5cGUgIT0gTGF5ZXJUeXBlQ29udGVudHNQcm92aWRlZExheWVyICYmIGxheWVy
VHlwZSAhPSBMYXllclR5cGVUcmFuc2Zvcm1MYXllcikgeworICAgICAgICBtX3Byb3BlcnRpZXMu
Y29udGVudHNTY2FsZSA9IG93bmVyLT5wbGF0Zm9ybUNBTGF5ZXJEZXZpY2VTY2FsZUZhY3Rvcigp
OworICAgICAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVy
VHJlZVRyYW5zYWN0aW9uOjpDb250ZW50c1NjYWxlQ2hhbmdlZCk7CisgICAgfQorfQorCitQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6OlBsYXRmb3JtQ0FMYXllclJlbW90ZShjb25zdCBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGUmIG90aGVyLCBQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVM
YXllclRyZWVDb250ZXh0JiBjb250ZXh0KQorICAgIDogUGxhdGZvcm1DQUxheWVyKG90aGVyLmxh
eWVyVHlwZSgpLCBvd25lcikKKyAgICAsIG1fYWNjZWxlcmF0ZXNEcmF3aW5nKG90aGVyLmFjY2Vs
ZXJhdGVzRHJhd2luZygpKQorICAgICwgbV9jb250ZXh0KCZjb250ZXh0KQoreworfQorCitSZWY8
UGxhdGZvcm1DQUxheWVyPiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNsb25lKFBsYXRmb3JtQ0FM
YXllckNsaWVudCogb3duZXIpIGNvbnN0Cit7CisgICAgYXV0byBjbG9uZSA9IFBsYXRmb3JtQ0FM
YXllclJlbW90ZTo6Y3JlYXRlKCp0aGlzLCBvd25lciwgKm1fY29udGV4dCk7CisKKyAgICB1cGRh
dGVDbG9uZWRMYXllclByb3BlcnRpZXMoY2xvbmUpOworCisgICAgY2xvbmUtPnNldENsb25lZExh
eWVyKHRoaXMpOworICAgIHJldHVybiBXVEZNb3ZlKGNsb25lKTsKK30KKworUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjp+UGxhdGZvcm1DQUxheWVyUmVtb3RlKCkKK3sKKyAgICBmb3IgKGNvbnN0IGF1
dG8mIGxheWVyIDogbV9jaGlsZHJlbikKKyAgICAgICAgZG93bmNhc3Q8UGxhdGZvcm1DQUxheWVy
UmVtb3RlPigqbGF5ZXIpLm1fc3VwZXJsYXllciA9IG51bGxwdHI7CisKKyAgICBpZiAobV9jb250
ZXh0KQorICAgICAgICBtX2NvbnRleHQtPmxheWVyV2lsbEJlRGVzdHJveWVkKCp0aGlzKTsKK30K
Kwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnVwZGF0ZUNsb25lZExheWVyUHJvcGVydGll
cyhQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmIGNsb25lLCBib29sIGNvcHlDb250ZW50cykgY29uc3QK
K3sKKyAgICBjbG9uZS5zZXRQb3NpdGlvbihwb3NpdGlvbigpKTsKKyAgICBjbG9uZS5zZXRCb3Vu
ZHMoYm91bmRzKCkpOworICAgIGNsb25lLnNldEFuY2hvclBvaW50KGFuY2hvclBvaW50KCkpOwor
CisgICAgaWYgKG1fcHJvcGVydGllcy50cmFuc2Zvcm0pCisgICAgICAgIGNsb25lLnNldFRyYW5z
Zm9ybSgqbV9wcm9wZXJ0aWVzLnRyYW5zZm9ybSk7CisKKyAgICBpZiAobV9wcm9wZXJ0aWVzLnN1
YmxheWVyVHJhbnNmb3JtKQorICAgICAgICBjbG9uZS5zZXRTdWJsYXllclRyYW5zZm9ybSgqbV9w
cm9wZXJ0aWVzLnN1YmxheWVyVHJhbnNmb3JtKTsKKworICAgIGlmIChjb3B5Q29udGVudHMpCisg
ICAgICAgIGNsb25lLnNldENvbnRlbnRzKGNvbnRlbnRzKCkpOworCisgICAgY2xvbmUuc2V0TWFz
a3NUb0JvdW5kcyhtYXNrc1RvQm91bmRzKCkpOworICAgIGNsb25lLnNldERvdWJsZVNpZGVkKGlz
RG91YmxlU2lkZWQoKSk7CisgICAgY2xvbmUuc2V0T3BhcXVlKGlzT3BhcXVlKCkpOworICAgIGNs
b25lLnNldEJhY2tncm91bmRDb2xvcihiYWNrZ3JvdW5kQ29sb3IoKSk7CisgICAgY2xvbmUuc2V0
Q29udGVudHNTY2FsZShjb250ZW50c1NjYWxlKCkpOworICAgIGNsb25lLnNldENvcm5lclJhZGl1
cyhjb3JuZXJSYWRpdXMoKSk7CisKKyAgICBpZiAoIW1fcHJvcGVydGllcy5zaGFwZVBhdGguaXNO
dWxsKCkpCisgICAgICAgIGNsb25lLnNldFNoYXBlUGF0aChtX3Byb3BlcnRpZXMuc2hhcGVQYXRo
KTsKKworICAgIGlmIChtX3Byb3BlcnRpZXMuc2hhcGVSb3VuZGVkUmVjdCkKKyAgICAgICAgY2xv
bmUuc2V0U2hhcGVSb3VuZGVkUmVjdCgqbV9wcm9wZXJ0aWVzLnNoYXBlUm91bmRlZFJlY3QpOwor
CisgICAgaWYgKG1fcHJvcGVydGllcy5maWx0ZXJzKQorICAgICAgICBjbG9uZS5jb3B5RmlsdGVy
c0Zyb20oKnRoaXMpOworCisgICAgY2xvbmUudXBkYXRlQ3VzdG9tQXBwZWFyYW5jZShjdXN0b21B
cHBlYXJhbmNlKCkpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVjdXJzaXZl
QnVpbGRUcmFuc2FjdGlvbihSZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250ZXh0LCBSZW1vdGVM
YXllclRyZWVUcmFuc2FjdGlvbiYgdHJhbnNhY3Rpb24pCit7CisgICAgQVNTRVJUKCFtX3Byb3Bl
cnRpZXMuYmFja2luZ1N0b3JlIHx8IG93bmVyKCkpOworICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZ
X0lNUExJQ0FUSU9OKCZjb250ZXh0ID09IG1fY29udGV4dCk7CisgICAgCisgICAgaWYgKG1fcHJv
cGVydGllcy5iYWNraW5nU3RvcmUgJiYgKCFvd25lcigpIHx8ICFvd25lcigpLT5wbGF0Zm9ybUNB
TGF5ZXJEcmF3c0NvbnRlbnQoKSkpIHsKKyAgICAgICAgbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9y
ZSA9IG51bGxwdHI7CisgICAgICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQo
UmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkJhY2tpbmdTdG9yZUNoYW5nZWQpOworICAgIH0K
KworICAgIGlmIChtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlICYmIG1fcHJvcGVydGllcy5iYWNr
aW5nU3RvcmVBdHRhY2hlZCAmJiBtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlLT5kaXNwbGF5KCkp
CisgICAgICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJU
cmVlVHJhbnNhY3Rpb246OkJhY2tpbmdTdG9yZUNoYW5nZWQpOworCisgICAgaWYgKG1fcHJvcGVy
dGllcy5jaGFuZ2VkUHJvcGVydGllcyAhPSBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Tm9D
aGFuZ2UpIHsKKyAgICAgICAgaWYgKG1fcHJvcGVydGllcy5jaGFuZ2VkUHJvcGVydGllcyAmIFJl
bW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDaGlsZHJlbkNoYW5nZWQpIHsKKyAgICAgICAgICAg
IG1fcHJvcGVydGllcy5jaGlsZHJlbi5yZXNpemUobV9jaGlsZHJlbi5zaXplKCkpOworICAgICAg
ICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgKytpKQorICAg
ICAgICAgICAgICAgIG1fcHJvcGVydGllcy5jaGlsZHJlbltpXSA9IG1fY2hpbGRyZW5baV0tPmxh
eWVySUQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1BsYXRmb3JtQ0FMYXllclJlbW90
ZUN1c3RvbSgpKSB7CisgICAgICAgICAgICBSZW1vdGVMYXllclRyZWVQcm9wZXJ0eUFwcGxpZXI6
OmFwcGx5UHJvcGVydGllcyhwbGF0Zm9ybUxheWVyKCksIG51bGxwdHIsIG1fcHJvcGVydGllcywg
UmVtb3RlTGF5ZXJUcmVlUHJvcGVydHlBcHBsaWVyOjpSZWxhdGVkTGF5ZXJNYXAoKSwgUmVtb3Rl
TGF5ZXJCYWNraW5nU3RvcmU6OkxheWVyQ29udGVudHNUeXBlOjpDQU1hY2hQb3J0KTsKKyAgICAg
ICAgICAgIGRpZENvbW1pdCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAg
ICAgICAgdHJhbnNhY3Rpb24ubGF5ZXJQcm9wZXJ0aWVzQ2hhbmdlZCgqdGhpcyk7CisgICAgfQor
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgKytpKSB7Cisg
ICAgICAgIFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgY2hpbGQgPSBkb3duY2FzdDxQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU+KCptX2NoaWxkcmVuW2ldKTsKKyAgICAgICAgQVNTRVJUKGNoaWxkLnN1cGVy
bGF5ZXIoKSA9PSB0aGlzKTsKKyAgICAgICAgY2hpbGQucmVjdXJzaXZlQnVpbGRUcmFuc2FjdGlv
bihjb250ZXh0LCB0cmFuc2FjdGlvbik7CisgICAgfQorCisgICAgaWYgKG1fbWFza0xheWVyKQor
ICAgICAgICBtX21hc2tMYXllci0+cmVjdXJzaXZlQnVpbGRUcmFuc2FjdGlvbihjb250ZXh0LCB0
cmFuc2FjdGlvbik7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpkaWRDb21taXQo
KQoreworICAgIG1fcHJvcGVydGllcy5hZGRlZEFuaW1hdGlvbnMuY2xlYXIoKTsKKyAgICBtX3By
b3BlcnRpZXMua2V5UGF0aHNPZkFuaW1hdGlvbnNUb1JlbW92ZS5jbGVhcigpOworICAgIG1fcHJv
cGVydGllcy5yZXNldENoYW5nZWRQcm9wZXJ0aWVzKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjplbnN1cmVCYWNraW5nU3RvcmUoKQoreworICAgIEFTU0VSVChvd25lcigpKTsK
KyAgICAKKyAgICBpZiAoIW1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUpCisgICAgICAgIG1fcHJv
cGVydGllcy5iYWNraW5nU3RvcmUgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlbW90ZUxheWVyQmFja2lu
Z1N0b3JlPih0aGlzKTsKKworICAgIHVwZGF0ZUJhY2tpbmdTdG9yZSgpOworfQorCit2b2lkIFBs
YXRmb3JtQ0FMYXllclJlbW90ZTo6dXBkYXRlQmFja2luZ1N0b3JlKCkKK3sKKyAgICBpZiAoIW1f
cHJvcGVydGllcy5iYWNraW5nU3RvcmUpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcHJvcGVy
dGllcy5iYWNraW5nU3RvcmUtPmVuc3VyZUJhY2tpbmdTdG9yZShtX3Byb3BlcnRpZXMuYm91bmRz
LnNpemUoKSwgbV9wcm9wZXJ0aWVzLmNvbnRlbnRzU2NhbGUsIG1fYWNjZWxlcmF0ZXNEcmF3aW5n
LCBtX3dhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlLCBtX3Byb3BlcnRpZXMub3BhcXVlKTsKK30K
Kwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldE5lZWRzRGlzcGxheUluUmVjdChjb25z
dCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgZW5zdXJlQmFja2luZ1N0b3JlKCk7CisKKyAgICAv
LyBGSVhNRTogTmVlZCB0byBtYXAgdGhpcyB0aHJvdWdoIGNvbnRlbnRzUmVjdC9ldGMuCisgICAg
bV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZS0+c2V0TmVlZHNEaXNwbGF5KGVuY2xvc2luZ0ludFJl
Y3QocmVjdCkpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TmVlZHNEaXNw
bGF5KCkKK3sKKyAgICBlbnN1cmVCYWNraW5nU3RvcmUoKTsKKworICAgIG1fcHJvcGVydGllcy5i
YWNraW5nU3RvcmUtPnNldE5lZWRzRGlzcGxheSgpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6Y29weUNvbnRlbnRzRnJvbUxheWVyKFBsYXRmb3JtQ0FMYXllciogbGF5ZXIpCit7
CisgICAgQVNTRVJUKG1fcHJvcGVydGllcy5jbG9uZWRMYXllcklEID09IGxheWVyLT5sYXllcklE
KCkpOworICAgIAorICAgIGlmICghbV9wcm9wZXJ0aWVzLmNoYW5nZWRQcm9wZXJ0aWVzKQorICAg
ICAgICBtX2NvbnRleHQtPmxheWVyUHJvcGVydHlDaGFuZ2VkV2hpbGVCdWlsZGluZ1RyYW5zYWN0
aW9uKCp0aGlzKTsKKworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNsb25lZENvbnRlbnRzQ2hhbmdlZCk7Cit9CisKK1Bs
YXRmb3JtQ0FMYXllciogUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzdXBlcmxheWVyKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV9zdXBlcmxheWVyOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJl
bW90ZTo6cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKQoreworICAgIGlmICghbV9zdXBlcmxheWVyKQor
ICAgICAgICByZXR1cm47CisKKyAgICBtX3N1cGVybGF5ZXItPnJlbW92ZVN1YmxheWVyKHRoaXMp
OworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVtb3ZlU3VibGF5ZXIoUGxhdGZv
cm1DQUxheWVyUmVtb3RlKiBsYXllcikKK3sKKyAgICBzaXplX3QgY2hpbGRJbmRleCA9IG1fY2hp
bGRyZW4uZmluZChsYXllcik7CisgICAgaWYgKGNoaWxkSW5kZXggIT0gbm90Rm91bmQpCisgICAg
ICAgIG1fY2hpbGRyZW4ucmVtb3ZlKGNoaWxkSW5kZXgpOworICAgIGxheWVyLT5tX3N1cGVybGF5
ZXIgPSBudWxscHRyOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNoaWxkcmVuQ2hhbmdlZCk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1DQUxheWVyUmVtb3RlOjpzZXRTdWJsYXllcnMoY29uc3QgUGxhdGZvcm1DQUxheWVyTGlz
dCYgbGlzdCkKK3sKKyAgICByZW1vdmVBbGxTdWJsYXllcnMoKTsKKyAgICBtX2NoaWxkcmVuID0g
bGlzdDsKKworICAgIGZvciAoY29uc3QgYXV0byYgbGF5ZXIgOiBsaXN0KSB7CisgICAgICAgIGxh
eWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOworICAgICAgICBkb3duY2FzdDxQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU+KCpsYXllcikubV9zdXBlcmxheWVyID0gdGhpczsKKyAgICB9CisKKyAgICBt
X3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0
aW9uOjpDaGlsZHJlbkNoYW5nZWQpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
cmVtb3ZlQWxsU3VibGF5ZXJzKCkKK3sKKyAgICBQbGF0Zm9ybUNBTGF5ZXJMaXN0IGxheWVyc1Rv
UmVtb3ZlID0gbV9jaGlsZHJlbjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGxheWVyIDogbGF5ZXJz
VG9SZW1vdmUpCisgICAgICAgIGxheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOworICAgIEFT
U0VSVChtX2NoaWxkcmVuLmlzRW1wdHkoKSk7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0
aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q2hpbGRyZW5DaGFuZ2VkKTsK
K30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmFwcGVuZFN1YmxheWVyKFBsYXRmb3Jt
Q0FMYXllciYgbGF5ZXIpCit7CisgICAgUmVmPFBsYXRmb3JtQ0FMYXllcj4gbGF5ZXJQcm90ZWN0
b3IobGF5ZXIpOworCisgICAgbGF5ZXIucmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKKyAgICBtX2No
aWxkcmVuLmFwcGVuZCgmbGF5ZXIpOworICAgIGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90
ZT4obGF5ZXIpLm1fc3VwZXJsYXllciA9IHRoaXM7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9w
ZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q2hpbGRyZW5DaGFuZ2Vk
KTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6Omluc2VydFN1YmxheWVyKFBsYXRm
b3JtQ0FMYXllciYgbGF5ZXIsIHNpemVfdCBpbmRleCkKK3sKKyAgICBSZWY8UGxhdGZvcm1DQUxh
eWVyPiBsYXllclByb3RlY3RvcihsYXllcik7CisKKyAgICBsYXllci5yZW1vdmVGcm9tU3VwZXJs
YXllcigpOworICAgIG1fY2hpbGRyZW4uaW5zZXJ0KGluZGV4LCAmbGF5ZXIpOworICAgIGRvd25j
YXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4obGF5ZXIpLm1fc3VwZXJsYXllciA9IHRoaXM7Cisg
ICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFu
c2FjdGlvbjo6Q2hpbGRyZW5DaGFuZ2VkKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6OnJlcGxhY2VTdWJsYXllcihQbGF0Zm9ybUNBTGF5ZXImIHJlZmVyZW5jZSwgUGxhdGZvcm1D
QUxheWVyJiBsYXllcikKK3sKKyAgICBBU1NFUlQocmVmZXJlbmNlLnN1cGVybGF5ZXIoKSA9PSB0
aGlzKTsKKyAgICBSZWY8UGxhdGZvcm1DQUxheWVyPiBsYXllclByb3RlY3RvcihsYXllcik7CisK
KyAgICBsYXllci5yZW1vdmVGcm9tU3VwZXJsYXllcigpOworICAgIHNpemVfdCByZWZlcmVuY2VJ
bmRleCA9IG1fY2hpbGRyZW4uZmluZCgmcmVmZXJlbmNlKTsKKyAgICBpZiAocmVmZXJlbmNlSW5k
ZXggIT0gbm90Rm91bmQpIHsKKyAgICAgICAgbV9jaGlsZHJlbltyZWZlcmVuY2VJbmRleF0tPnJl
bW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgICAgIG1fY2hpbGRyZW4uaW5zZXJ0KHJlZmVyZW5j
ZUluZGV4LCAmbGF5ZXIpOworICAgICAgICBkb3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+
KGxheWVyKS5tX3N1cGVybGF5ZXIgPSB0aGlzOworICAgIH0KKworICAgIG1fcHJvcGVydGllcy5u
b3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNoaWxkcmVu
Q2hhbmdlZCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjphZG9wdFN1YmxheWVy
cyhQbGF0Zm9ybUNBTGF5ZXImIHNvdXJjZSkKK3sKKyAgICBQbGF0Zm9ybUNBTGF5ZXJMaXN0IGxh
eWVyc1RvTW92ZSA9IGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4oc291cmNlKS5tX2No
aWxkcmVuOworCisgICAgaWYgKGNvbnN0IFBsYXRmb3JtQ0FMYXllckxpc3QqIGN1c3RvbUxheWVy
cyA9IHNvdXJjZS5jdXN0b21TdWJsYXllcnMoKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8m
IGxheWVyIDogKmN1c3RvbUxheWVycykgeworICAgICAgICAgICAgc2l6ZV90IGxheWVySW5kZXgg
PSBsYXllcnNUb01vdmUuZmluZChsYXllcik7CisgICAgICAgICAgICBpZiAobGF5ZXJJbmRleCAh
PSBub3RGb3VuZCkKKyAgICAgICAgICAgICAgICBsYXllcnNUb01vdmUucmVtb3ZlKGxheWVySW5k
ZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgc2V0U3VibGF5ZXJzKGxheWVyc1RvTW92ZSk7
Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjphZGRBbmltYXRpb25Gb3JLZXkoY29u
c3QgU3RyaW5nJiBrZXksIFBsYXRmb3JtQ0FBbmltYXRpb24mIGFuaW1hdGlvbikKK3sKKyAgICBh
dXRvIGFkZFJlc3VsdCA9IG1fYW5pbWF0aW9ucy5zZXQoa2V5LCAmYW5pbWF0aW9uKTsKKyAgICBp
ZiAoYWRkUmVzdWx0LmlzTmV3RW50cnkpCisgICAgICAgIG1fcHJvcGVydGllcy5hZGRlZEFuaW1h
dGlvbnMuYXBwZW5kKHN0ZDo6cGFpcjxTdHJpbmcsIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6
OlByb3BlcnRpZXM+KGtleSwgZG93bmNhc3Q8UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4oYW5p
bWF0aW9uKS5wcm9wZXJ0aWVzKCkpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChhdXRvJiBr
ZXlBbmltYXRpb25QYWlyIDogbV9wcm9wZXJ0aWVzLmFkZGVkQW5pbWF0aW9ucykgeworICAgICAg
ICAgICAgaWYgKGtleUFuaW1hdGlvblBhaXIuZmlyc3QgPT0ga2V5KSB7CisgICAgICAgICAgICAg
ICAga2V5QW5pbWF0aW9uUGFpci5zZWNvbmQgPSBkb3duY2FzdDxQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlPihhbmltYXRpb24pLnByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBtX3Byb3BlcnRpZXMu
bm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpBbmltYXRp
b25zQ2hhbmdlZCk7CisKKyAgICBpZiAobV9jb250ZXh0KQorICAgICAgICBtX2NvbnRleHQtPndp
bGxTdGFydEFuaW1hdGlvbk9uTGF5ZXIoKnRoaXMpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6cmVtb3ZlQW5pbWF0aW9uRm9yS2V5KGNvbnN0IFN0cmluZyYga2V5KQoreworICAg
IGlmIChtX2FuaW1hdGlvbnMucmVtb3ZlKGtleSkpIHsKKyAgICAgICAgbV9wcm9wZXJ0aWVzLmFk
ZGVkQW5pbWF0aW9ucy5yZW1vdmVGaXJzdE1hdGNoaW5nKFsma2V5XShhdXRvJiBwYWlyKSB7Cisg
ICAgICAgICAgICByZXR1cm4gcGFpci5maXJzdCA9PSBrZXk7CisgICAgICAgIH0pOworICAgIH0K
KyAgICBtX3Byb3BlcnRpZXMua2V5UGF0aHNPZkFuaW1hdGlvbnNUb1JlbW92ZS5hZGQoa2V5KTsK
KyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRy
YW5zYWN0aW9uOjpBbmltYXRpb25zQ2hhbmdlZCk7Cit9CisKK1JlZlB0cjxQbGF0Zm9ybUNBQW5p
bWF0aW9uPiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmFuaW1hdGlvbkZvcktleShjb25zdCBTdHJp
bmcmIGtleSkKK3sKKyAgICByZXR1cm4gbV9hbmltYXRpb25zLmdldChrZXkpOworfQorCitzdGF0
aWMgaW5saW5lIGJvb2wgaXNFcXVpdmFsZW50TGF5ZXIoY29uc3QgUGxhdGZvcm1DQUxheWVyKiBs
YXllciwgR3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklEIGxheWVySUQpCit7CisgICAgR3Jh
cGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklEIG5ld0xheWVySUQgPSBsYXllciA/IGxheWVyLT5s
YXllcklEKCkgOiAwOworICAgIHJldHVybiBsYXllcklEID09IG5ld0xheWVySUQ7Cit9CisKK3Zv
aWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjphbmltYXRpb25TdGFydGVkKGNvbnN0IFN0cmluZyYg
a2V5LCBDRlRpbWVJbnRlcnZhbCBiZWdpblRpbWUpCit7CisgICAgYXV0byBpdCA9IG1fYW5pbWF0
aW9ucy5maW5kKGtleSk7CisgICAgaWYgKGl0ICE9IG1fYW5pbWF0aW9ucy5lbmQoKSkKKyAgICAg
ICAgZG93bmNhc3Q8UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4oKml0LT52YWx1ZSkuZGlkU3Rh
cnQoYmVnaW5UaW1lKTsKKyAgICAKKyAgICBpZiAobV9vd25lcikKKyAgICAgICAgbV9vd25lci0+
cGxhdGZvcm1DQUxheWVyQW5pbWF0aW9uU3RhcnRlZChrZXksIGJlZ2luVGltZSk7Cit9CisKK3Zv
aWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjphbmltYXRpb25FbmRlZChjb25zdCBTdHJpbmcmIGtl
eSkKK3sKKyAgICBpZiAobV9vd25lcikKKyAgICAgICAgbV9vd25lci0+cGxhdGZvcm1DQUxheWVy
QW5pbWF0aW9uRW5kZWQoa2V5KTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNl
dE1hc2soUGxhdGZvcm1DQUxheWVyKiBsYXllcikKK3sKKyAgICBpZiAoaXNFcXVpdmFsZW50TGF5
ZXIobGF5ZXIsIG1fcHJvcGVydGllcy5tYXNrTGF5ZXJJRCkpCisgICAgICAgIHJldHVybjsKKyAg
ICAKKyAgICBpZiAobGF5ZXIpIHsKKyAgICAgICAgbV9tYXNrTGF5ZXIgPSBkb3duY2FzdDxQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU+KGxheWVyKTsKKyAgICAgICAgbV9wcm9wZXJ0aWVzLm1hc2tMYXll
cklEID0gbV9tYXNrTGF5ZXItPmxheWVySUQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX21h
c2tMYXllciA9IG51bGxwdHI7CisgICAgICAgIG1fcHJvcGVydGllcy5tYXNrTGF5ZXJJRCA9IDA7
CisgICAgfQorCisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVM
YXllclRyZWVUcmFuc2FjdGlvbjo6TWFza0xheWVyQ2hhbmdlZCk7Cit9CisKK3ZvaWQgUGxhdGZv
cm1DQUxheWVyUmVtb3RlOjpzZXRDbG9uZWRMYXllcihjb25zdCBQbGF0Zm9ybUNBTGF5ZXIqIGxh
eWVyKQoreworICAgIGlmIChpc0VxdWl2YWxlbnRMYXllcihsYXllciwgbV9wcm9wZXJ0aWVzLmNs
b25lZExheWVySUQpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobGF5ZXIpCisgICAgICAg
IG1fcHJvcGVydGllcy5jbG9uZWRMYXllcklEID0gbGF5ZXItPmxheWVySUQoKTsKKyAgICBlbHNl
CisgICAgICAgIG1fcHJvcGVydGllcy5jbG9uZWRMYXllcklEID0gMDsKKworICAgIG1fcHJvcGVy
dGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNs
b25lZENvbnRlbnRzQ2hhbmdlZCk7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpp
c09wYXF1ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5vcGFxdWU7Cit9CisK
K3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRPcGFxdWUoYm9vbCB2YWx1ZSkKK3sKKyAg
ICBtX3Byb3BlcnRpZXMub3BhcXVlID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9w
ZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6T3BhcXVlQ2hhbmdlZCk7
CisKKyAgICB1cGRhdGVCYWNraW5nU3RvcmUoKTsKK30KKworRmxvYXRSZWN0IFBsYXRmb3JtQ0FM
YXllclJlbW90ZTo6Ym91bmRzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmJv
dW5kczsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEJvdW5kcyhjb25zdCBG
bG9hdFJlY3QmIHZhbHVlKQoreworICAgIGlmICh2YWx1ZSA9PSBtX3Byb3BlcnRpZXMuYm91bmRz
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3BlcnRpZXMuYm91bmRzID0gdmFsdWU7Cisg
ICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFu
c2FjdGlvbjo6Qm91bmRzQ2hhbmdlZCk7CisgICAgCisgICAgaWYgKHJlcXVpcmVzQ3VzdG9tQXBw
ZWFyYW5jZVVwZGF0ZU9uQm91bmRzQ2hhbmdlKCkpCisgICAgICAgIG1fcHJvcGVydGllcy5ub3Rl
UHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkN1c3RvbUFwcGVh
cmFuY2VDaGFuZ2VkKTsKKworICAgIHVwZGF0ZUJhY2tpbmdTdG9yZSgpOworfQorCitGbG9hdFBv
aW50M0QgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpwb3NpdGlvbigpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fcHJvcGVydGllcy5wb3NpdGlvbjsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6OnNldFBvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQzRCYgdmFsdWUpCit7CisgICAgLy8gV2Ug
Y2FuJ3QgZWFybHkgcmV0dXJuIGhlcmUgaWYgdGhlIHBvc2l0aW9uIGhhcyBub3QgY2hhbmdlZCwg
c2luY2UgR3JhcGhpY3NMYXllckNBOjpzeW5jUG9zaXRpb24oKSBtYXkgaGF2ZSBjaGFuZ2VkCisg
ICAgLy8gdGhlIEdyYXBoaWNzTGF5ZXIgcG9zaXRpb24gKHdoaWNoIGRvZXNuJ3QgZm9yY2UgYSBn
ZW9tZXRyeSB1cGRhdGUpIGJ1dCB3ZSB3YW50IGEgc3Vic2VxdWVudCBHcmFwaGljc0xheWVyQ0E6
OnNldFBvc2l0aW9uKCkKKyAgICAvLyB0byBwdXNoIGEgbmV3IHBvc2l0aW9uIHRvIHRoZSBVSSBw
cm9jZXNzLCBldmVuIHRob3VnaCBvdXIgbV9wcm9wZXJ0aWVzLnBvc2l0aW9uIGhhc24ndCBjaGFu
Z2VkLgorICAgIG1fcHJvcGVydGllcy5wb3NpdGlvbiA9IHZhbHVlOworICAgIG1fcHJvcGVydGll
cy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlBvc2l0
aW9uQ2hhbmdlZCk7Cit9CisKK0Zsb2F0UG9pbnQzRCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmFu
Y2hvclBvaW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmFuY2hvclBvaW50
OworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0QW5jaG9yUG9pbnQoY29uc3Qg
RmxvYXRQb2ludDNEJiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPT0gbV9wcm9wZXJ0aWVzLmFu
Y2hvclBvaW50KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3BlcnRpZXMuYW5jaG9yUG9p
bnQgPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90
ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpBbmNob3JQb2ludENoYW5nZWQpOworfQorCitUcmFuc2Zv
cm1hdGlvbk1hdHJpeCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnRyYW5zZm9ybSgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy50cmFuc2Zvcm0gPyAqbV9wcm9wZXJ0aWVzLnRyYW5z
Zm9ybSA6IFRyYW5zZm9ybWF0aW9uTWF0cml4KCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjpzZXRUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHZhbHVlKQor
eworICAgIG1fcHJvcGVydGllcy50cmFuc2Zvcm0gPSBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zZm9y
bWF0aW9uTWF0cml4Pih2YWx1ZSk7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hh
bmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6VHJhbnNmb3JtQ2hhbmdlZCk7Cit9CisK
K1RyYW5zZm9ybWF0aW9uTWF0cml4IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c3VibGF5ZXJUcmFu
c2Zvcm0oKSBjb25zdAoreworICAgIHJldHVybiBtX3Byb3BlcnRpZXMuc3VibGF5ZXJUcmFuc2Zv
cm0gPyAqbV9wcm9wZXJ0aWVzLnN1YmxheWVyVHJhbnNmb3JtIDogVHJhbnNmb3JtYXRpb25NYXRy
aXgoKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFN1YmxheWVyVHJhbnNm
b3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB2YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRp
ZXMuc3VibGF5ZXJUcmFuc2Zvcm0gPSBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zZm9ybWF0aW9uTWF0
cml4Pih2YWx1ZSk7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1v
dGVMYXllclRyZWVUcmFuc2FjdGlvbjo6U3VibGF5ZXJUcmFuc2Zvcm1DaGFuZ2VkKTsKK30KKwor
Ym9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmlzSGlkZGVuKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9wcm9wZXJ0aWVzLmhpZGRlbjsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6
OnNldEhpZGRlbihib29sIHZhbHVlKQoreworICAgIGlmIChtX3Byb3BlcnRpZXMuaGlkZGVuID09
IHZhbHVlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3BlcnRpZXMuaGlkZGVuID0gdmFs
dWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRy
ZWVUcmFuc2FjdGlvbjo6SGlkZGVuQ2hhbmdlZCk7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjpjb250ZW50c0hpZGRlbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGll
cy5jb250ZW50c0hpZGRlbjsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldENv
bnRlbnRzSGlkZGVuKGJvb2wgdmFsdWUpCit7CisgICAgaWYgKG1fcHJvcGVydGllcy5jb250ZW50
c0hpZGRlbiA9PSB2YWx1ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVzLmNv
bnRlbnRzSGlkZGVuID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hh
bmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q29udGVudHNIaWRkZW5DaGFuZ2VkKTsK
K30KKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnVzZXJJbnRlcmFjdGlvbkVuYWJsZWQo
KSBjb25zdAoreworICAgIHJldHVybiBtX3Byb3BlcnRpZXMudXNlckludGVyYWN0aW9uRW5hYmxl
ZDsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFVzZXJJbnRlcmFjdGlvbkVu
YWJsZWQoYm9vbCB2YWx1ZSkKK3sKKyAgICBpZiAobV9wcm9wZXJ0aWVzLnVzZXJJbnRlcmFjdGlv
bkVuYWJsZWQgPT0gdmFsdWUpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBtX3Byb3BlcnRp
ZXMudXNlckludGVyYWN0aW9uRW5hYmxlZCA9IHZhbHVlOworICAgIG1fcHJvcGVydGllcy5ub3Rl
UHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlVzZXJJbnRlcmFj
dGlvbkVuYWJsZWRDaGFuZ2VkKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNl
dEJhY2tpbmdTdG9yZUF0dGFjaGVkKGJvb2wgdmFsdWUpCit7CisgICAgaWYgKG1fcHJvcGVydGll
cy5iYWNraW5nU3RvcmVBdHRhY2hlZCA9PSB2YWx1ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
bV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZUF0dGFjaGVkID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0
aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6QmFj
a2luZ1N0b3JlQXR0YWNobWVudENoYW5nZWQpOworfQorCitib29sIFBsYXRmb3JtQ0FMYXllclJl
bW90ZTo6YmFja2luZ1N0b3JlQXR0YWNoZWQoKSBjb25zdAoreworICAgIHJldHVybiBtX3Byb3Bl
cnRpZXMuYmFja2luZ1N0b3JlQXR0YWNoZWQ7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjpzZXRHZW9tZXRyeUZsaXBwZWQoYm9vbCB2YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMu
Z2VvbWV0cnlGbGlwcGVkID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVz
Q2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6R2VvbWV0cnlGbGlwcGVkQ2hhbmdl
ZCk7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpnZW9tZXRyeUZsaXBwZWQoKSBj
b25zdAoreworICAgIHJldHVybiBtX3Byb3BlcnRpZXMuZ2VvbWV0cnlGbGlwcGVkOworfQorCiti
b29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6aXNEb3VibGVTaWRlZCgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fcHJvcGVydGllcy5kb3VibGVTaWRlZDsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGU6OnNldERvdWJsZVNpZGVkKGJvb2wgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVz
LmRvdWJsZVNpZGVkID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hh
bmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6RG91YmxlU2lkZWRDaGFuZ2VkKTsKK30K
KworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6Om1hc2tzVG9Cb3VuZHMoKSBjb25zdAorewor
ICAgIHJldHVybiBtX3Byb3BlcnRpZXMubWFza3NUb0JvdW5kczsKK30KKwordm9pZCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6OnNldE1hc2tzVG9Cb3VuZHMoYm9vbCB2YWx1ZSkKK3sKKyAgICBpZiAo
dmFsdWUgPT0gbV9wcm9wZXJ0aWVzLm1hc2tzVG9Cb3VuZHMpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fcHJvcGVydGllcy5tYXNrc1RvQm91bmRzID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0aWVz
Lm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6TWFza3NU
b0JvdW5kc0NoYW5nZWQpOworfQorCitib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6YWNjZWxl
cmF0ZXNEcmF3aW5nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9hY2NlbGVyYXRlc0RyYXdpbmc7
Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRBY2NlbGVyYXRlc0RyYXdpbmco
Ym9vbCBhY2NlbGVyYXRlc0RyYXdpbmcpCit7CisgICAgbV9hY2NlbGVyYXRlc0RyYXdpbmcgPSBh
Y2NlbGVyYXRlc0RyYXdpbmc7CisgICAgdXBkYXRlQmFja2luZ1N0b3JlKCk7Cit9CisKK2Jvb2wg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjp3YW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZSgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1fd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmU7Cit9CisKK3ZvaWQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRXYW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZShib29s
IHdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKQoreworICAgIG1fd2FudHNEZWVwQ29sb3JCYWNr
aW5nU3RvcmUgPSB3YW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZTsKKyAgICB1cGRhdGVCYWNraW5n
U3RvcmUoKTsKK30KKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnN1cHBvcnRzU3VicGl4
ZWxBbnRpYWxpYXNlZFRleHQoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9p
ZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFN1cHBvcnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRl
eHQoYm9vbCkKK3sKK30KKworQ0ZUeXBlUmVmIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y29udGVu
dHMoKSBjb25zdAoreworICAgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIFBsYXRmb3JtQ0FM
YXllclJlbW90ZTo6c2V0Q29udGVudHMoQ0ZUeXBlUmVmIHZhbHVlKQoreworfQorCit2b2lkIFBs
YXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0Q29udGVudHNSZWN0KGNvbnN0IEZsb2F0UmVjdCYgdmFs
dWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLmNvbnRlbnRzUmVjdCA9IHZhbHVlOworICAgIG1fcHJv
cGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246
OkNvbnRlbnRzUmVjdENoYW5nZWQpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
c2V0TWluaWZpY2F0aW9uRmlsdGVyKEZpbHRlclR5cGUgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0
aWVzLm1pbmlmaWNhdGlvbkZpbHRlciA9IHZhbHVlOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJv
cGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246Ok1pbmlmaWNhdGlvbkZp
bHRlckNoYW5nZWQpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TWFnbmlm
aWNhdGlvbkZpbHRlcihGaWx0ZXJUeXBlIHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5tYWdu
aWZpY2F0aW9uRmlsdGVyID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVz
Q2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6TWFnbmlmaWNhdGlvbkZpbHRlckNo
YW5nZWQpOworfQorCitDb2xvciBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmJhY2tncm91bmRDb2xv
cigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5iYWNrZ3JvdW5kQ29sb3I7Cit9
CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3Qg
Q29sb3ImIHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1
ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJl
ZVRyYW5zYWN0aW9uOjpCYWNrZ3JvdW5kQ29sb3JDaGFuZ2VkKTsKK30KKwordm9pZCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6OnNldEJvcmRlcldpZHRoKGZsb2F0IHZhbHVlKQoreworICAgIGlmICh2
YWx1ZSA9PSBtX3Byb3BlcnRpZXMuYm9yZGVyV2lkdGgpCisgICAgICAgIHJldHVybjsKKworICAg
IG1fcHJvcGVydGllcy5ib3JkZXJXaWR0aCA9IHZhbHVlOworICAgIG1fcHJvcGVydGllcy5ub3Rl
UHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkJvcmRlcldpZHRo
Q2hhbmdlZCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCb3JkZXJDb2xv
cihjb25zdCBDb2xvciYgdmFsdWUpCit7CisgICAgaWYgKHZhbHVlID09IG1fcHJvcGVydGllcy5i
b3JkZXJDb2xvcikKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVzLmJvcmRlckNv
bG9yID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1v
dGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Qm9yZGVyQ29sb3JDaGFuZ2VkKTsKK30KKworZmxvYXQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpvcGFjaXR5KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9w
cm9wZXJ0aWVzLm9wYWNpdHk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRP
cGFjaXR5KGZsb2F0IHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5vcGFjaXR5ID0gdmFsdWU7
CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6T3BhY2l0eUNoYW5nZWQpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJl
bW90ZTo6c2V0RmlsdGVycyhjb25zdCBGaWx0ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKQoreworICAg
IG1fcHJvcGVydGllcy5maWx0ZXJzID0gc3RkOjptYWtlX3VuaXF1ZTxGaWx0ZXJPcGVyYXRpb25z
PihmaWx0ZXJzKTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90
ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpGaWx0ZXJzQ2hhbmdlZCk7Cit9CisKK3ZvaWQgUGxhdGZv
cm1DQUxheWVyUmVtb3RlOjpjb3B5RmlsdGVyc0Zyb20oY29uc3QgUGxhdGZvcm1DQUxheWVyJiBz
b3VyY2VMYXllcikKK3sKKyAgICBpZiAoY29uc3QgRmlsdGVyT3BlcmF0aW9ucyogZmlsdGVycyA9
IGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4oc291cmNlTGF5ZXIpLm1fcHJvcGVydGll
cy5maWx0ZXJzLmdldCgpKQorICAgICAgICBzZXRGaWx0ZXJzKCpmaWx0ZXJzKTsKKyAgICBlbHNl
IGlmIChtX3Byb3BlcnRpZXMuZmlsdGVycykKKyAgICAgICAgbV9wcm9wZXJ0aWVzLmZpbHRlcnMg
PSBudWxscHRyOworCisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1v
dGVMYXllclRyZWVUcmFuc2FjdGlvbjo6RmlsdGVyc0NoYW5nZWQpOworfQorCisjaWYgRU5BQkxF
KENTU19DT01QT1NJVElORykKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCbGVuZE1v
ZGUoQmxlbmRNb2RlIGJsZW5kTW9kZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMuYmxlbmRNb2RlID0g
YmxlbmRNb2RlOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3Rl
TGF5ZXJUcmVlVHJhbnNhY3Rpb246OkJsZW5kTW9kZUNoYW5nZWQpOworfQorI2VuZGlmCisKK2Jv
b2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpmaWx0ZXJzQ2FuQmVDb21wb3NpdGVkKGNvbnN0IEZp
bHRlck9wZXJhdGlvbnMmIGZpbHRlcnMpCit7CisgICAgcmV0dXJuIFBsYXRmb3JtQ0FMYXllckNv
Y29hOjpmaWx0ZXJzQ2FuQmVDb21wb3NpdGVkKGZpbHRlcnMpOworfQorCit2b2lkIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6c2V0TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQoreworICAgIG1fcHJv
cGVydGllcy5uYW1lID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hh
bmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6TmFtZUNoYW5nZWQpOworfQorCit2b2lk
IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0U3BlZWQoZmxvYXQgdmFsdWUpCit7CisgICAgbV9w
cm9wZXJ0aWVzLnNwZWVkID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVz
Q2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6U3BlZWRDaGFuZ2VkKTsKK30KKwor
dm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFRpbWVPZmZzZXQoQ0ZUaW1lSW50ZXJ2YWwg
dmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLnRpbWVPZmZzZXQgPSB2YWx1ZTsKKyAgICBtX3By
b3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9u
OjpUaW1lT2Zmc2V0Q2hhbmdlZCk7Cit9CisKK2Zsb2F0IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
Y29udGVudHNTY2FsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5jb250ZW50
c1NjYWxlOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0Q29udGVudHNTY2Fs
ZShmbG9hdCB2YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMuY29udGVudHNTY2FsZSA9IHZhbHVl
OworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVl
VHJhbnNhY3Rpb246OkNvbnRlbnRzU2NhbGVDaGFuZ2VkKTsKKworICAgIHVwZGF0ZUJhY2tpbmdT
dG9yZSgpOworfQorCitmbG9hdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNvcm5lclJhZGl1cygp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5jb3JuZXJSYWRpdXM7Cit9CisKK3Zv
aWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRDb3JuZXJSYWRpdXMoZmxvYXQgdmFsdWUpCit7
CisgICAgaWYgKG1fcHJvcGVydGllcy5jb3JuZXJSYWRpdXMgPT0gdmFsdWUpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fcHJvcGVydGllcy5jb3JuZXJSYWRpdXMgPSB2YWx1ZTsKKyAgICBtX3By
b3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9u
OjpDb3JuZXJSYWRpdXNDaGFuZ2VkKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6
OnNldEVkZ2VBbnRpYWxpYXNpbmdNYXNrKHVuc2lnbmVkIHZhbHVlKQoreworICAgIG1fcHJvcGVy
dGllcy5lZGdlQW50aWFsaWFzaW5nTWFzayA9IHZhbHVlOworICAgIG1fcHJvcGVydGllcy5ub3Rl
UHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkVkZ2VBbnRpYWxp
YXNpbmdNYXNrQ2hhbmdlZCk7Cit9CisKK0Zsb2F0Um91bmRlZFJlY3QgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjpzaGFwZVJvdW5kZWRSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0
aWVzLnNoYXBlUm91bmRlZFJlY3QgPyAqbV9wcm9wZXJ0aWVzLnNoYXBlUm91bmRlZFJlY3QgOiBG
bG9hdFJvdW5kZWRSZWN0KEZsb2F0UmVjdCgpKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGU6OnNldFNoYXBlUm91bmRlZFJlY3QoY29uc3QgRmxvYXRSb3VuZGVkUmVjdCYgcm91bmRl
ZFJlY3QpCit7CisgICAgaWYgKG1fcHJvcGVydGllcy5zaGFwZVJvdW5kZWRSZWN0ICYmICptX3By
b3BlcnRpZXMuc2hhcGVSb3VuZGVkUmVjdCA9PSByb3VuZGVkUmVjdCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgbV9wcm9wZXJ0aWVzLnNoYXBlUm91bmRlZFJlY3QgPSBzdGQ6Om1ha2VfdW5pcXVl
PEZsb2F0Um91bmRlZFJlY3Q+KHJvdW5kZWRSZWN0KTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVBy
b3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpTaGFwZVJvdW5kZWRS
ZWN0Q2hhbmdlZCk7Cit9CisKK1BhdGggUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzaGFwZVBhdGgo
KSBjb25zdAoreworICAgIEFTU0VSVChtX2xheWVyVHlwZSA9PSBMYXllclR5cGVTaGFwZUxheWVy
KTsKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnNoYXBlUGF0aDsKK30KKwordm9pZCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6OnNldFNoYXBlUGF0aChjb25zdCBQYXRoJiBwYXRoKQoreworICAgIEFT
U0VSVChtX2xheWVyVHlwZSA9PSBMYXllclR5cGVTaGFwZUxheWVyKTsKKyAgICBtX3Byb3BlcnRp
ZXMuc2hhcGVQYXRoID0gcGF0aDsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFu
Z2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpTaGFwZVBhdGhDaGFuZ2VkKTsKK30KKwor
V2luZFJ1bGUgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzaGFwZVdpbmRSdWxlKCkgY29uc3QKK3sK
KyAgICBBU1NFUlQobV9sYXllclR5cGUgPT0gTGF5ZXJUeXBlU2hhcGVMYXllcik7CisgICAgcmV0
dXJuIG1fcHJvcGVydGllcy53aW5kUnVsZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6OnNldFNoYXBlV2luZFJ1bGUoV2luZFJ1bGUgd2luZFJ1bGUpCit7CisgICAgQVNTRVJUKG1f
bGF5ZXJUeXBlID09IExheWVyVHlwZVNoYXBlTGF5ZXIpOworICAgIG1fcHJvcGVydGllcy53aW5k
UnVsZSA9IHdpbmRSdWxlOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQo
UmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OldpbmRSdWxlQ2hhbmdlZCk7Cit9CisKK2Jvb2wg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpyZXF1aXJlc0N1c3RvbUFwcGVhcmFuY2VVcGRhdGVPbkJv
dW5kc0NoYW5nZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5jdXN0b21BcHBl
YXJhbmNlID09IEdyYXBoaWNzTGF5ZXI6OlNjcm9sbGluZ1NoYWRvdzsKK30KKworR3JhcGhpY3NM
YXllcjo6Q3VzdG9tQXBwZWFyYW5jZSBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmN1c3RvbUFwcGVh
cmFuY2UoKSBjb25zdAoreworICAgIHJldHVybiBtX3Byb3BlcnRpZXMuY3VzdG9tQXBwZWFyYW5j
ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnVwZGF0ZUN1c3RvbUFwcGVhcmFu
Y2UoR3JhcGhpY3NMYXllcjo6Q3VzdG9tQXBwZWFyYW5jZSBjdXN0b21BcHBlYXJhbmNlKQorewor
ICAgIG1fcHJvcGVydGllcy5jdXN0b21BcHBlYXJhbmNlID0gY3VzdG9tQXBwZWFyYW5jZTsKKyAg
ICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5z
YWN0aW9uOjpDdXN0b21BcHBlYXJhbmNlQ2hhbmdlZCk7Cit9CisKK1JlZjxQbGF0Zm9ybUNBTGF5
ZXI+IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y3JlYXRlQ29tcGF0aWJsZUxheWVyKFBsYXRmb3Jt
Q0FMYXllcjo6TGF5ZXJUeXBlIGxheWVyVHlwZSwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBjbGll
bnQpIGNvbnN0Cit7CisgICAgcmV0dXJuIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y3JlYXRlKGxh
eWVyVHlwZSwgY2xpZW50LCAqbV9jb250ZXh0KTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGU6OmVudW1lcmF0ZVJlY3RzQmVpbmdEcmF3bihDR0NvbnRleHRSZWYgY29udGV4dCwgdm9p
ZCAoXmJsb2NrKShDR1JlY3QpKQoreworICAgIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUtPmVu
dW1lcmF0ZVJlY3RzQmVpbmdEcmF3bihjb250ZXh0LCBibG9jayk7Cit9CisKK3VpbnQzMl90IFBs
YXRmb3JtQ0FMYXllclJlbW90ZTo6aG9zdGluZ0NvbnRleHRJRCgpCit7CisgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIFBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6YmFja2luZ1N0b3JlQnl0ZXNQZXJQaXhlbCgpIGNvbnN0Cit7CisgICAgaWYgKCFt
X3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlKQorICAgICAgICByZXR1cm4gNDsKKworICAgIHJldHVy
biBtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlLT5ieXRlc1BlclBpeGVsKCk7Cit9CisKK0xheWVy
UG9vbCYgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpsYXllclBvb2woKQoreworICAgIHJldHVybiBt
X2NvbnRleHQtPmxheWVyUG9vbCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVy
VHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9X
ZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi5hOTYzNWVmOTFmMzE5YzcyN2RlY2MyMmNiMWE4OGZjMDc2ODAwODBkCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3Rl
TGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5oCkBAIC0wLDAgKzEsMjI3IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisK
KyNpbmNsdWRlICJSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbi5oIgorI2luY2x1ZGUgPFdlYkNv
cmUvUGxhdGZvcm1DQUxheWVyLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9QbGF0Zm9ybUxheWVyLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIExheWVyUG9vbDsKK30KKworbmFtZXNwYWNl
IFdlYktpdCB7CisKK2NsYXNzIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ7CisKK2NsYXNzIFBsYXRm
b3JtQ0FMYXllclJlbW90ZSA6IHB1YmxpYyBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXIgeworcHVi
bGljOgorICAgIHN0YXRpYyBSZWY8UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBjcmVhdGUoV2ViQ29y
ZTo6UGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGUsIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckNs
aWVudCosIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmKTsKKyAgICBzdGF0aWMgUmVmPFBsYXRmb3Jt
Q0FMYXllclJlbW90ZT4gY3JlYXRlKFBsYXRmb3JtTGF5ZXIgKiwgV2ViQ29yZTo6UGxhdGZvcm1D
QUxheWVyQ2xpZW50KiwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYpOworICAgIHN0YXRpYyBSZWY8
UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBjcmVhdGUoY29uc3QgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
JiwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4
dCYpOworCisgICAgdmlydHVhbCB+UGxhdGZvcm1DQUxheWVyUmVtb3RlKCk7CisKKyAgICBQbGF0
Zm9ybUxheWVyKiBwbGF0Zm9ybUxheWVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbnVsbHB0
cjsgfQorCisgICAgdm9pZCByZWN1cnNpdmVCdWlsZFRyYW5zYWN0aW9uKFJlbW90ZUxheWVyVHJl
ZUNvbnRleHQmLCBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbiYpOworCisgICAgdm9pZCBzZXRO
ZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgV2ViQ29yZTo6RmxvYXRSZWN0JiBkaXJ0eVJlY3QpIG92
ZXJyaWRlOworICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCkgb3ZlcnJpZGU7CisKKyAgICB2b2lk
IGNvcHlDb250ZW50c0Zyb21MYXllcihQbGF0Zm9ybUNBTGF5ZXIqKSBvdmVycmlkZTsKKworICAg
IFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllciogc3VwZXJsYXllcigpIGNvbnN0IG92ZXJyaWRlOwor
ICAgIHZvaWQgcmVtb3ZlRnJvbVN1cGVybGF5ZXIoKSBvdmVycmlkZTsKKyAgICB2b2lkIHNldFN1
YmxheWVycyhjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJMaXN0Jikgb3ZlcnJpZGU7Cisg
ICAgdm9pZCByZW1vdmVBbGxTdWJsYXllcnMoKSBvdmVycmlkZTsKKyAgICB2b2lkIGFwcGVuZFN1
YmxheWVyKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllciYpIG92ZXJyaWRlOworICAgIHZvaWQgaW5z
ZXJ0U3VibGF5ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyJiwgc2l6ZV90IGluZGV4KSBvdmVy
cmlkZTsKKyAgICB2b2lkIHJlcGxhY2VTdWJsYXllcihXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXIm
IHJlZmVyZW5jZSwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyJikgb3ZlcnJpZGU7CisgICAgY29u
c3QgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyTGlzdCogY3VzdG9tU3VibGF5ZXJzKCkgY29uc3Qg
b3ZlcnJpZGUgeyByZXR1cm4gbnVsbHB0cjsgfQorICAgIHZvaWQgYWRvcHRTdWJsYXllcnMoV2Vi
Q29yZTo6UGxhdGZvcm1DQUxheWVyJiBzb3VyY2UpIG92ZXJyaWRlOworCisgICAgdm9pZCBhZGRB
bmltYXRpb25Gb3JLZXkoY29uc3QgU3RyaW5nJiBrZXksIFdlYkNvcmU6OlBsYXRmb3JtQ0FBbmlt
YXRpb24mKSBvdmVycmlkZTsKKyAgICB2b2lkIHJlbW92ZUFuaW1hdGlvbkZvcktleShjb25zdCBT
dHJpbmcmIGtleSkgb3ZlcnJpZGU7CisgICAgUmVmUHRyPFdlYkNvcmU6OlBsYXRmb3JtQ0FBbmlt
YXRpb24+IGFuaW1hdGlvbkZvcktleShjb25zdCBTdHJpbmcmIGtleSkgb3ZlcnJpZGU7CisgICAg
dm9pZCBhbmltYXRpb25TdGFydGVkKGNvbnN0IFN0cmluZyYga2V5LCBDRlRpbWVJbnRlcnZhbCBi
ZWdpblRpbWUpIG92ZXJyaWRlOworICAgIHZvaWQgYW5pbWF0aW9uRW5kZWQoY29uc3QgU3RyaW5n
JiBrZXkpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRNYXNrKFdlYkNvcmU6OlBsYXRmb3JtQ0FM
YXllciopIG92ZXJyaWRlOworCisgICAgYm9vbCBpc09wYXF1ZSgpIGNvbnN0IG92ZXJyaWRlOwor
ICAgIHZvaWQgc2V0T3BhcXVlKGJvb2wpIG92ZXJyaWRlOworCisgICAgV2ViQ29yZTo6RmxvYXRS
ZWN0IGJvdW5kcygpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0Qm91bmRzKGNvbnN0IFdl
YkNvcmU6OkZsb2F0UmVjdCYpIG92ZXJyaWRlOworCisgICAgV2ViQ29yZTo6RmxvYXRQb2ludDNE
IHBvc2l0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRQb3NpdGlvbihjb25zdCBX
ZWJDb3JlOjpGbG9hdFBvaW50M0QmKSBvdmVycmlkZTsKKworICAgIFdlYkNvcmU6OkZsb2F0UG9p
bnQzRCBhbmNob3JQb2ludCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0QW5jaG9yUG9p
bnQoY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludDNEJikgb3ZlcnJpZGU7CisKKyAgICBXZWJDb3Jl
OjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm0oKSBjb25zdCBvdmVycmlkZTsKKyAgICB2
b2lkIHNldFRyYW5zZm9ybShjb25zdCBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCYpIG92
ZXJyaWRlOworCisgICAgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXggc3VibGF5ZXJUcmFu
c2Zvcm0oKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFN1YmxheWVyVHJhbnNmb3JtKGNv
bnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4Jikgb3ZlcnJpZGU7CisKKyAgICBib29s
IGlzSGlkZGVuKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRIaWRkZW4oYm9vbCkgb3Zl
cnJpZGU7CisKKyAgICBib29sIGNvbnRlbnRzSGlkZGVuKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAg
dm9pZCBzZXRDb250ZW50c0hpZGRlbihib29sKSBvdmVycmlkZTsKKworICAgIGJvb2wgdXNlcklu
dGVyYWN0aW9uRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0VXNlckludGVy
YWN0aW9uRW5hYmxlZChib29sKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0QmFja2luZ1N0b3Jl
QXR0YWNoZWQoYm9vbCkgb3ZlcnJpZGU7CisgICAgYm9vbCBiYWNraW5nU3RvcmVBdHRhY2hlZCgp
IGNvbnN0IG92ZXJyaWRlOworCisgICAgYm9vbCBnZW9tZXRyeUZsaXBwZWQoKSBjb25zdCBvdmVy
cmlkZTsKKyAgICB2b2lkIHNldEdlb21ldHJ5RmxpcHBlZChib29sKSBvdmVycmlkZTsKKworICAg
IGJvb2wgaXNEb3VibGVTaWRlZCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0RG91Ymxl
U2lkZWQoYm9vbCkgb3ZlcnJpZGU7CisKKyAgICBib29sIG1hc2tzVG9Cb3VuZHMoKSBjb25zdCBv
dmVycmlkZTsKKyAgICB2b2lkIHNldE1hc2tzVG9Cb3VuZHMoYm9vbCkgb3ZlcnJpZGU7CisKKyAg
ICBib29sIGFjY2VsZXJhdGVzRHJhd2luZygpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0
QWNjZWxlcmF0ZXNEcmF3aW5nKGJvb2wpIG92ZXJyaWRlOworCisgICAgYm9vbCB3YW50c0RlZXBD
b2xvckJhY2tpbmdTdG9yZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0V2FudHNEZWVw
Q29sb3JCYWNraW5nU3RvcmUoYm9vbCkgb3ZlcnJpZGU7CisKKyAgICBib29sIHN1cHBvcnRzU3Vi
cGl4ZWxBbnRpYWxpYXNlZFRleHQoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFN1cHBv
cnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRleHQoYm9vbCkgb3ZlcnJpZGU7CisKKyAgICBDRlR5cGVS
ZWYgY29udGVudHMoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldENvbnRlbnRzKENGVHlw
ZVJlZikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldENvbnRlbnRzUmVjdChjb25zdCBXZWJDb3Jl
OjpGbG9hdFJlY3QmKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0TWluaWZpY2F0aW9uRmlsdGVy
KFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcjo6RmlsdGVyVHlwZSkgb3ZlcnJpZGU7CisgICAgdm9p
ZCBzZXRNYWduaWZpY2F0aW9uRmlsdGVyKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcjo6RmlsdGVy
VHlwZSkgb3ZlcnJpZGU7CisKKyAgICBXZWJDb3JlOjpDb2xvciBiYWNrZ3JvdW5kQ29sb3IoKSBj
b25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldEJhY2tncm91bmRDb2xvcihjb25zdCBXZWJDb3Jl
OjpDb2xvciYpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRCb3JkZXJXaWR0aChmbG9hdCkgb3Zl
cnJpZGU7CisgICAgdm9pZCBzZXRCb3JkZXJDb2xvcihjb25zdCBXZWJDb3JlOjpDb2xvciYpIG92
ZXJyaWRlOworCisgICAgZmxvYXQgb3BhY2l0eSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQg
c2V0T3BhY2l0eShmbG9hdCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldEZpbHRlcnMoY29uc3Qg
V2ViQ29yZTo6RmlsdGVyT3BlcmF0aW9ucyYpIG92ZXJyaWRlOworICAgIHN0YXRpYyBib29sIGZp
bHRlcnNDYW5CZUNvbXBvc2l0ZWQoY29uc3QgV2ViQ29yZTo6RmlsdGVyT3BlcmF0aW9ucyYpOwor
ICAgIHZvaWQgY29weUZpbHRlcnNGcm9tKGNvbnN0IFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllciYp
IG92ZXJyaWRlOworCisjaWYgRU5BQkxFKENTU19DT01QT1NJVElORykKKyAgICB2b2lkIHNldEJs
ZW5kTW9kZShXZWJDb3JlOjpCbGVuZE1vZGUpIG92ZXJyaWRlOworI2VuZGlmCisKKyAgICB2b2lk
IHNldE5hbWUoY29uc3QgU3RyaW5nJikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldFNwZWVkKGZs
b2F0KSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0VGltZU9mZnNldChDRlRpbWVJbnRlcnZhbCkg
b3ZlcnJpZGU7CisKKyAgICBmbG9hdCBjb250ZW50c1NjYWxlKCkgY29uc3Qgb3ZlcnJpZGU7Cisg
ICAgdm9pZCBzZXRDb250ZW50c1NjYWxlKGZsb2F0KSBvdmVycmlkZTsKKworICAgIGZsb2F0IGNv
cm5lclJhZGl1cygpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0Q29ybmVyUmFkaXVzKGZs
b2F0KSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0RWRnZUFudGlhbGlhc2luZ01hc2sodW5zaWdu
ZWQpIG92ZXJyaWRlOworCisgICAgLy8gRklYTUU6IEhhdmluZyBib3RoIHNoYXBlUm91bmRlZFJl
Y3QgYW5kIHNoYXBlUGF0aCBpcyByZWR1bmRhbnQuIFdlIGNvdWxkIHVzZSBzaGFwZVBhdGggZm9y
IGV2ZXJ5dGhpbmcuCisgICAgV2ViQ29yZTo6RmxvYXRSb3VuZGVkUmVjdCBzaGFwZVJvdW5kZWRS
ZWN0KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRTaGFwZVJvdW5kZWRSZWN0KGNvbnN0
IFdlYkNvcmU6OkZsb2F0Um91bmRlZFJlY3QmKSBvdmVycmlkZTsKKworICAgIFdlYkNvcmU6OlBh
dGggc2hhcGVQYXRoKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRTaGFwZVBhdGgoY29u
c3QgV2ViQ29yZTo6UGF0aCYpIG92ZXJyaWRlOworCisgICAgV2ViQ29yZTo6V2luZFJ1bGUgc2hh
cGVXaW5kUnVsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0U2hhcGVXaW5kUnVsZShX
ZWJDb3JlOjpXaW5kUnVsZSkgb3ZlcnJpZGU7CisKKyAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVy
OjpDdXN0b21BcHBlYXJhbmNlIGN1c3RvbUFwcGVhcmFuY2UoKSBjb25zdCBvdmVycmlkZTsKKyAg
ICB2b2lkIHVwZGF0ZUN1c3RvbUFwcGVhcmFuY2UoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6Q3Vz
dG9tQXBwZWFyYW5jZSkgb3ZlcnJpZGU7CisKKyAgICBXZWJDb3JlOjpUaWxlZEJhY2tpbmcqIHRp
bGVkQmFja2luZygpIG92ZXJyaWRlIHsgcmV0dXJuIG51bGxwdHI7IH0KKworICAgIFJlZjxXZWJD
b3JlOjpQbGF0Zm9ybUNBTGF5ZXI+IGNsb25lKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckNsaWVu
dCogb3duZXIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgUmVmPFBsYXRmb3JtQ0FMYXllcj4gY3Jl
YXRlQ29tcGF0aWJsZUxheWVyKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlLCBX
ZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZv
aWQgZW51bWVyYXRlUmVjdHNCZWluZ0RyYXduKENHQ29udGV4dFJlZiwgdm9pZCAoXmJsb2NrKShD
R1JlY3QpKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgaG9zdGluZ0NvbnRleHRJ
RCgpOworCisgICAgdW5zaWduZWQgYmFja2luZ1N0b3JlQnl0ZXNQZXJQaXhlbCgpIGNvbnN0IG92
ZXJyaWRlOworCisgICAgdm9pZCBzZXRDbG9uZWRMYXllcihjb25zdCBQbGF0Zm9ybUNBTGF5ZXIq
KTsKKworICAgIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpMYXllclByb3BlcnRpZXMmIHBy
b3BlcnRpZXMoKSB7IHJldHVybiBtX3Byb3BlcnRpZXM7IH0KKyAgICBjb25zdCBSZW1vdGVMYXll
clRyZWVUcmFuc2FjdGlvbjo6TGF5ZXJQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKCkgY29uc3QgeyBy
ZXR1cm4gbV9wcm9wZXJ0aWVzOyB9CisKKyAgICB2b2lkIGRpZENvbW1pdCgpOworCisgICAgdm9p
ZCBjbGVhckNvbnRleHQoKSB7IG1fY29udGV4dCA9IG51bGxwdHI7IH0KKyAgICBSZW1vdGVMYXll
clRyZWVDb250ZXh0KiBjb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZXh0OyB9CisKK3By
b3RlY3RlZDoKKyAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUoV2ViQ29yZTo6UGxhdGZvcm1DQUxh
eWVyOjpMYXllclR5cGUsIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIsIFJl
bW90ZUxheWVyVHJlZUNvbnRleHQmIGNvbnRleHQpOworICAgIFBsYXRmb3JtQ0FMYXllclJlbW90
ZShjb25zdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJD
bGllbnQqLCBSZW1vdGVMYXllclRyZWVDb250ZXh0Jik7CisKKyAgICB2b2lkIHVwZGF0ZUNsb25l
ZExheWVyUHJvcGVydGllcyhQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmIGNsb25lLCBib29sIGNvcHlD
b250ZW50cyA9IHRydWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIGJvb2wgaXNQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgICAgdm9pZCBl
bnN1cmVCYWNraW5nU3RvcmUoKTsKKyAgICB2b2lkIHVwZGF0ZUJhY2tpbmdTdG9yZSgpOworICAg
IHZvaWQgcmVtb3ZlU3VibGF5ZXIoUGxhdGZvcm1DQUxheWVyUmVtb3RlKik7CisKKyAgICBib29s
IHJlcXVpcmVzQ3VzdG9tQXBwZWFyYW5jZVVwZGF0ZU9uQm91bmRzQ2hhbmdlKCkgY29uc3Q7CisK
KyAgICBXZWJDb3JlOjpMYXllclBvb2wmIGxheWVyUG9vbCgpIG92ZXJyaWRlOworCisgICAgUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkxheWVyUHJvcGVydGllcyBtX3Byb3BlcnRpZXM7Cisg
ICAgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyTGlzdCBtX2NoaWxkcmVuOworICAgIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZSogbV9zdXBlcmxheWVyIHsgbnVsbHB0ciB9OworICAgIFBsYXRmb3JtQ0FM
YXllclJlbW90ZSogbV9tYXNrTGF5ZXIgeyBudWxscHRyIH07CisgICAgSGFzaE1hcDxTdHJpbmcs
IFJlZlB0cjxXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uPj4gbV9hbmltYXRpb25zOworCisg
ICAgYm9vbCBtX2FjY2VsZXJhdGVzRHJhd2luZyB7IGZhbHNlIH07CisgICAgYm9vbCBtX3dhbnRz
RGVlcENvbG9yQmFja2luZ1N0b3JlIHsgZmFsc2UgfTsKKworICAgIFJlbW90ZUxheWVyVHJlZUNv
bnRleHQqIG1fY29udGV4dDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCitTUEVDSUFM
SVpFX1RZUEVfVFJBSVRTX1BMQVRGT1JNX0NBTEFZRVIoV2ViS2l0OjpQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGUsIGlzUGxhdGZvcm1DQUxheWVyUmVtb3RlKCkpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUxh
eWVyUmVtb3RlQ3VzdG9tLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2Nv
YS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uZGFkNjRjZjBjZmI0MDFmMGI3Y2UzZjE2YjRjMGFiNGQwOGQyNjY0MQotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVy
VHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20uaApAQCAtMCwwICsxLDY2IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisK
KyNpbmNsdWRlICJQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaCIKKworbmFtZXNwYWNlIFdlYktpdCB7
CisKK2NsYXNzIExheWVySG9zdGluZ0NvbnRleHQ7CisKKy8vIFBsYXRmb3JtQ0FMYXllclJlbW90
ZUN1c3RvbSBpcyB1c2VkIGZvciBDQUxheWVycyB0aGF0IGxpdmUgaW4gdGhlIHdlYiBwcm9jZXNz
IGFuZCBhcmUgaG9zdGVkIGludG8gdGhlIFVJIHByb2Nlc3MgdmlhIHJlbW90ZSBjb250ZXh0Lgor
Y2xhc3MgUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tIGZpbmFsIDogcHVibGljIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZSB7CisgICAgZnJpZW5kIGNsYXNzIFBsYXRmb3JtQ0FMYXllclJlbW90ZTsK
K3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPFBsYXRmb3JtQ0FMYXllclJlbW90ZT4gY3JlYXRlKFBs
YXRmb3JtTGF5ZXIgKiwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiwgUmVtb3RlTGF5
ZXJUcmVlQ29udGV4dCYpOworCisgICAgdmlydHVhbCB+UGxhdGZvcm1DQUxheWVyUmVtb3RlQ3Vz
dG9tKCk7CisKKyAgICBQbGF0Zm9ybUxheWVyKiBwbGF0Zm9ybUxheWVyKCkgY29uc3Qgb3ZlcnJp
ZGUgeyByZXR1cm4gbV9wbGF0Zm9ybUxheWVyLmdldCgpOyB9CisKKyAgICB1aW50MzJfdCBob3N0
aW5nQ29udGV4dElEKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldE5lZWRzRGlzcGxheUluUmVj
dChjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmIGRpcnR5UmVjdCkgb3ZlcnJpZGU7CisgICAgdm9p
ZCBzZXROZWVkc0Rpc3BsYXkoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGVDdXN0b20oV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGUsIFBs
YXRmb3JtTGF5ZXIgKiwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVt
b3RlTGF5ZXJUcmVlQ29udGV4dCYpOworCisgICAgUmVmPFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXll
cj4gY2xvbmUoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikgY29uc3Qgb3Zl
cnJpZGU7CisKKyAgICBib29sIGlzUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKCkgY29uc3Qg
b3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgQ0ZUeXBlUmVmIGNvbnRlbnRzKCkgY29u
c3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRDb250ZW50cyhDRlR5cGVSZWYpIG92ZXJyaWRlOwor
CisgICAgc3RkOjp1bmlxdWVfcHRyPExheWVySG9zdGluZ0NvbnRleHQ+IG1fbGF5ZXJIb3N0aW5n
Q29udGV4dDsKKyAgICBSZXRhaW5QdHI8UGxhdGZvcm1MYXllcj4gbV9wbGF0Zm9ybUxheWVyOwor
ICAgIGJvb2wgbV9wcm92aWRlc0NvbnRlbnRzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0
CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfUExBVEZPUk1fQ0FMQVlFUihXZWJLaXQ6OlBsYXRm
b3JtQ0FMYXllclJlbW90ZUN1c3RvbSwgaXNQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUoKSkKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVy
VHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20ubW0gYi9Tb3VyY2UvV2ViS2l0L1dlYlBy
b2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUxheWVyUmVtb3Rl
Q3VzdG9tLm1tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLmM2OWI5YjMxNWFjODNkYjZkNzg4YzhmMTM2MzIyZTg2Nzc2
MmM2MDAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFn
ZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tLm1tCkBA
IC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVyUmVtb3Rl
Q3VzdG9tLmgiCisKKyNpbXBvcnQgIkxheWVySG9zdGluZ0NvbnRleHQuaCIKKyNpbXBvcnQgIlJl
bW90ZUxheWVyVHJlZUNvbnRleHQuaCIKKyNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZVByb3BlcnR5
QXBwbGllci5oIgorI2ltcG9ydCAiV2ViUHJvY2Vzcy5oIgorI2ltcG9ydCA8QVZGb3VuZGF0aW9u
L0FWRm91bmRhdGlvbi5oPgorI2ltcG9ydCA8V2ViQ29yZS9HcmFwaGljc0xheWVyQ0EuaD4KKyNp
bXBvcnQgPFdlYkNvcmUvUGxhdGZvcm1DQUxheWVyQ29jb2EuaD4KKyNpbXBvcnQgPFdlYkNvcmUv
V2ViQ29yZUNBTGF5ZXJFeHRyYXMuaD4KKyNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KKyNpbXBv
cnQgPHd0Zi9Tb2Z0TGlua2luZy5oPgorCitTT0ZUX0xJTktfRlJBTUVXT1JLX09QVElPTkFMKEFW
Rm91bmRhdGlvbikKK1NPRlRfTElOS19DTEFTU19PUFRJT05BTChBVkZvdW5kYXRpb24sIEFWUGxh
eWVyTGF5ZXIpCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0
IHsKKworc3RhdGljIE5TU3RyaW5nICogY29uc3QgcGxhdGZvcm1DQUxheWVyUG9pbnRlciA9IEAi
V0tQbGF0Zm9ybUNBTGF5ZXIiOworCitSZWY8UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVDdXN0b206OmNyZWF0ZShQbGF0Zm9ybUxheWVyICpwbGF0Zm9ybUxheWVy
LCBQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBj
b250ZXh0KQoreworICAgIGF1dG8gbGF5ZXIgPSBhZG9wdFJlZigqbmV3IFBsYXRmb3JtQ0FMYXll
clJlbW90ZUN1c3RvbShQbGF0Zm9ybUNBTGF5ZXJDb2NvYTo6bGF5ZXJUeXBlRm9yUGxhdGZvcm1M
YXllcihwbGF0Zm9ybUxheWVyKSwgcGxhdGZvcm1MYXllciwgb3duZXIsIGNvbnRleHQpKTsKKyAg
ICBjb250ZXh0LmxheWVyV2FzQ3JlYXRlZChsYXllci5nZXQoKSwgbGF5ZXItPmxheWVyVHlwZSgp
KTsKKyAgICByZXR1cm4gV1RGTW92ZShsYXllcik7Cit9CisKK1BsYXRmb3JtQ0FMYXllclJlbW90
ZUN1c3RvbTo6UGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKExheWVyVHlwZSBsYXllclR5cGUs
IFBsYXRmb3JtTGF5ZXIgKiBjdXN0b21MYXllciwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25l
ciwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCkKKyAgICA6IFBsYXRmb3JtQ0FMYXll
clJlbW90ZShsYXllclR5cGUsIG93bmVyLCBjb250ZXh0KQoreworICAgIHN3aXRjaCAoY29udGV4
dC5sYXllckhvc3RpbmdNb2RlKCkpIHsKKyAgICBjYXNlIExheWVySG9zdGluZ01vZGU6OkluUHJv
Y2VzczoKKyAgICAgICAgbV9sYXllckhvc3RpbmdDb250ZXh0ID0gTGF5ZXJIb3N0aW5nQ29udGV4
dDo6Y3JlYXRlRm9yUG9ydChXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5jb21wb3NpdGluZ1JlbmRl
clNlcnZlclBvcnQoKSk7CisgICAgICAgIGJyZWFrOworI2lmIEhBVkUoT1VUX09GX1BST0NFU1Nf
TEFZRVJfSE9TVElORykKKyAgICBjYXNlIExheWVySG9zdGluZ01vZGU6Ok91dE9mUHJvY2VzczoK
KyAgICAgICAgbV9sYXllckhvc3RpbmdDb250ZXh0ID0gTGF5ZXJIb3N0aW5nQ29udGV4dDo6Y3Jl
YXRlRm9yRXh0ZXJuYWxIb3N0aW5nUHJvY2VzcygpOworI2lmIFBMQVRGT1JNKElPUykKKyAgICAg
ICAgaWYgKGxheWVyVHlwZSA9PSBMYXllclR5cGVBVlBsYXllckxheWVyKSB7CisgICAgICAgICAg
ICBmbG9hdCBzY2FsZUZhY3RvciA9IGNvbnRleHQuZGV2aWNlU2NhbGVGYWN0b3IoKTsKKyAgICAg
ICAgICAgIC8vIFNldCBhIHNjYWxlIGZhY3RvciBoZXJlIHRvIG1ha2UgY29udmVydFJlY3Q6dG9M
YXllcjpuaWwgdGFrZSBzY2FsZSBmYWN0b3IgaW50byBhY2NvdW50LiA8cmRhcjovL3Byb2JsZW0v
MTgzMTY1NDI+LgorICAgICAgICAgICAgLy8gVGhpcyBzY2FsZSBmYWN0b3IgaXMgaW52ZXJ0ZWQg
aW4gdGhlIGhvc3RpbmcgcHJvY2Vzcy4KKyAgICAgICAgICAgIFtjdXN0b21MYXllciBzZXRUcmFu
c2Zvcm06Q0FUcmFuc2Zvcm0zRE1ha2VTY2FsZShzY2FsZUZhY3Rvciwgc2NhbGVGYWN0b3IsIDEp
XTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorCisg
ICAgbV9sYXllckhvc3RpbmdDb250ZXh0LT5zZXRSb290TGF5ZXIoY3VzdG9tTGF5ZXIpOworICAg
IFtjdXN0b21MYXllciBzZXRWYWx1ZTpbTlNWYWx1ZSB2YWx1ZVdpdGhQb2ludGVyOnRoaXNdIGZv
cktleTpwbGF0Zm9ybUNBTGF5ZXJQb2ludGVyXTsKKworICAgIG1fcGxhdGZvcm1MYXllciA9IGN1
c3RvbUxheWVyOworICAgIFtjdXN0b21MYXllciB3ZWJfZGlzYWJsZUFsbEFjdGlvbnNdOworCisg
ICAgbV9wcm92aWRlc0NvbnRlbnRzID0gbGF5ZXJUeXBlID09IExheWVyVHlwZUNvbnRlbnRzUHJv
dmlkZWRMYXllcjsKKworICAgIHByb3BlcnRpZXMoKS5wb3NpdGlvbiA9IEZsb2F0UG9pbnQzRChj
dXN0b21MYXllci5wb3NpdGlvbi54LCBjdXN0b21MYXllci5wb3NpdGlvbi55LCBjdXN0b21MYXll
ci56UG9zaXRpb24pOworICAgIHByb3BlcnRpZXMoKS5hbmNob3JQb2ludCA9IEZsb2F0UG9pbnQz
RChjdXN0b21MYXllci5hbmNob3JQb2ludC54LCBjdXN0b21MYXllci5hbmNob3JQb2ludC55LCBj
dXN0b21MYXllci5hbmNob3JQb2ludFopOworICAgIHByb3BlcnRpZXMoKS5ib3VuZHMgPSBjdXN0
b21MYXllci5ib3VuZHM7CisgICAgcHJvcGVydGllcygpLmNvbnRlbnRzUmVjdCA9IGN1c3RvbUxh
eWVyLmNvbnRlbnRzUmVjdDsKK30KKworUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tOjp+UGxh
dGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKCkKK3sKKyAgICBbbV9wbGF0Zm9ybUxheWVyIHNldFZh
bHVlOm5pbCBmb3JLZXk6cGxhdGZvcm1DQUxheWVyUG9pbnRlcl07Cit9CisKK3VpbnQzMl90IFBs
YXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6aG9zdGluZ0NvbnRleHRJRCgpCit7CisgICAgcmV0
dXJuIG1fbGF5ZXJIb3N0aW5nQ29udGV4dC0+Y29udGV4dElEKCk7Cit9CisKK1JlZjxXZWJDb3Jl
OjpQbGF0Zm9ybUNBTGF5ZXI+IFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6Y2xvbmUoUGxh
dGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikgY29uc3QKK3sKKyAgICBSZXRhaW5QdHI8Q0FMYXll
ciAqPiBjbG9uZWRMYXllcjsKKyAgICBib29sIGNvcHlDb250ZW50cyA9IHRydWU7CisKKyAgICBp
ZiAobGF5ZXJUeXBlKCkgPT0gTGF5ZXJUeXBlQVZQbGF5ZXJMYXllcikgeworICAgICAgICAKKyAg
ICAgICAgaWYgKFtwbGF0Zm9ybUxheWVyKCkgaXNLaW5kT2ZDbGFzczpnZXRBVlBsYXllckxheWVy
Q2xhc3MoKV0pIHsKKyAgICAgICAgICAgIGNsb25lZExheWVyID0gYWRvcHROUyhbYWxsb2NBVlBs
YXllckxheWVySW5zdGFuY2UoKSBpbml0XSk7CisKKyAgICAgICAgICAgIEFWUGxheWVyTGF5ZXIq
IGRlc3RpbmF0aW9uUGxheWVyTGF5ZXIgPSBzdGF0aWNfY2FzdDxBVlBsYXllckxheWVyICo+KGNs
b25lZExheWVyLmdldCgpKTsKKyAgICAgICAgICAgIEFWUGxheWVyTGF5ZXIqIHNvdXJjZVBsYXll
ckxheWVyID0gc3RhdGljX2Nhc3Q8QVZQbGF5ZXJMYXllciAqPihwbGF0Zm9ybUxheWVyKCkpOwor
ICAgICAgICAgICAgZGlzcGF0Y2hfYXN5bmMoZGlzcGF0Y2hfZ2V0X21haW5fcXVldWUoKSwgXnsK
KyAgICAgICAgICAgICAgICBbZGVzdGluYXRpb25QbGF5ZXJMYXllciBzZXRQbGF5ZXI6W3NvdXJj
ZVBsYXllckxheWVyIHBsYXllcl1dOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICAvLyBPbiBpT1MsIHRoZSBBVlBsYXllckxheWVyIGlzIGluc2lkZSBhIFdl
YlZpZGVvQ29udGFpbmVyTGF5ZXIuIFRoaXMgY29kZSBuZWVkcyB0byBzaGFyZSBsb2dpYyB3aXRo
IE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbk9iakM6OmNyZWF0ZUFWUGxheWVyTGF5ZXIo
KS4KKyAgICAgICAgICAgIGNsb25lZExheWVyID0gYWRvcHROUyhbW0NBTGF5ZXIgYWxsb2NdIGlu
aXRdKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvcHlDb250ZW50cyA9IGZhbHNlOworICAgIH0g
ZWxzZSBpZiAobGF5ZXJUeXBlKCkgPT0gTGF5ZXJUeXBlQ29udGVudHNQcm92aWRlZExheWVyKSB7
CisgICAgICAgIGNsb25lZExheWVyID0gYWRvcHROUyhbW0NBTGF5ZXIgYWxsb2NdIGluaXRdKTsK
KyAgICAgICAgLy8gRklYTUU6IGN1cnJlbnRseSBjb3B5aW5nIFdlYkdMIGNvbnRlbnRzIGJyZWFr
cyB0aGUgb3JpZ2luYWwgbGF5ZXIuCisgICAgICAgIGNvcHlDb250ZW50cyA9IGZhbHNlOworICAg
IH0KKworICAgIGF1dG8gY2xvbmUgPSBhZG9wdFJlZigqbmV3IFBsYXRmb3JtQ0FMYXllclJlbW90
ZUN1c3RvbShsYXllclR5cGUoKSwgY2xvbmVkTGF5ZXIuZ2V0KCksIG93bmVyLCAqY29udGV4dCgp
KSk7CisgICAgY29udGV4dCgpLT5sYXllcldhc0NyZWF0ZWQoY2xvbmUuZ2V0KCksIGNsb25lLT5s
YXllclR5cGUoKSk7CisKKyAgICB1cGRhdGVDbG9uZWRMYXllclByb3BlcnRpZXMoY2xvbmUuZ2V0
KCksIGNvcHlDb250ZW50cyk7CisKKyAgICBjbG9uZS0+c2V0Q2xvbmVkTGF5ZXIodGhpcyk7Cisg
ICAgcmV0dXJuIFdURk1vdmUoY2xvbmUpOworfQorCitDRlR5cGVSZWYgUGxhdGZvcm1DQUxheWVy
UmVtb3RlQ3VzdG9tOjpjb250ZW50cygpIGNvbnN0Cit7CisgICAgcmV0dXJuIFttX3BsYXRmb3Jt
TGF5ZXIgY29udGVudHNdOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6
c2V0Q29udGVudHMoQ0ZUeXBlUmVmIGNvbnRlbnRzKQoreworICAgIFttX3BsYXRmb3JtTGF5ZXIg
c2V0Q29udGVudHM6KGlkKWNvbnRlbnRzXTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGVDdXN0b206OnNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7
CisgICAgaWYgKG1fcHJvdmlkZXNDb250ZW50cykKKyAgICAgICAgW21fcGxhdGZvcm1MYXllciBz
ZXROZWVkc0Rpc3BsYXlJblJlY3Q6cmVjdF07CisgICAgZWxzZQorICAgICAgICBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU6OnNldE5lZWRzRGlzcGxheUluUmVjdChyZWN0KTsKK30KKwordm9pZCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b206OnNldE5lZWRzRGlzcGxheSgpCit7CisgICAgaWYgKG1f
cHJvdmlkZXNDb250ZW50cykKKyAgICAgICAgW21fcGxhdGZvcm1MYXllciBzZXROZWVkc0Rpc3Bs
YXldOworICAgIGVsc2UKKyAgICAgICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXROZWVkc0Rp
c3BsYXkoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1D
QUxheWVyUmVtb3RlVGlsZWRCYWNraW5nLmNwcCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9X
ZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJh
Y2tpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLmZlYzMwYzJkMjE2ZTdhNDliMmMyZmYxM2VlNjlmMDllYTc4
NWEyODEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFn
ZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5n
LmNwcApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbXBvcnQgIlBsYXRmb3JtQ0FMYXll
clJlbW90ZVRpbGVkQmFja2luZy5oIgorCisjaW1wb3J0ICJSZW1vdGVMYXllclRyZWVDb250ZXh0
LmgiCisjaW1wb3J0IDxXZWJDb3JlL0dyYXBoaWNzTGF5ZXJDQS5oPgorI2ltcG9ydCA8V2ViQ29y
ZS9QbGF0Zm9ybUNBTGF5ZXJDb2NvYS5oPgorI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgorCit1
c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK1BsYXRmb3Jt
Q0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6UGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNr
aW5nKExheWVyVHlwZSBsYXllclR5cGUsIFBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIsIFJl
bW90ZUxheWVyVHJlZUNvbnRleHQmIGNvbnRleHQpCisgICAgOiBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGUobGF5ZXJUeXBlLCBvd25lciwgY29udGV4dCkKKyAgICAsIG1fdGlsZUNvbnRyb2xsZXIoc3Rk
OjptYWtlX3VuaXF1ZTxUaWxlQ29udHJvbGxlcj4odGhpcykpCit7Cit9CisKK1BsYXRmb3JtQ0FM
YXllclJlbW90ZVRpbGVkQmFja2luZzo6flBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2lu
ZygpCit7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRO
ZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRSZWN0JiBkaXJ0eVJlY3QpCit7CisgICAgbV90
aWxlQ29udHJvbGxlci0+c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGVuY2xvc2luZ0ludFJlY3QoZGly
dHlSZWN0KSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpz
ZXROZWVkc0Rpc3BsYXkoKQoreworICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldE5lZWRzRGlzcGxh
eSgpOworfQorCitjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJMaXN0KiBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OmN1c3RvbVN1YmxheWVycygpIGNvbnN0Cit7CisgICAg
bV9jdXN0b21TdWJsYXllcnMgPSBtX3RpbGVDb250cm9sbGVyLT5jb250YWluZXJMYXllcnMoKTsK
KyAgICByZXR1cm4gJm1fY3VzdG9tU3VibGF5ZXJzOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXll
clJlbW90ZVRpbGVkQmFja2luZzo6c2V0Qm91bmRzKGNvbnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYg
Ym91bmRzKQoreworICAgIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0Qm91bmRzKGJvdW5kcyk7
CisgICAgbV90aWxlQ29udHJvbGxlci0+dGlsZUNhY2hlTGF5ZXJCb3VuZHNDaGFuZ2VkKCk7Cit9
CisKK2Jvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjppc09wYXF1ZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fdGlsZUNvbnRyb2xsZXItPnRpbGVzQXJlT3BhcXVlKCk7Cit9
CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRPcGFxdWUoYm9v
bCBvcGFxdWUpCit7CisgICAgbV90aWxlQ29udHJvbGxlci0+c2V0VGlsZXNPcGFxdWUob3BhcXVl
KTsKK30KKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OmFjY2VsZXJh
dGVzRHJhd2luZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdGlsZUNvbnRyb2xsZXItPmFjY2Vs
ZXJhdGVzRHJhd2luZygpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFj
a2luZzo6c2V0QWNjZWxlcmF0ZXNEcmF3aW5nKGJvb2wgYWNjZWxlcmF0ZXNEcmF3aW5nKQorewor
ICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldEFjY2VsZXJhdGVzRHJhd2luZyhhY2NlbGVyYXRlc0Ry
YXdpbmcpOworfQorCitib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6d2Fu
dHNEZWVwQ29sb3JCYWNraW5nU3RvcmUoKSBjb25zdAoreworICAgIHJldHVybiBtX3RpbGVDb250
cm9sbGVyLT53YW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZSgpOworfQorCit2b2lkIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6c2V0V2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUo
Ym9vbCB3YW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZSkKK3sKKyAgICBtX3RpbGVDb250cm9sbGVy
LT5zZXRXYW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZSh3YW50c0RlZXBDb2xvckJhY2tpbmdTdG9y
ZSk7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzdXBwb3J0
c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90aWxlQ29u
dHJvbGxlci0+c3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dCgpOworfQorCit2b2lkIFBs
YXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6c2V0U3VwcG9ydHNTdWJwaXhlbEFudGlh
bGlhc2VkVGV4dChib29sIHN1cHBvcnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRleHQpCit7CisgICAg
bV90aWxlQ29udHJvbGxlci0+c2V0U3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dChzdXBw
b3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KTsKK30KKworZmxvYXQgUGxhdGZvcm1DQUxheWVy
UmVtb3RlVGlsZWRCYWNraW5nOjpjb250ZW50c1NjYWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bV90aWxlQ29udHJvbGxlci0+Y29udGVudHNTY2FsZSgpOworfQorCit2b2lkIFBsYXRmb3JtQ0FM
YXllclJlbW90ZVRpbGVkQmFja2luZzo6c2V0Q29udGVudHNTY2FsZShmbG9hdCBzY2FsZSkKK3sK
KyAgICBtX3RpbGVDb250cm9sbGVyLT5zZXRDb250ZW50c1NjYWxlKHNjYWxlKTsKK30KKwordm9p
ZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldEJvcmRlcldpZHRoKGZsb2F0
IGJvcmRlcldpZHRoKQoreworICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldFRpbGVEZWJ1Z0JvcmRl
cldpZHRoKGJvcmRlcldpZHRoIC8gMik7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
VGlsZWRCYWNraW5nOjpzZXRCb3JkZXJDb2xvcihjb25zdCBXZWJDb3JlOjpDb2xvciYgY29sb3Ip
Cit7CisgICAgbV90aWxlQ29udHJvbGxlci0+c2V0VGlsZURlYnVnQm9yZGVyQ29sb3IoY29sb3Ip
OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGVUaWxlZEJhY2tpbmcuaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0Nv
Y29hL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi4wZGRmY2U4NTJkNTEyNzAzZDM0ZjQzNTJhMzlmNDVhM2U1ZDE1YTU5Ci0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVt
b3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5oCkBAIC0wLDAg
KzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aWZuZGVmIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZ19oCisjZGVmaW5lIFBsYXRm
b3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZ19oCisKKyNpbmNsdWRlICJQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGUuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL1RpbGVDb250cm9sbGVyLmg+CisKK25hbWVz
cGFjZSBXZWJLaXQgeworCitjbGFzcyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcg
ZmluYWwgOiBwdWJsaWMgUGxhdGZvcm1DQUxheWVyUmVtb3RlIHsKKyAgICBmcmllbmQgY2xhc3Mg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOworcHVibGljOgorICAgIHZpcnR1YWwgflBsYXRmb3JtQ0FM
YXllclJlbW90ZVRpbGVkQmFja2luZygpOworCitwcml2YXRlOgorICAgIFBsYXRmb3JtQ0FMYXll
clJlbW90ZVRpbGVkQmFja2luZyhXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSwg
V2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3RlTGF5ZXJUcmVlQ29u
dGV4dCYpOworCisgICAgV2ViQ29yZTo6VGlsZWRCYWNraW5nKiB0aWxlZEJhY2tpbmcoKSBvdmVy
cmlkZSB7IHJldHVybiBtX3RpbGVDb250cm9sbGVyLmdldCgpOyB9CisKKyAgICB2b2lkIHNldE5l
ZWRzRGlzcGxheUluUmVjdChjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmIGRpcnR5UmVjdCkgb3Zl
cnJpZGU7CisgICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKSBvdmVycmlkZTsKKworICAgIGNvbnN0
IFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckxpc3QqIGN1c3RvbVN1YmxheWVycygpIGNvbnN0IG92
ZXJyaWRlOworCisgICAgdm9pZCBzZXRCb3VuZHMoY29uc3QgV2ViQ29yZTo6RmxvYXRSZWN0Jikg
b3ZlcnJpZGU7CisgICAgCisgICAgYm9vbCBpc09wYXF1ZSgpIGNvbnN0IG92ZXJyaWRlOworICAg
IHZvaWQgc2V0T3BhcXVlKGJvb2wpIG92ZXJyaWRlOworICAgIAorICAgIGJvb2wgYWNjZWxlcmF0
ZXNEcmF3aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRBY2NlbGVyYXRlc0RyYXdp
bmcoYm9vbCkgb3ZlcnJpZGU7CisKKyAgICBib29sIHdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3Jl
KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRXYW50c0RlZXBDb2xvckJhY2tpbmdTdG9y
ZShib29sKSBvdmVycmlkZTsKKworICAgIGJvb2wgc3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2Vk
VGV4dCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0U3VwcG9ydHNTdWJwaXhlbEFudGlh
bGlhc2VkVGV4dChib29sKSBvdmVycmlkZTsKKworICAgIGZsb2F0IGNvbnRlbnRzU2NhbGUoKSBj
b25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldENvbnRlbnRzU2NhbGUoZmxvYXQpIG92ZXJyaWRl
OworICAgIAorICAgIHZvaWQgc2V0Qm9yZGVyV2lkdGgoZmxvYXQpIG92ZXJyaWRlOworICAgIHZv
aWQgc2V0Qm9yZGVyQ29sb3IoY29uc3QgV2ViQ29yZTo6Q29sb3ImKSBvdmVycmlkZTsKKworICAg
IHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpUaWxlQ29udHJvbGxlcj4gbV90aWxlQ29udHJvbGxl
cjsKKyAgICBtdXRhYmxlIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckxpc3QgbV9jdXN0b21TdWJs
YXllcnM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlmIC8vIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZVRpbGVkQmFja2luZ19oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dl
YlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJUcmVlQ29u
dGV4dC5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5
ZXJUcmVlL1JlbW90ZUxheWVyVHJlZUNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yNTU0OGVhMWM5NDUw
M2FlOWEwYjA1ZDM2MmI0NzFiMWQwMGEwY2I4Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVy
VHJlZUNvbnRleHQuaApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEy
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
CisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSZW1v
dGVMYXllclRyZWVDb250ZXh0X2gKKyNkZWZpbmUgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dF9oCisK
KyNpbmNsdWRlICJMYXllclRyZWVDb250ZXh0LmgiCisjaW5jbHVkZSAiUmVtb3RlTGF5ZXJCYWNr
aW5nU3RvcmVDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAiUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rp
b24uaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0dyYXBoaWNzTGF5ZXJGYWN0b3J5Lmg+CisjaW5jbHVk
ZSA8V2ViQ29yZS9MYXllclBvb2wuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtQ0FMYXll
ci5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2Ns
YXNzIFBsYXRmb3JtQ0FMYXllclJlbW90ZTsKK2NsYXNzIFdlYlBhZ2U7CisKKy8vIEZJWE1FOiBU
aGlzIGNsYXNzIGRvZXNuJ3QgZG8gbXVjaCBub3cuIFJvbGwgaW50byBSZW1vdGVMYXllclRyZWVE
cmF3aW5nQXJlYT8KK2NsYXNzIFJlbW90ZUxheWVyVHJlZUNvbnRleHQgOiBwdWJsaWMgV2ViQ29y
ZTo6R3JhcGhpY3NMYXllckZhY3RvcnkgeworcHVibGljOgorICAgIGV4cGxpY2l0IFJlbW90ZUxh
eWVyVHJlZUNvbnRleHQoV2ViUGFnZSYpOworICAgIH5SZW1vdGVMYXllclRyZWVDb250ZXh0KCk7
CisKKyAgICB2b2lkIGxheWVyV2FzQ3JlYXRlZChQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmLCBXZWJD
b3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSk7CisgICAgdm9pZCBsYXllcldpbGxCZURl
c3Ryb3llZChQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmKTsKKworICAgIHZvaWQgYmFja2luZ1N0b3Jl
V2FzQ3JlYXRlZChSZW1vdGVMYXllckJhY2tpbmdTdG9yZSYpOworICAgIHZvaWQgYmFja2luZ1N0
b3JlV2lsbEJlRGVzdHJveWVkKFJlbW90ZUxheWVyQmFja2luZ1N0b3JlJik7CisgICAgYm9vbCBi
YWNraW5nU3RvcmVXaWxsQmVEaXNwbGF5ZWQoUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUmKTsKKwor
ICAgIFdlYkNvcmU6OkxheWVyUG9vbCYgbGF5ZXJQb29sKCkgeyByZXR1cm4gbV9sYXllclBvb2w7
IH0KKworICAgIGZsb2F0IGRldmljZVNjYWxlRmFjdG9yKCkgY29uc3Q7CisKKyAgICBMYXllckhv
c3RpbmdNb2RlIGxheWVySG9zdGluZ01vZGUoKSBjb25zdDsKKworICAgIHZvaWQgYnVpbGRUcmFu
c2FjdGlvbihSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbiYsIFdlYkNvcmU6OlBsYXRmb3JtQ0FM
YXllciYgcm9vdExheWVyKTsKKworICAgIHZvaWQgbGF5ZXJQcm9wZXJ0eUNoYW5nZWRXaGlsZUJ1
aWxkaW5nVHJhbnNhY3Rpb24oUGxhdGZvcm1DQUxheWVyUmVtb3RlJik7CisKKyAgICAvLyBGcm9t
IHRoZSBVSSBwcm9jZXNzCisgICAgdm9pZCBhbmltYXRpb25EaWRTdGFydChXZWJDb3JlOjpHcmFw
aGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQsIGNvbnN0IFN0cmluZyYga2V5LCBkb3VibGUgc3Rh
cnRUaW1lKTsKKyAgICB2b2lkIGFuaW1hdGlvbkRpZEVuZChXZWJDb3JlOjpHcmFwaGljc0xheWVy
OjpQbGF0Zm9ybUxheWVySUQsIGNvbnN0IFN0cmluZyYga2V5KTsKKworICAgIHZvaWQgd2lsbFN0
YXJ0QW5pbWF0aW9uT25MYXllcihQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmKTsKKworICAgIFJlbW90
ZUxheWVyQmFja2luZ1N0b3JlQ29sbGVjdGlvbiYgYmFja2luZ1N0b3JlQ29sbGVjdGlvbigpIHsg
cmV0dXJuIG1fYmFja2luZ1N0b3JlQ29sbGVjdGlvbjsgfQorICAgIAorICAgIHZvaWQgc2V0TmV4
dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludChib29sIG5leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFp
bnQpIHsgbV9uZXh0Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50ID0gbmV4dEZsdXNoSXNGb3JJbW1l
ZGlhdGVQYWludDsgfQorICAgIGJvb2wgbmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludCgpIGNv
bnN0IHsgcmV0dXJuIG1fbmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludDsgfQorCitwcml2YXRl
OgorICAgIC8vIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJGYWN0b3J5CisgICAgc3RkOjp1bmlxdWVf
cHRyPFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI+IGNyZWF0ZUdyYXBoaWNzTGF5ZXIoV2ViQ29yZTo6
R3JhcGhpY3NMYXllcjo6VHlwZSwgV2ViQ29yZTo6R3JhcGhpY3NMYXllckNsaWVudCYpIG92ZXJy
aWRlOworCisgICAgV2ViUGFnZSYgbV93ZWJQYWdlOworCisgICAgSGFzaE1hcDxXZWJDb3JlOjpH
cmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQsIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9u
OjpMYXllckNyZWF0aW9uUHJvcGVydGllcz4gbV9jcmVhdGVkTGF5ZXJzOworICAgIFZlY3RvcjxX
ZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQ+IG1fZGVzdHJveWVkTGF5ZXJz
OworCisgICAgSGFzaE1hcDxXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQs
IFBsYXRmb3JtQ0FMYXllclJlbW90ZSo+IG1fbGl2ZUxheWVyczsKKyAgICBIYXNoTWFwPFdlYkNv
cmU6OkdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCwgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
Kj4gbV9sYXllcnNXaXRoQW5pbWF0aW9uczsKKworICAgIFJlbW90ZUxheWVyQmFja2luZ1N0b3Jl
Q29sbGVjdGlvbiBtX2JhY2tpbmdTdG9yZUNvbGxlY3Rpb247CisgICAgCisgICAgUmVtb3RlTGF5
ZXJUcmVlVHJhbnNhY3Rpb24qIG1fY3VycmVudFRyYW5zYWN0aW9uOworCisgICAgV2ViQ29yZTo6
TGF5ZXJQb29sIG1fbGF5ZXJQb29sOworICAgIAorICAgIGJvb2wgbV9uZXh0Rmx1c2hJc0Zvcklt
bWVkaWF0ZVBhaW50IHsgZmFsc2UgfTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisj
ZW5kaWYgLy8gUmVtb3RlTGF5ZXJUcmVlQ29udGV4dF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJU
cmVlQ29udGV4dC5tbSBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1Jl
bW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVDb250ZXh0Lm1tCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjkwYzQ4
NmI1ODJiMGQxNTg3MDU2YTQ4ZDE4MTJkYjM5ZjdiNTJiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUmVt
b3RlTGF5ZXJUcmVlQ29udGV4dC5tbQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bXBvcnQgImNvbmZpZy5oIgorI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5oIgorCisj
aW1wb3J0ICJHZW5lcmljQ2FsbGJhY2suaCIKKyNpbXBvcnQgIkdyYXBoaWNzTGF5ZXJDQVJlbW90
ZS5oIgorI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVyUmVtb3RlLmgiCisjaW1wb3J0ICJSZW1vdGVM
YXllckJhY2tpbmdTdG9yZUNvbGxlY3Rpb24uaCIKKyNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZVRy
YW5zYWN0aW9uLmgiCisjaW1wb3J0ICJXZWJQYWdlLmgiCisjaW1wb3J0IDxXZWJDb3JlL0ZyYW1l
Vmlldy5oPgorI2ltcG9ydCA8V2ViQ29yZS9NYWluRnJhbWUuaD4KKyNpbXBvcnQgPFdlYkNvcmUv
UGFnZS5oPgorI2ltcG9ydCA8d3RmL1NldEZvclNjb3BlLmg+CisjaW1wb3J0IDx3dGYvU3lzdGVt
VHJhY2luZy5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktp
dCB7CisKK1JlbW90ZUxheWVyVHJlZUNvbnRleHQ6OlJlbW90ZUxheWVyVHJlZUNvbnRleHQoV2Vi
UGFnZSYgd2ViUGFnZSkKKyAgICA6IG1fd2ViUGFnZSh3ZWJQYWdlKQorICAgICwgbV9jdXJyZW50
VHJhbnNhY3Rpb24obnVsbHB0cikKK3sKK30KKworUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6flJl
bW90ZUxheWVyVHJlZUNvbnRleHQoKQoreworICAgIGZvciAoYXV0byYgbGF5ZXIgOiBtX2xpdmVM
YXllcnMudmFsdWVzKCkpCisgICAgICAgIGxheWVyLT5jbGVhckNvbnRleHQoKTsKK30KKworZmxv
YXQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6ZGV2aWNlU2NhbGVGYWN0b3IoKSBjb25zdAorewor
ICAgIHJldHVybiBtX3dlYlBhZ2UuZGV2aWNlU2NhbGVGYWN0b3IoKTsKK30KKworTGF5ZXJIb3N0
aW5nTW9kZSBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpsYXllckhvc3RpbmdNb2RlKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV93ZWJQYWdlLmxheWVySG9zdGluZ01vZGUoKTsKK30KKwordm9pZCBS
ZW1vdGVMYXllclRyZWVDb250ZXh0OjpsYXllcldhc0NyZWF0ZWQoUGxhdGZvcm1DQUxheWVyUmVt
b3RlJiBsYXllciwgUGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGUgdHlwZSkKK3sKKyAgICBHcmFw
aGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQgbGF5ZXJJRCA9IGxheWVyLmxheWVySUQoKTsKKwor
ICAgIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpMYXllckNyZWF0aW9uUHJvcGVydGllcyBj
cmVhdGlvblByb3BlcnRpZXM7CisgICAgY3JlYXRpb25Qcm9wZXJ0aWVzLmxheWVySUQgPSBsYXll
cklEOworICAgIGNyZWF0aW9uUHJvcGVydGllcy50eXBlID0gdHlwZTsKKworICAgIGlmIChsYXll
ci5pc1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbSgpKSB7CisgICAgICAgIGNyZWF0aW9uUHJv
cGVydGllcy5ob3N0aW5nQ29udGV4dElEID0gbGF5ZXIuaG9zdGluZ0NvbnRleHRJRCgpOworICAg
ICAgICBjcmVhdGlvblByb3BlcnRpZXMuaG9zdGluZ0RldmljZVNjYWxlRmFjdG9yID0gZGV2aWNl
U2NhbGVGYWN0b3IoKTsKKyAgICB9CisKKyAgICBtX2NyZWF0ZWRMYXllcnMuYWRkKGxheWVySUQs
IFdURk1vdmUoY3JlYXRpb25Qcm9wZXJ0aWVzKSk7CisgICAgbV9saXZlTGF5ZXJzLmFkZChsYXll
cklELCAmbGF5ZXIpOworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmxheWVyV2ls
bEJlRGVzdHJveWVkKFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgbGF5ZXIpCit7CisgICAgQVNTRVJU
KGxheWVyLmxheWVySUQoKSk7CisgICAgR3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklEIGxh
eWVySUQgPSBsYXllci5sYXllcklEKCk7CisKKyAgICBtX2NyZWF0ZWRMYXllcnMucmVtb3ZlKGxh
eWVySUQpOworICAgIG1fbGl2ZUxheWVycy5yZW1vdmUobGF5ZXJJRCk7CisKKyAgICBBU1NFUlQo
IW1fZGVzdHJveWVkTGF5ZXJzLmNvbnRhaW5zKGxheWVySUQpKTsKKyAgICBtX2Rlc3Ryb3llZExh
eWVycy5hcHBlbmQobGF5ZXJJRCk7CisgICAgCisgICAgbV9sYXllcnNXaXRoQW5pbWF0aW9ucy5y
ZW1vdmUobGF5ZXJJRCk7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6YmFja2lu
Z1N0b3JlV2FzQ3JlYXRlZChSZW1vdGVMYXllckJhY2tpbmdTdG9yZSYgYmFja2luZ1N0b3JlKQor
eworICAgIG1fYmFja2luZ1N0b3JlQ29sbGVjdGlvbi5iYWNraW5nU3RvcmVXYXNDcmVhdGVkKGJh
Y2tpbmdTdG9yZSk7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6YmFja2luZ1N0
b3JlV2lsbEJlRGVzdHJveWVkKFJlbW90ZUxheWVyQmFja2luZ1N0b3JlJiBiYWNraW5nU3RvcmUp
Cit7CisgICAgbV9iYWNraW5nU3RvcmVDb2xsZWN0aW9uLmJhY2tpbmdTdG9yZVdpbGxCZURlc3Ry
b3llZChiYWNraW5nU3RvcmUpOworfQorCitib29sIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmJh
Y2tpbmdTdG9yZVdpbGxCZURpc3BsYXllZChSZW1vdGVMYXllckJhY2tpbmdTdG9yZSYgYmFja2lu
Z1N0b3JlKQoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNvbGxlY3Rpb24uYmFja2luZ1N0
b3JlV2lsbEJlRGlzcGxheWVkKGJhY2tpbmdTdG9yZSk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxH
cmFwaGljc0xheWVyPiBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpjcmVhdGVHcmFwaGljc0xheWVy
KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlR5cGUgbGF5ZXJUeXBlLCBHcmFwaGljc0xheWVyQ2xp
ZW50JiBjbGllbnQpCit7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8R3JhcGhpY3NMYXll
ckNBUmVtb3RlPihsYXllclR5cGUsIGNsaWVudCwgKnRoaXMpOworfQorCit2b2lkIFJlbW90ZUxh
eWVyVHJlZUNvbnRleHQ6OmJ1aWxkVHJhbnNhY3Rpb24oUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rp
b24mIHRyYW5zYWN0aW9uLCBQbGF0Zm9ybUNBTGF5ZXImIHJvb3RMYXllcikKK3sKKyAgICBUcmFj
ZVNjb3BlIHRyYWNpbmdTY29wZShCdWlsZFRyYW5zYWN0aW9uU3RhcnQsIEJ1aWxkVHJhbnNhY3Rp
b25FbmQpOworCisgICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlJiByb290TGF5ZXJSZW1vdGUgPSBk
b3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+KHJvb3RMYXllcik7CisgICAgdHJhbnNhY3Rp
b24uc2V0Um9vdExheWVySUQocm9vdExheWVyUmVtb3RlLmxheWVySUQoKSk7CisKKyAgICBtX2N1
cnJlbnRUcmFuc2FjdGlvbiA9ICZ0cmFuc2FjdGlvbjsKKyAgICByb290TGF5ZXJSZW1vdGUucmVj
dXJzaXZlQnVpbGRUcmFuc2FjdGlvbigqdGhpcywgdHJhbnNhY3Rpb24pOworICAgIG1fY3VycmVu
dFRyYW5zYWN0aW9uID0gbnVsbHB0cjsKKworICAgIFZlY3RvcjxSZW1vdGVMYXllclRyZWVUcmFu
c2FjdGlvbjo6TGF5ZXJDcmVhdGlvblByb3BlcnRpZXM+IGNyZWF0ZWRMYXllclByb3BlcnRpZXM7
CisgICAgY29weVZhbHVlc1RvVmVjdG9yKG1fY3JlYXRlZExheWVycywgY3JlYXRlZExheWVyUHJv
cGVydGllcyk7CisgICAgdHJhbnNhY3Rpb24uc2V0Q3JlYXRlZExheWVycyhXVEZNb3ZlKGNyZWF0
ZWRMYXllclByb3BlcnRpZXMpKTsKKyAgICB0cmFuc2FjdGlvbi5zZXREZXN0cm95ZWRMYXllcklE
cyhXVEZNb3ZlKG1fZGVzdHJveWVkTGF5ZXJzKSk7CisgICAgCisgICAgbV9jcmVhdGVkTGF5ZXJz
LmNsZWFyKCk7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6bGF5ZXJQcm9wZXJ0
eUNoYW5nZWRXaGlsZUJ1aWxkaW5nVHJhbnNhY3Rpb24oUGxhdGZvcm1DQUxheWVyUmVtb3RlJiBs
YXllcikKK3sKKyAgICBpZiAobV9jdXJyZW50VHJhbnNhY3Rpb24pCisgICAgICAgIG1fY3VycmVu
dFRyYW5zYWN0aW9uLT5sYXllclByb3BlcnRpZXNDaGFuZ2VkKGxheWVyKTsKK30KKwordm9pZCBS
ZW1vdGVMYXllclRyZWVDb250ZXh0Ojp3aWxsU3RhcnRBbmltYXRpb25PbkxheWVyKFBsYXRmb3Jt
Q0FMYXllclJlbW90ZSYgbGF5ZXIpCit7CisgICAgbV9sYXllcnNXaXRoQW5pbWF0aW9ucy5hZGQo
bGF5ZXIubGF5ZXJJRCgpLCAmbGF5ZXIpOworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZUNvbnRl
eHQ6OmFuaW1hdGlvbkRpZFN0YXJ0KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5
ZXJJRCBsYXllcklELCBjb25zdCBTdHJpbmcmIGtleSwgZG91YmxlIHN0YXJ0VGltZSkKK3sKKyAg
ICBhdXRvIGl0ID0gbV9sYXllcnNXaXRoQW5pbWF0aW9ucy5maW5kKGxheWVySUQpOworICAgIGlm
IChpdCAhPSBtX2xheWVyc1dpdGhBbmltYXRpb25zLmVuZCgpKQorICAgICAgICBpdC0+dmFsdWUt
PmFuaW1hdGlvblN0YXJ0ZWQoa2V5LCBzdGFydFRpbWUpOworfQorCit2b2lkIFJlbW90ZUxheWVy
VHJlZUNvbnRleHQ6OmFuaW1hdGlvbkRpZEVuZChXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0
Zm9ybUxheWVySUQgbGF5ZXJJRCwgY29uc3QgU3RyaW5nJiBrZXkpCit7CisgICAgYXV0byBpdCA9
IG1fbGF5ZXJzV2l0aEFuaW1hdGlvbnMuZmluZChsYXllcklEKTsKKyAgICBpZiAoaXQgIT0gbV9s
YXllcnNXaXRoQW5pbWF0aW9ucy5lbmQoKSkKKyAgICAgICAgaXQtPnZhbHVlLT5hbmltYXRpb25F
bmRlZChrZXkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVM
YXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IuaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVEaXNwbGF5UmVm
cmVzaE1vbml0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zMmI3ZjVhYTE3YTMwNjM4YzJiZDBiMDgxNDhjY2Zk
MDdkODY4ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dl
YlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNo
TW9uaXRvci5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZiBVU0UoUkVRVUVTVF9BTklNQVRJ
T05fRlJBTUVfRElTUExBWV9NT05JVE9SKQorCisjaW5jbHVkZSAiUmVtb3RlTGF5ZXJUcmVlRHJh
d2luZ0FyZWEuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0Rpc3BsYXlSZWZyZXNoTW9uaXRvci5oPgor
CituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJl
c2hNb25pdG9yIDogcHVibGljIFdlYkNvcmU6OkRpc3BsYXlSZWZyZXNoTW9uaXRvciB7CitwdWJs
aWM6CisgICAgc3RhdGljIFJlZjxSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3I+
IGNyZWF0ZShXZWJDb3JlOjpQbGF0Zm9ybURpc3BsYXlJRCBkaXNwbGF5SUQsIFJlbW90ZUxheWVy
VHJlZURyYXdpbmdBcmVhJiBkcmF3aW5nQXJlYSkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9w
dFJlZigqbmV3IFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcihkaXNwbGF5SUQs
IGRyYXdpbmdBcmVhKSk7CisgICAgfQorICAgIAorICAgIHZpcnR1YWwgflJlbW90ZUxheWVyVHJl
ZURpc3BsYXlSZWZyZXNoTW9uaXRvcigpOworCisgICAgYm9vbCByZXF1ZXN0UmVmcmVzaENhbGxi
YWNrKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGRpZFVwZGF0ZUxheWVycygpOworCitwcml2YXRl
OgorICAgIGV4cGxpY2l0IFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcihXZWJD
b3JlOjpQbGF0Zm9ybURpc3BsYXlJRCwgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEmKTsKKwor
ICAgIFdlYWtQdHI8UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE+IG1fZHJhd2luZ0FyZWE7Cit9
OworCit9CisKKyNlbmRpZiAvLyBVU0UoUkVRVUVTVF9BTklNQVRJT05fRlJBTUVfRElTUExBWV9N
T05JVE9SKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29j
b2EvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5t
bSBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJl
ZS9SZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IubW0KbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODky
ZDY1NzE1NTk4Zjc3NGFiZjllMzQ0OTA3NTcxNjNjYzQ0NTA4MgotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9S
ZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IubW0KQEAgLTAsMCArMSw3NSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW1wb3J0ICJj
b25maWcuaCIKKyNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5o
IgorCisjaWYgVVNFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FX0RJU1BMQVlfTU9OSVRPUikKKwor
I2ltcG9ydCA8d3RmL0N1cnJlbnRUaW1lLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwor
CituYW1lc3BhY2UgV2ViS2l0IHsKKworUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25p
dG9yOjpSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IoUGxhdGZvcm1EaXNwbGF5
SUQgZGlzcGxheUlELCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYSYgZHJhd2luZ0FyZWEpCisg
ICAgOiBEaXNwbGF5UmVmcmVzaE1vbml0b3IoZGlzcGxheUlEKQorICAgICwgbV9kcmF3aW5nQXJl
YShkcmF3aW5nQXJlYS5jcmVhdGVXZWFrUHRyKCkpCit7Cit9CisKK1JlbW90ZUxheWVyVHJlZURp
c3BsYXlSZWZyZXNoTW9uaXRvcjo6flJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRv
cigpCit7CisgICAgaWYgKG1fZHJhd2luZ0FyZWEpCisgICAgICAgIG1fZHJhd2luZ0FyZWEtPndp
bGxEZXN0cm95RGlzcGxheVJlZnJlc2hNb25pdG9yKHRoaXMpOworfQorCitib29sIFJlbW90ZUxh
eWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcjo6cmVxdWVzdFJlZnJlc2hDYWxsYmFjaygpCit7
CisgICAgaWYgKCFtX2RyYXdpbmdBcmVhIHx8ICFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBpZiAoIWlzU2NoZWR1bGVkKCkpCisgICAgICAgIHN0YXRpY19jYXN0PERy
YXdpbmdBcmVhJj4oKm1fZHJhd2luZ0FyZWEuZ2V0KCkpLnNjaGVkdWxlQ29tcG9zaXRpbmdMYXll
ckZsdXNoKCk7CisKKyAgICBzZXRJc0FjdGl2ZSh0cnVlKTsKKyAgICBzZXRJc1NjaGVkdWxlZCh0
cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVEaXNwbGF5
UmVmcmVzaE1vbml0b3I6OmRpZFVwZGF0ZUxheWVycygpCit7CisgICAgc2V0SXNTY2hlZHVsZWQo
ZmFsc2UpOworCisgICAgaWYgKCFpc1ByZXZpb3VzRnJhbWVEb25lKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIHNldElzUHJldmlvdXNGcmFtZURvbmUoZmFsc2UpOworICAgIGhhbmRsZURpc3Bs
YXlSZWZyZXNoZWROb3RpZmljYXRpb25Pbk1haW5UaHJlYWQodGhpcyk7Cit9CisKK30KKworI2Vu
ZGlmIC8vIFVTRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRV9ESVNQTEFZX01PTklUT1IpCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXll
clRyZWUvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEuaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVEcmF3aW5n
QXJlYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLjQyNzVhZTMxMTVhNmQyNTE4NGJjMmJkZGQ4MmQwNGE1NWE5OTk3
YmYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9D
b2NvYS9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEuaApAQCAtMCww
ICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDE0IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJD
YWxsYmFja0lELmgiCisjaW5jbHVkZSAiRHJhd2luZ0FyZWEuaCIKKyNpbmNsdWRlICJHcmFwaGlj
c0xheWVyQ0FSZW1vdGUuaCIKKyNpbmNsdWRlICJSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbi5o
IgorI2luY2x1ZGUgPFdlYkNvcmUvR3JhcGhpY3NMYXllckNsaWVudC5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvVGltZXIuaD4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8ZGlzcGF0Y2gvZGlz
cGF0Y2guaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9XZWFrUHRy
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIFBsYXRmb3JtQ0FMYXllcjsKK30KKwor
bmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ7CitjbGFz
cyBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3I7CisKK2NsYXNzIFJlbW90ZUxh
eWVyVHJlZURyYXdpbmdBcmVhIDogcHVibGljIERyYXdpbmdBcmVhLCBwdWJsaWMgV2ViQ29yZTo6
R3JhcGhpY3NMYXllckNsaWVudCB7CisgICAgZnJpZW5kIGNsYXNzIFJlbW90ZUxheWVyVHJlZURp
c3BsYXlSZWZyZXNoTW9uaXRvcjsKK3B1YmxpYzoKKyAgICBSZW1vdGVMYXllclRyZWVEcmF3aW5n
QXJlYShXZWJQYWdlJiwgY29uc3QgV2ViUGFnZUNyZWF0aW9uUGFyYW1ldGVycyYpOworICAgIHZp
cnR1YWwgflJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhKCk7CisKKyAgICB1aW50NjRfdCBuZXh0
VHJhbnNhY3Rpb25JRCgpIGNvbnN0IHsgcmV0dXJuIG1fY3VycmVudFRyYW5zYWN0aW9uSUQgKyAx
OyB9CisgICAgdWludDY0X3QgbGFzdENvbW1pdHRlZFRyYW5zYWN0aW9uSUQoKSBjb25zdCB7IHJl
dHVybiBtX2N1cnJlbnRUcmFuc2FjdGlvbklEOyB9CisKKyAgICBXZWFrUHRyPFJlbW90ZUxheWVy
VHJlZURyYXdpbmdBcmVhPiBjcmVhdGVXZWFrUHRyKCkgeyByZXR1cm4gbV93ZWFrUHRyRmFjdG9y
eS5jcmVhdGVXZWFrUHRyKCk7IH0KKworcHJpdmF0ZToKKyAgICAvLyBEcmF3aW5nQXJlYQorICAg
IHZvaWQgc2V0TmVlZHNEaXNwbGF5KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXROZWVkc0Rpc3Bs
YXlJblJlY3QoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYpIG92ZXJyaWRlOworICAgIHZvaWQgc2Ny
b2xsKGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHNjcm9sbFJlY3QsIGNvbnN0IFdlYkNvcmU6Oklu
dFNpemUmIHNjcm9sbERlbHRhKSBvdmVycmlkZTsKKyAgICB2b2lkIHVwZGF0ZUdlb21ldHJ5KGNv
bnN0IFdlYkNvcmU6OkludFNpemUmIHZpZXdTaXplLCBjb25zdCBXZWJDb3JlOjpJbnRTaXplJiBs
YXllclBvc2l0aW9uLCBib29sIGZsdXNoU3luY2hyb25vdXNseSwgY29uc3QgV2ViQ29yZTo6TWFj
aFNlbmRSaWdodCYgZmVuY2VQb3J0KSBvdmVycmlkZTsKKworICAgIFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJGYWN0b3J5KiBncmFwaGljc0xheWVyRmFjdG9yeSgpIG92ZXJyaWRlOworICAgIHZvaWQg
c2V0Um9vdENvbXBvc2l0aW5nTGF5ZXIoV2ViQ29yZTo6R3JhcGhpY3NMYXllciopIG92ZXJyaWRl
OworICAgIHZvaWQgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKSBvdmVycmlkZTsKKyAg
ICB2b2lkIHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllckZsdXNoSW1tZWRpYXRlbHkoKSBvdmVycmlk
ZTsKKyAgICB2b2lkIGF0dGFjaFZpZXdPdmVybGF5R3JhcGhpY3NMYXllcihXZWJDb3JlOjpGcmFt
ZSosIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXIqKSBvdmVycmlkZTsKKworICAgIHZvaWQgYWRkVHJh
bnNhY3Rpb25DYWxsYmFja0lEKENhbGxiYWNrSUQpIG92ZXJyaWRlOworCisgICAgUmVmUHRyPFdl
YkNvcmU6OkRpc3BsYXlSZWZyZXNoTW9uaXRvcj4gY3JlYXRlRGlzcGxheVJlZnJlc2hNb25pdG9y
KFdlYkNvcmU6OlBsYXRmb3JtRGlzcGxheUlEKSBvdmVycmlkZTsKKyAgICB2b2lkIHdpbGxEZXN0
cm95RGlzcGxheVJlZnJlc2hNb25pdG9yKFdlYkNvcmU6OkRpc3BsYXlSZWZyZXNoTW9uaXRvciop
OworCisgICAgYm9vbCBzaG91bGRVc2VUaWxlZEJhY2tpbmdGb3JGcmFtZVZpZXcoY29uc3QgV2Vi
Q29yZTo6RnJhbWVWaWV3Jikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHVwZGF0ZVByZWZlcmVuY2Vz
KGNvbnN0IFdlYlByZWZlcmVuY2VzU3RvcmUmKSBvdmVycmlkZTsKKworICAgIGJvb2wgc3VwcG9y
dHNBc3luY1Njcm9sbGluZygpIG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHZvaWQg
c2V0TGF5ZXJUcmVlU3RhdGVJc0Zyb3plbihib29sKSBvdmVycmlkZTsKKworICAgIHZvaWQgZm9y
Y2VSZXBhaW50KCkgb3ZlcnJpZGU7CisgICAgYm9vbCBmb3JjZVJlcGFpbnRBc3luYyhDYWxsYmFj
a0lEKSBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdm9pZCBzZXRWaWV3RXhwb3Nl
ZFJlY3Qoc3RkOjpvcHRpb25hbDxXZWJDb3JlOjpGbG9hdFJlY3Q+KSBvdmVycmlkZTsKKyAgICBz
dGQ6Om9wdGlvbmFsPFdlYkNvcmU6OkZsb2F0UmVjdD4gdmlld0V4cG9zZWRSZWN0KCkgY29uc3Qg
b3ZlcnJpZGUgeyByZXR1cm4gbV9zY3JvbGxlZFZpZXdFeHBvc2VkUmVjdDsgfQorCisgICAgdm9p
ZCBhY2NlbGVyYXRlZEFuaW1hdGlvbkRpZFN0YXJ0KHVpbnQ2NF90IGxheWVySUQsIGNvbnN0IFN0
cmluZyYga2V5LCBkb3VibGUgc3RhcnRUaW1lKSBvdmVycmlkZTsKKyAgICB2b2lkIGFjY2VsZXJh
dGVkQW5pbWF0aW9uRGlkRW5kKHVpbnQ2NF90IGxheWVySUQsIGNvbnN0IFN0cmluZyYga2V5KSBv
dmVycmlkZTsKKworI2lmIFBMQVRGT1JNKElPUykKKyAgICBXZWJDb3JlOjpGbG9hdFJlY3QgZXhw
b3NlZENvbnRlbnRSZWN0KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRFeHBvc2VkQ29u
dGVudFJlY3QoY29uc3QgV2ViQ29yZTo6RmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisjZW5kaWYKKwor
ICAgIHZvaWQgZGlkVXBkYXRlKCkgb3ZlcnJpZGU7CisKKyNpZiBQTEFURk9STShJT1MpCisgICAg
dm9pZCBzZXREZXZpY2VTY2FsZUZhY3RvcihmbG9hdCkgb3ZlcnJpZGU7CisjZW5kaWYKKworICAg
IHZvaWQgbWFpbkZyYW1lQ29udGVudFNpemVDaGFuZ2VkKGNvbnN0IFdlYkNvcmU6OkludFNpemUm
KSBvdmVycmlkZTsKKworICAgIHZvaWQgYWN0aXZpdHlTdGF0ZURpZENoYW5nZShXZWJDb3JlOjpB
Y3Rpdml0eVN0YXRlOjpGbGFncyBjaGFuZ2VkLCBib29sIHdhbnRzRGlkVXBkYXRlQWN0aXZpdHlT
dGF0ZSwgY29uc3QgVmVjdG9yPENhbGxiYWNrSUQ+JiBjYWxsYmFja0lEcykgb3ZlcnJpZGU7CisK
KyAgICBib29sIGFkanVzdExheWVyRmx1c2hUaHJvdHRsaW5nKFdlYkNvcmU6OkxheWVyRmx1c2hU
aHJvdHRsZVN0YXRlOjpGbGFncykgb3ZlcnJpZGU7CisKKyAgICBib29sIGRpc3BhdGNoRGlkUmVh
Y2hMYXlvdXRNaWxlc3RvbmUoV2ViQ29yZTo6TGF5b3V0TWlsZXN0b25lcykgb3ZlcnJpZGU7CisK
KyAgICB2b2lkIHVwZGF0ZVNjcm9sbGVkRXhwb3NlZFJlY3QoKTsKKyAgICB2b2lkIHVwZGF0ZVJv
b3RMYXllcnMoKTsKKworICAgIHZvaWQgZmx1c2hMYXllcnMoKTsKKworICAgIFdlYkNvcmU6OlRp
bGVkQmFja2luZyogbWFpbkZyYW1lVGlsZWRCYWNraW5nKCkgY29uc3Q7CisKKyAgICB1aW50NjRf
dCB0YWtlTmV4dFRyYW5zYWN0aW9uSUQoKSB7IHJldHVybiArK21fY3VycmVudFRyYW5zYWN0aW9u
SUQ7IH0KKworICAgIGJvb2wgbWFya0xheWVyc1ZvbGF0aWxlSW1tZWRpYXRlbHlJZlBvc3NpYmxl
KCkgb3ZlcnJpZGU7CisKKyAgICBjbGFzcyBCYWNraW5nU3RvcmVGbHVzaGVyIDogcHVibGljIFRo
cmVhZFNhZmVSZWZDb3VudGVkPEJhY2tpbmdTdG9yZUZsdXNoZXI+IHsKKyAgICBwdWJsaWM6Cisg
ICAgICAgIHN0YXRpYyBSZWY8QmFja2luZ1N0b3JlRmx1c2hlcj4gY3JlYXRlKElQQzo6Q29ubmVj
dGlvbiosIHN0ZDo6dW5pcXVlX3B0cjxJUEM6OkVuY29kZXI+LCBWZWN0b3I8UmV0YWluUHRyPENH
Q29udGV4dFJlZj4+KTsKKworICAgICAgICB2b2lkIGZsdXNoKCk7CisgICAgICAgIGJvb2wgaGFz
Rmx1c2hlZCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzRmx1c2hlZDsgfQorCisgICAgcHJpdmF0ZToK
KyAgICAgICAgQmFja2luZ1N0b3JlRmx1c2hlcihJUEM6OkNvbm5lY3Rpb24qLCBzdGQ6OnVuaXF1
ZV9wdHI8SVBDOjpFbmNvZGVyPiwgVmVjdG9yPFJldGFpblB0cjxDR0NvbnRleHRSZWY+Pik7CisK
KyAgICAgICAgUmVmUHRyPElQQzo6Q29ubmVjdGlvbj4gbV9jb25uZWN0aW9uOworICAgICAgICBz
dGQ6OnVuaXF1ZV9wdHI8SVBDOjpFbmNvZGVyPiBtX2NvbW1pdEVuY29kZXI7CisgICAgICAgIFZl
Y3RvcjxSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPj4gbV9jb250ZXh0c1RvRmx1c2g7CisKKyAgICAg
ICAgc3RkOjphdG9taWM8Ym9vbD4gbV9oYXNGbHVzaGVkOworICAgIH07CisKKyAgICBzdGQ6OnVu
aXF1ZV9wdHI8UmVtb3RlTGF5ZXJUcmVlQ29udGV4dD4gbV9yZW1vdGVMYXllclRyZWVDb250ZXh0
OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpHcmFwaGljc0xheWVyPiBtX3Jvb3RMYXll
cjsKKworICAgIFdlYkNvcmU6OkludFNpemUgbV92aWV3U2l6ZTsKKworICAgIHN0ZDo6b3B0aW9u
YWw8V2ViQ29yZTo6RmxvYXRSZWN0PiBtX3ZpZXdFeHBvc2VkUmVjdDsKKyAgICBzdGQ6Om9wdGlv
bmFsPFdlYkNvcmU6OkZsb2F0UmVjdD4gbV9zY3JvbGxlZFZpZXdFeHBvc2VkUmVjdDsKKworICAg
IFdlYkNvcmU6OlRpbWVyIG1fbGF5ZXJGbHVzaFRpbWVyOworICAgIGJvb2wgbV9pc0ZsdXNoaW5n
U3VzcGVuZGVkIHsgZmFsc2UgfTsKKyAgICBib29sIG1faGFzRGVmZXJyZWRGbHVzaCB7IGZhbHNl
IH07CisgICAgYm9vbCBtX2lzVGhyb3R0bGluZ0xheWVyRmx1c2hlcyB7IGZhbHNlIH07CisgICAg
Ym9vbCBtX2lzTGF5ZXJGbHVzaFRocm90dGxpbmdUZW1wb3JhcmlseURpc2FibGVkRm9ySW50ZXJh
Y3Rpb24geyBmYWxzZSB9OworICAgIGJvb2wgbV9pc0luaXRpYWxUaHJvdHRsZWRMYXllckZsdXNo
IHsgZmFsc2UgfTsKKworICAgIGJvb2wgbV93YWl0aW5nRm9yQmFja2luZ1N0b3JlU3dhcCB7IGZh
bHNlIH07CisgICAgYm9vbCBtX2hhZEZsdXNoRGVmZXJyZWRXaGlsZVdhaXRpbmdGb3JCYWNraW5n
U3RvcmVTd2FwIHsgZmFsc2UgfTsKKyAgICBib29sIG1fbmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQ
YWludCB7IGZhbHNlIH07CisKKyAgICBkaXNwYXRjaF9xdWV1ZV90IG1fY29tbWl0UXVldWU7Cisg
ICAgUmVmUHRyPEJhY2tpbmdTdG9yZUZsdXNoZXI+IG1fcGVuZGluZ0JhY2tpbmdTdG9yZUZsdXNo
ZXI7CisKKyAgICBIYXNoU2V0PFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcio+
IG1fZGlzcGxheVJlZnJlc2hNb25pdG9yczsKKyAgICBIYXNoU2V0PFJlbW90ZUxheWVyVHJlZURp
c3BsYXlSZWZyZXNoTW9uaXRvcio+KiBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnNUb05vdGlmeSB7
IG51bGxwdHIgfTsKKworICAgIHVpbnQ2NF90IG1fY3VycmVudFRyYW5zYWN0aW9uSUQgeyAwIH07
CisgICAgVmVjdG9yPFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpUcmFuc2FjdGlvbkNhbGxi
YWNrSUQ+IG1fcGVuZGluZ0NhbGxiYWNrSURzOworCisgICAgV2ViQ29yZTo6TGF5b3V0TWlsZXN0
b25lcyBtX3BlbmRpbmdOZXdseVJlYWNoZWRMYXlvdXRNaWxlc3RvbmVzIHsgMCB9OworCisgICAg
V2ViQ29yZTo6R3JhcGhpY3NMYXllciogbV9jb250ZW50TGF5ZXIgeyBudWxscHRyIH07CisgICAg
V2ViQ29yZTo6R3JhcGhpY3NMYXllciogbV92aWV3T3ZlcmxheVJvb3RMYXllciB7IG51bGxwdHIg
fTsKKyAgICAKKyAgICBXZWFrUHRyRmFjdG9yeTxSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYT4g
bV93ZWFrUHRyRmFjdG9yeTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCitTUEVDSUFM
SVpFX1RZUEVfVFJBSVRTX0RSQVdJTkdfQVJFQShSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYSwg
RHJhd2luZ0FyZWFUeXBlUmVtb3RlTGF5ZXJUcmVlKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJl
ZURyYXdpbmdBcmVhLm1tIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2Ev
UmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhLm1tCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LmYxNDZmYTBmMGI4NjY1YzlkMjQwNjA4ZGVkNzFlY2I4MzU2M2ExNjMKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRy
ZWUvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEubW0KQEAgLTAsMCArMSw1MTQgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbXBvcnQgImNvbmZpZy5oIgorI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVl
RHJhd2luZ0FyZWEuaCIKKworI2ltcG9ydCAiRHJhd2luZ0FyZWFQcm94eU1lc3NhZ2VzLmgiCisj
aW1wb3J0ICJHcmFwaGljc0xheWVyQ0FSZW1vdGUuaCIKKyNpbXBvcnQgIlBsYXRmb3JtQ0FMYXll
clJlbW90ZS5oIgorI2ltcG9ydCAiUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmVDb2xsZWN0aW9uLmgi
CisjaW1wb3J0ICJSZW1vdGVMYXllclRyZWVDb250ZXh0LmgiCisjaW1wb3J0ICJSZW1vdGVMYXll
clRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IuaCIKKyNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZURy
YXdpbmdBcmVhUHJveHlNZXNzYWdlcy5oIgorI2ltcG9ydCAiUmVtb3RlU2Nyb2xsaW5nQ29vcmRp
bmF0b3IuaCIKKyNpbXBvcnQgIlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yVHJhbnNhY3Rpb24u
aCIKKyNpbXBvcnQgIldlYlBhZ2UuaCIKKyNpbXBvcnQgIldlYlByb2Nlc3MuaCIKKyNpbXBvcnQg
PFF1YXJ0ekNvcmUvUXVhcnR6Q29yZS5oPgorI2ltcG9ydCA8V2ViQ29yZS9EZWJ1Z1BhZ2VPdmVy
bGF5cy5oPgorI2ltcG9ydCA8V2ViQ29yZS9GcmFtZS5oPgorI2ltcG9ydCA8V2ViQ29yZS9GcmFt
ZVZpZXcuaD4KKyNpbXBvcnQgPFdlYkNvcmUvSW5zcGVjdG9yQ29udHJvbGxlci5oPgorI2ltcG9y
dCA8V2ViQ29yZS9NYWluRnJhbWUuaD4KKyNpbXBvcnQgPFdlYkNvcmUvUGFnZU92ZXJsYXlDb250
cm9sbGVyLmg+CisjaW1wb3J0IDxXZWJDb3JlL1JlbmRlckxheWVyQ29tcG9zaXRvci5oPgorI2lt
cG9ydCA8V2ViQ29yZS9SZW5kZXJWaWV3Lmg+CisjaW1wb3J0IDxXZWJDb3JlL1NldHRpbmdzLmg+
CisjaW1wb3J0IDxXZWJDb3JlL1RpbGVkQmFja2luZy5oPgorI2ltcG9ydCA8cGFsL3NwaS9jb2Nv
YS9RdWFydHpDb3JlU1BJLmg+CisjaW1wb3J0IDx3dGYvU3lzdGVtVHJhY2luZy5oPgorCit1c2lu
ZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK1JlbW90ZUxheWVy
VHJlZURyYXdpbmdBcmVhOjpSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYShXZWJQYWdlJiB3ZWJQ
YWdlLCBjb25zdCBXZWJQYWdlQ3JlYXRpb25QYXJhbWV0ZXJzJikKKyAgICA6IERyYXdpbmdBcmVh
KERyYXdpbmdBcmVhVHlwZVJlbW90ZUxheWVyVHJlZSwgd2ViUGFnZSkKKyAgICAsIG1fcmVtb3Rl
TGF5ZXJUcmVlQ29udGV4dChzdGQ6Om1ha2VfdW5pcXVlPFJlbW90ZUxheWVyVHJlZUNvbnRleHQ+
KHdlYlBhZ2UpKQorICAgICwgbV9yb290TGF5ZXIoR3JhcGhpY3NMYXllcjo6Y3JlYXRlKGdyYXBo
aWNzTGF5ZXJGYWN0b3J5KCksICp0aGlzKSkKKyAgICAsIG1fbGF5ZXJGbHVzaFRpbWVyKCp0aGlz
LCAmUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmZsdXNoTGF5ZXJzKQorICAgICwgbV93ZWFr
UHRyRmFjdG9yeSh0aGlzKQoreworICAgIHdlYlBhZ2UuY29yZVBhZ2UoKS0+c2V0dGluZ3MoKS5z
ZXRGb3JjZUNvbXBvc2l0aW5nTW9kZSh0cnVlKTsKKyNpZiBQTEFURk9STShJT1MpCisgICAgd2Vi
UGFnZS5jb3JlUGFnZSgpLT5zZXR0aW5ncygpLnNldERlbGVnYXRlc1BhZ2VTY2FsaW5nKHRydWUp
OworI2VuZGlmCisgICAgbV9yb290TGF5ZXItPnNldE5hbWUoImRyYXdpbmcgYXJlYSByb290Iik7
CisKKyAgICBtX2NvbW1pdFF1ZXVlID0gZGlzcGF0Y2hfcXVldWVfY3JlYXRlKCJjb20uYXBwbGUu
V2ViS2l0LldlYkNvbnRlbnQuUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEuQ29tbWl0UXVldWUi
LCBudWxscHRyKTsKKworICAgIC8vIEluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHdlIGdldCBhIHVu
aXF1ZSBEaXNwbGF5UmVmcmVzaE1vbml0b3IgcGVyLURyYXdpbmdBcmVhIChuZWNlc3NhcnkgYmVj
YXVzZSBEaXNwbGF5UmVmcmVzaE1vbml0b3IKKyAgICAvLyBpcyBkcml2ZW4gYnkgdGhpcyBjbGFz
cyksIGdpdmUgZWFjaCBwYWdlIGEgdW5pcXVlIERpc3BsYXlJRCBkZXJpdmVkIGZyb20gV2ViUGFn
ZSdzIHVuaXF1ZSBJRC4KKyAgICAvLyBGSVhNRTogV2hpbGUgdXNpbmcgdGhlIGhpZ2ggZW5kIG9m
IHRoZSByYW5nZSBvZiBEaXNwbGF5SURzIG1ha2VzIGEgY29sbGlzaW9uIHdpdGggcmVhbCwgbm9u
LVJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhCisgICAgLy8gRGlzcGxheUlEcyBsZXNzIGxpa2Vs
eSwgaXQgaXMgbm90IGVudGlyZWx5IHNhZmUgdG8gaGF2ZSBhIFJlbW90ZUxheWVyVHJlZURyYXdp
bmdBcmVhIGFuZCBUaWxlZENvcmVBbmltYXRpb25EcmF3aW5nQXJlYQorICAgIC8vIGNvZWV4aXN0
IGluIHRoZSBzYW1lIHByb2Nlc3MuCisgICAgd2ViUGFnZS53aW5kb3dTY3JlZW5EaWRDaGFuZ2Uo
c3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpIC0gd2ViUGFnZS5wYWdlSUQoKSk7
Cit9CisKK1JlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjp+UmVtb3RlTGF5ZXJUcmVlRHJhd2lu
Z0FyZWEoKQoreworICAgIGRpc3BhdGNoX3JlbGVhc2UobV9jb21taXRRdWV1ZSk7Cit9CisKK3Zv
aWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnNldE5lZWRzRGlzcGxheSgpCit7Cit9CisK
K3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnNldE5lZWRzRGlzcGxheUluUmVjdChj
b25zdCBJbnRSZWN0JikKK3sKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6
c2Nyb2xsKGNvbnN0IEludFJlY3QmIHNjcm9sbFJlY3QsIGNvbnN0IEludFNpemUmIHNjcm9sbERl
bHRhKQoreworfQorCitHcmFwaGljc0xheWVyRmFjdG9yeSogUmVtb3RlTGF5ZXJUcmVlRHJhd2lu
Z0FyZWE6OmdyYXBoaWNzTGF5ZXJGYWN0b3J5KCkKK3sKKyAgICByZXR1cm4gbV9yZW1vdGVMYXll
clRyZWVDb250ZXh0LmdldCgpOworfQorCitSZWZQdHI8RGlzcGxheVJlZnJlc2hNb25pdG9yPiBS
ZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6Y3JlYXRlRGlzcGxheVJlZnJlc2hNb25pdG9yKFBs
YXRmb3JtRGlzcGxheUlEIGRpc3BsYXlJRCkKK3sKKyAgICBhdXRvIG1vbml0b3IgPSBSZW1vdGVM
YXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3I6OmNyZWF0ZShkaXNwbGF5SUQsICp0aGlzKTsK
KyAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnMuYWRkKG1vbml0b3IucHRyKCkpOworICAgIHJl
dHVybiBXVEZNb3ZlKG1vbml0b3IpOworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdB
cmVhOjp3aWxsRGVzdHJveURpc3BsYXlSZWZyZXNoTW9uaXRvcihEaXNwbGF5UmVmcmVzaE1vbml0
b3IqIG1vbml0b3IpCit7CisgICAgYXV0byByZW1vdGVNb25pdG9yID0gc3RhdGljX2Nhc3Q8UmVt
b3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yKj4obW9uaXRvcik7CisgICAgbV9kaXNw
bGF5UmVmcmVzaE1vbml0b3JzLnJlbW92ZShyZW1vdGVNb25pdG9yKTsKKworICAgIGlmIChtX2Rp
c3BsYXlSZWZyZXNoTW9uaXRvcnNUb05vdGlmeSkKKyAgICAgICAgbV9kaXNwbGF5UmVmcmVzaE1v
bml0b3JzVG9Ob3RpZnktPnJlbW92ZShyZW1vdGVNb25pdG9yKTsKK30KKwordm9pZCBSZW1vdGVM
YXllclRyZWVEcmF3aW5nQXJlYTo6dXBkYXRlUm9vdExheWVycygpCit7CisgICAgVmVjdG9yPEdy
YXBoaWNzTGF5ZXIqPiBjaGlsZHJlbjsKKyAgICBpZiAobV9jb250ZW50TGF5ZXIpIHsKKyAgICAg
ICAgY2hpbGRyZW4uYXBwZW5kKG1fY29udGVudExheWVyKTsKKyAgICAgICAgaWYgKG1fdmlld092
ZXJsYXlSb290TGF5ZXIpCisgICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmQobV92aWV3T3Zlcmxh
eVJvb3RMYXllcik7CisgICAgfQorCisgICAgbV9yb290TGF5ZXItPnNldENoaWxkcmVuKGNoaWxk
cmVuKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6YXR0YWNoVmlld092
ZXJsYXlHcmFwaGljc0xheWVyKEZyYW1lKiBmcmFtZSwgR3JhcGhpY3NMYXllciogdmlld092ZXJs
YXlSb290TGF5ZXIpCit7CisgICAgaWYgKCFmcmFtZS0+aXNNYWluRnJhbWUoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV92aWV3T3ZlcmxheVJvb3RMYXllciA9IHZpZXdPdmVybGF5Um9vdExh
eWVyOworICAgIHVwZGF0ZVJvb3RMYXllcnMoKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVE
cmF3aW5nQXJlYTo6c2V0Um9vdENvbXBvc2l0aW5nTGF5ZXIoR3JhcGhpY3NMYXllciogcm9vdExh
eWVyKQoreworICAgIG1fY29udGVudExheWVyID0gcm9vdExheWVyOworICAgIHVwZGF0ZVJvb3RM
YXllcnMoKTsKKyAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOworfQorCit2b2lk
IFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjp1cGRhdGVHZW9tZXRyeShjb25zdCBJbnRTaXpl
JiB2aWV3U2l6ZSwgY29uc3QgSW50U2l6ZSYgbGF5ZXJQb3NpdGlvbiwgYm9vbCBmbHVzaFN5bmNo
cm9ub3VzbHksIGNvbnN0IFdlYkNvcmU6Ok1hY2hTZW5kUmlnaHQmKQoreworICAgIG1fdmlld1Np
emUgPSB2aWV3U2l6ZTsKKyAgICBtX3dlYlBhZ2Uuc2V0U2l6ZSh2aWV3U2l6ZSk7CisKKyAgICBz
Y2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOworCisgICAgbV93ZWJQYWdlLnNlbmQoTWVz
c2FnZXM6OkRyYXdpbmdBcmVhUHJveHk6OkRpZFVwZGF0ZUdlb21ldHJ5KCkpOworfQorCitib29s
IFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzaG91bGRVc2VUaWxlZEJhY2tpbmdGb3JGcmFt
ZVZpZXcoY29uc3QgRnJhbWVWaWV3JiBmcmFtZVZpZXcpCit7CisgICAgcmV0dXJuIGZyYW1lVmll
dy5mcmFtZSgpLmlzTWFpbkZyYW1lKCk7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2lu
Z0FyZWE6OnVwZGF0ZVByZWZlcmVuY2VzKGNvbnN0IFdlYlByZWZlcmVuY2VzU3RvcmUmKQorewor
ICAgIFNldHRpbmdzJiBzZXR0aW5ncyA9IG1fd2ViUGFnZS5jb3JlUGFnZSgpLT5zZXR0aW5ncygp
OworCisgICAgLy8gRml4ZWQgcG9zaXRpb24gZWxlbWVudHMgbmVlZCB0byBiZSBjb21wb3NpdGVk
IGFuZCBjcmVhdGUgc3RhY2tpbmcgY29udGV4dHMKKyAgICAvLyBpbiBvcmRlciB0byBiZSBzY3Jv
bGxlZCBieSB0aGUgU2Nyb2xsaW5nQ29vcmRpbmF0b3IuCisgICAgc2V0dGluZ3Muc2V0QWNjZWxl
cmF0ZWRDb21wb3NpdGluZ0ZvckZpeGVkUG9zaXRpb25FbmFibGVkKHRydWUpOworCisgICAgbV9y
b290TGF5ZXItPnNldFNob3dEZWJ1Z0JvcmRlcihzZXR0aW5ncy5zaG93RGVidWdCb3JkZXJzKCkp
OworCisgICAgaWYgKE1haW5GcmFtZSogbWFpbkZyYW1lID0gbV93ZWJQYWdlLm1haW5GcmFtZSgp
KQorICAgICAgICBEZWJ1Z1BhZ2VPdmVybGF5czo6c2V0dGluZ3NDaGFuZ2VkKCptYWluRnJhbWUp
OworfQorCisjaWYgUExBVEZPUk0oSU9TKQordm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJl
YTo6c2V0RGV2aWNlU2NhbGVGYWN0b3IoZmxvYXQgZGV2aWNlU2NhbGVGYWN0b3IpCit7CisgICAg
bV93ZWJQYWdlLnNldERldmljZVNjYWxlRmFjdG9yKGRldmljZVNjYWxlRmFjdG9yKTsKK30KKyNl
bmRpZgorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzZXRMYXllclRyZWVTdGF0
ZUlzRnJvemVuKGJvb2wgaXNGcm96ZW4pCit7CisgICAgaWYgKG1faXNGbHVzaGluZ1N1c3BlbmRl
ZCA9PSBpc0Zyb3plbikKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9pc0ZsdXNoaW5nU3VzcGVu
ZGVkID0gaXNGcm96ZW47CisKKyAgICBpZiAoIW1faXNGbHVzaGluZ1N1c3BlbmRlZCAmJiBtX2hh
c0RlZmVycmVkRmx1c2gpIHsKKyAgICAgICAgbV9oYXNEZWZlcnJlZEZsdXNoID0gZmFsc2U7Cisg
ICAgICAgIHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllckZsdXNoKCk7CisgICAgfQorfQorCit2b2lk
IFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpmb3JjZVJlcGFpbnQoKQoreworICAgIGlmICht
X2lzRmx1c2hpbmdTdXNwZW5kZWQpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoRnJhbWUq
IGZyYW1lID0gJm1fd2ViUGFnZS5jb3JlUGFnZSgpLT5tYWluRnJhbWUoKTsgZnJhbWU7IGZyYW1l
ID0gZnJhbWUtPnRyZWUoKS50cmF2ZXJzZU5leHQoKSkgeworICAgICAgICBGcmFtZVZpZXcqIGZy
YW1lVmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgICAgIGlmICghZnJhbWVWaWV3IHx8ICFmcmFt
ZVZpZXctPnRpbGVkQmFja2luZygpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
ZnJhbWVWaWV3LT50aWxlZEJhY2tpbmcoKS0+Zm9yY2VSZXBhaW50KCk7CisgICAgfQorCisgICAg
Zmx1c2hMYXllcnMoKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6YWNj
ZWxlcmF0ZWRBbmltYXRpb25EaWRTdGFydCh1aW50NjRfdCBsYXllcklELCBjb25zdCBTdHJpbmcm
IGtleSwgZG91YmxlIHN0YXJ0VGltZSkKK3sKKyAgICBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQt
PmFuaW1hdGlvbkRpZFN0YXJ0KGxheWVySUQsIGtleSwgc3RhcnRUaW1lKTsKK30KKwordm9pZCBS
ZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6YWNjZWxlcmF0ZWRBbmltYXRpb25EaWRFbmQodWlu
dDY0X3QgbGF5ZXJJRCwgY29uc3QgU3RyaW5nJiBrZXkpCit7CisgICAgbV9yZW1vdGVMYXllclRy
ZWVDb250ZXh0LT5hbmltYXRpb25EaWRFbmQobGF5ZXJJRCwga2V5KTsKK30KKwordm9pZCBSZW1v
dGVMYXllclRyZWVEcmF3aW5nQXJlYTo6c2V0Vmlld0V4cG9zZWRSZWN0KHN0ZDo6b3B0aW9uYWw8
V2ViQ29yZTo6RmxvYXRSZWN0PiB2aWV3RXhwb3NlZFJlY3QpCit7CisgICAgbV92aWV3RXhwb3Nl
ZFJlY3QgPSB2aWV3RXhwb3NlZFJlY3Q7CisgICAgdXBkYXRlU2Nyb2xsZWRFeHBvc2VkUmVjdCgp
OworfQorCisjaWYgUExBVEZPUk0oSU9TKQorV2ViQ29yZTo6RmxvYXRSZWN0IFJlbW90ZUxheWVy
VHJlZURyYXdpbmdBcmVhOjpleHBvc2VkQ29udGVudFJlY3QoKSBjb25zdAoreworICAgIEZyYW1l
VmlldyogZnJhbWVWaWV3ID0gbV93ZWJQYWdlLm1haW5GcmFtZVZpZXcoKTsKKyAgICBpZiAoIWZy
YW1lVmlldykKKyAgICAgICAgcmV0dXJuIEZsb2F0UmVjdCgpOworCisgICAgcmV0dXJuIGZyYW1l
Vmlldy0+ZXhwb3NlZENvbnRlbnRSZWN0KCk7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJh
d2luZ0FyZWE6OnNldEV4cG9zZWRDb250ZW50UmVjdChjb25zdCBGbG9hdFJlY3QmIGV4cG9zZWRD
b250ZW50UmVjdCkKK3sKKyAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IG1fd2ViUGFnZS5tYWlu
RnJhbWVWaWV3KCk7CisgICAgaWYgKCFmcmFtZVZpZXcpCisgICAgICAgIHJldHVybjsKKyAgICBp
ZiAoZnJhbWVWaWV3LT5leHBvc2VkQ29udGVudFJlY3QoKSA9PSBleHBvc2VkQ29udGVudFJlY3Qp
CisgICAgICAgIHJldHVybjsKKworICAgIGZyYW1lVmlldy0+c2V0RXhwb3NlZENvbnRlbnRSZWN0
KGV4cG9zZWRDb250ZW50UmVjdCk7CisgICAgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2go
KTsKK30KKyNlbmRpZgorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjp1cGRhdGVT
Y3JvbGxlZEV4cG9zZWRSZWN0KCkKK3sKKyAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IG1fd2Vi
UGFnZS5tYWluRnJhbWVWaWV3KCk7CisgICAgaWYgKCFmcmFtZVZpZXcpCisgICAgICAgIHJldHVy
bjsKKworICAgIG1fc2Nyb2xsZWRWaWV3RXhwb3NlZFJlY3QgPSBtX3ZpZXdFeHBvc2VkUmVjdDsK
KworI2lmICFQTEFURk9STShJT1MpCisgICAgaWYgKG1fdmlld0V4cG9zZWRSZWN0KSB7CisgICAg
ICAgIFNjcm9sbE9mZnNldCBzY3JvbGxPZmZzZXQgPSBmcmFtZVZpZXctPnNjcm9sbE9mZnNldEZy
b21Qb3NpdGlvbihmcmFtZVZpZXctPnNjcm9sbFBvc2l0aW9uKCkpOworICAgICAgICBtX3Njcm9s
bGVkVmlld0V4cG9zZWRSZWN0LnZhbHVlKCkubW92ZUJ5KHNjcm9sbE9mZnNldCk7CisgICAgfQor
I2VuZGlmCisKKyAgICBmcmFtZVZpZXctPnNldFZpZXdFeHBvc2VkUmVjdChtX3Njcm9sbGVkVmll
d0V4cG9zZWRSZWN0KTsKK30KKworVGlsZWRCYWNraW5nKiBSZW1vdGVMYXllclRyZWVEcmF3aW5n
QXJlYTo6bWFpbkZyYW1lVGlsZWRCYWNraW5nKCkgY29uc3QKK3sKKyAgICBGcmFtZVZpZXcqIGZy
YW1lVmlldyA9IG1fd2ViUGFnZS5tYWluRnJhbWVWaWV3KCk7CisgICAgcmV0dXJuIGZyYW1lVmll
dyA/IGZyYW1lVmlldy0+dGlsZWRCYWNraW5nKCkgOiBudWxscHRyOworfQorCit2b2lkIFJlbW90
ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaEltbWVk
aWF0ZWx5KCkKK3sKKyAgICBtX2xheWVyRmx1c2hUaW1lci5zdGFydE9uZVNob3QoMF9zKTsKK30K
Kwordm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6c2NoZWR1bGVDb21wb3NpdGluZ0xh
eWVyRmx1c2goKQoreworICAgIGlmIChtX2lzRmx1c2hpbmdTdXNwZW5kZWQpIHsKKyAgICAgICAg
bV9pc0xheWVyRmx1c2hUaHJvdHRsaW5nVGVtcG9yYXJpbHlEaXNhYmxlZEZvckludGVyYWN0aW9u
ID0gZmFsc2U7CisgICAgICAgIG1faGFzRGVmZXJyZWRGbHVzaCA9IHRydWU7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgaWYgKG1faXNMYXllckZsdXNoVGhyb3R0bGluZ1RlbXBvcmFyaWx5
RGlzYWJsZWRGb3JJbnRlcmFjdGlvbikgeworICAgICAgICBtX2lzTGF5ZXJGbHVzaFRocm90dGxp
bmdUZW1wb3JhcmlseURpc2FibGVkRm9ySW50ZXJhY3Rpb24gPSBmYWxzZTsKKyAgICAgICAgc2No
ZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2hJbW1lZGlhdGVseSgpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgaWYgKG1fbGF5ZXJGbHVzaFRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIGNvbnN0IFNlY29uZHMgaW5pdGlhbEZsdXNoRGVsYXkgPSA1MDBfbXM7
CisgICAgY29uc3QgU2Vjb25kcyBmbHVzaERlbGF5ID0gMTUwMF9tczsKKyAgICBTZWNvbmRzIHRo
cm90dGxlRGVsYXkgPSBtX2lzVGhyb3R0bGluZ0xheWVyRmx1c2hlcyA/IChtX2lzSW5pdGlhbFRo
cm90dGxlZExheWVyRmx1c2ggPyBpbml0aWFsRmx1c2hEZWxheSA6IGZsdXNoRGVsYXkpIDogMF9z
OworICAgIG1faXNJbml0aWFsVGhyb3R0bGVkTGF5ZXJGbHVzaCA9IGZhbHNlOworCisgICAgbV9s
YXllckZsdXNoVGltZXIuc3RhcnRPbmVTaG90KHRocm90dGxlRGVsYXkpOworfQorCitib29sIFJl
bW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphZGp1c3RMYXllckZsdXNoVGhyb3R0bGluZyhXZWJD
b3JlOjpMYXllckZsdXNoVGhyb3R0bGVTdGF0ZTo6RmxhZ3MgZmxhZ3MpCit7CisgICAgaWYgKGZs
YWdzICYgV2ViQ29yZTo6TGF5ZXJGbHVzaFRocm90dGxlU3RhdGU6OlVzZXJJc0ludGVyYWN0aW5n
KQorICAgICAgICBtX2lzTGF5ZXJGbHVzaFRocm90dGxpbmdUZW1wb3JhcmlseURpc2FibGVkRm9y
SW50ZXJhY3Rpb24gPSB0cnVlOworCisgICAgYm9vbCB3YXNUaHJvdHRsaW5nTGF5ZXJGbHVzaGVz
ID0gbV9pc1Rocm90dGxpbmdMYXllckZsdXNoZXM7CisgICAgbV9pc1Rocm90dGxpbmdMYXllckZs
dXNoZXMgPSBmbGFncyAmIFdlYkNvcmU6OkxheWVyRmx1c2hUaHJvdHRsZVN0YXRlOjpFbmFibGVk
OworCisgICAgaWYgKCF3YXNUaHJvdHRsaW5nTGF5ZXJGbHVzaGVzICYmIG1faXNUaHJvdHRsaW5n
TGF5ZXJGbHVzaGVzKQorICAgICAgICBtX2lzSW5pdGlhbFRocm90dGxlZExheWVyRmx1c2ggPSB0
cnVlOworCisgICAgLy8gUmUtc2NoZWR1bGUgdGhlIGZsdXNoIGlmIHdlIHN0b3BwZWQgdGhyb3R0
bGluZy4KKyAgICBpZiAod2FzVGhyb3R0bGluZ0xheWVyRmx1c2hlcyAmJiAhbV9pc1Rocm90dGxp
bmdMYXllckZsdXNoZXMgJiYgbV9sYXllckZsdXNoVGltZXIuaXNBY3RpdmUoKSkgeworICAgICAg
ICBtX2xheWVyRmx1c2hUaW1lci5zdG9wKCk7CisgICAgICAgIHNjaGVkdWxlQ29tcG9zaXRpbmdM
YXllckZsdXNoKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFJlbW90ZUxh
eWVyVHJlZURyYXdpbmdBcmVhOjpmbHVzaExheWVycygpCit7CisgICAgaWYgKCFtX3Jvb3RMYXll
cikKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1faXNGbHVzaGluZ1N1c3BlbmRlZCkgewor
ICAgICAgICBtX2hhc0RlZmVycmVkRmx1c2ggPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgaWYgKG1fd2FpdGluZ0ZvckJhY2tpbmdTdG9yZVN3YXApIHsKKyAgICAgICAgbV9o
YWRGbHVzaERlZmVycmVkV2hpbGVXYWl0aW5nRm9yQmFja2luZ1N0b3JlU3dhcCA9IHRydWU7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSRUxFQVNFX0FTU0VSVCghbV9wZW5kaW5nQmFj
a2luZ1N0b3JlRmx1c2hlciB8fCBtX3BlbmRpbmdCYWNraW5nU3RvcmVGbHVzaGVyLT5oYXNGbHVz
aGVkKCkpOworCisgICAgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmVDb2xsZWN0aW9uJiBiYWNraW5n
U3RvcmVDb2xsZWN0aW9uID0gbV9yZW1vdGVMYXllclRyZWVDb250ZXh0LT5iYWNraW5nU3RvcmVD
b2xsZWN0aW9uKCk7CisgICAgYmFja2luZ1N0b3JlQ29sbGVjdGlvbi53aWxsRmx1c2hMYXllcnMo
KTsKKworICAgIG1fd2ViUGFnZS5sYXlvdXRJZk5lZWRlZCgpOworCisgICAgRmxvYXRSZWN0IHZp
c2libGVSZWN0KEZsb2F0UG9pbnQoKSwgbV92aWV3U2l6ZSk7CisgICAgaWYgKG1fc2Nyb2xsZWRW
aWV3RXhwb3NlZFJlY3QpCisgICAgICAgIHZpc2libGVSZWN0LmludGVyc2VjdChtX3Njcm9sbGVk
Vmlld0V4cG9zZWRSZWN0LnZhbHVlKCkpOworCisgICAgUmVmUHRyPFdlYlBhZ2U+IHJldGFpbmVk
UGFnZSA9ICZtX3dlYlBhZ2U7CisgICAgW0NBVHJhbnNhY3Rpb24gYWRkQ29tbWl0SGFuZGxlcjpb
cmV0YWluZWRQYWdlXSB7CisgICAgICAgIGlmIChQYWdlKiBjb3JlUGFnZSA9IHJldGFpbmVkUGFn
ZS0+Y29yZVBhZ2UoKSkgeworICAgICAgICAgICAgaWYgKEZyYW1lKiBjb3JlRnJhbWUgPSByZXRh
aW5lZFBhZ2UtPm1haW5GcmFtZSgpKQorICAgICAgICAgICAgICAgIGNvcmVQYWdlLT5pbnNwZWN0
b3JDb250cm9sbGVyKCkuZGlkQ29tcG9zaXRlKCpjb3JlRnJhbWUpOworICAgICAgICB9CisgICAg
fSBmb3JQaGFzZTprQ0FUcmFuc2FjdGlvblBoYXNlUG9zdENvbW1pdF07CisKKyAgICBtX3dlYlBh
Z2UubWFpbkZyYW1lVmlldygpLT5mbHVzaENvbXBvc2l0aW5nU3RhdGVJbmNsdWRpbmdTdWJmcmFt
ZXMoKTsKKworICAgIC8vIEJlY2F1c2Ugb3VyIHZpZXctcmVsYXRpdmUgb3ZlcmxheSByb290IGxh
eWVyIGlzIG5vdCBhdHRhY2hlZCB0byB0aGUgRnJhbWVWaWV3J3MgR3JhcGhpY3NMYXllciB0cmVl
LCB3ZSBuZWVkIHRvIGZsdXNoIGl0IG1hbnVhbGx5LgorICAgIGlmIChtX3ZpZXdPdmVybGF5Um9v
dExheWVyKQorICAgICAgICBtX3ZpZXdPdmVybGF5Um9vdExheWVyLT5mbHVzaENvbXBvc2l0aW5n
U3RhdGUodmlzaWJsZVJlY3QpOworCisgICAgbV9yb290TGF5ZXItPmZsdXNoQ29tcG9zaXRpbmdT
dGF0ZUZvclRoaXNMYXllck9ubHkoKTsKKworICAgIC8vIEZJWE1FOiBNaW5pbWl6ZSB0aGVzZSB0
cmFuc2FjdGlvbnMgaWYgbm90aGluZyBjaGFuZ2VkLgorICAgIFJlbW90ZUxheWVyVHJlZVRyYW5z
YWN0aW9uIGxheWVyVHJhbnNhY3Rpb247CisgICAgbGF5ZXJUcmFuc2FjdGlvbi5zZXRUcmFuc2Fj
dGlvbklEKHRha2VOZXh0VHJhbnNhY3Rpb25JRCgpKTsKKyAgICBsYXllclRyYW5zYWN0aW9uLnNl
dENhbGxiYWNrSURzKFdURk1vdmUobV9wZW5kaW5nQ2FsbGJhY2tJRHMpKTsKKyAgICBtX3JlbW90
ZUxheWVyVHJlZUNvbnRleHQtPnNldE5leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQobV9uZXh0
Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50KTsKKyAgICBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQt
PmJ1aWxkVHJhbnNhY3Rpb24obGF5ZXJUcmFuc2FjdGlvbiwgKmRvd25jYXN0PEdyYXBoaWNzTGF5
ZXJDQVJlbW90ZT4oKm1fcm9vdExheWVyKS5wbGF0Zm9ybUNBTGF5ZXIoKSk7CisgICAgbV9yZW1v
dGVMYXllclRyZWVDb250ZXh0LT5zZXROZXh0Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50KGZhbHNl
KTsKKyAgICBiYWNraW5nU3RvcmVDb2xsZWN0aW9uLndpbGxDb21taXRMYXllclRyZWUobGF5ZXJU
cmFuc2FjdGlvbik7CisgICAgbV93ZWJQYWdlLndpbGxDb21taXRMYXllclRyZWUobGF5ZXJUcmFu
c2FjdGlvbik7CisKKyAgICBsYXllclRyYW5zYWN0aW9uLnNldE5ld2x5UmVhY2hlZExheW91dE1p
bGVzdG9uZXMobV9wZW5kaW5nTmV3bHlSZWFjaGVkTGF5b3V0TWlsZXN0b25lcyk7CisgICAgbV9w
ZW5kaW5nTmV3bHlSZWFjaGVkTGF5b3V0TWlsZXN0b25lcyA9IDA7CisKKyAgICBSZW1vdGVTY3Jv
bGxpbmdDb29yZGluYXRvclRyYW5zYWN0aW9uIHNjcm9sbGluZ1RyYW5zYWN0aW9uOworI2lmIEVO
QUJMRShBU1lOQ19TQ1JPTExJTkcpCisgICAgaWYgKG1fd2ViUGFnZS5zY3JvbGxpbmdDb29yZGlu
YXRvcigpKQorICAgICAgICBkb3duY2FzdDxSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcj4oKm1f
d2ViUGFnZS5zY3JvbGxpbmdDb29yZGluYXRvcigpKS5idWlsZFRyYW5zYWN0aW9uKHNjcm9sbGlu
Z1RyYW5zYWN0aW9uKTsKKyNlbmRpZgorCisgICAgbV9uZXh0Rmx1c2hJc0ZvckltbWVkaWF0ZVBh
aW50ID0gZmFsc2U7CisgICAgbV93YWl0aW5nRm9yQmFja2luZ1N0b3JlU3dhcCA9IHRydWU7CisK
KyAgICBtX3dlYlBhZ2Uuc2VuZChNZXNzYWdlczo6UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWFQ
cm94eTo6V2lsbENvbW1pdExheWVyVHJlZShsYXllclRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSUQo
KSkpOworCisgICAgTWVzc2FnZXM6OlJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhUHJveHk6OkNv
bW1pdExheWVyVHJlZSBtZXNzYWdlKGxheWVyVHJhbnNhY3Rpb24sIHNjcm9sbGluZ1RyYW5zYWN0
aW9uKTsKKyAgICBhdXRvIGNvbW1pdEVuY29kZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPElQQzo6RW5j
b2Rlcj4oTWVzc2FnZXM6OlJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhUHJveHk6OkNvbW1pdExh
eWVyVHJlZTo6cmVjZWl2ZXJOYW1lKCksIE1lc3NhZ2VzOjpSZW1vdGVMYXllclRyZWVEcmF3aW5n
QXJlYVByb3h5OjpDb21taXRMYXllclRyZWU6Om5hbWUoKSwgbV93ZWJQYWdlLnBhZ2VJRCgpKTsK
KyAgICBjb21taXRFbmNvZGVyLT5lbmNvZGUobWVzc2FnZS5hcmd1bWVudHMoKSk7CisKKyAgICAv
LyBGSVhNRTogTW92ZSBhbGwgYmFja2luZyBzdG9yZSBmbHVzaGluZyBtYW5hZ2VtZW50IHRvIFJl
bW90ZUxheWVyQmFja2luZ1N0b3JlQ29sbGVjdGlvbi4KKyAgICBib29sIGhhZEFueUNoYW5nZWRC
YWNraW5nU3RvcmUgPSBmYWxzZTsKKyAgICBWZWN0b3I8UmV0YWluUHRyPENHQ29udGV4dFJlZj4+
IGNvbnRleHRzVG9GbHVzaDsKKyAgICBmb3IgKGF1dG8mIGxheWVyIDogbGF5ZXJUcmFuc2FjdGlv
bi5jaGFuZ2VkTGF5ZXJzKCkpIHsKKyAgICAgICAgaWYgKGxheWVyLT5wcm9wZXJ0aWVzKCkuY2hh
bmdlZFByb3BlcnRpZXMgJiBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6TGF5ZXJDaGFuZ2Vz
OjpCYWNraW5nU3RvcmVDaGFuZ2VkKSB7CisgICAgICAgICAgICBoYWRBbnlDaGFuZ2VkQmFja2lu
Z1N0b3JlID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChsYXllci0+cHJvcGVydGllcygpLmJhY2tp
bmdTdG9yZSkgeworICAgICAgICAgICAgICAgIGlmIChhdXRvIGNvbnRleHRQZW5kaW5nRmx1c2gg
PSBsYXllci0+cHJvcGVydGllcygpLmJhY2tpbmdTdG9yZS0+dGFrZUZyb250Q29udGV4dFBlbmRp
bmdGbHVzaCgpKQorICAgICAgICAgICAgICAgICAgICBjb250ZXh0c1RvRmx1c2guYXBwZW5kKGNv
bnRleHRQZW5kaW5nRmx1c2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
bGF5ZXItPmRpZENvbW1pdCgpOworICAgIH0KKworICAgIGJhY2tpbmdTdG9yZUNvbGxlY3Rpb24u
ZGlkRmx1c2hMYXllcnMoKTsKKworICAgIGlmIChoYWRBbnlDaGFuZ2VkQmFja2luZ1N0b3JlKQor
ICAgICAgICBiYWNraW5nU3RvcmVDb2xsZWN0aW9uLnNjaGVkdWxlVm9sYXRpbGl0eVRpbWVyKCk7
CisKKyAgICBSZWZQdHI8QmFja2luZ1N0b3JlRmx1c2hlcj4gYmFja2luZ1N0b3JlRmx1c2hlciA9
IEJhY2tpbmdTdG9yZUZsdXNoZXI6OmNyZWF0ZShXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5wYXJl
bnRQcm9jZXNzQ29ubmVjdGlvbigpLCBXVEZNb3ZlKGNvbW1pdEVuY29kZXIpLCBXVEZNb3ZlKGNv
bnRleHRzVG9GbHVzaCkpOworICAgIG1fcGVuZGluZ0JhY2tpbmdTdG9yZUZsdXNoZXIgPSBiYWNr
aW5nU3RvcmVGbHVzaGVyOworCisgICAgdWludDY0X3QgcGFnZUlEID0gbV93ZWJQYWdlLnBhZ2VJ
RCgpOworICAgIGRpc3BhdGNoX2FzeW5jKG1fY29tbWl0UXVldWUsIFtiYWNraW5nU3RvcmVGbHVz
aGVyLCBwYWdlSURdIHsKKyAgICAgICAgYmFja2luZ1N0b3JlRmx1c2hlci0+Zmx1c2goKTsKKwor
ICAgICAgICBNb25vdG9uaWNUaW1lIHRpbWVzdGFtcCA9IE1vbm90b25pY1RpbWU6Om5vdygpOwor
ICAgICAgICBkaXNwYXRjaF9hc3luYyhkaXNwYXRjaF9nZXRfbWFpbl9xdWV1ZSgpLCBbcGFnZUlE
LCB0aW1lc3RhbXBdIHsKKyAgICAgICAgICAgIGlmIChXZWJQYWdlKiB3ZWJQYWdlID0gV2ViUHJv
Y2Vzczo6c2luZ2xldG9uKCkud2ViUGFnZShwYWdlSUQpKQorICAgICAgICAgICAgICAgIHdlYlBh
Z2UtPmRpZEZsdXNoTGF5ZXJUcmVlQXRUaW1lKHRpbWVzdGFtcCk7CisgICAgICAgIH0pOworICAg
IH0pOworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpkaWRVcGRhdGUoKQor
eworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgYSBjb3VudGVkIHJlcGxhY2VtZW50IGZv
ciBzZXRMYXllclRyZWVTdGF0ZUlzRnJvemVuLCBidXQKKyAgICAvLyB0aGUgY2FsbGVycyBvZiB0
aGF0IGZ1bmN0aW9uIGFyZSBub3Qgc3RyaWN0bHkgcGFpcmVkLgorCisgICAgbV93YWl0aW5nRm9y
QmFja2luZ1N0b3JlU3dhcCA9IGZhbHNlOworCisgICAgaWYgKG1faGFkRmx1c2hEZWZlcnJlZFdo
aWxlV2FpdGluZ0ZvckJhY2tpbmdTdG9yZVN3YXApIHsKKyAgICAgICAgc2NoZWR1bGVDb21wb3Np
dGluZ0xheWVyRmx1c2goKTsKKyAgICAgICAgbV9oYWRGbHVzaERlZmVycmVkV2hpbGVXYWl0aW5n
Rm9yQmFja2luZ1N0b3JlU3dhcCA9IGZhbHNlOworICAgIH0KKworICAgIC8vIFRoaXMgZW1wdHkg
dHJhbnNhY3Rpb24gc2VydmVzIHRvIHRyaWdnZXIgQ0EncyBnYXJiYWdlIGNvbGxlY3Rpb24gb2Yg
SU9TdXJmYWNlcy4gU2VlIDxyZGFyOi8vcHJvYmxlbS8xNjExMDY4Nz4KKyAgICBbQ0FUcmFuc2Fj
dGlvbiBiZWdpbl07CisgICAgW0NBVHJhbnNhY3Rpb24gY29tbWl0XTsKKworICAgIEhhc2hTZXQ8
UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yKj4gbW9uaXRvcnNUb05vdGlmeSA9
IG1fZGlzcGxheVJlZnJlc2hNb25pdG9yczsKKyAgICBBU1NFUlQoIW1fZGlzcGxheVJlZnJlc2hN
b25pdG9yc1RvTm90aWZ5KTsKKyAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnNUb05vdGlmeSA9
ICZtb25pdG9yc1RvTm90aWZ5OworICAgIHdoaWxlICghbW9uaXRvcnNUb05vdGlmeS5pc0VtcHR5
KCkpCisgICAgICAgIG1vbml0b3JzVG9Ob3RpZnkudGFrZUFueSgpLT5kaWRVcGRhdGVMYXllcnMo
KTsKKyAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnNUb05vdGlmeSA9IG51bGxwdHI7Cit9CisK
K3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6Om1haW5GcmFtZUNvbnRlbnRTaXplQ2hh
bmdlZChjb25zdCBJbnRTaXplJiBjb250ZW50c1NpemUpCit7CisgICAgbV9yb290TGF5ZXItPnNl
dFNpemUoY29udGVudHNTaXplKTsKK30KKworYm9vbCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJl
YTo6bWFya0xheWVyc1ZvbGF0aWxlSW1tZWRpYXRlbHlJZlBvc3NpYmxlKCkKK3sKKyAgICByZXR1
cm4gbV9yZW1vdGVMYXllclRyZWVDb250ZXh0LT5iYWNraW5nU3RvcmVDb2xsZWN0aW9uKCkubWFy
a0FsbEJhY2tpbmdTdG9yZVZvbGF0aWxlSW1tZWRpYXRlbHlJZlBvc3NpYmxlKCk7Cit9CisKK1Jl
ZjxSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6QmFja2luZ1N0b3JlRmx1c2hlcj4gUmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWE6OkJhY2tpbmdTdG9yZUZsdXNoZXI6OmNyZWF0ZShJUEM6OkNv
bm5lY3Rpb24qIGNvbm5lY3Rpb24sIHN0ZDo6dW5pcXVlX3B0cjxJUEM6OkVuY29kZXI+IGVuY29k
ZXIsIFZlY3RvcjxSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPj4gY29udGV4dHNUb0ZsdXNoKQorewor
ICAgIHJldHVybiBhZG9wdFJlZigqbmV3IFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpCYWNr
aW5nU3RvcmVGbHVzaGVyKGNvbm5lY3Rpb24sIFdURk1vdmUoZW5jb2RlciksIFdURk1vdmUoY29u
dGV4dHNUb0ZsdXNoKSkpOworfQorCitSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6QmFja2lu
Z1N0b3JlRmx1c2hlcjo6QmFja2luZ1N0b3JlRmx1c2hlcihJUEM6OkNvbm5lY3Rpb24qIGNvbm5l
Y3Rpb24sIHN0ZDo6dW5pcXVlX3B0cjxJUEM6OkVuY29kZXI+IGVuY29kZXIsIFZlY3RvcjxSZXRh
aW5QdHI8Q0dDb250ZXh0UmVmPj4gY29udGV4dHNUb0ZsdXNoKQorICAgIDogbV9jb25uZWN0aW9u
KGNvbm5lY3Rpb24pCisgICAgLCBtX2NvbW1pdEVuY29kZXIoV1RGTW92ZShlbmNvZGVyKSkKKyAg
ICAsIG1fY29udGV4dHNUb0ZsdXNoKFdURk1vdmUoY29udGV4dHNUb0ZsdXNoKSkKKyAgICAsIG1f
aGFzRmx1c2hlZChmYWxzZSkKK3sKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJl
YTo6QmFja2luZ1N0b3JlRmx1c2hlcjo6Zmx1c2goKQoreworICAgIEFTU0VSVCghbV9oYXNGbHVz
aGVkKTsKKworICAgIFRyYWNlU2NvcGUgdHJhY2luZ1Njb3BlKEJhY2tpbmdTdG9yZUZsdXNoU3Rh
cnQsIEJhY2tpbmdTdG9yZUZsdXNoRW5kKTsKKyAgICAKKyAgICBmb3IgKGF1dG8mIGNvbnRleHQg
OiBtX2NvbnRleHRzVG9GbHVzaCkKKyAgICAgICAgQ0dDb250ZXh0Rmx1c2goY29udGV4dC5nZXQo
KSk7CisgICAgbV9oYXNGbHVzaGVkID0gdHJ1ZTsKKworICAgIG1fY29ubmVjdGlvbi0+c2VuZE1l
c3NhZ2UoV1RGTW92ZShtX2NvbW1pdEVuY29kZXIpLCB7IH0pOworfQorCit2b2lkIFJlbW90ZUxh
eWVyVHJlZURyYXdpbmdBcmVhOjphY3Rpdml0eVN0YXRlRGlkQ2hhbmdlKEFjdGl2aXR5U3RhdGU6
OkZsYWdzLCBib29sIHdhbnRzRGlkVXBkYXRlQWN0aXZpdHlTdGF0ZSwgY29uc3QgVmVjdG9yPENh
bGxiYWNrSUQ+JikKK3sKKyAgICAvLyBGSVhNRTogU2hvdWxkIHdlIHN1c3BlbmQgcGFpbnRpbmcg
d2hpbGUgbm90IHZpc2libGUsIGxpa2UgVGlsZWRDb3JlQW5pbWF0aW9uRHJhd2luZ0FyZWE/IFBy
b2JhYmx5LgorCisgICAgaWYgKHdhbnRzRGlkVXBkYXRlQWN0aXZpdHlTdGF0ZSkgeworICAgICAg
ICBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQgPSB0cnVlOworICAgICAgICBzY2hlZHVs
ZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaEltbWVkaWF0ZWx5KCk7CisgICAgfQorfQorCit2b2lkIFJl
bW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphZGRUcmFuc2FjdGlvbkNhbGxiYWNrSUQoQ2FsbGJh
Y2tJRCBjYWxsYmFja0lEKQoreworICAgIC8vIEFzc3VtZSB0aGF0IGlmIHNvbWVvbmUgaXMgbGlz
dGVuaW5nIGZvciB0aGlzIHRyYW5zYWN0aW9uJ3MgY29tcGxldGlvbiwgdGhhdCB0aGV5IHdhbnQg
aXQgdG8KKyAgICAvLyBiZSBhICJjb21wbGV0ZSIgcGFpbnQgKGluY2x1ZGluZyBpbWFnZXMgdGhh
dCB3b3VsZCBub3JtYWxseSBiZSBhc3luY2hyb25vdXNseSBkZWNvZGluZykuCisgICAgbV9uZXh0
Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50ID0gdHJ1ZTsKKworICAgIG1fcGVuZGluZ0NhbGxiYWNr
SURzLmFwcGVuZChzdGF0aWNfY2FzdDxSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6VHJhbnNh
Y3Rpb25DYWxsYmFja0lEPihjYWxsYmFja0lEKSk7CisgICAgc2NoZWR1bGVDb21wb3NpdGluZ0xh
eWVyRmx1c2goKTsKK30KKworYm9vbCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6ZGlzcGF0
Y2hEaWRSZWFjaExheW91dE1pbGVzdG9uZShXZWJDb3JlOjpMYXlvdXRNaWxlc3RvbmVzIGxheW91
dE1pbGVzdG9uZXMpCit7CisgICAgbV9wZW5kaW5nTmV3bHlSZWFjaGVkTGF5b3V0TWlsZXN0b25l
cyB8PSBsYXlvdXRNaWxlc3RvbmVzOworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdl
L0NvY29hL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5oIGIvU291
cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlL1JlbW90
ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uY2Y1ZGNlZDNiNGM3NDJiYjA5MzZj
ZjNlOGUzYmVjNDNkMmQyMDE3MQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVTY3JvbGxpbmdDb29y
ZGluYXRvci5oCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAx
NSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUmVt
b3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JfaAorI2RlZmluZSBSZW1vdGVTY3JvbGxpbmdDb29yZGlu
YXRvcl9oCisKKyNpZiBFTkFCTEUoQVNZTkNfU0NST0xMSU5HKQorCisjaW5jbHVkZSAiTWVzc2Fn
ZVJlY2VpdmVyLmgiCisjaW5jbHVkZSA8V2ViQ29yZS9Bc3luY1Njcm9sbGluZ0Nvb3JkaW5hdG9y
Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TY3JvbGxUeXBlcy5oPgorI2luY2x1ZGUgPFdlYkNvcmUv
U2Nyb2xsaW5nQ29uc3RyYWludHMuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1RpbWVyLmg+CisKK25h
bWVzcGFjZSBJUEMgeworY2xhc3MgRGVjb2RlcjsKK2NsYXNzIEVuY29kZXI7Cit9CisKK25hbWVz
cGFjZSBXZWJLaXQgeworCitjbGFzcyBXZWJQYWdlOworY2xhc3MgUmVtb3RlU2Nyb2xsaW5nQ29v
cmRpbmF0b3JUcmFuc2FjdGlvbjsKKworY2xhc3MgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3Ig
OiBwdWJsaWMgV2ViQ29yZTo6QXN5bmNTY3JvbGxpbmdDb29yZGluYXRvciwgcHVibGljIElQQzo6
TWVzc2FnZVJlY2VpdmVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUmVmPFJlbW90ZVNjcm9sbGlu
Z0Nvb3JkaW5hdG9yPiBjcmVhdGUoV2ViUGFnZSogcGFnZSkKKyAgICB7CisgICAgICAgIHJldHVy
biBhZG9wdFJlZigqbmV3IFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yKHBhZ2UpKTsKKyAgICB9
CisKKyAgICB2b2lkIGJ1aWxkVHJhbnNhY3Rpb24oUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JU
cmFuc2FjdGlvbiYpOworCitwcml2YXRlOgorICAgIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9y
KFdlYlBhZ2UqKTsKKyAgICB2aXJ0dWFsIH5SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcigpOwor
CisgICAgYm9vbCBpc1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yKCkgY29uc3Qgb3ZlcnJpZGUg
eyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIC8vIFNjcm9sbGluZ0Nvb3JkaW5hdG9yCisgICAg
Ym9vbCBjb29yZGluYXRlc1Njcm9sbGluZ0ZvckZyYW1lVmlldyhjb25zdCBXZWJDb3JlOjpGcmFt
ZVZpZXcmKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNjaGVkdWxlVHJlZVN0YXRlQ29tbWl0
KCkgb3ZlcnJpZGU7CisKKyAgICBib29sIGlzUnViYmVyQmFuZEluUHJvZ3Jlc3MoKSBjb25zdCBv
dmVycmlkZTsKKyAgICB2b2lkIHNldFNjcm9sbFBpbm5pbmdCZWhhdmlvcihXZWJDb3JlOjpTY3Jv
bGxQaW5uaW5nQmVoYXZpb3IpIG92ZXJyaWRlOworICAgIGJvb2wgaXNTY3JvbGxTbmFwSW5Qcm9n
cmVzcygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gSVBDOjpNZXNzYWdlUmVjZWl2ZXIKKyAg
ICB2b2lkIGRpZFJlY2VpdmVNZXNzYWdlKElQQzo6Q29ubmVjdGlvbiYsIElQQzo6RGVjb2RlciYp
IG92ZXJyaWRlOworICAgIAorICAgIC8vIFJlc3BvbmQgdG8gVUkgcHJvY2VzcyBjaGFuZ2VzLgor
ICAgIHZvaWQgc2Nyb2xsUG9zaXRpb25DaGFuZ2VkRm9yTm9kZShXZWJDb3JlOjpTY3JvbGxpbmdO
b2RlSUQsIGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmIHNjcm9sbFBvc2l0aW9uLCBib29sIHN5
bmNMYXllclBvc2l0aW9uKTsKKyAgICB2b2lkIGN1cnJlbnRTbmFwUG9pbnRJbmRpY2VzQ2hhbmdl
ZEZvck5vZGUoV2ViQ29yZTo6U2Nyb2xsaW5nTm9kZUlELCB1bnNpZ25lZCBob3Jpem9udGFsLCB1
bnNpZ25lZCB2ZXJ0aWNhbCk7CisKKyAgICBXZWJQYWdlKiBtX3dlYlBhZ2U7Cit9OworCit9IC8v
IG5hbWVzcGFjZSBXZWJLaXQKKworU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19TQ1JPTExJTkdfQ09P
UkRJTkFUT1IoV2ViS2l0OjpSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvciwgaXNSZW1vdGVTY3Jv
bGxpbmdDb29yZGluYXRvcigpKTsKKworI2VuZGlmIC8vIEVOQUJMRShBU1lOQ19TQ1JPTExJTkcp
CisKKyNlbmRpZiAvLyBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcl9oCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUmVt
b3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMuaW4gYi9Tb3VyY2UvV2ViS2l0L1dlYlBy
b2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUmVtb3RlU2Nyb2xsaW5nQ29vcmRp
bmF0b3IubWVzc2FnZXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMmMwOThhMTA5NzAyMzY3YzM4MzM3MWU4OGU1
YTc2MWQ0NWUxOTlhZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRv
ci5tZXNzYWdlcy5pbgpAQCAtMCwwICsxLDMwIEBACisjIENvcHlyaWdodCAoQykgMjAxNC0yMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworIyBhcmUgbWV0OgorIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
IEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SCisjIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyMgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIKKyMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyMgT1IgVE9SVCAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKworI2lmIEVOQUJMRShBU1lOQ19TQ1JPTExJTkcpCisKK21lc3Nh
Z2VzIC0+IFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yIHsKKyAgICBTY3JvbGxQb3NpdGlvbkNo
YW5nZWRGb3JOb2RlKHVpbnQ2NF90IG5vZGVJRCwgV2ViQ29yZTo6RmxvYXRQb2ludCBzY3JvbGxQ
b3NpdGlvbiwgYm9vbCBzeW5jTGF5ZXJQb3NpdGlvbik7CisgICAgQ3VycmVudFNuYXBQb2ludElu
ZGljZXNDaGFuZ2VkRm9yTm9kZSh1aW50NjRfdCBub2RlSUQsIHVuc2lnbmVkIGhvcml6b250YWws
IHVuc2lnbmVkIHZlcnRpY2FsKTsKK30KKworI2VuZGlmIC8vIEVOQUJMRShBU1lOQ19TQ1JPTExJ
TkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9S
ZW1vdGVMYXllclRyZWUvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubW0gYi9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWUvUmVtb3RlU2Nyb2xs
aW5nQ29vcmRpbmF0b3IubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODg2NDE1MjVlNTJiOTc5ZGU0MDNhNmU2YTcx
MDJjZDNhMjVkMzI1MgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRv
ci5tbQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwor
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisg
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2ltcG9ydCAiY29uZmln
LmgiCisjaW1wb3J0ICJSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5oIgorCisjaWYgRU5BQkxF
KEFTWU5DX1NDUk9MTElORykKKworI2ltcG9ydCAiQXJndW1lbnRDb2RlcnMuaCIKKyNpbXBvcnQg
IkdyYXBoaWNzTGF5ZXJDQVJlbW90ZS5oIgorI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlRHJhd2lu
Z0FyZWEuaCIKKyNpbXBvcnQgIlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yTWVzc2FnZXMuaCIK
KyNpbXBvcnQgIlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yVHJhbnNhY3Rpb24uaCIKKyNpbXBv
cnQgIldlYkNvcmVBcmd1bWVudENvZGVycy5oIgorI2ltcG9ydCAiV2ViUGFnZS5oIgorI2ltcG9y
dCAiV2ViUHJvY2Vzcy5oIgorI2ltcG9ydCA8V2ViQ29yZS9HcmFwaGljc0xheWVyLmg+CisjaW1w
b3J0IDxXZWJDb3JlL0ZyYW1lVmlldy5oPgorI2ltcG9ydCA8V2ViQ29yZS9GcmFtZS5oPgorI2lt
cG9ydCA8V2ViQ29yZS9SZW5kZXJMYXllckNvbXBvc2l0b3IuaD4KKyNpbXBvcnQgPFdlYkNvcmUv
UmVuZGVyVmlldy5oPgorI2ltcG9ydCA8V2ViQ29yZS9TY3JvbGxpbmdUcmVlRml4ZWROb2RlLmg+
CisjaW1wb3J0IDxXZWJDb3JlL1Njcm9sbGluZ1RyZWVTdGlja3lOb2RlLmg+CisKK3VzaW5nIG5h
bWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworUmVtb3RlU2Nyb2xsaW5n
Q29vcmRpbmF0b3I6OlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yKFdlYlBhZ2UqIHBhZ2UpCisg
ICAgOiBBc3luY1Njcm9sbGluZ0Nvb3JkaW5hdG9yKHBhZ2UtPmNvcmVQYWdlKCkpCisgICAgLCBt
X3dlYlBhZ2UocGFnZSkKK3sKKyAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5hZGRNZXNzYWdl
UmVjZWl2ZXIoTWVzc2FnZXM6OlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yOjptZXNzYWdlUmVj
ZWl2ZXJOYW1lKCksIG1fd2ViUGFnZS0+cGFnZUlEKCksICp0aGlzKTsKK30KKworUmVtb3RlU2Ny
b2xsaW5nQ29vcmRpbmF0b3I6On5SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcigpCit7CisgICAg
V2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucmVtb3ZlTWVzc2FnZVJlY2VpdmVyKE1lc3NhZ2VzOjpS
ZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcjo6bWVzc2FnZVJlY2VpdmVyTmFtZSgpLCBtX3dlYlBh
Z2UtPnBhZ2VJRCgpKTsKK30KKwordm9pZCBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcjo6c2No
ZWR1bGVUcmVlU3RhdGVDb21taXQoKQoreworICAgIG1fd2ViUGFnZS0+ZHJhd2luZ0FyZWEoKS0+
c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKTsKK30KKworYm9vbCBSZW1vdGVTY3JvbGxp
bmdDb29yZGluYXRvcjo6Y29vcmRpbmF0ZXNTY3JvbGxpbmdGb3JGcmFtZVZpZXcoY29uc3QgRnJh
bWVWaWV3JiBmcmFtZVZpZXcpIGNvbnN0Cit7CisgICAgUmVuZGVyVmlldyogcmVuZGVyVmlldyA9
IGZyYW1lVmlldy5yZW5kZXJWaWV3KCk7CisgICAgcmV0dXJuIHJlbmRlclZpZXcgJiYgcmVuZGVy
Vmlldy0+dXNlc0NvbXBvc2l0aW5nKCk7Cit9CisKK2Jvb2wgUmVtb3RlU2Nyb2xsaW5nQ29vcmRp
bmF0b3I6OmlzUnViYmVyQmFuZEluUHJvZ3Jlc3MoKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBu
ZWVkIHRvIG1haW50YWluIHN0YXRlIGluIHRoZSB3ZWIgcHJvY2Vzcz8KKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK2Jvb2wgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I6OmlzU2Nyb2xsU25hcElu
UHJvZ3Jlc3MoKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBuZWVkIHRvIG1haW50YWluIHN0YXRl
IGluIHRoZSB3ZWIgcHJvY2Vzcz8KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVtb3Rl
U2Nyb2xsaW5nQ29vcmRpbmF0b3I6OnNldFNjcm9sbFBpbm5pbmdCZWhhdmlvcihTY3JvbGxQaW5u
aW5nQmVoYXZpb3IpCit7CisgICAgLy8gRklYTUU6IHNlbmQgdG8gdGhlIFVJIHByb2Nlc3MuCit9
CisKK3ZvaWQgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I6OmJ1aWxkVHJhbnNhY3Rpb24oUmVt
b3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JUcmFuc2FjdGlvbiYgdHJhbnNhY3Rpb24pCit7CisgICAg
d2lsbENvbW1pdFRyZWUoKTsKKyAgICB0cmFuc2FjdGlvbi5zZXRTdGF0ZVRyZWVUb0VuY29kZShz
Y3JvbGxpbmdTdGF0ZVRyZWUoKS0+Y29tbWl0KExheWVyUmVwcmVzZW50YXRpb246OlBsYXRmb3Jt
TGF5ZXJJRFJlcHJlc2VudGF0aW9uKSk7Cit9CisKKy8vIE5vdGlmaWNhdGlvbiBmcm9tIHRoZSBV
SSBwcm9jZXNzIHRoYXQgd2Ugc2Nyb2xsZWQuCit2b2lkIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5h
dG9yOjpzY3JvbGxQb3NpdGlvbkNoYW5nZWRGb3JOb2RlKFNjcm9sbGluZ05vZGVJRCBub2RlSUQs
IGNvbnN0IEZsb2F0UG9pbnQmIHNjcm9sbFBvc2l0aW9uLCBib29sIHN5bmNMYXllclBvc2l0aW9u
KQoreworICAgIHNjaGVkdWxlVXBkYXRlU2Nyb2xsUG9zaXRpb25BZnRlckFzeW5jU2Nyb2xsKG5v
ZGVJRCwgc2Nyb2xsUG9zaXRpb24sIHN0ZDo6bnVsbG9wdCwgZmFsc2UgLyogRklYTUUgKi8sIHN5
bmNMYXllclBvc2l0aW9uID8gU2Nyb2xsaW5nTGF5ZXJQb3NpdGlvbkFjdGlvbjo6U3luYyA6IFNj
cm9sbGluZ0xheWVyUG9zaXRpb25BY3Rpb246OlNldCk7Cit9CisKK3ZvaWQgUmVtb3RlU2Nyb2xs
aW5nQ29vcmRpbmF0b3I6OmN1cnJlbnRTbmFwUG9pbnRJbmRpY2VzQ2hhbmdlZEZvck5vZGUoU2Ny
b2xsaW5nTm9kZUlEIG5vZGVJRCwgdW5zaWduZWQgaG9yaXpvbnRhbCwgdW5zaWduZWQgdmVydGlj
YWwpCit7CisgICAgc2V0QWN0aXZlU2Nyb2xsU25hcEluZGljZXMobm9kZUlELCBob3Jpem9udGFs
LCB2ZXJ0aWNhbCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8gRU5B
QkxFKEFTWU5DX1NDUk9MTElORykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5oIGIv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlRGlz
cGxheVJlZnJlc2hNb25pdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjdm
NWFhMTdhMzA2MzhjMmJkMGIwODE0OGNjZmQwN2Q4NjhkYjAuLjAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBh
Z2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yLmgKKysrIC9kZXYv
bnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0g
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgVVNFKFJFUVVFU1RfQU5JTUFUSU9OX0ZS
QU1FX0RJU1BMQVlfTU9OSVRPUikKLQotI2luY2x1ZGUgIlJlbW90ZUxheWVyVHJlZURyYXdpbmdB
cmVhLmgiCi0jaW5jbHVkZSA8V2ViQ29yZS9EaXNwbGF5UmVmcmVzaE1vbml0b3IuaD4KLQotbmFt
ZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9u
aXRvciA6IHB1YmxpYyBXZWJDb3JlOjpEaXNwbGF5UmVmcmVzaE1vbml0b3IgewotcHVibGljOgot
ICAgIHN0YXRpYyBSZWY8UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yPiBjcmVh
dGUoV2ViQ29yZTo6UGxhdGZvcm1EaXNwbGF5SUQgZGlzcGxheUlELCBSZW1vdGVMYXllclRyZWVE
cmF3aW5nQXJlYSYgZHJhd2luZ0FyZWEpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYo
Km5ldyBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IoZGlzcGxheUlELCBkcmF3
aW5nQXJlYSkpOwotICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIH5SZW1vdGVMYXllclRyZWVEaXNw
bGF5UmVmcmVzaE1vbml0b3IoKTsKLQotICAgIGJvb2wgcmVxdWVzdFJlZnJlc2hDYWxsYmFjaygp
IG92ZXJyaWRlOwotCi0gICAgdm9pZCBkaWRVcGRhdGVMYXllcnMoKTsKLQotcHJpdmF0ZToKLSAg
ICBleHBsaWNpdCBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IoV2ViQ29yZTo6
UGxhdGZvcm1EaXNwbGF5SUQsIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhJik7Ci0KLSAgICBX
ZWFrUHRyPFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhPiBtX2RyYXdpbmdBcmVhOwotfTsKLQot
fQotCi0jZW5kaWYgLy8gVVNFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FX0RJU1BMQVlfTU9OSVRP
UikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1Jl
bW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5tbSBiL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRv
ci5tbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyZDY1NzE1NTk4Zjc3NGFiZjll
MzQ0OTA3NTcxNjNjYzQ0NTA4Mi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVM
YXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IubW0KKysrIC9kZXYvbnVsbApAQCAtMSw3NSAr
MCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
Ci0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0KLSNp
bXBvcnQgImNvbmZpZy5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hN
b25pdG9yLmgiCi0KLSNpZiBVU0UoUkVRVUVTVF9BTklNQVRJT05fRlJBTUVfRElTUExBWV9NT05J
VE9SKQotCi0jaW1wb3J0IDx3dGYvQ3VycmVudFRpbWUuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdl
YkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1SZW1vdGVMYXllclRyZWVEaXNwbGF5UmVm
cmVzaE1vbml0b3I6OlJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcihQbGF0Zm9y
bURpc3BsYXlJRCBkaXNwbGF5SUQsIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhJiBkcmF3aW5n
QXJlYSkKLSAgICA6IERpc3BsYXlSZWZyZXNoTW9uaXRvcihkaXNwbGF5SUQpCi0gICAgLCBtX2Ry
YXdpbmdBcmVhKGRyYXdpbmdBcmVhLmNyZWF0ZVdlYWtQdHIoKSkKLXsKLX0KLQotUmVtb3RlTGF5
ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yOjp+UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJl
c2hNb25pdG9yKCkKLXsKLSAgICBpZiAobV9kcmF3aW5nQXJlYSkKLSAgICAgICAgbV9kcmF3aW5n
QXJlYS0+d2lsbERlc3Ryb3lEaXNwbGF5UmVmcmVzaE1vbml0b3IodGhpcyk7Ci19Ci0KLWJvb2wg
UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yOjpyZXF1ZXN0UmVmcmVzaENhbGxi
YWNrKCkKLXsKLSAgICBpZiAoIW1fZHJhd2luZ0FyZWEgfHwgIWlzQWN0aXZlKCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIGlmICghaXNTY2hlZHVsZWQoKSkKLSAgICAgICAgc3RhdGlj
X2Nhc3Q8RHJhd2luZ0FyZWEmPigqbV9kcmF3aW5nQXJlYS5nZXQoKSkuc2NoZWR1bGVDb21wb3Np
dGluZ0xheWVyRmx1c2goKTsKLQotICAgIHNldElzQWN0aXZlKHRydWUpOwotICAgIHNldElzU2No
ZWR1bGVkKHRydWUpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJl
ZURpc3BsYXlSZWZyZXNoTW9uaXRvcjo6ZGlkVXBkYXRlTGF5ZXJzKCkKLXsKLSAgICBzZXRJc1Nj
aGVkdWxlZChmYWxzZSk7Ci0KLSAgICBpZiAoIWlzUHJldmlvdXNGcmFtZURvbmUoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgc2V0SXNQcmV2aW91c0ZyYW1lRG9uZShmYWxzZSk7Ci0gICAgaGFu
ZGxlRGlzcGxheVJlZnJlc2hlZE5vdGlmaWNhdGlvbk9uTWFpblRocmVhZCh0aGlzKTsKLX0KLQot
fQotCi0jZW5kaWYgLy8gVVNFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FX0RJU1BMQVlfTU9OSVRP
UikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9HcmFw
aGljc0xheWVyQ0FSZW1vdGUuY3BwIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2Uv
bWFjL0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDJkZjQyZTk0NzMwZjE2MzgzZjliNWE3MzJlODI5NmNiNWMxYTI1ZjAuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9j
ZXNzL1dlYlBhZ2UvbWFjL0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5jcHAKKysrIC9kZXYvbnVsbApA
QCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgot
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0g
Ki8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXJDQVJlbW90
ZS5oIgotI2luY2x1ZGUgIlBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUuaCIKLSNpbmNsdWRlICJQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaCIKLSNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtU2NyZWVu
Lmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQot
R3JhcGhpY3NMYXllckNBUmVtb3RlOjp+R3JhcGhpY3NMYXllckNBUmVtb3RlKCkKLXsKLX0KLQot
Ym9vbCBHcmFwaGljc0xheWVyQ0FSZW1vdGU6OmZpbHRlcnNDYW5CZUNvbXBvc2l0ZWQoY29uc3Qg
RmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycykKLXsKLSAgICByZXR1cm4gUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjpmaWx0ZXJzQ2FuQmVDb21wb3NpdGVkKGZpbHRlcnMpOwotfQotCi1SZWY8UGxhdGZv
cm1DQUxheWVyPiBHcmFwaGljc0xheWVyQ0FSZW1vdGU6OmNyZWF0ZVBsYXRmb3JtQ0FMYXllcihQ
bGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSBsYXllclR5cGUsIFBsYXRmb3JtQ0FMYXllckNsaWVu
dCogb3duZXIpCi17Ci0gICAgYXV0byByZXN1bHQgPSBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNy
ZWF0ZShsYXllclR5cGUsIG93bmVyLCBtX2NvbnRleHQpOwotCi0gICAgaWYgKHJlc3VsdC0+Y2Fu
SGF2ZUJhY2tpbmdTdG9yZSgpKQotICAgICAgICByZXN1bHQtPnNldFdhbnRzRGVlcENvbG9yQmFj
a2luZ1N0b3JlKHNjcmVlblN1cHBvcnRzRXh0ZW5kZWRDb2xvcigpKTsKLQotICAgIHJldHVybiBX
VEZNb3ZlKHJlc3VsdCk7Ci19Ci0KLVJlZjxQbGF0Zm9ybUNBTGF5ZXI+IEdyYXBoaWNzTGF5ZXJD
QVJlbW90ZTo6Y3JlYXRlUGxhdGZvcm1DQUxheWVyKFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5
ZXIsIFBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIpCi17Ci0gICAgcmV0dXJuIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6Y3JlYXRlKHBsYXRmb3JtTGF5ZXIsIG93bmVyLCBtX2NvbnRleHQpOwot
fQotCi1SZWY8UGxhdGZvcm1DQUFuaW1hdGlvbj4gR3JhcGhpY3NMYXllckNBUmVtb3RlOjpjcmVh
dGVQbGF0Zm9ybUNBQW5pbWF0aW9uKFBsYXRmb3JtQ0FBbmltYXRpb246OkFuaW1hdGlvblR5cGUg
dHlwZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoKQotewotICAgIHJldHVybiBQbGF0Zm9ybUNBQW5p
bWF0aW9uUmVtb3RlOjpjcmVhdGUodHlwZSwga2V5UGF0aCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNl
IFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFj
L0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBh
Z2UvbWFjL0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCBlNGE5MjU3YTY5YWIyYWVmZDFlYTg2ZDBjOGJjNTZjODU2NzhhNzZiLi4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9XZWJQYWdlL21hYy9HcmFwaGljc0xheWVyQ0FSZW1vdGUuaAorKysgL2Rldi9udWxsCkBA
IC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUg
bWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0g
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPFdlYkNvcmUvR3JhcGhpY3NMYXllckNBLmg+
Ci0jaW5jbHVkZSA8V2ViQ29yZS9QbGF0Zm9ybUxheWVyLmg+Ci0KLW5hbWVzcGFjZSBXZWJLaXQg
ewotCi1jbGFzcyBSZW1vdGVMYXllclRyZWVDb250ZXh0OwotCi1jbGFzcyBHcmFwaGljc0xheWVy
Q0FSZW1vdGUgZmluYWwgOiBwdWJsaWMgV2ViQ29yZTo6R3JhcGhpY3NMYXllckNBIHsKLXB1Ymxp
YzoKLSAgICBHcmFwaGljc0xheWVyQ0FSZW1vdGUoVHlwZSBsYXllclR5cGUsIFdlYkNvcmU6Okdy
YXBoaWNzTGF5ZXJDbGllbnQmIGNsaWVudCwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4
dCkKLSAgICAgICAgOiBHcmFwaGljc0xheWVyQ0EobGF5ZXJUeXBlLCBjbGllbnQpCi0gICAgICAg
ICwgbV9jb250ZXh0KGNvbnRleHQpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgfkdyYXBo
aWNzTGF5ZXJDQVJlbW90ZSgpOwotCi0gICAgYm9vbCBmaWx0ZXJzQ2FuQmVDb21wb3NpdGVkKGNv
bnN0IFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbnMmIGZpbHRlcnMpIG92ZXJyaWRlOwotCi1wcml2
YXRlOgotICAgIGJvb2wgaXNHcmFwaGljc0xheWVyQ0FSZW1vdGUoKSBjb25zdCBvdmVycmlkZSB7
IHJldHVybiB0cnVlOyB9Ci0KLSAgICBSZWY8V2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyPiBjcmVh
dGVQbGF0Zm9ybUNBTGF5ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGUsIFdl
YkNvcmU6OlBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIpIG92ZXJyaWRlOwotICAgIFJlZjxX
ZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI+IGNyZWF0ZVBsYXRmb3JtQ0FMYXllcihQbGF0Zm9ybUxh
eWVyKiwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikgb3ZlcnJpZGU7Ci0g
ICAgUmVmPFdlYkNvcmU6OlBsYXRmb3JtQ0FBbmltYXRpb24+IGNyZWF0ZVBsYXRmb3JtQ0FBbmlt
YXRpb24oV2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbjo6QW5pbWF0aW9uVHlwZSwgY29uc3Qg
U3RyaW5nJiBrZXlQYXRoKSBvdmVycmlkZTsKLQotICAgIC8vIFBsYXRmb3JtQ0FMYXllclJlbW90
ZSBjYW4ndCBjdXJyZW50bHkgcHJveHkgZGlyZWN0bHkgY29tcG9zaXRlZCBpbWFnZSBjb250ZW50
cywgc28gb3B0IG91dCBvZiB0aGlzIG9wdGltaXphdGlvbi4KLSAgICBib29sIHNob3VsZERpcmVj
dGx5Q29tcG9zaXRlSW1hZ2UoV2ViQ29yZTo6SW1hZ2UqKSBjb25zdCBvdmVycmlkZSB7IHJldHVy
biBmYWxzZTsgfQotICAgIAotICAgIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmIG1fY29udGV4dDsK
LX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdAotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0dS
QVBISUNTTEFZRVIoV2ViS2l0OjpHcmFwaGljc0xheWVyQ0FSZW1vdGUsIGlzR3JhcGhpY3NMYXll
ckNBUmVtb3RlKCkpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFn
ZS9tYWMvUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9j
ZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUuaApkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggYzJkNjhkZTg1MjQxYTMyZTU4MjFkOGU3ZjNiY2QwZGU3MzVhODc5
Zi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5o
CisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MTQgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQot
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGVf
aAotI2RlZmluZSBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlX2gKLQotI2luY2x1ZGUgPFdlYkNv
cmUvUGxhdGZvcm1DQUFuaW1hdGlvbi5oPgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Ci0jaW5j
bHVkZSA8d3RmL0hhc2hTZXQuaD4KLQotbmFtZXNwYWNlIElQQyB7Ci1jbGFzcyBFbmNvZGVyOwot
Y2xhc3MgRGVjb2RlcjsKLX07Ci0KLW5hbWVzcGFjZSBXVEYgewotY2xhc3MgVGV4dFN0cmVhbTsK
LX07Ci0KLU9CSkNfQ0xBU1MgQ0FMYXllcjsKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNz
IFJlbW90ZUxheWVyVHJlZUhvc3Q7Ci0KLWNsYXNzIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUg
ZmluYWwgOiBwdWJsaWMgV2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbiB7Ci1wdWJsaWM6Ci0g
ICAgc3RhdGljIFJlZjxQbGF0Zm9ybUNBQW5pbWF0aW9uPiBjcmVhdGUoQW5pbWF0aW9uVHlwZSwg
Y29uc3QgU3RyaW5nJiBrZXlQYXRoKTsKLQotICAgIHZpcnR1YWwgflBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGUoKSB7IH0KLQotICAgIGJvb2wgaXNQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlKCkg
Y29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgUmVmPFBsYXRmb3JtQ0FBbmlt
YXRpb24+IGNvcHkoKSBjb25zdCBvdmVycmlkZTsKLQotICAgIFN0cmluZyBrZXlQYXRoKCkgY29u
c3Qgb3ZlcnJpZGU7Ci0KLSAgICBDRlRpbWVJbnRlcnZhbCBiZWdpblRpbWUoKSBjb25zdCBvdmVy
cmlkZTsKLSAgICB2b2lkIHNldEJlZ2luVGltZShDRlRpbWVJbnRlcnZhbCkgb3ZlcnJpZGU7Ci0K
LSAgICBDRlRpbWVJbnRlcnZhbCBkdXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQg
c2V0RHVyYXRpb24oQ0ZUaW1lSW50ZXJ2YWwpIG92ZXJyaWRlOwotCi0gICAgZmxvYXQgc3BlZWQo
KSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldFNwZWVkKGZsb2F0KSBvdmVycmlkZTsKLQot
ICAgIENGVGltZUludGVydmFsIHRpbWVPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lk
IHNldFRpbWVPZmZzZXQoQ0ZUaW1lSW50ZXJ2YWwpIG92ZXJyaWRlOwotCi0gICAgZmxvYXQgcmVw
ZWF0Q291bnQoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldFJlcGVhdENvdW50KGZsb2F0
KSBvdmVycmlkZTsKLQotICAgIGJvb2wgYXV0b3JldmVyc2VzKCkgY29uc3Qgb3ZlcnJpZGU7Ci0g
ICAgdm9pZCBzZXRBdXRvcmV2ZXJzZXMoYm9vbCkgb3ZlcnJpZGU7Ci0KLSAgICBGaWxsTW9kZVR5
cGUgZmlsbE1vZGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldEZpbGxNb2RlKEZpbGxN
b2RlVHlwZSkgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldFRpbWluZ0Z1bmN0aW9uKGNvbnN0IFdl
YkNvcmU6OlRpbWluZ0Z1bmN0aW9uKiwgYm9vbCByZXZlcnNlID0gZmFsc2UpIG92ZXJyaWRlOwot
ICAgIHZvaWQgY29weVRpbWluZ0Z1bmN0aW9uRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNB
QW5pbWF0aW9uJikgb3ZlcnJpZGU7Ci0KLSAgICBib29sIGlzUmVtb3ZlZE9uQ29tcGxldGlvbigp
IGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0UmVtb3ZlZE9uQ29tcGxldGlvbihib29sKSBv
dmVycmlkZTsKLQotICAgIGJvb2wgaXNBZGRpdGl2ZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZv
aWQgc2V0QWRkaXRpdmUoYm9vbCkgb3ZlcnJpZGU7Ci0KLSAgICBWYWx1ZUZ1bmN0aW9uVHlwZSB2
YWx1ZUZ1bmN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRWYWx1ZUZ1bmN0aW9u
KFZhbHVlRnVuY3Rpb25UeXBlKSBvdmVycmlkZTsKLQotICAgIC8vIEJhc2ljLWFuaW1hdGlvbiBw
cm9wZXJ0aWVzLgotICAgIHZvaWQgc2V0RnJvbVZhbHVlKGZsb2F0KSBvdmVycmlkZTsKLSAgICB2
b2lkIHNldEZyb21WYWx1ZShjb25zdCBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCYpIG92
ZXJyaWRlOwotICAgIHZvaWQgc2V0RnJvbVZhbHVlKGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQz
RCYpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0RnJvbVZhbHVlKGNvbnN0IFdlYkNvcmU6OkNvbG9y
Jikgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRGcm9tVmFsdWUoY29uc3QgV2ViQ29yZTo6RmlsdGVy
T3BlcmF0aW9uKiwgaW50IGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCkgb3ZlcnJpZGU7Ci0g
ICAgdm9pZCBjb3B5RnJvbVZhbHVlRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0
aW9uJikgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldFRvVmFsdWUoZmxvYXQpIG92ZXJyaWRlOwot
ICAgIHZvaWQgc2V0VG9WYWx1ZShjb25zdCBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCYp
IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0VG9WYWx1ZShjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50
M0QmKSBvdmVycmlkZTsKLSAgICB2b2lkIHNldFRvVmFsdWUoY29uc3QgV2ViQ29yZTo6Q29sb3Im
KSBvdmVycmlkZTsKLSAgICB2b2lkIHNldFRvVmFsdWUoY29uc3QgV2ViQ29yZTo6RmlsdGVyT3Bl
cmF0aW9uKiwgaW50IGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCkgb3ZlcnJpZGU7Ci0gICAg
dm9pZCBjb3B5VG9WYWx1ZUZyb20oY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbiYp
IG92ZXJyaWRlOwotCi0gICAgLy8gS2V5ZnJhbWUtYW5pbWF0aW9uIHByb3BlcnRpZXMuCi0gICAg
dm9pZCBzZXRWYWx1ZXMoY29uc3QgVmVjdG9yPGZsb2F0PiYpIG92ZXJyaWRlOwotICAgIHZvaWQg
c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeD4mKSBv
dmVycmlkZTsKLSAgICB2b2lkIHNldFZhbHVlcyhjb25zdCBWZWN0b3I8V2ViQ29yZTo6RmxvYXRQ
b2ludDNEPiYpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxXZWJD
b3JlOjpDb2xvcj4mKSBvdmVycmlkZTsKLSAgICB2b2lkIHNldFZhbHVlcyhjb25zdCBWZWN0b3I8
UmVmUHRyPFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbj4+JiwgaW50IGludGVybmFsRmlsdGVyUHJv
cGVydHlJbmRleCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBjb3B5VmFsdWVzRnJvbShjb25zdCBXZWJD
b3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uJikgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldEtleVRp
bWVzKGNvbnN0IFZlY3RvcjxmbG9hdD4mKSBvdmVycmlkZTsKLSAgICB2b2lkIGNvcHlLZXlUaW1l
c0Zyb20oY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbiYpIG92ZXJyaWRlOwotCi0g
ICAgdm9pZCBzZXRUaW1pbmdGdW5jdGlvbnMoY29uc3QgVmVjdG9yPGNvbnN0IFdlYkNvcmU6OlRp
bWluZ0Z1bmN0aW9uKj4mLCBib29sIHJldmVyc2UgPSBmYWxzZSkgb3ZlcnJpZGU7Ci0gICAgdm9p
ZCBjb3B5VGltaW5nRnVuY3Rpb25zRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0
aW9uJikgb3ZlcnJpZGU7Ci0KLSAgICBBbmltYXRpb25UeXBlIGFuaW1hdGlvblR5cGUoKSBjb25z
dCB7IHJldHVybiBtX3Byb3BlcnRpZXMuYW5pbWF0aW9uVHlwZTsgfQotICAgIHZvaWQgc2V0SGFz
RXhwbGljaXRCZWdpblRpbWUoYm9vbCBoYXNFeHBsaWNpdEJlZ2luVGltZSkgeyBtX3Byb3BlcnRp
ZXMuaGFzRXhwbGljaXRCZWdpblRpbWUgPSBoYXNFeHBsaWNpdEJlZ2luVGltZTsgfQotICAgIGJv
b2wgaGFzRXhwbGljaXRCZWdpblRpbWUoKSBjb25zdCB7IHJldHVybiBtX3Byb3BlcnRpZXMuaGFz
RXhwbGljaXRCZWdpblRpbWU7IH0KLQotICAgIHZvaWQgZGlkU3RhcnQoQ0ZUaW1lSW50ZXJ2YWwg
YmVnaW5UaW1lKSB7IG1fcHJvcGVydGllcy5iZWdpblRpbWUgPSBiZWdpblRpbWU7IH0KLQotICAg
IGNsYXNzIEtleWZyYW1lVmFsdWUgewotICAgIHB1YmxpYzoKLSAgICAgICAgZW51bSBLZXlmcmFt
ZVR5cGUgewotICAgICAgICAgICAgTnVtYmVyS2V5VHlwZSwKLSAgICAgICAgICAgIENvbG9yS2V5
VHlwZSwKLSAgICAgICAgICAgIFBvaW50S2V5VHlwZSwKLSAgICAgICAgICAgIFRyYW5zZm9ybUtl
eVR5cGUsCi0gICAgICAgICAgICBGaWx0ZXJLZXlUeXBlLAotICAgICAgICB9OwotCi0gICAgICAg
IH5LZXlmcmFtZVZhbHVlKCkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgS2V5ZnJh
bWVWYWx1ZShmbG9hdCB2YWx1ZSA9IDApCi0gICAgICAgICAgICA6IGtleVR5cGUoTnVtYmVyS2V5
VHlwZSkKLSAgICAgICAgICAgICwgbnVtYmVyKHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgIH0K
LQotICAgICAgICBLZXlmcmFtZVZhbHVlKFdlYkNvcmU6OkNvbG9yIHZhbHVlKQotICAgICAgICAg
ICAgOiBrZXlUeXBlKENvbG9yS2V5VHlwZSkKLSAgICAgICAgICAgICwgY29sb3IodmFsdWUpCi0g
ICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIEtleWZyYW1lVmFsdWUoY29uc3QgV2ViQ29y
ZTo6RmxvYXRQb2ludDNEJiB2YWx1ZSkKLSAgICAgICAgICAgIDoga2V5VHlwZShQb2ludEtleVR5
cGUpCi0gICAgICAgICAgICAsIHBvaW50KHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgIH0KLQot
ICAgICAgICBLZXlmcmFtZVZhbHVlKGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4
JiB2YWx1ZSkKLSAgICAgICAgICAgIDoga2V5VHlwZShUcmFuc2Zvcm1LZXlUeXBlKQotICAgICAg
ICAgICAgLCB0cmFuc2Zvcm0odmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAg
IEtleWZyYW1lVmFsdWUoUmVmUHRyPFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbj4mJiB2YWx1ZSkK
LSAgICAgICAgICAgIDoga2V5VHlwZShGaWx0ZXJLZXlUeXBlKQotICAgICAgICAgICAgLCBmaWx0
ZXIoV1RGTW92ZSh2YWx1ZSkpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIEtleWZy
YW1lVmFsdWUoY29uc3QgS2V5ZnJhbWVWYWx1ZSYgb3RoZXIpCi0gICAgICAgIHsKLSAgICAgICAg
ICAgICp0aGlzID0gb3RoZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBLZXlmcmFtZVZhbHVlJiBv
cGVyYXRvcj0oY29uc3QgS2V5ZnJhbWVWYWx1ZSYgb3RoZXIpCi0gICAgICAgIHsKLSAgICAgICAg
ICAgIGtleVR5cGUgPSBvdGhlci5rZXlUeXBlOwotICAgICAgICAgICAgc3dpdGNoIChrZXlUeXBl
KSB7Ci0gICAgICAgICAgICBjYXNlIE51bWJlcktleVR5cGU6Ci0gICAgICAgICAgICAgICAgbnVt
YmVyID0gb3RoZXIubnVtYmVyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
Y2FzZSBDb2xvcktleVR5cGU6Ci0gICAgICAgICAgICAgICAgY29sb3IgPSBvdGhlci5jb2xvcjsK
LSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUG9pbnRLZXlUeXBlOgot
ICAgICAgICAgICAgICAgIHBvaW50ID0gb3RoZXIucG9pbnQ7Ci0gICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICBjYXNlIFRyYW5zZm9ybUtleVR5cGU6Ci0gICAgICAgICAgICAgICAg
dHJhbnNmb3JtID0gb3RoZXIudHJhbnNmb3JtOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgY2FzZSBGaWx0ZXJLZXlUeXBlOgotICAgICAgICAgICAgICAgIGZpbHRlciA9IG90
aGVyLmZpbHRlcjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgcmV0dXJuICp0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgS2V5ZnJhbWVUeXBl
IGtleWZyYW1lVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGtleVR5cGU7IH0KLQotICAgICAgICBmbG9h
dCBudW1iZXJWYWx1ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChrZXlU
eXBlID09IE51bWJlcktleVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIG51bWJlcjsKLSAgICAg
ICAgfQotCi0gICAgICAgIFdlYkNvcmU6OkNvbG9yIGNvbG9yVmFsdWUoKSBjb25zdAotICAgICAg
ICB7Ci0gICAgICAgICAgICBBU1NFUlQoa2V5VHlwZSA9PSBDb2xvcktleVR5cGUpOwotICAgICAg
ICAgICAgcmV0dXJuIGNvbG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgV2ViQ29yZTo6
RmxvYXRQb2ludDNEJiBwb2ludFZhbHVlKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAg
QVNTRVJUKGtleVR5cGUgPT0gUG9pbnRLZXlUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBwb2lu
dDsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0
cml4JiB0cmFuc2Zvcm1WYWx1ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VS
VChrZXlUeXBlID09IFRyYW5zZm9ybUtleVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIHRyYW5z
Zm9ybTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IFdlYkNvcmU6OkZpbHRlck9wZXJhdGlv
biogZmlsdGVyVmFsdWUoKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQoa2V5
VHlwZSA9PSBGaWx0ZXJLZXlUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBmaWx0ZXIuZ2V0KCk7
Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGVuY29kZShJUEM6OkVuY29kZXImKSBjb25zdDsK
LSAgICAgICAgc3RhdGljIGJvb2wgZGVjb2RlKElQQzo6RGVjb2RlciYsIEtleWZyYW1lVmFsdWUm
KTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIEtleWZyYW1lVHlwZSBrZXlUeXBlOwotICAgICAg
ICB1bmlvbiB7Ci0gICAgICAgICAgICBmbG9hdCBudW1iZXI7Ci0gICAgICAgICAgICBXZWJDb3Jl
OjpDb2xvciBjb2xvcjsKLSAgICAgICAgICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQzRCBwb2ludDsK
LSAgICAgICAgICAgIFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybTsKLSAg
ICAgICAgfTsKLSAgICAgICAgUmVmUHRyPFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbj4gZmlsdGVy
OwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgUHJvcGVydGllcyB7Ci0gICAgICAgIFByb3BlcnRpZXMo
KQotICAgICAgICAgICAgOiBhbmltYXRpb25UeXBlKEJhc2ljKQotICAgICAgICAgICAgLCBiZWdp
blRpbWUoMCkKLSAgICAgICAgICAgICwgZHVyYXRpb24oMCkKLSAgICAgICAgICAgICwgdGltZU9m
ZnNldCgwKQotICAgICAgICAgICAgLCByZXBlYXRDb3VudCgxKQotICAgICAgICAgICAgLCBzcGVl
ZCgxKQotICAgICAgICAgICAgLCBmaWxsTW9kZShOb0ZpbGxNb2RlKQotICAgICAgICAgICAgLCB2
YWx1ZUZ1bmN0aW9uKE5vVmFsdWVGdW5jdGlvbikKLSAgICAgICAgICAgICwgYXV0b1JldmVyc2Vz
KGZhbHNlKQotICAgICAgICAgICAgLCByZW1vdmVkT25Db21wbGV0aW9uKHRydWUpCi0gICAgICAg
ICAgICAsIGFkZGl0aXZlKGZhbHNlKQotICAgICAgICAgICAgLCByZXZlcnNlVGltaW5nRnVuY3Rp
b25zKGZhbHNlKQotICAgICAgICAgICAgLCBoYXNFeHBsaWNpdEJlZ2luVGltZShmYWxzZSkKLSAg
ICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlbmNvZGUoSVBDOjpFbmNvZGVyJikg
Y29uc3Q7Ci0gICAgICAgIHN0YXRpYyBib29sIGRlY29kZShJUEM6OkRlY29kZXImLCBQcm9wZXJ0
aWVzJik7Ci0KLSAgICAgICAgU3RyaW5nIGtleVBhdGg7Ci0gICAgICAgIFBsYXRmb3JtQ0FBbmlt
YXRpb246OkFuaW1hdGlvblR5cGUgYW5pbWF0aW9uVHlwZTsKLQotICAgICAgICBkb3VibGUgYmVn
aW5UaW1lOwotICAgICAgICBkb3VibGUgZHVyYXRpb247Ci0gICAgICAgIGRvdWJsZSB0aW1lT2Zm
c2V0OwotICAgICAgICBmbG9hdCByZXBlYXRDb3VudDsKLSAgICAgICAgZmxvYXQgc3BlZWQ7Ci0K
LSAgICAgICAgUGxhdGZvcm1DQUFuaW1hdGlvbjo6RmlsbE1vZGVUeXBlIGZpbGxNb2RlOwotICAg
ICAgICBQbGF0Zm9ybUNBQW5pbWF0aW9uOjpWYWx1ZUZ1bmN0aW9uVHlwZSB2YWx1ZUZ1bmN0aW9u
OwotCi0gICAgICAgIGJvb2wgYXV0b1JldmVyc2VzOwotICAgICAgICBib29sIHJlbW92ZWRPbkNv
bXBsZXRpb247Ci0gICAgICAgIGJvb2wgYWRkaXRpdmU7Ci0gICAgICAgIGJvb2wgcmV2ZXJzZVRp
bWluZ0Z1bmN0aW9uczsKLSAgICAgICAgYm9vbCBoYXNFeHBsaWNpdEJlZ2luVGltZTsKLQotICAg
ICAgICAvLyBGb3IgYmFzaWMgYW5pbWF0aW9ucywgdGhlc2UgdmVjdG9ycyBoYXZlIHR3byBlbnRy
aWVzLiBGb3Iga2V5ZnJhbWUgYW5pbWF0aW9ucywgdHdvIG9yIG1vcmUuCi0gICAgICAgIC8vIHRp
bWluZ0Z1bmN0aW9ucyBoYXMgbi0xIGVudHJpZXMuCi0gICAgICAgIFZlY3RvcjxLZXlmcmFtZVZh
bHVlPiBrZXlWYWx1ZXM7Ci0gICAgICAgIFZlY3RvcjxmbG9hdD4ga2V5VGltZXM7Ci0gICAgICAg
IFZlY3RvcjxSZWZQdHI8V2ViQ29yZTo6VGltaW5nRnVuY3Rpb24+PiB0aW1pbmdGdW5jdGlvbnM7
Ci0gICAgfTsKLQotICAgIGNvbnN0IFByb3BlcnRpZXMmIHByb3BlcnRpZXMoKSBjb25zdCB7IHJl
dHVybiBtX3Byb3BlcnRpZXM7IH0KLQotICAgIHR5cGVkZWYgVmVjdG9yPHN0ZDo6cGFpcjxTdHJp
bmcsIFByb3BlcnRpZXM+PiBBbmltYXRpb25zTGlzdDsKLSAgICBzdGF0aWMgdm9pZCB1cGRhdGVM
YXllckFuaW1hdGlvbnMoQ0FMYXllciAqLCBSZW1vdGVMYXllclRyZWVIb3N0KiwgY29uc3QgQW5p
bWF0aW9uc0xpc3QmIGFuaW1hdGlvbnNUb0FkZCwgY29uc3QgSGFzaFNldDxTdHJpbmc+JiBhbmlt
YXRpb25zVG9SZW1vdmUpOwotCi1wcml2YXRlOgotICAgIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGUoQW5pbWF0aW9uVHlwZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoKTsKLQotICAgIFByb3BlcnRp
ZXMgbV9wcm9wZXJ0aWVzOwotfTsKLQotV1RGOjpUZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFdURjo6
VGV4dFN0cmVhbSYsIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFs
dWUmKTsKLVdURjo6VGV4dFN0cmVhbSYgb3BlcmF0b3I8PChXVEY6OlRleHRTdHJlYW0mLCBjb25z
dCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpQcm9wZXJ0aWVzJik7Ci0KLX0gLy8gbmFtZXNw
YWNlIFdlYktpdAotCi1TUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0NBQU5JTUFUSU9OKFdlYktpdDo6
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZSwgaXNQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlKCkp
Ci0KLSNlbmRpZiAvLyBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlX2gKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVt
b3RlLm1tIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGUubW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZTI3M2Mz
YTcxOWU2OTEwMGQxNWY1YTMxYTFhMmQ0NWZmNmZmNDIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2Uv
bWFjL1BsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUubW0KKysrIC9kZXYvbnVsbApAQCAtMSw5MzQg
KzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0g
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
LSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0g
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNp
bmNsdWRlICJjb25maWcuaCIKLSNpbXBvcnQgIlBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUuaCIK
LQotI2ltcG9ydCAiQXJndW1lbnRDb2RlcnMuaCIKLSNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZUhv
c3QuaCIKLSNpbXBvcnQgIldlYkNvcmVBcmd1bWVudENvZGVycy5oIgotI2ltcG9ydCA8UXVhcnR6
Q29yZS9RdWFydHpDb3JlLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL0dyYXBoaWNzTGF5ZXIuaD4KLSNp
bXBvcnQgPFdlYkNvcmUvUGxhdGZvcm1DQUFuaW1hdGlvbkNvY29hLmg+Ci0jaW1wb3J0IDxXZWJD
b3JlL1BsYXRmb3JtQ0FGaWx0ZXJzLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL1RpbWluZ0Z1bmN0aW9u
Lmg+Ci0jaW1wb3J0IDxwYWwvc3BpL2NvY29hL1F1YXJ0ekNvcmVTUEkuaD4KLSNpbXBvcnQgPHd0
Zi9CbG9ja09iakNFeGNlcHRpb25zLmg+Ci0jaW1wb3J0IDx3dGYvQ3VycmVudFRpbWUuaD4KLSNp
bXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KLSNpbXBvcnQgPHd0Zi90ZXh0L1RleHRTdHJlYW0uaD4K
LQotdXNpbmcgbmFtZXNwYWNlIFdURjsKLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotCi1zdGF0
aWMgZG91YmxlIG1lZGlhVGltZVRvQ3VycmVudFRpbWUoQ0ZUaW1lSW50ZXJ2YWwgdCkKLXsKLSAg
ICByZXR1cm4gbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCkgKyB0IC0gQ0FDdXJyZW50TWVk
aWFUaW1lKCk7Ci19Ci0KLXN0YXRpYyBOU1N0cmluZyAqIGNvbnN0IFdLRXhwbGljaXRCZWdpblRp
bWVGbGFnID0gQCJXS1BsYXRmb3JtQ0FBbmltYXRpb25FeHBsaWNpdEJlZ2luVGltZUZsYWciOwot
Ci1AaW50ZXJmYWNlIFdLQW5pbWF0aW9uRGVsZWdhdGUgOiBOU09iamVjdCA8Q0FBbmltYXRpb25E
ZWxlZ2F0ZT4gewotICAgIEdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCBfbGF5ZXJJRDsK
LSAgICBXZWJLaXQ6OlJlbW90ZUxheWVyVHJlZUhvc3QqIF9sYXllclRyZWVIb3N0OwotfQotCi0t
IChpbnN0YW5jZXR5cGUpaW5pdFdpdGhMYXllcklEOihHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxh
eWVySUQpbGF5ZXJJRCBsYXllclRyZWVIb3N0OihXZWJLaXQ6OlJlbW90ZUxheWVyVHJlZUhvc3Qq
KWxheWVyVHJlZUhvc3Q7Ci0tICh2b2lkKWludmFsaWRhdGU7Ci1AZW5kCi0KLUBpbXBsZW1lbnRh
dGlvbiBXS0FuaW1hdGlvbkRlbGVnYXRlCi0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aExheWVy
SUQ6KEdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRClsYXllcklEIGxheWVyVHJlZUhvc3Q6
KFdlYktpdDo6UmVtb3RlTGF5ZXJUcmVlSG9zdCopbGF5ZXJUcmVlSG9zdAotewotICAgIGlmICgo
c2VsZiA9IFtzdXBlciBpbml0XSkpIHsKLSAgICAgICAgX2xheWVySUQgPSBsYXllcklEOwotICAg
ICAgICBfbGF5ZXJUcmVlSG9zdCA9IGxheWVyVHJlZUhvc3Q7Ci0gICAgfQotICAgIHJldHVybiBz
ZWxmOwotfQotCi0tICh2b2lkKWludmFsaWRhdGUKLXsKLSAgICBfbGF5ZXJUcmVlSG9zdCA9IG51
bGxwdHI7Ci19Ci0KLS0gKHZvaWQpYW5pbWF0aW9uRGlkU3RhcnQ6KENBQW5pbWF0aW9uICopYW5p
bWF0aW9uCi17Ci0gICAgaWYgKCFfbGF5ZXJUcmVlSG9zdCkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgYm9vbCBoYXNFeHBsaWNpdEJlZ2luVGltZSA9IFtbYW5pbWF0aW9uIHZhbHVlRm9yS2V5OldL
RXhwbGljaXRCZWdpblRpbWVGbGFnXSBib29sVmFsdWVdOwotICAgIENGVGltZUludGVydmFsIHN0
YXJ0VGltZTsKLQotICAgIGlmIChoYXNFeHBsaWNpdEJlZ2luVGltZSkgewotICAgICAgICAvLyBX
ZSBkb24ndCBrbm93IHdoYXQgdGltZSBDQSB1c2VkIHRvIGNvbW1pdCB0aGUgYW5pbWF0aW9uLCBz
byBqdXN0IHVzZSB0aGUgY3VycmVudCB0aW1lCi0gICAgICAgIC8vIChldmVuIHRob3VnaCB0aGlz
IHdpbGwgYmUgc2xpZ2h0bHkgb2ZmKS4KLSAgICAgICAgc3RhcnRUaW1lID0gbWVkaWFUaW1lVG9D
dXJyZW50VGltZShDQUN1cnJlbnRNZWRpYVRpbWUoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHN0
YXJ0VGltZSA9IG1lZGlhVGltZVRvQ3VycmVudFRpbWUoW2FuaW1hdGlvbiBiZWdpblRpbWVdKTsK
LQotICAgIF9sYXllclRyZWVIb3N0LT5hbmltYXRpb25EaWRTdGFydChfbGF5ZXJJRCwgYW5pbWF0
aW9uLCBzdGFydFRpbWUpOwotfQotCi0tICh2b2lkKWFuaW1hdGlvbkRpZFN0b3A6KENBQW5pbWF0
aW9uICopYW5pbWF0aW9uIGZpbmlzaGVkOihCT09MKWZpbmlzaGVkCi17Ci0gICAgaWYgKCFfbGF5
ZXJUcmVlSG9zdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgX2xheWVyVHJlZUhvc3QtPmFuaW1h
dGlvbkRpZEVuZChfbGF5ZXJJRCwgYW5pbWF0aW9uKTsKLX0KLQotQGVuZAotCi1uYW1lc3BhY2Ug
V2ViS2l0IHsKLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVl
OjplbmNvZGUoSVBDOjpFbmNvZGVyJiBlbmNvZGVyKSBjb25zdAotewotICAgIGVuY29kZXIuZW5j
b2RlRW51bShrZXlUeXBlKTsKLQotICAgIHN3aXRjaCAoa2V5VHlwZSkgewotICAgIGNhc2UgTnVt
YmVyS2V5VHlwZToKLSAgICAgICAgZW5jb2RlciA8PCBudW1iZXI7Ci0gICAgICAgIGJyZWFrOwot
ICAgIGNhc2UgQ29sb3JLZXlUeXBlOgotICAgICAgICBlbmNvZGVyIDw8IGNvbG9yOwotICAgICAg
ICBicmVhazsKLSAgICBjYXNlIFBvaW50S2V5VHlwZToKLSAgICAgICAgZW5jb2RlciA8PCBwb2lu
dDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUcmFuc2Zvcm1LZXlUeXBlOgotICAgICAgICBl
bmNvZGVyIDw8IHRyYW5zZm9ybTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGaWx0ZXJLZXlU
eXBlOgotICAgICAgICBlbmNvZGVyIDw8ICpmaWx0ZXIuZ2V0KCk7Ci0gICAgICAgIGJyZWFrOwot
ICAgIH0KLX0KLQotYm9vbCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVl
OjpkZWNvZGUoSVBDOjpEZWNvZGVyJiBkZWNvZGVyLCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3Rl
OjpLZXlmcmFtZVZhbHVlJiB2YWx1ZSkKLXsKLSAgICBpZiAoIWRlY29kZXIuZGVjb2RlRW51bSh2
YWx1ZS5rZXlUeXBlKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc3dpdGNoICh2YWx1
ZS5rZXlUeXBlKSB7Ci0gICAgY2FzZSBOdW1iZXJLZXlUeXBlOgotICAgICAgICBpZiAoIWRlY29k
ZXIuZGVjb2RlKHZhbHVlLm51bWJlcikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIGJyZWFrOwotICAgIGNhc2UgQ29sb3JLZXlUeXBlOgotICAgICAgICBpZiAoIWRlY29kZXIu
ZGVjb2RlKHZhbHVlLmNvbG9yKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
YnJlYWs7Ci0gICAgY2FzZSBQb2ludEtleVR5cGU6Ci0gICAgICAgIGlmICghZGVjb2Rlci5kZWNv
ZGUodmFsdWUucG9pbnQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBicmVh
azsKLSAgICBjYXNlIFRyYW5zZm9ybUtleVR5cGU6Ci0gICAgICAgIGlmICghZGVjb2Rlci5kZWNv
ZGUodmFsdWUudHJhbnNmb3JtKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
YnJlYWs7Ci0gICAgY2FzZSBGaWx0ZXJLZXlUeXBlOgotICAgICAgICBpZiAoIWRlY29kZUZpbHRl
ck9wZXJhdGlvbihkZWNvZGVyLCB2YWx1ZS5maWx0ZXIpKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9p
ZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpQcm9wZXJ0aWVzOjplbmNvZGUoSVBDOjpFbmNv
ZGVyJiBlbmNvZGVyKSBjb25zdAotewotICAgIGVuY29kZXIgPDwga2V5UGF0aDsKLSAgICBlbmNv
ZGVyLmVuY29kZUVudW0oYW5pbWF0aW9uVHlwZSk7Ci0KLSAgICBlbmNvZGVyIDw8IGJlZ2luVGlt
ZTsKLSAgICBlbmNvZGVyIDw8IGR1cmF0aW9uOwotICAgIGVuY29kZXIgPDwgdGltZU9mZnNldDsK
LSAgICBlbmNvZGVyIDw8IHJlcGVhdENvdW50OwotICAgIGVuY29kZXIgPDwgc3BlZWQ7Ci0KLSAg
ICBlbmNvZGVyLmVuY29kZUVudW0oZmlsbE1vZGUpOwotICAgIGVuY29kZXIuZW5jb2RlRW51bSh2
YWx1ZUZ1bmN0aW9uKTsKLQotICAgIGVuY29kZXIgPDwgYXV0b1JldmVyc2VzOwotICAgIGVuY29k
ZXIgPDwgcmVtb3ZlZE9uQ29tcGxldGlvbjsKLSAgICBlbmNvZGVyIDw8IGFkZGl0aXZlOwotICAg
IGVuY29kZXIgPDwgcmV2ZXJzZVRpbWluZ0Z1bmN0aW9uczsKLSAgICBlbmNvZGVyIDw8IGhhc0V4
cGxpY2l0QmVnaW5UaW1lOwotICAgIAotICAgIGVuY29kZXIgPDwga2V5VmFsdWVzOwotICAgIGVu
Y29kZXIgPDwga2V5VGltZXM7Ci0gICAgCi0gICAgZW5jb2RlciA8PCBzdGF0aWNfY2FzdDx1aW50
NjRfdD4odGltaW5nRnVuY3Rpb25zLnNpemUoKSk7Ci0gICAgZm9yIChjb25zdCBhdXRvJiB0aW1p
bmdGdW5jdGlvbiA6IHRpbWluZ0Z1bmN0aW9ucykgewotICAgICAgICBzd2l0Y2ggKHRpbWluZ0Z1
bmN0aW9uLT50eXBlKCkpIHsKLSAgICAgICAgY2FzZSBUaW1pbmdGdW5jdGlvbjo6TGluZWFyRnVu
Y3Rpb246Ci0gICAgICAgICAgICBlbmNvZGVyIDw8ICpzdGF0aWNfY2FzdDxMaW5lYXJUaW1pbmdG
dW5jdGlvbio+KHRpbWluZ0Z1bmN0aW9uLmdldCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgCi0gICAgICAgIGNhc2UgVGltaW5nRnVuY3Rpb246OkN1YmljQmV6aWVyRnVuY3Rp
b246Ci0gICAgICAgICAgICBlbmNvZGVyIDw8ICpzdGF0aWNfY2FzdDxDdWJpY0JlemllclRpbWlu
Z0Z1bmN0aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIAotICAgICAgICBjYXNlIFRpbWluZ0Z1bmN0aW9uOjpTdGVwc0Z1bmN0aW9uOgotICAg
ICAgICAgICAgZW5jb2RlciA8PCAqc3RhdGljX2Nhc3Q8U3RlcHNUaW1pbmdGdW5jdGlvbio+KHRp
bWluZ0Z1bmN0aW9uLmdldCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ug
VGltaW5nRnVuY3Rpb246OlNwcmluZ0Z1bmN0aW9uOgotICAgICAgICAgICAgZW5jb2RlciA8PCAq
c3RhdGljX2Nhc3Q8U3ByaW5nVGltaW5nRnVuY3Rpb24qPih0aW1pbmdGdW5jdGlvbi5nZXQoKSk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotYm9vbCBQbGF0Zm9y
bUNBQW5pbWF0aW9uUmVtb3RlOjpQcm9wZXJ0aWVzOjpkZWNvZGUoSVBDOjpEZWNvZGVyJiBkZWNv
ZGVyLCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKQot
ewotICAgIGlmICghZGVjb2Rlci5kZWNvZGUocHJvcGVydGllcy5rZXlQYXRoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZUVudW0ocHJvcGVydGllcy5h
bmltYXRpb25UeXBlKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVy
LmRlY29kZShwcm9wZXJ0aWVzLmJlZ2luVGltZSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIGlmICghZGVjb2Rlci5kZWNvZGUocHJvcGVydGllcy5kdXJhdGlvbikpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIGlmICghZGVjb2Rlci5kZWNvZGUocHJvcGVydGllcy50aW1lT2Zm
c2V0KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShw
cm9wZXJ0aWVzLnJlcGVhdENvdW50KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYg
KCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLnNwZWVkKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZUVudW0ocHJvcGVydGllcy5maWxsTW9kZSkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghZGVjb2Rlci5kZWNvZGVFbnVtKHByb3Bl
cnRpZXMudmFsdWVGdW5jdGlvbikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICgh
ZGVjb2Rlci5kZWNvZGUocHJvcGVydGllcy5hdXRvUmV2ZXJzZXMpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMucmVtb3ZlZE9uQ29t
cGxldGlvbikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghZGVjb2Rlci5kZWNv
ZGUocHJvcGVydGllcy5hZGRpdGl2ZSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlm
ICghZGVjb2Rlci5kZWNvZGUocHJvcGVydGllcy5yZXZlcnNlVGltaW5nRnVuY3Rpb25zKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVz
Lmhhc0V4cGxpY2l0QmVnaW5UaW1lKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYg
KCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmtleVZhbHVlcykpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIGlmICghZGVjb2Rlci5kZWNvZGUocHJvcGVydGllcy5rZXlUaW1lcykpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHVpbnQ2NF90IG51bVRpbWluZ0Z1bmN0aW9uczsK
LSAgICBpZiAoIWRlY29kZXIuZGVjb2RlKG51bVRpbWluZ0Z1bmN0aW9ucykpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAKLSAgICBpZiAobnVtVGltaW5nRnVuY3Rpb25zKSB7Ci0gICAgICAg
IHByb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkobnVtVGlt
aW5nRnVuY3Rpb25zKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVRpbWlu
Z0Z1bmN0aW9uczsgKytpKSB7Ci0gICAgICAgIAotICAgICAgICAgICAgVGltaW5nRnVuY3Rpb246
OlRpbWluZ0Z1bmN0aW9uVHlwZSB0eXBlOwotICAgICAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29k
ZUVudW0odHlwZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAg
ICBSZWZQdHI8VGltaW5nRnVuY3Rpb24+IHRpbWluZ0Z1bmN0aW9uOwotICAgICAgICAgICAgc3dp
dGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFRpbWluZ0Z1bmN0aW9uOjpMaW5lYXJGdW5j
dGlvbjoKLSAgICAgICAgICAgICAgICB0aW1pbmdGdW5jdGlvbiA9IExpbmVhclRpbWluZ0Z1bmN0
aW9uOjpjcmVhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRlY29kZXIuZGVjb2RlKCpzdGF0
aWNfY2FzdDxMaW5lYXJUaW1pbmdGdW5jdGlvbio+KHRpbWluZ0Z1bmN0aW9uLmdldCgpKSkpCi0g
ICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGNhc2UgVGltaW5nRnVuY3Rpb246OkN1Ymlj
QmV6aWVyRnVuY3Rpb246Ci0gICAgICAgICAgICAgICAgdGltaW5nRnVuY3Rpb24gPSBDdWJpY0Jl
emllclRpbWluZ0Z1bmN0aW9uOjpjcmVhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRlY29k
ZXIuZGVjb2RlKCpzdGF0aWNfY2FzdDxDdWJpY0JlemllclRpbWluZ0Z1bmN0aW9uKj4odGltaW5n
RnVuY3Rpb24uZ2V0KCkpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIFRpbWlu
Z0Z1bmN0aW9uOjpTdGVwc0Z1bmN0aW9uOgotICAgICAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9u
ID0gU3RlcHNUaW1pbmdGdW5jdGlvbjo6Y3JlYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFk
ZWNvZGVyLmRlY29kZSgqc3RhdGljX2Nhc3Q8U3RlcHNUaW1pbmdGdW5jdGlvbio+KHRpbWluZ0Z1
bmN0aW9uLmdldCgpKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBUaW1pbmdGdW5jdGlvbjo6U3By
aW5nRnVuY3Rpb246Ci0gICAgICAgICAgICAgICAgdGltaW5nRnVuY3Rpb24gPSBTcHJpbmdUaW1p
bmdGdW5jdGlvbjo6Y3JlYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29k
ZSgqc3RhdGljX2Nhc3Q8U3ByaW5nVGltaW5nRnVuY3Rpb24qPih0aW1pbmdGdW5jdGlvbi5nZXQo
KSkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByb3BlcnRp
ZXMudGltaW5nRnVuY3Rpb25zLnVuY2hlY2tlZEFwcGVuZChXVEZNb3ZlKHRpbWluZ0Z1bmN0aW9u
KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLSAgICAKLVJlZjxQ
bGF0Zm9ybUNBQW5pbWF0aW9uPiBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpjcmVhdGUoUGxh
dGZvcm1DQUFuaW1hdGlvbjo6QW5pbWF0aW9uVHlwZSB0eXBlLCBjb25zdCBTdHJpbmcmIGtleVBh
dGgpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90
ZSh0eXBlLCBrZXlQYXRoKSk7Ci19Ci0KLVJlZjxQbGF0Zm9ybUNBQW5pbWF0aW9uPiBQbGF0Zm9y
bUNBQW5pbWF0aW9uUmVtb3RlOjpjb3B5KCkgY29uc3QKLXsKLSAgICBhdXRvIGFuaW1hdGlvbiA9
IGNyZWF0ZShhbmltYXRpb25UeXBlKCksIGtleVBhdGgoKSk7Ci0gICAgCi0gICAgYW5pbWF0aW9u
LT5zZXRCZWdpblRpbWUoYmVnaW5UaW1lKCkpOwotICAgIGFuaW1hdGlvbi0+c2V0RHVyYXRpb24o
ZHVyYXRpb24oKSk7Ci0gICAgYW5pbWF0aW9uLT5zZXRTcGVlZChzcGVlZCgpKTsKLSAgICBhbmlt
YXRpb24tPnNldFRpbWVPZmZzZXQodGltZU9mZnNldCgpKTsKLSAgICBhbmltYXRpb24tPnNldFJl
cGVhdENvdW50KHJlcGVhdENvdW50KCkpOwotICAgIGFuaW1hdGlvbi0+c2V0QXV0b3JldmVyc2Vz
KGF1dG9yZXZlcnNlcygpKTsKLSAgICBhbmltYXRpb24tPnNldEZpbGxNb2RlKGZpbGxNb2RlKCkp
OwotICAgIGFuaW1hdGlvbi0+c2V0UmVtb3ZlZE9uQ29tcGxldGlvbihpc1JlbW92ZWRPbkNvbXBs
ZXRpb24oKSk7Ci0gICAgYW5pbWF0aW9uLT5zZXRBZGRpdGl2ZShpc0FkZGl0aXZlKCkpOwotICAg
IGFuaW1hdGlvbi0+Y29weVRpbWluZ0Z1bmN0aW9uRnJvbSgqdGhpcyk7Ci0gICAgYW5pbWF0aW9u
LT5zZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlRnVuY3Rpb24oKSk7Ci0KLSAgICBkb3duY2FzdDxQbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlPihhbmltYXRpb24uZ2V0KCkpLnNldEhhc0V4cGxpY2l0QmVn
aW5UaW1lKGhhc0V4cGxpY2l0QmVnaW5UaW1lKCkpOwotICAgIAotICAgIC8vIENvcHkgdGhlIHNw
ZWNpZmljIEJhc2ljIG9yIEtleWZyYW1lIHZhbHVlcy4KLSAgICBpZiAoYW5pbWF0aW9uVHlwZSgp
ID09IEtleWZyYW1lKSB7Ci0gICAgICAgIGFuaW1hdGlvbi0+Y29weVZhbHVlc0Zyb20oKnRoaXMp
OwotICAgICAgICBhbmltYXRpb24tPmNvcHlLZXlUaW1lc0Zyb20oKnRoaXMpOwotICAgICAgICBh
bmltYXRpb24tPmNvcHlUaW1pbmdGdW5jdGlvbnNGcm9tKCp0aGlzKTsKLSAgICB9IGVsc2Ugewot
ICAgICAgICBhbmltYXRpb24tPmNvcHlGcm9tVmFsdWVGcm9tKCp0aGlzKTsKLSAgICAgICAgYW5p
bWF0aW9uLT5jb3B5VG9WYWx1ZUZyb20oKnRoaXMpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4g
YW5pbWF0aW9uOwotfQotCi1QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpQbGF0Zm9ybUNBQW5p
bWF0aW9uUmVtb3RlKEFuaW1hdGlvblR5cGUgdHlwZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoKQot
ICAgIDogUGxhdGZvcm1DQUFuaW1hdGlvbih0eXBlKQotewotICAgIG1fcHJvcGVydGllcy5rZXlQ
YXRoID0ga2V5UGF0aDsKLSAgICBtX3Byb3BlcnRpZXMuYW5pbWF0aW9uVHlwZSA9IHR5cGU7Ci19
Ci0KLVN0cmluZyBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjprZXlQYXRoKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmtleVBhdGg7Ci19Ci0KLUNGVGltZUludGVydmFsIFBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmJlZ2luVGltZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1fcHJvcGVydGllcy5iZWdpblRpbWU7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6c2V0QmVnaW5UaW1lKENGVGltZUludGVydmFsIHZhbHVlKQotewotICAgIG1fcHJvcGVy
dGllcy5iZWdpblRpbWUgPSB2YWx1ZTsKLSAgICAKLSAgICAvLyBBbHNvIHNldCBhIGZsYWcgdG8g
dGVsbCB1cyBpZiB3ZSd2ZSBwYXNzZWQgaW4gYSAwIHZhbHVlLiAKLSAgICAvLyBUaGUgZmxhZyBp
cyBuZWVkZWQgYmVjYXVzZSBsYXRlciBiZWdpblRpbWUgd2lsbCBnZXQgY2hhbmdlZAotICAgIC8v
IHRvIHRoZSB0aW1lIGF0IHdoaWNoIGl0IGZpcmVkIGFuZCB3ZSBuZWVkIHRvIGtub3cgd2hldGhl
cgotICAgIC8vIG9yIG5vdCBpdCB3YXMgMCB0byBiZWdpbiB3aXRoLgotICAgIGlmICh2YWx1ZSkK
LSAgICAgICAgbV9wcm9wZXJ0aWVzLmhhc0V4cGxpY2l0QmVnaW5UaW1lID0gdmFsdWU7Ci19Ci0K
LUNGVGltZUludGVydmFsIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmR1cmF0aW9uKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmR1cmF0aW9uOwotfQotCi12b2lkIFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldER1cmF0aW9uKENGVGltZUludGVydmFsIHZhbHVlKQot
ewotICAgIG1fcHJvcGVydGllcy5kdXJhdGlvbiA9IHZhbHVlOwotfQotCi1mbG9hdCBQbGF0Zm9y
bUNBQW5pbWF0aW9uUmVtb3RlOjpzcGVlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVy
dGllcy5zcGVlZDsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRTcGVl
ZChmbG9hdCB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMuc3BlZWQgPSB2YWx1ZTsKLX0KLQot
Q0ZUaW1lSW50ZXJ2YWwgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6dGltZU9mZnNldCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy50aW1lT2Zmc2V0OwotfQotCi12b2lkIFBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFRpbWVPZmZzZXQoQ0ZUaW1lSW50ZXJ2YWwgdmFs
dWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLnRpbWVPZmZzZXQgPSB2YWx1ZTsKLX0KLQotZmxvYXQg
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6cmVwZWF0Q291bnQoKSBjb25zdAotewotICAgIHJl
dHVybiBtX3Byb3BlcnRpZXMucmVwZWF0Q291bnQ7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1h
dGlvblJlbW90ZTo6c2V0UmVwZWF0Q291bnQoZmxvYXQgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0
aWVzLnJlcGVhdENvdW50ID0gdmFsdWU7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6YXV0b3JldmVyc2VzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmF1
dG9SZXZlcnNlczsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRBdXRv
cmV2ZXJzZXMoYm9vbCB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMuYXV0b1JldmVyc2VzID0g
dmFsdWU7Ci19Ci0KLVBsYXRmb3JtQ0FBbmltYXRpb246OkZpbGxNb2RlVHlwZSBQbGF0Zm9ybUNB
QW5pbWF0aW9uUmVtb3RlOjpmaWxsTW9kZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVy
dGllcy5maWxsTW9kZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRG
aWxsTW9kZShGaWxsTW9kZVR5cGUgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLmZpbGxNb2Rl
ID0gdmFsdWU7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VGltaW5n
RnVuY3Rpb24oY29uc3QgVGltaW5nRnVuY3Rpb24qIHZhbHVlLCBib29sIHJldmVyc2UpCi17Ci0g
ICAgVmVjdG9yPFJlZlB0cjxUaW1pbmdGdW5jdGlvbj4+IHRpbWluZ0Z1bmN0aW9uczsKLSAgICB0
aW1pbmdGdW5jdGlvbnMuYXBwZW5kKHZhbHVlLT5jbG9uZSgpKTsKLQotICAgIG1fcHJvcGVydGll
cy50aW1pbmdGdW5jdGlvbnMgPSBXVEZNb3ZlKHRpbWluZ0Z1bmN0aW9ucyk7Ci0gICAgbV9wcm9w
ZXJ0aWVzLnJldmVyc2VUaW1pbmdGdW5jdGlvbnMgPSByZXZlcnNlOwotfQotCi12b2lkIFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU6OmNvcHlUaW1pbmdGdW5jdGlvbkZyb20oY29uc3QgUGxhdGZv
cm1DQUFuaW1hdGlvbiYgdmFsdWUpCi17Ci0gICAgY29weVRpbWluZ0Z1bmN0aW9uc0Zyb20odmFs
dWUpOwotfQotCi1ib29sIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmlzUmVtb3ZlZE9uQ29t
cGxldGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5yZW1vdmVkT25Db21w
bGV0aW9uOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFJlbW92ZWRP
bkNvbXBsZXRpb24oYm9vbCB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMucmVtb3ZlZE9uQ29t
cGxldGlvbiA9IHZhbHVlOwotfQotCi1ib29sIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6Omlz
QWRkaXRpdmUoKSBjb25zdAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMuYWRkaXRpdmU7Ci19
Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0QWRkaXRpdmUoYm9vbCB2YWx1
ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMuYWRkaXRpdmUgPSB2YWx1ZTsKLX0KLQotUGxhdGZvcm1D
QUFuaW1hdGlvbjo6VmFsdWVGdW5jdGlvblR5cGUgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6
dmFsdWVGdW5jdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy52YWx1ZUZ1
bmN0aW9uOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFZhbHVlRnVu
Y3Rpb24oVmFsdWVGdW5jdGlvblR5cGUgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLnZhbHVl
RnVuY3Rpb24gPSB2YWx1ZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpz
ZXRGcm9tVmFsdWUoZmxvYXQgdmFsdWUpCi17Ci0gICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBC
YXNpYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNp
emUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1swXSA9IEtleWZyYW1lVmFsdWUodmFs
dWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldEZyb21WYWx1ZShj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdmFsdWUpCi17Ci0gICAgaWYgKGFuaW1hdGlvblR5
cGUoKSAhPSBCYXNpYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVzLmtleVZh
bHVlcy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1swXSA9IEtleWZyYW1l
VmFsdWUodmFsdWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldEZy
b21WYWx1ZShjb25zdCBGbG9hdFBvaW50M0QmIHZhbHVlKQotewotICAgIGlmIChhbmltYXRpb25U
eXBlKCkgIT0gQmFzaWMpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVydGllcy5rZXlW
YWx1ZXMucmVzaXplKDIpOwotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMF0gPSBLZXlmcmFt
ZVZhbHVlKHZhbHVlKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRG
cm9tVmFsdWUoY29uc3QgQ29sb3ImIHZhbHVlKQotewotICAgIGlmIChhbmltYXRpb25UeXBlKCkg
IT0gQmFzaWMpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMu
cmVzaXplKDIpOwotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMF0gPSBLZXlmcmFtZVZhbHVl
KHZhbHVlKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRGcm9tVmFs
dWUoY29uc3QgRmlsdGVyT3BlcmF0aW9uKiBvcGVyYXRpb24sIGludCBpbnRlcm5hbEZpbHRlclBy
b3BlcnR5SW5kZXgpCi17Ci0gICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7Ci0gICAg
bV9wcm9wZXJ0aWVzLmtleVZhbHVlc1swXSA9IEtleWZyYW1lVmFsdWUob3BlcmF0aW9uLT5jbG9u
ZSgpKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpjb3B5RnJvbVZhbHVl
RnJvbShjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uJiB2YWx1ZSkKLXsKLSAgICBjb25zdCBQbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlJiBvdGhlciA9IGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGU+KHZhbHVlKTsKLQotICAgIGlmIChvdGhlci5tX3Byb3BlcnRpZXMua2V5VmFsdWVz
LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIG1fcHJvcGVydGllcy5rZXlW
YWx1ZXMucmVzaXplKDIpOwotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMF0gPSBvdGhlci5t
X3Byb3BlcnRpZXMua2V5VmFsdWVzWzBdOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OnNldFRvVmFsdWUoZmxvYXQgdmFsdWUpCi17Ci0gICAgaWYgKGFuaW1hdGlvblR5cGUo
KSAhPSBCYXNpYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVl
cy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1sxXSA9IEtleWZyYW1lVmFs
dWUodmFsdWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFRvVmFs
dWUoY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHZhbHVlKQotewotICAgIGlmIChhbmltYXRp
b25UeXBlKCkgIT0gQmFzaWMpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVydGllcy5r
ZXlWYWx1ZXMucmVzaXplKDIpOwotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMV0gPSBLZXlm
cmFtZVZhbHVlKHZhbHVlKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpz
ZXRUb1ZhbHVlKGNvbnN0IEZsb2F0UG9pbnQzRCYgdmFsdWUpCi17Ci0gICAgaWYgKGFuaW1hdGlv
blR5cGUoKSAhPSBCYXNpYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVzLmtl
eVZhbHVlcy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1sxXSA9IEtleWZy
YW1lVmFsdWUodmFsdWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNl
dFRvVmFsdWUoY29uc3QgQ29sb3ImIHZhbHVlKQotewotICAgIGlmIChhbmltYXRpb25UeXBlKCkg
IT0gQmFzaWMpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMu
cmVzaXplKDIpOwotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMV0gPSBLZXlmcmFtZVZhbHVl
KHZhbHVlKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRUb1ZhbHVl
KGNvbnN0IEZpbHRlck9wZXJhdGlvbiogb3BlcmF0aW9uLCBpbnQgaW50ZXJuYWxGaWx0ZXJQcm9w
ZXJ0eUluZGV4KQotewotICAgIGlmIChhbmltYXRpb25UeXBlKCkgIT0gQmFzaWMpCi0gICAgICAg
IHJldHVybjsKLSAgICAKLSAgICBVTlVTRURfUEFSQU0oaW50ZXJuYWxGaWx0ZXJQcm9wZXJ0eUlu
ZGV4KTsKLSAgICBBU1NFUlQob3BlcmF0aW9uKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVz
LnJlc2l6ZSgyKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzFdID0gS2V5ZnJhbWVWYWx1
ZShvcGVyYXRpb24tPmNsb25lKCkpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU6OmNvcHlUb1ZhbHVlRnJvbShjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uJiB2YWx1ZSkKLXsK
LSAgICBjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlJiBvdGhlciA9IGRvd25jYXN0PFBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KHZhbHVlKTsKLQotICAgIGlmIChvdGhlci5tX3Byb3Bl
cnRpZXMua2V5VmFsdWVzLnNpemUoKSA8IDIpCi0gICAgICAgIHJldHVybjsKLSAgICBtX3Byb3Bl
cnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzFd
ID0gb3RoZXIubV9wcm9wZXJ0aWVzLmtleVZhbHVlc1sxXTsKLX0KLQotLy8gS2V5ZnJhbWUtYW5p
bWF0aW9uIHByb3BlcnRpZXMuCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFZh
bHVlcyhjb25zdCBWZWN0b3I8ZmxvYXQ+JiB2YWx1ZXMpCi17Ci0gICAgaWYgKGFuaW1hdGlvblR5
cGUoKSAhPSBLZXlmcmFtZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgVmVjdG9yPEtleWZyYW1l
VmFsdWU+IGtleWZyYW1lczsKLSAgICBrZXlmcmFtZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eSh2
YWx1ZXMuc2l6ZSgpKTsKLSAgICAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5z
aXplKCk7ICsraSkKLSAgICAgICAga2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlmcmFtZVZh
bHVlKHZhbHVlc1tpXSkpOwotICAgIAotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMgPSBXVEZN
b3ZlKGtleWZyYW1lcyk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0
VmFsdWVzKGNvbnN0IFZlY3RvcjxUcmFuc2Zvcm1hdGlvbk1hdHJpeD4mIHZhbHVlcykKLXsKLSAg
ICBpZiAoYW5pbWF0aW9uVHlwZSgpICE9IEtleWZyYW1lKQotICAgICAgICByZXR1cm47Ci0gICAg
ICAgIAotICAgIFZlY3RvcjxLZXlmcmFtZVZhbHVlPiBrZXlmcmFtZXM7Ci0gICAga2V5ZnJhbWVz
LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkodmFsdWVzLnNpemUoKSk7Ci0gICAgCi0gICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpOyArK2kpCi0gICAgICAgIGtleWZyYW1lcy51
bmNoZWNrZWRBcHBlbmQoS2V5ZnJhbWVWYWx1ZSh2YWx1ZXNbaV0pKTsKLSAgICAKLSAgICBtX3By
b3BlcnRpZXMua2V5VmFsdWVzID0gV1RGTW92ZShrZXlmcmFtZXMpOwotfQotCi12b2lkIFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFZhbHVlcyhjb25zdCBWZWN0b3I8RmxvYXRQb2ludDNE
PiYgdmFsdWVzKQotewotICAgIGlmIChhbmltYXRpb25UeXBlKCkgIT0gS2V5ZnJhbWUpCi0gICAg
ICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgVmVjdG9yPEtleWZyYW1lVmFsdWU+IGtleWZyYW1l
czsKLSAgICBrZXlmcmFtZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eSh2YWx1ZXMuc2l6ZSgpKTsK
LSAgICAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7ICsraSkKLSAg
ICAgICAga2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlmcmFtZVZhbHVlKHZhbHVlc1tpXSkp
OwotICAgIAotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMgPSBXVEZNb3ZlKGtleWZyYW1lcyk7
Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VmFsdWVzKGNvbnN0IFZl
Y3RvcjxDb2xvcj4mIHZhbHVlcykKLXsKLSAgICBpZiAoYW5pbWF0aW9uVHlwZSgpICE9IEtleWZy
YW1lKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIFZlY3RvcjxLZXlmcmFtZVZhbHVl
PiBrZXlmcmFtZXM7Ci0gICAga2V5ZnJhbWVzLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkodmFsdWVz
LnNpemUoKSk7Ci0gICAgCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgp
OyArK2kpCi0gICAgICAgIGtleWZyYW1lcy51bmNoZWNrZWRBcHBlbmQoS2V5ZnJhbWVWYWx1ZSh2
YWx1ZXNbaV0pKTsKLSAgICAKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzID0gV1RGTW92ZShr
ZXlmcmFtZXMpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldFZhbHVl
cyhjb25zdCBWZWN0b3I8UmVmUHRyPEZpbHRlck9wZXJhdGlvbj4+JiB2YWx1ZXMsIGludCBpbnRl
cm5hbEZpbHRlclByb3BlcnR5SW5kZXgpCi17Ci0gICAgVU5VU0VEX1BBUkFNKGludGVybmFsRmls
dGVyUHJvcGVydHlJbmRleCk7Ci0gICAgCi0gICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBLZXlm
cmFtZSkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBWZWN0b3I8S2V5ZnJhbWVWYWx1
ZT4ga2V5ZnJhbWVzOwotICAgIGtleWZyYW1lcy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KHZhbHVl
cy5zaXplKCkpOwotICAgIAotICAgIGZvciAoYXV0byYgdmFsdWUgOiB2YWx1ZXMpCi0gICAgICAg
IGtleWZyYW1lcy51bmNoZWNrZWRBcHBlbmQoS2V5ZnJhbWVWYWx1ZSB7IHZhbHVlLmNvcHlSZWYo
KSB9KTsKLSAgICAKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzID0gV1RGTW92ZShrZXlmcmFt
ZXMpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNvcHlWYWx1ZXNGcm9t
KGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb24mIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5r
ZXlWYWx1ZXMgPSBkb3duY2FzdDxQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlPih2YWx1ZSkubV9w
cm9wZXJ0aWVzLmtleVZhbHVlczsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3Rl
OjpzZXRLZXlUaW1lcyhjb25zdCBWZWN0b3I8ZmxvYXQ+JiBrZXlUaW1lcykKLXsKLSAgICBtX3By
b3BlcnRpZXMua2V5VGltZXMgPSBrZXlUaW1lczsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0
aW9uUmVtb3RlOjpjb3B5S2V5VGltZXNGcm9tKGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb24mIHZh
bHVlKQotewotICAgIG1fcHJvcGVydGllcy5rZXlUaW1lcyA9IGRvd25jYXN0PFBsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGU+KHZhbHVlKS5tX3Byb3BlcnRpZXMua2V5VGltZXM7Ci19Ci0KLXZvaWQg
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VGltaW5nRnVuY3Rpb25zKGNvbnN0IFZlY3Rv
cjxjb25zdCBUaW1pbmdGdW5jdGlvbio+JiB2YWx1ZXMsIGJvb2wgcmV2ZXJzZSkKLXsKLSAgICBW
ZWN0b3I8UmVmUHRyPFdlYkNvcmU6OlRpbWluZ0Z1bmN0aW9uPj4gdGltaW5nRnVuY3Rpb25zOwot
ICAgIHRpbWluZ0Z1bmN0aW9ucy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KHZhbHVlcy5zaXplKCkp
OwotICAgIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKTsgKytpKQot
ICAgICAgICB0aW1pbmdGdW5jdGlvbnMudW5jaGVja2VkQXBwZW5kKHZhbHVlc1tpXS0+Y2xvbmUo
KSk7Ci0gICAgCi0gICAgbV9wcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucyA9IFdURk1vdmUodGlt
aW5nRnVuY3Rpb25zKTsKLSAgICBtX3Byb3BlcnRpZXMucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyA9
IHJldmVyc2U7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6Y29weVRpbWlu
Z0Z1bmN0aW9uc0Zyb20oY29uc3QgUGxhdGZvcm1DQUFuaW1hdGlvbiYgdmFsdWUpCi17Ci0gICAg
Y29uc3QgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZSYgb3RoZXIgPSBkb3duY2FzdDxQbGF0Zm9y
bUNBQW5pbWF0aW9uUmVtb3RlPih2YWx1ZSk7Ci0KLSAgICBtX3Byb3BlcnRpZXMudGltaW5nRnVu
Y3Rpb25zID0gb3RoZXIubV9wcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9uczsKLSAgICBtX3Byb3Bl
cnRpZXMucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyA9IG90aGVyLm1fcHJvcGVydGllcy5yZXZlcnNl
VGltaW5nRnVuY3Rpb25zOwotfQotCi1zdGF0aWMgTlNPYmplY3QqIGFuaW1hdGlvblZhbHVlRnJv
bUtleWZyYW1lVmFsdWUoY29uc3QgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVW
YWx1ZSYga2V5ZnJhbWVWYWx1ZSkKLXsKLSAgICBzd2l0Y2ggKGtleWZyYW1lVmFsdWUua2V5ZnJh
bWVUeXBlKCkpIHsKLSAgICBjYXNlIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1l
VmFsdWU6Ok51bWJlcktleVR5cGU6Ci0gICAgICAgIHJldHVybiBAKGtleWZyYW1lVmFsdWUubnVt
YmVyVmFsdWUoKSk7Ci0gICAgICAgICAgICAKLSAgICBjYXNlIFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OktleWZyYW1lVmFsdWU6OkNvbG9yS2V5VHlwZTogewotICAgICAgICBDb2xvciBjb2xv
ciA9IGtleWZyYW1lVmFsdWUuY29sb3JWYWx1ZSgpOwotICAgICAgICByZXR1cm4gQFsgQChjb2xv
ci5yZWQoKSksIEAoY29sb3IuZ3JlZW4oKSksIEAoY29sb3IuYmx1ZSgpKSwgQChjb2xvci5hbHBo
YSgpKSBdOwotICAgIH0KLQotICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5
ZnJhbWVWYWx1ZTo6UG9pbnRLZXlUeXBlOiB7Ci0gICAgICAgIEZsb2F0UG9pbnQzRCBwb2ludCA9
IGtleWZyYW1lVmFsdWUucG9pbnRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gQFsgQChwb2ludC54
KCkpLCBAKHBvaW50LnkoKSksIEAocG9pbnQueigpKSBdOwotICAgIH0KLSAgICBjYXNlIFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6OlRyYW5zZm9ybUtleVR5cGU6Ci0g
ICAgICAgIHJldHVybiBbTlNWYWx1ZSB2YWx1ZVdpdGhDQVRyYW5zZm9ybTNEOmtleWZyYW1lVmFs
dWUudHJhbnNmb3JtVmFsdWUoKV07Ci0gICAgICAgICAgICAKLSAgICBjYXNlIFBsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6OkZpbHRlcktleVR5cGU6Ci0gICAgICAgIHJl
dHVybiBQbGF0Zm9ybUNBRmlsdGVyczo6ZmlsdGVyVmFsdWVGb3JPcGVyYXRpb24oa2V5ZnJhbWVW
YWx1ZS5maWx0ZXJWYWx1ZSgpLCAwIC8qIHVudXNlZCAqLykuYXV0b3JlbGVhc2UoKTsKLSAgICB9
Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZEFuaW1hdGlvblRvTGF5ZXIoQ0FMYXllciAqbGF5ZXIsIFJl
bW90ZUxheWVyVHJlZUhvc3QqIGxheWVyVHJlZUhvc3QsIGNvbnN0IFN0cmluZyYga2V5LCBjb25z
dCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKQotewot
ICAgIFJldGFpblB0cjxDQVByb3BlcnR5QW5pbWF0aW9uPiBjYUFuaW1hdGlvbjsKLSAgICBzd2l0
Y2ggKHByb3BlcnRpZXMuYW5pbWF0aW9uVHlwZSkgewotICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1h
dGlvbjo6QmFzaWM6IHsKLSAgICAgICAgUmV0YWluUHRyPENBQmFzaWNBbmltYXRpb24+IGJhc2lj
QW5pbWF0aW9uOwotICAgICAgICBiYXNpY0FuaW1hdGlvbiA9IFtDQUJhc2ljQW5pbWF0aW9uIGFu
aW1hdGlvbldpdGhLZXlQYXRoOnByb3BlcnRpZXMua2V5UGF0aF07Ci0gICAgICAgIAotICAgICAg
ICBpZiAocHJvcGVydGllcy5rZXlWYWx1ZXMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgW2Jh
c2ljQW5pbWF0aW9uIHNldEZyb21WYWx1ZTphbmltYXRpb25WYWx1ZUZyb21LZXlmcmFtZVZhbHVl
KHByb3BlcnRpZXMua2V5VmFsdWVzWzBdKV07Ci0gICAgICAgICAgICBbYmFzaWNBbmltYXRpb24g
c2V0VG9WYWx1ZTphbmltYXRpb25WYWx1ZUZyb21LZXlmcmFtZVZhbHVlKHByb3BlcnRpZXMua2V5
VmFsdWVzWzFdKV07Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChwcm9wZXJ0aWVz
LnRpbWluZ0Z1bmN0aW9ucy5zaXplKCkpCi0gICAgICAgICAgICBbYmFzaWNBbmltYXRpb24gc2V0
VGltaW5nRnVuY3Rpb246dG9DQU1lZGlhVGltaW5nRnVuY3Rpb24ocHJvcGVydGllcy50aW1pbmdG
dW5jdGlvbnNbMF0uZ2V0KCksIHByb3BlcnRpZXMucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyldOwot
ICAgICAgICAKLSAgICAgICAgY2FBbmltYXRpb24gPSBiYXNpY0FuaW1hdGlvbjsKLSAgICAgICAg
YnJlYWs7Ci0gICAgfQotICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvbjo6S2V5ZnJhbWU6IHsK
LSAgICAgICAgUmV0YWluUHRyPENBS2V5ZnJhbWVBbmltYXRpb24+IGtleWZyYW1lQW5pbWF0aW9u
OwotICAgICAgICBrZXlmcmFtZUFuaW1hdGlvbiA9IFtDQUtleWZyYW1lQW5pbWF0aW9uIGFuaW1h
dGlvbldpdGhLZXlQYXRoOnByb3BlcnRpZXMua2V5UGF0aF07Ci0KLSAgICAgICAgaWYgKHByb3Bl
cnRpZXMua2V5VmFsdWVzLnNpemUoKSkgewotICAgICAgICAgICAgUmV0YWluUHRyPE5TTXV0YWJs
ZUFycmF5PiBrZXlmcmFtZXMgPSBhZG9wdE5TKFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRX
aXRoQ2FwYWNpdHk6cHJvcGVydGllcy5rZXlWYWx1ZXMuc2l6ZSgpXSk7Ci0gICAgICAgICAgICBm
b3IgKGNvbnN0IGF1dG8mIHZhbHVlIDogcHJvcGVydGllcy5rZXlWYWx1ZXMpCi0gICAgICAgICAg
ICAgICAgW2tleWZyYW1lcyBhZGRPYmplY3Q6YW5pbWF0aW9uVmFsdWVGcm9tS2V5ZnJhbWVWYWx1
ZSh2YWx1ZSldOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBba2V5ZnJhbWVBbmltYXRpb24g
c2V0VmFsdWVzOmtleWZyYW1lcy5nZXQoKV07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJv
cGVydGllcy5rZXlUaW1lcy5zaXplKCkpIHsKLSAgICAgICAgICAgIFJldGFpblB0cjxOU011dGFi
bGVBcnJheT4ga2V5VGltZXMgPSBhZG9wdE5TKFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRX
aXRoQ2FwYWNpdHk6cHJvcGVydGllcy5rZXlUaW1lcy5zaXplKCldKTsKLSAgICAgICAgICAgIGZv
ciAoYXV0byBrZXlUaW1lIDogcHJvcGVydGllcy5rZXlUaW1lcykKLSAgICAgICAgICAgICAgICBb
a2V5VGltZXMgYWRkT2JqZWN0OkAoa2V5VGltZSldOwotICAgICAgICAgICAgCi0gICAgICAgICAg
ICBba2V5ZnJhbWVBbmltYXRpb24gc2V0S2V5VGltZXM6a2V5VGltZXMuZ2V0KCldOwotICAgICAg
ICB9Ci0KLSAgICAgICAgaWYgKHByb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zLnNpemUoKSkgewot
ICAgICAgICAgICAgUmV0YWluUHRyPE5TTXV0YWJsZUFycmF5PiB0aW1pbmdGdW5jdGlvbnMgPSBh
ZG9wdE5TKFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6cHJvcGVydGll
cy50aW1pbmdGdW5jdGlvbnMuc2l6ZSgpXSk7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8m
IHRpbWluZ0Z1bmN0aW9uIDogcHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMpCi0gICAgICAgICAg
ICAgICAgW3RpbWluZ0Z1bmN0aW9ucyBhZGRPYmplY3Q6dG9DQU1lZGlhVGltaW5nRnVuY3Rpb24o
dGltaW5nRnVuY3Rpb24uZ2V0KCksIHByb3BlcnRpZXMucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyld
OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBba2V5ZnJhbWVBbmltYXRpb24gc2V0VGltaW5n
RnVuY3Rpb25zOnRpbWluZ0Z1bmN0aW9ucy5nZXQoKV07Ci0gICAgICAgIH0KLSAgICAgICAgCi0g
ICAgICAgIGNhQW5pbWF0aW9uID0ga2V5ZnJhbWVBbmltYXRpb247Ci0gICAgICAgIGJyZWFrOwot
ICAgIH0KLSAgICBjYXNlIFBsYXRmb3JtQ0FBbmltYXRpb246OlNwcmluZzogewotICAgICAgICBS
ZXRhaW5QdHI8Q0FTcHJpbmdBbmltYXRpb24+IHNwcmluZ0FuaW1hdGlvbjsKLSAgICAgICAgc3By
aW5nQW5pbWF0aW9uID0gW0NBU3ByaW5nQW5pbWF0aW9uIGFuaW1hdGlvbldpdGhLZXlQYXRoOnBy
b3BlcnRpZXMua2V5UGF0aF07Ci0gICAgICAgIAotICAgICAgICBpZiAocHJvcGVydGllcy5rZXlW
YWx1ZXMuc2l6ZSgpID4gMSkgewotICAgICAgICAgICAgW3NwcmluZ0FuaW1hdGlvbiBzZXRGcm9t
VmFsdWU6YW5pbWF0aW9uVmFsdWVGcm9tS2V5ZnJhbWVWYWx1ZShwcm9wZXJ0aWVzLmtleVZhbHVl
c1swXSldOwotICAgICAgICAgICAgW3NwcmluZ0FuaW1hdGlvbiBzZXRUb1ZhbHVlOmFuaW1hdGlv
blZhbHVlRnJvbUtleWZyYW1lVmFsdWUocHJvcGVydGllcy5rZXlWYWx1ZXNbMV0pXTsKLSAgICAg
ICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHByb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zLnNp
emUoKSkgewotICAgICAgICAgICAgYXV0byYgdGltaW5nRnVuY3Rpb24gPSBwcm9wZXJ0aWVzLnRp
bWluZ0Z1bmN0aW9uc1swXTsKLSAgICAgICAgICAgIGlmICh0aW1pbmdGdW5jdGlvbi0+aXNTcHJp
bmdUaW1pbmdGdW5jdGlvbigpKSB7Ci0gICAgICAgICAgICAgICAgYXV0byYgZnVuY3Rpb24gPSAq
c3RhdGljX2Nhc3Q8Y29uc3QgU3ByaW5nVGltaW5nRnVuY3Rpb24qPih0aW1pbmdGdW5jdGlvbi5n
ZXQoKSk7Ci0gICAgICAgICAgICAgICAgW3NwcmluZ0FuaW1hdGlvbiBzZXRNYXNzOmZ1bmN0aW9u
Lm1hc3MoKV07Ci0gICAgICAgICAgICAgICAgW3NwcmluZ0FuaW1hdGlvbiBzZXRTdGlmZm5lc3M6
ZnVuY3Rpb24uc3RpZmZuZXNzKCldOwotICAgICAgICAgICAgICAgIFtzcHJpbmdBbmltYXRpb24g
c2V0RGFtcGluZzpmdW5jdGlvbi5kYW1waW5nKCldOwotICAgICAgICAgICAgICAgIFtzcHJpbmdB
bmltYXRpb24gc2V0SW5pdGlhbFZlbG9jaXR5OmZ1bmN0aW9uLmluaXRpYWxWZWxvY2l0eSgpXTsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYUFuaW1hdGlvbiA9IHNwcmluZ0Fu
aW1hdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIH0KLSAgICAKLSAgICBbY2FBbmlt
YXRpb24gc2V0QmVnaW5UaW1lOnByb3BlcnRpZXMuYmVnaW5UaW1lXTsKLSAgICBbY2FBbmltYXRp
b24gc2V0RHVyYXRpb246cHJvcGVydGllcy5kdXJhdGlvbl07Ci0gICAgW2NhQW5pbWF0aW9uIHNl
dFRpbWVPZmZzZXQ6cHJvcGVydGllcy50aW1lT2Zmc2V0XTsKLSAgICBbY2FBbmltYXRpb24gc2V0
UmVwZWF0Q291bnQ6cHJvcGVydGllcy5yZXBlYXRDb3VudF07Ci0gICAgW2NhQW5pbWF0aW9uIHNl
dFNwZWVkOnByb3BlcnRpZXMuc3BlZWRdOwotICAgIFtjYUFuaW1hdGlvbiBzZXRBdXRvcmV2ZXJz
ZXM6cHJvcGVydGllcy5hdXRvUmV2ZXJzZXNdOwotICAgIFtjYUFuaW1hdGlvbiBzZXRSZW1vdmVk
T25Db21wbGV0aW9uOnByb3BlcnRpZXMucmVtb3ZlZE9uQ29tcGxldGlvbl07Ci0gICAgW2NhQW5p
bWF0aW9uIHNldEFkZGl0aXZlOnByb3BlcnRpZXMuYWRkaXRpdmVdOwotICAgIAotICAgIGlmIChw
cm9wZXJ0aWVzLmZpbGxNb2RlICE9IFBsYXRmb3JtQ0FBbmltYXRpb246Ok5vRmlsbE1vZGUpCi0g
ICAgICAgIFtjYUFuaW1hdGlvbiBzZXRGaWxsTW9kZTp0b0NBRmlsbE1vZGVUeXBlKHByb3BlcnRp
ZXMuZmlsbE1vZGUpXTsKLQotICAgIGlmIChwcm9wZXJ0aWVzLnZhbHVlRnVuY3Rpb24gIT0gUGxh
dGZvcm1DQUFuaW1hdGlvbjo6Tm9WYWx1ZUZ1bmN0aW9uKQotICAgICAgICBbY2FBbmltYXRpb24g
c2V0VmFsdWVGdW5jdGlvbjpbQ0FWYWx1ZUZ1bmN0aW9uIGZ1bmN0aW9uV2l0aE5hbWU6dG9DQVZh
bHVlRnVuY3Rpb25UeXBlKHByb3BlcnRpZXMudmFsdWVGdW5jdGlvbildXTsKLSAgICAKLSAgICBp
ZiAocHJvcGVydGllcy5oYXNFeHBsaWNpdEJlZ2luVGltZSkKLSAgICAgICAgW2NhQW5pbWF0aW9u
IHNldFZhbHVlOkBZRVMgZm9yS2V5OldLRXhwbGljaXRCZWdpblRpbWVGbGFnXTsKLSAgICAKLSAg
ICBpZiAobGF5ZXJUcmVlSG9zdCkgewotICAgICAgICBHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxh
eWVySUQgbGF5ZXJJRCA9IFJlbW90ZUxheWVyVHJlZUhvc3Q6OmxheWVySUQobGF5ZXIpOwotICAg
IAotICAgICAgICBSZXRhaW5QdHI8V0tBbmltYXRpb25EZWxlZ2F0ZT4mIGRlbGVnYXRlID0gbGF5
ZXJUcmVlSG9zdC0+YW5pbWF0aW9uRGVsZWdhdGVzKCkuYWRkKGxheWVySUQsIG51bGxwdHIpLml0
ZXJhdG9yLT52YWx1ZTsKLSAgICAgICAgaWYgKCFkZWxlZ2F0ZSkKLSAgICAgICAgICAgIGRlbGVn
YXRlID0gYWRvcHROUyhbW1dLQW5pbWF0aW9uRGVsZWdhdGUgYWxsb2NdIGluaXRXaXRoTGF5ZXJJ
RDpsYXllcklEIGxheWVyVHJlZUhvc3Q6bGF5ZXJUcmVlSG9zdF0pOwotCi0gICAgICAgIFtjYUFu
aW1hdGlvbiBzZXREZWxlZ2F0ZTpkZWxlZ2F0ZS5nZXQoKV07Ci0gICAgfQotICAgIAotICAgIFts
YXllciBhZGRBbmltYXRpb246Y2FBbmltYXRpb24uZ2V0KCkgZm9yS2V5OmtleV07Ci19Ci0KLXZv
aWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6dXBkYXRlTGF5ZXJBbmltYXRpb25zKENBTGF5
ZXIgKmxheWVyLCBSZW1vdGVMYXllclRyZWVIb3N0KiBsYXllclRyZWVIb3N0LCBjb25zdCBBbmlt
YXRpb25zTGlzdCYgYW5pbWF0aW9uc1RvQWRkLCBjb25zdCBIYXNoU2V0PFN0cmluZz4mIGFuaW1h
dGlvbnNUb1JlbW92ZSkKLXsKLSAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlM7Ci0KLSAg
ICBmb3IgKGNvbnN0IGF1dG8mIHZhbHVlIDogYW5pbWF0aW9uc1RvUmVtb3ZlKQotICAgICAgICBb
bGF5ZXIgcmVtb3ZlQW5pbWF0aW9uRm9yS2V5OnZhbHVlXTsKLQotICAgIGZvciAoY29uc3QgYXV0
byYga2V5QW5pbWF0aW9uUGFpciA6IGFuaW1hdGlvbnNUb0FkZCkKLSAgICAgICAgYWRkQW5pbWF0
aW9uVG9MYXllcihsYXllciwgbGF5ZXJUcmVlSG9zdCwga2V5QW5pbWF0aW9uUGFpci5maXJzdCwg
a2V5QW5pbWF0aW9uUGFpci5zZWNvbmQpOwotCi0gICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9O
UzsKLX0KLQotVGV4dFN0cmVhbSYgb3BlcmF0b3I8PChUZXh0U3RyZWFtJnRzLCBjb25zdCBQbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVlJiB2YWx1ZSkKLXsKLSAgICBzd2l0
Y2ggKHZhbHVlLmtleWZyYW1lVHlwZSgpKSB7Ci0gICAgY2FzZSBQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlOjpLZXlmcmFtZVZhbHVlOjpOdW1iZXJLZXlUeXBlOgotICAgICAgICB0cyA8PCAibnVt
YmVyPSIgPDwgdmFsdWUubnVtYmVyVmFsdWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQ
bGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVlOjpDb2xvcktleVR5cGU6Ci0g
ICAgICAgIHRzIDw8ICJjb2xvcj0iOwotICAgICAgICB0cyA8PCB2YWx1ZS5jb2xvclZhbHVlKCk7
Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5
ZnJhbWVWYWx1ZTo6UG9pbnRLZXlUeXBlOgotICAgICAgICB0cyA8PCAicG9pbnQ9IjsKLSAgICAg
ICAgdHMgPDwgdmFsdWUucG9pbnRWYWx1ZSgpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6OlRyYW5zZm9ybUtleVR5cGU6
Ci0gICAgICAgIHRzIDw8ICJ0cmFuc2Zvcm09IjsKLSAgICAgICAgdHMgPDwgdmFsdWUudHJhbnNm
b3JtVmFsdWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlOjpLZXlmcmFtZVZhbHVlOjpGaWx0ZXJLZXlUeXBlOgotICAgICAgICB0cyA8PCAiZmls
dGVyPSI7Ci0gICAgICAgIGlmICh2YWx1ZS5maWx0ZXJWYWx1ZSgpKQotICAgICAgICAgICAgdHMg
PDwgKnZhbHVlLmZpbHRlclZhbHVlKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRzIDw8
ICJudWxsIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiB0czsKLX0KLQotVGV4
dFN0cmVhbSYgb3BlcmF0b3I8PChUZXh0U3RyZWFtJiB0cywgY29uc3QgUGxhdGZvcm1DQUFuaW1h
dGlvblJlbW90ZTo6UHJvcGVydGllcyYgYW5pbWF0aW9uKQotewotICAgIHRzIDw8ICJ0eXBlPSI7
Ci0gICAgdHMgPDwgYW5pbWF0aW9uLmFuaW1hdGlvblR5cGU7Ci0gICAgdHMgPDwgIiBrZXlQYXRo
PSI7Ci0gICAgdHMgPDwgYW5pbWF0aW9uLmtleVBhdGg7Ci0KLSAgICBpZiAoYW5pbWF0aW9uLmJl
Z2luVGltZSkKLSAgICAgICAgdHMuZHVtcFByb3BlcnR5KCJiZWdpblRpbWUiLCBhbmltYXRpb24u
YmVnaW5UaW1lKTsKLQotICAgIGlmIChhbmltYXRpb24uZHVyYXRpb24pCi0gICAgICAgIHRzLmR1
bXBQcm9wZXJ0eSgiZHVyYXRpb24iLCBhbmltYXRpb24uZHVyYXRpb24pOwotCi0gICAgaWYgKGFu
aW1hdGlvbi50aW1lT2Zmc2V0KQotICAgICAgICB0cy5kdW1wUHJvcGVydHkoInRpbWVPZmZzZXQi
LCBhbmltYXRpb24udGltZU9mZnNldCk7Ci0KLSAgICB0cy5kdW1wUHJvcGVydHkoInJlcGVhdENv
dW50IiwgYW5pbWF0aW9uLnJlcGVhdENvdW50KTsKLQotICAgIGlmIChhbmltYXRpb24uc3BlZWQg
IT0gMSkKLSAgICAgICAgdHMuZHVtcFByb3BlcnR5KCJzcGVlZCIsIGFuaW1hdGlvbi5zcGVlZCk7
Ci0KLSAgICB0cy5kdW1wUHJvcGVydHkoImZpbGxNb2RlIiwgYW5pbWF0aW9uLmZpbGxNb2RlKTsK
LSAgICB0cy5kdW1wUHJvcGVydHkoInZhbHVlRnVuY3Rpb24iLCBhbmltYXRpb24udmFsdWVGdW5j
dGlvbik7Ci0KLSAgICBpZiAoYW5pbWF0aW9uLmF1dG9SZXZlcnNlcykKLSAgICAgICAgdHMuZHVt
cFByb3BlcnR5KCJhdXRvUmV2ZXJzZXMiLCBhbmltYXRpb24uYXV0b1JldmVyc2VzKTsKLQotICAg
IGlmICghYW5pbWF0aW9uLnJlbW92ZWRPbkNvbXBsZXRpb24pCi0gICAgICAgIHRzLmR1bXBQcm9w
ZXJ0eSgicmVtb3ZlZE9uQ29tcGxldGlvbiIsIGFuaW1hdGlvbi5yZW1vdmVkT25Db21wbGV0aW9u
KTsKLQotICAgIGlmIChhbmltYXRpb24uYWRkaXRpdmUpCi0gICAgICAgIHRzLmR1bXBQcm9wZXJ0
eSgiYWRkaXRpdmUiLCBhbmltYXRpb24uYWRkaXRpdmUpOwotCi0gICAgaWYgKGFuaW1hdGlvbi5y
ZXZlcnNlVGltaW5nRnVuY3Rpb25zKQotICAgICAgICB0cy5kdW1wUHJvcGVydHkoInJldmVyc2VU
aW1pbmdGdW5jdGlvbnMiLCBhbmltYXRpb24ucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyk7Ci0KLSAg
ICBpZiAoYW5pbWF0aW9uLmhhc0V4cGxpY2l0QmVnaW5UaW1lKQotICAgICAgICB0cy5kdW1wUHJv
cGVydHkoImhhc0V4cGxpY2l0QmVnaW5UaW1lIiwgYW5pbWF0aW9uLmhhc0V4cGxpY2l0QmVnaW5U
aW1lKTsKLQotICAgIHRzIDw8ICJcbiI7Ci0gICAgdHMuaW5jcmVhc2VJbmRlbnQoKTsKLSAgICB0
cy53cml0ZUluZGVudCgpOwotICAgIHRzIDw8ICIoIiA8PCAia2V5ZnJhbWVzIjsKLSAgICB0cy5p
bmNyZWFzZUluZGVudCgpOwotCi0gICAgc2l6ZV90IG1heEZyYW1lcyA9IHN0ZDo6bWF4KGFuaW1h
dGlvbi5rZXlWYWx1ZXMuc2l6ZSgpLCBhbmltYXRpb24ua2V5VGltZXMuc2l6ZSgpKTsKLSAgICBt
YXhGcmFtZXMgPSBzdGQ6Om1heChtYXhGcmFtZXMsIGFuaW1hdGlvbi50aW1pbmdGdW5jdGlvbnMu
c2l6ZSgpKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF4RnJhbWVzOyArK2kpIHsK
LSAgICAgICAgdHMgPDwgIlxuIjsKLSAgICAgICAgdHMud3JpdGVJbmRlbnQoKTsKLSAgICAgICAg
dHMgPDwgIihrZXlmcmFtZSAiIDw8IHVuc2lnbmVkKGkpOwotICAgICAgICBpZiAoaSA8IGFuaW1h
dGlvbi5rZXlUaW1lcy5zaXplKCkpCi0gICAgICAgICAgICB0cy5kdW1wUHJvcGVydHkoInRpbWUi
LCBhbmltYXRpb24ua2V5VGltZXNbaV0pOwotCi0gICAgICAgIGlmIChpIDwgYW5pbWF0aW9uLnRp
bWluZ0Z1bmN0aW9ucy5zaXplKCkgJiYgYW5pbWF0aW9uLnRpbWluZ0Z1bmN0aW9uc1tpXSkKLSAg
ICAgICAgICAgIHRzLmR1bXBQcm9wZXJ0eTxjb25zdCBUaW1pbmdGdW5jdGlvbiY+KCJ0aW1pbmcg
ZnVuY3Rpb24iLCAqYW5pbWF0aW9uLnRpbWluZ0Z1bmN0aW9uc1tpXSk7Ci0KLSAgICAgICAgaWYg
KGkgPCBhbmltYXRpb24ua2V5VmFsdWVzLnNpemUoKSkKLSAgICAgICAgICAgIHRzLmR1bXBQcm9w
ZXJ0eSgidmFsdWUiLCBhbmltYXRpb24ua2V5VmFsdWVzW2ldKTsKLQotICAgICAgICB0cyA8PCAi
KSI7Ci0gICAgfQotCi0gICAgdHMuZGVjcmVhc2VJbmRlbnQoKTsKLSAgICB0cy5kZWNyZWFzZUlu
ZGVudCgpOwotCi0gICAgcmV0dXJuIHRzOwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNB
TGF5ZXJSZW1vdGUuY3BwIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1Bs
YXRmb3JtQ0FMYXllclJlbW90ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBk
MTRlZWQ4MTE3NzBmZmQwNDk1MWU5MmIwMTIxMzU2NmM1ZTBiZGYuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dl
YlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4
NTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6
Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0K
LSNpbmNsdWRlICJjb25maWcuaCIKLSNpbXBvcnQgIlBsYXRmb3JtQ0FMYXllclJlbW90ZS5oIgot
Ci0jaW1wb3J0ICJQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20uaCIKLSNpbXBvcnQgIlBsYXRm
b3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJCYWNr
aW5nU3RvcmUuaCIKLSNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZUNvbnRleHQuaCIKLSNpbXBvcnQg
IlJlbW90ZUxheWVyVHJlZVByb3BlcnR5QXBwbGllci5oIgotI2ltcG9ydCA8V2ViQ29yZS9Bbmlt
YXRpb25VdGlsaXRpZXMuaD4KLSNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NDb250ZXh0Lmg+Ci0j
aW1wb3J0IDxXZWJDb3JlL0dyYXBoaWNzTGF5ZXJDQS5oPgotI2ltcG9ydCA8V2ViQ29yZS9MZW5n
dGhGdW5jdGlvbnMuaD4KLSNpbXBvcnQgPFdlYkNvcmUvUGxhdGZvcm1DQUZpbHRlcnMuaD4KLSNp
bXBvcnQgPFdlYkNvcmUvUGxhdGZvcm1DQUxheWVyQ29jb2EuaD4KLSNpbXBvcnQgPFdlYkNvcmUv
VGlsZWRCYWNraW5nLmg+Ci0jaW1wb3J0IDx3dGYvQ3VycmVudFRpbWUuaD4KLQotdXNpbmcgbmFt
ZXNwYWNlIFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1SZWY8UGxhdGZvcm1DQUxh
eWVyUmVtb3RlPiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNyZWF0ZShMYXllclR5cGUgbGF5ZXJU
eXBlLCBQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0
JiBjb250ZXh0KQotewotICAgIFJlZlB0cjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+IGxheWVyOwot
Ci0gICAgaWYgKGxheWVyVHlwZSA9PSBMYXllclR5cGVUaWxlZEJhY2tpbmdMYXllciB8fCAgbGF5
ZXJUeXBlID09IExheWVyVHlwZVBhZ2VUaWxlZEJhY2tpbmdMYXllcikKLSAgICAgICAgbGF5ZXIg
PSBhZG9wdFJlZihuZXcgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nKGxheWVyVHlw
ZSwgb3duZXIsIGNvbnRleHQpKTsKLSAgICBlbHNlCi0gICAgICAgIGxheWVyID0gYWRvcHRSZWYo
bmV3IFBsYXRmb3JtQ0FMYXllclJlbW90ZShsYXllclR5cGUsIG93bmVyLCBjb250ZXh0KSk7Ci0K
LSAgICBjb250ZXh0LmxheWVyV2FzQ3JlYXRlZCgqbGF5ZXIsIGxheWVyVHlwZSk7Ci0KLSAgICBy
ZXR1cm4gbGF5ZXIucmVsZWFzZU5vbk51bGwoKTsKLX0KLQotUmVmPFBsYXRmb3JtQ0FMYXllclJl
bW90ZT4gUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjcmVhdGUoUGxhdGZvcm1MYXllciAqcGxhdGZv
cm1MYXllciwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3RlTGF5ZXJUcmVlQ29u
dGV4dCYgY29udGV4dCkKLXsKLSAgICByZXR1cm4gUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9t
OjpjcmVhdGUocGxhdGZvcm1MYXllciwgb3duZXIsIGNvbnRleHQpOwotfQotCi1SZWY8UGxhdGZv
cm1DQUxheWVyUmVtb3RlPiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNyZWF0ZShjb25zdCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGUmIG90aGVyLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQq
IG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250ZXh0KQotewotICAgIGF1dG8gbGF5
ZXIgPSBhZG9wdFJlZigqbmV3IFBsYXRmb3JtQ0FMYXllclJlbW90ZShvdGhlciwgb3duZXIsIGNv
bnRleHQpKTsKLQotICAgIGNvbnRleHQubGF5ZXJXYXNDcmVhdGVkKGxheWVyLmdldCgpLCBvdGhl
ci5sYXllclR5cGUoKSk7Ci0KLSAgICByZXR1cm4gbGF5ZXI7Ci19Ci0KLVBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6UGxhdGZvcm1DQUxheWVyUmVtb3RlKExheWVyVHlwZSBsYXllclR5cGUsIFBsYXRm
b3JtQ0FMYXllckNsaWVudCogb3duZXIsIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmIGNvbnRleHQp
Ci0gICAgOiBQbGF0Zm9ybUNBTGF5ZXIobGF5ZXJUeXBlLCBvd25lcikKLSAgICAsIG1fY29udGV4
dCgmY29udGV4dCkKLXsKLSAgICBpZiAob3duZXIgJiYgbGF5ZXJUeXBlICE9IExheWVyVHlwZUNv
bnRlbnRzUHJvdmlkZWRMYXllciAmJiBsYXllclR5cGUgIT0gTGF5ZXJUeXBlVHJhbnNmb3JtTGF5
ZXIpIHsKLSAgICAgICAgbV9wcm9wZXJ0aWVzLmNvbnRlbnRzU2NhbGUgPSBvd25lci0+cGxhdGZv
cm1DQUxheWVyRGV2aWNlU2NhbGVGYWN0b3IoKTsKLSAgICAgICAgbV9wcm9wZXJ0aWVzLm5vdGVQ
cm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q29udGVudHNTY2Fs
ZUNoYW5nZWQpOwotICAgIH0KLX0KLQotUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGUoY29uc3QgUGxhdGZvcm1DQUxheWVyUmVtb3RlJiBvdGhlciwgUGxhdGZvcm1D
QUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCkKLSAg
ICA6IFBsYXRmb3JtQ0FMYXllcihvdGhlci5sYXllclR5cGUoKSwgb3duZXIpCi0gICAgLCBtX2Fj
Y2VsZXJhdGVzRHJhd2luZyhvdGhlci5hY2NlbGVyYXRlc0RyYXdpbmcoKSkKLSAgICAsIG1fY29u
dGV4dCgmY29udGV4dCkKLXsKLX0KLQotUmVmPFBsYXRmb3JtQ0FMYXllcj4gUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjpjbG9uZShQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyKSBjb25zdAotewot
ICAgIGF1dG8gY2xvbmUgPSBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNyZWF0ZSgqdGhpcywgb3du
ZXIsICptX2NvbnRleHQpOwotCi0gICAgdXBkYXRlQ2xvbmVkTGF5ZXJQcm9wZXJ0aWVzKGNsb25l
KTsKLQotICAgIGNsb25lLT5zZXRDbG9uZWRMYXllcih0aGlzKTsKLSAgICByZXR1cm4gV1RGTW92
ZShjbG9uZSk7Ci19Ci0KLVBsYXRmb3JtQ0FMYXllclJlbW90ZTo6flBsYXRmb3JtQ0FMYXllclJl
bW90ZSgpCi17Ci0gICAgZm9yIChjb25zdCBhdXRvJiBsYXllciA6IG1fY2hpbGRyZW4pCi0gICAg
ICAgIGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4oKmxheWVyKS5tX3N1cGVybGF5ZXIg
PSBudWxscHRyOwotCi0gICAgaWYgKG1fY29udGV4dCkKLSAgICAgICAgbV9jb250ZXh0LT5sYXll
cldpbGxCZURlc3Ryb3llZCgqdGhpcyk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
Ojp1cGRhdGVDbG9uZWRMYXllclByb3BlcnRpZXMoUGxhdGZvcm1DQUxheWVyUmVtb3RlJiBjbG9u
ZSwgYm9vbCBjb3B5Q29udGVudHMpIGNvbnN0Ci17Ci0gICAgY2xvbmUuc2V0UG9zaXRpb24ocG9z
aXRpb24oKSk7Ci0gICAgY2xvbmUuc2V0Qm91bmRzKGJvdW5kcygpKTsKLSAgICBjbG9uZS5zZXRB
bmNob3JQb2ludChhbmNob3JQb2ludCgpKTsKLQotICAgIGlmIChtX3Byb3BlcnRpZXMudHJhbnNm
b3JtKQotICAgICAgICBjbG9uZS5zZXRUcmFuc2Zvcm0oKm1fcHJvcGVydGllcy50cmFuc2Zvcm0p
OwotCi0gICAgaWYgKG1fcHJvcGVydGllcy5zdWJsYXllclRyYW5zZm9ybSkKLSAgICAgICAgY2xv
bmUuc2V0U3VibGF5ZXJUcmFuc2Zvcm0oKm1fcHJvcGVydGllcy5zdWJsYXllclRyYW5zZm9ybSk7
Ci0KLSAgICBpZiAoY29weUNvbnRlbnRzKQotICAgICAgICBjbG9uZS5zZXRDb250ZW50cyhjb250
ZW50cygpKTsKLQotICAgIGNsb25lLnNldE1hc2tzVG9Cb3VuZHMobWFza3NUb0JvdW5kcygpKTsK
LSAgICBjbG9uZS5zZXREb3VibGVTaWRlZChpc0RvdWJsZVNpZGVkKCkpOwotICAgIGNsb25lLnNl
dE9wYXF1ZShpc09wYXF1ZSgpKTsKLSAgICBjbG9uZS5zZXRCYWNrZ3JvdW5kQ29sb3IoYmFja2dy
b3VuZENvbG9yKCkpOwotICAgIGNsb25lLnNldENvbnRlbnRzU2NhbGUoY29udGVudHNTY2FsZSgp
KTsKLSAgICBjbG9uZS5zZXRDb3JuZXJSYWRpdXMoY29ybmVyUmFkaXVzKCkpOwotCi0gICAgaWYg
KCFtX3Byb3BlcnRpZXMuc2hhcGVQYXRoLmlzTnVsbCgpKQotICAgICAgICBjbG9uZS5zZXRTaGFw
ZVBhdGgobV9wcm9wZXJ0aWVzLnNoYXBlUGF0aCk7Ci0KLSAgICBpZiAobV9wcm9wZXJ0aWVzLnNo
YXBlUm91bmRlZFJlY3QpCi0gICAgICAgIGNsb25lLnNldFNoYXBlUm91bmRlZFJlY3QoKm1fcHJv
cGVydGllcy5zaGFwZVJvdW5kZWRSZWN0KTsKLQotICAgIGlmIChtX3Byb3BlcnRpZXMuZmlsdGVy
cykKLSAgICAgICAgY2xvbmUuY29weUZpbHRlcnNGcm9tKCp0aGlzKTsKLQotICAgIGNsb25lLnVw
ZGF0ZUN1c3RvbUFwcGVhcmFuY2UoY3VzdG9tQXBwZWFyYW5jZSgpKTsKLX0KLQotdm9pZCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6OnJlY3Vyc2l2ZUJ1aWxkVHJhbnNhY3Rpb24oUmVtb3RlTGF5ZXJU
cmVlQ29udGV4dCYgY29udGV4dCwgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24mIHRyYW5zYWN0
aW9uKQotewotICAgIEFTU0VSVCghbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZSB8fCBvd25lcigp
KTsKLSAgICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTigmY29udGV4dCA9PSBtX2Nv
bnRleHQpOwotICAgIAotICAgIGlmIChtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlICYmICghb3du
ZXIoKSB8fCAhb3duZXIoKS0+cGxhdGZvcm1DQUxheWVyRHJhd3NDb250ZW50KCkpKSB7Ci0gICAg
ICAgIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUgPSBudWxscHRyOwotICAgICAgICBtX3Byb3Bl
cnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpC
YWNraW5nU3RvcmVDaGFuZ2VkKTsKLSAgICB9Ci0KLSAgICBpZiAobV9wcm9wZXJ0aWVzLmJhY2tp
bmdTdG9yZSAmJiBtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlQXR0YWNoZWQgJiYgbV9wcm9wZXJ0
aWVzLmJhY2tpbmdTdG9yZS0+ZGlzcGxheSgpKQotICAgICAgICBtX3Byb3BlcnRpZXMubm90ZVBy
b3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpCYWNraW5nU3RvcmVD
aGFuZ2VkKTsKLQotICAgIGlmIChtX3Byb3BlcnRpZXMuY2hhbmdlZFByb3BlcnRpZXMgIT0gUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246Ok5vQ2hhbmdlKSB7Ci0gICAgICAgIGlmIChtX3Byb3Bl
cnRpZXMuY2hhbmdlZFByb3BlcnRpZXMgJiBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q2hp
bGRyZW5DaGFuZ2VkKSB7Ci0gICAgICAgICAgICBtX3Byb3BlcnRpZXMuY2hpbGRyZW4ucmVzaXpl
KG1fY2hpbGRyZW4uc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
bV9jaGlsZHJlbi5zaXplKCk7ICsraSkKLSAgICAgICAgICAgICAgICBtX3Byb3BlcnRpZXMuY2hp
bGRyZW5baV0gPSBtX2NoaWxkcmVuW2ldLT5sYXllcklEKCk7Ci0gICAgICAgIH0KLQotICAgICAg
ICBpZiAoaXNQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20oKSkgewotICAgICAgICAgICAgUmVt
b3RlTGF5ZXJUcmVlUHJvcGVydHlBcHBsaWVyOjphcHBseVByb3BlcnRpZXMocGxhdGZvcm1MYXll
cigpLCBudWxscHRyLCBtX3Byb3BlcnRpZXMsIFJlbW90ZUxheWVyVHJlZVByb3BlcnR5QXBwbGll
cjo6UmVsYXRlZExheWVyTWFwKCksIFJlbW90ZUxheWVyQmFja2luZ1N0b3JlOjpMYXllckNvbnRl
bnRzVHlwZTo6Q0FNYWNoUG9ydCk7Ci0gICAgICAgICAgICBkaWRDb21taXQoKTsKLSAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHRyYW5zYWN0aW9uLmxheWVyUHJvcGVy
dGllc0NoYW5nZWQoKnRoaXMpOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
bV9jaGlsZHJlbi5zaXplKCk7ICsraSkgewotICAgICAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUm
IGNoaWxkID0gZG93bmNhc3Q8UGxhdGZvcm1DQUxheWVyUmVtb3RlPigqbV9jaGlsZHJlbltpXSk7
Ci0gICAgICAgIEFTU0VSVChjaGlsZC5zdXBlcmxheWVyKCkgPT0gdGhpcyk7Ci0gICAgICAgIGNo
aWxkLnJlY3Vyc2l2ZUJ1aWxkVHJhbnNhY3Rpb24oY29udGV4dCwgdHJhbnNhY3Rpb24pOwotICAg
IH0KLQotICAgIGlmIChtX21hc2tMYXllcikKLSAgICAgICAgbV9tYXNrTGF5ZXItPnJlY3Vyc2l2
ZUJ1aWxkVHJhbnNhY3Rpb24oY29udGV4dCwgdHJhbnNhY3Rpb24pOwotfQotCi12b2lkIFBsYXRm
b3JtQ0FMYXllclJlbW90ZTo6ZGlkQ29tbWl0KCkKLXsKLSAgICBtX3Byb3BlcnRpZXMuYWRkZWRB
bmltYXRpb25zLmNsZWFyKCk7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVBhdGhzT2ZBbmltYXRpb25z
VG9SZW1vdmUuY2xlYXIoKTsKLSAgICBtX3Byb3BlcnRpZXMucmVzZXRDaGFuZ2VkUHJvcGVydGll
cygpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6ZW5zdXJlQmFja2luZ1N0b3Jl
KCkKLXsKLSAgICBBU1NFUlQob3duZXIoKSk7Ci0gICAgCi0gICAgaWYgKCFtX3Byb3BlcnRpZXMu
YmFja2luZ1N0b3JlKQotICAgICAgICBtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlID0gc3RkOjpt
YWtlX3VuaXF1ZTxSZW1vdGVMYXllckJhY2tpbmdTdG9yZT4odGhpcyk7Ci0KLSAgICB1cGRhdGVC
YWNraW5nU3RvcmUoKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnVwZGF0ZUJh
Y2tpbmdTdG9yZSgpCi17Ci0gICAgaWYgKCFtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlLT5lbnN1cmVCYWNr
aW5nU3RvcmUobV9wcm9wZXJ0aWVzLmJvdW5kcy5zaXplKCksIG1fcHJvcGVydGllcy5jb250ZW50
c1NjYWxlLCBtX2FjY2VsZXJhdGVzRHJhd2luZywgbV93YW50c0RlZXBDb2xvckJhY2tpbmdTdG9y
ZSwgbV9wcm9wZXJ0aWVzLm9wYXF1ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
OjpzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQotewotICAgIGVu
c3VyZUJhY2tpbmdTdG9yZSgpOwotCi0gICAgLy8gRklYTUU6IE5lZWQgdG8gbWFwIHRoaXMgdGhy
b3VnaCBjb250ZW50c1JlY3QvZXRjLgotICAgIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUtPnNl
dE5lZWRzRGlzcGxheShlbmNsb3NpbmdJbnRSZWN0KHJlY3QpKTsKLX0KLQotdm9pZCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6OnNldE5lZWRzRGlzcGxheSgpCi17Ci0gICAgZW5zdXJlQmFja2luZ1N0
b3JlKCk7Ci0KLSAgICBtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlLT5zZXROZWVkc0Rpc3BsYXko
KTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNvcHlDb250ZW50c0Zyb21MYXll
cihQbGF0Zm9ybUNBTGF5ZXIqIGxheWVyKQotewotICAgIEFTU0VSVChtX3Byb3BlcnRpZXMuY2xv
bmVkTGF5ZXJJRCA9PSBsYXllci0+bGF5ZXJJRCgpKTsKLSAgICAKLSAgICBpZiAoIW1fcHJvcGVy
dGllcy5jaGFuZ2VkUHJvcGVydGllcykKLSAgICAgICAgbV9jb250ZXh0LT5sYXllclByb3BlcnR5
Q2hhbmdlZFdoaWxlQnVpbGRpbmdUcmFuc2FjdGlvbigqdGhpcyk7Ci0KLSAgICBtX3Byb3BlcnRp
ZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDbG9u
ZWRDb250ZW50c0NoYW5nZWQpOwotfQotCi1QbGF0Zm9ybUNBTGF5ZXIqIFBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6c3VwZXJsYXllcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc3VwZXJsYXllcjsK
LX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnJlbW92ZUZyb21TdXBlcmxheWVyKCkK
LXsKLSAgICBpZiAoIW1fc3VwZXJsYXllcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9zdXBl
cmxheWVyLT5yZW1vdmVTdWJsYXllcih0aGlzKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGU6OnJlbW92ZVN1YmxheWVyKFBsYXRmb3JtQ0FMYXllclJlbW90ZSogbGF5ZXIpCi17Ci0g
ICAgc2l6ZV90IGNoaWxkSW5kZXggPSBtX2NoaWxkcmVuLmZpbmQobGF5ZXIpOwotICAgIGlmIChj
aGlsZEluZGV4ICE9IG5vdEZvdW5kKQotICAgICAgICBtX2NoaWxkcmVuLnJlbW92ZShjaGlsZElu
ZGV4KTsKLSAgICBsYXllci0+bV9zdXBlcmxheWVyID0gbnVsbHB0cjsKLSAgICBtX3Byb3BlcnRp
ZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDaGls
ZHJlbkNoYW5nZWQpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0U3VibGF5
ZXJzKGNvbnN0IFBsYXRmb3JtQ0FMYXllckxpc3QmIGxpc3QpCi17Ci0gICAgcmVtb3ZlQWxsU3Vi
bGF5ZXJzKCk7Ci0gICAgbV9jaGlsZHJlbiA9IGxpc3Q7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8m
IGxheWVyIDogbGlzdCkgewotICAgICAgICBsYXllci0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsK
LSAgICAgICAgZG93bmNhc3Q8UGxhdGZvcm1DQUxheWVyUmVtb3RlPigqbGF5ZXIpLm1fc3VwZXJs
YXllciA9IHRoaXM7Ci0gICAgfQotCi0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hh
bmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q2hpbGRyZW5DaGFuZ2VkKTsKLX0KLQot
dm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnJlbW92ZUFsbFN1YmxheWVycygpCi17Ci0gICAg
UGxhdGZvcm1DQUxheWVyTGlzdCBsYXllcnNUb1JlbW92ZSA9IG1fY2hpbGRyZW47Ci0gICAgZm9y
IChjb25zdCBhdXRvJiBsYXllciA6IGxheWVyc1RvUmVtb3ZlKQotICAgICAgICBsYXllci0+cmVt
b3ZlRnJvbVN1cGVybGF5ZXIoKTsKLSAgICBBU1NFUlQobV9jaGlsZHJlbi5pc0VtcHR5KCkpOwot
ICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJh
bnNhY3Rpb246OkNoaWxkcmVuQ2hhbmdlZCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjphcHBlbmRTdWJsYXllcihQbGF0Zm9ybUNBTGF5ZXImIGxheWVyKQotewotICAgIFJlZjxQ
bGF0Zm9ybUNBTGF5ZXI+IGxheWVyUHJvdGVjdG9yKGxheWVyKTsKLQotICAgIGxheWVyLnJlbW92
ZUZyb21TdXBlcmxheWVyKCk7Ci0gICAgbV9jaGlsZHJlbi5hcHBlbmQoJmxheWVyKTsKLSAgICBk
b3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+KGxheWVyKS5tX3N1cGVybGF5ZXIgPSB0aGlz
OwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVl
VHJhbnNhY3Rpb246OkNoaWxkcmVuQ2hhbmdlZCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjppbnNlcnRTdWJsYXllcihQbGF0Zm9ybUNBTGF5ZXImIGxheWVyLCBzaXplX3QgaW5k
ZXgpCi17Ci0gICAgUmVmPFBsYXRmb3JtQ0FMYXllcj4gbGF5ZXJQcm90ZWN0b3IobGF5ZXIpOwot
Ci0gICAgbGF5ZXIucmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKLSAgICBtX2NoaWxkcmVuLmluc2Vy
dChpbmRleCwgJmxheWVyKTsKLSAgICBkb3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+KGxh
eWVyKS5tX3N1cGVybGF5ZXIgPSB0aGlzOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGll
c0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNoaWxkcmVuQ2hhbmdlZCk7Ci19
Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpyZXBsYWNlU3VibGF5ZXIoUGxhdGZvcm1D
QUxheWVyJiByZWZlcmVuY2UsIFBsYXRmb3JtQ0FMYXllciYgbGF5ZXIpCi17Ci0gICAgQVNTRVJU
KHJlZmVyZW5jZS5zdXBlcmxheWVyKCkgPT0gdGhpcyk7Ci0gICAgUmVmPFBsYXRmb3JtQ0FMYXll
cj4gbGF5ZXJQcm90ZWN0b3IobGF5ZXIpOwotCi0gICAgbGF5ZXIucmVtb3ZlRnJvbVN1cGVybGF5
ZXIoKTsKLSAgICBzaXplX3QgcmVmZXJlbmNlSW5kZXggPSBtX2NoaWxkcmVuLmZpbmQoJnJlZmVy
ZW5jZSk7Ci0gICAgaWYgKHJlZmVyZW5jZUluZGV4ICE9IG5vdEZvdW5kKSB7Ci0gICAgICAgIG1f
Y2hpbGRyZW5bcmVmZXJlbmNlSW5kZXhdLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOwotICAgICAg
ICBtX2NoaWxkcmVuLmluc2VydChyZWZlcmVuY2VJbmRleCwgJmxheWVyKTsKLSAgICAgICAgZG93
bmNhc3Q8UGxhdGZvcm1DQUxheWVyUmVtb3RlPihsYXllcikubV9zdXBlcmxheWVyID0gdGhpczsK
LSAgICB9Ci0KLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxh
eWVyVHJlZVRyYW5zYWN0aW9uOjpDaGlsZHJlbkNoYW5nZWQpOwotfQotCi12b2lkIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6YWRvcHRTdWJsYXllcnMoUGxhdGZvcm1DQUxheWVyJiBzb3VyY2UpCi17
Ci0gICAgUGxhdGZvcm1DQUxheWVyTGlzdCBsYXllcnNUb01vdmUgPSBkb3duY2FzdDxQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU+KHNvdXJjZSkubV9jaGlsZHJlbjsKLQotICAgIGlmIChjb25zdCBQbGF0
Zm9ybUNBTGF5ZXJMaXN0KiBjdXN0b21MYXllcnMgPSBzb3VyY2UuY3VzdG9tU3VibGF5ZXJzKCkp
IHsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBsYXllciA6ICpjdXN0b21MYXllcnMpIHsKLSAg
ICAgICAgICAgIHNpemVfdCBsYXllckluZGV4ID0gbGF5ZXJzVG9Nb3ZlLmZpbmQobGF5ZXIpOwot
ICAgICAgICAgICAgaWYgKGxheWVySW5kZXggIT0gbm90Rm91bmQpCi0gICAgICAgICAgICAgICAg
bGF5ZXJzVG9Nb3ZlLnJlbW92ZShsYXllckluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAg
IHNldFN1YmxheWVycyhsYXllcnNUb01vdmUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJl
bW90ZTo6YWRkQW5pbWF0aW9uRm9yS2V5KGNvbnN0IFN0cmluZyYga2V5LCBQbGF0Zm9ybUNBQW5p
bWF0aW9uJiBhbmltYXRpb24pCi17Ci0gICAgYXV0byBhZGRSZXN1bHQgPSBtX2FuaW1hdGlvbnMu
c2V0KGtleSwgJmFuaW1hdGlvbik7Ci0gICAgaWYgKGFkZFJlc3VsdC5pc05ld0VudHJ5KQotICAg
ICAgICBtX3Byb3BlcnRpZXMuYWRkZWRBbmltYXRpb25zLmFwcGVuZChzdGQ6OnBhaXI8U3RyaW5n
LCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpQcm9wZXJ0aWVzPihrZXksIGRvd25jYXN0PFBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KGFuaW1hdGlvbikucHJvcGVydGllcygpKSk7Ci0gICAg
ZWxzZSB7Ci0gICAgICAgIGZvciAoYXV0byYga2V5QW5pbWF0aW9uUGFpciA6IG1fcHJvcGVydGll
cy5hZGRlZEFuaW1hdGlvbnMpIHsKLSAgICAgICAgICAgIGlmIChrZXlBbmltYXRpb25QYWlyLmZp
cnN0ID09IGtleSkgewotICAgICAgICAgICAgICAgIGtleUFuaW1hdGlvblBhaXIuc2Vjb25kID0g
ZG93bmNhc3Q8UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4oYW5pbWF0aW9uKS5wcm9wZXJ0aWVz
KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgCi0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVM
YXllclRyZWVUcmFuc2FjdGlvbjo6QW5pbWF0aW9uc0NoYW5nZWQpOwotCi0gICAgaWYgKG1fY29u
dGV4dCkKLSAgICAgICAgbV9jb250ZXh0LT53aWxsU3RhcnRBbmltYXRpb25PbkxheWVyKCp0aGlz
KTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnJlbW92ZUFuaW1hdGlvbkZvcktl
eShjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICBpZiAobV9hbmltYXRpb25zLnJlbW92ZShrZXkp
KSB7Ci0gICAgICAgIG1fcHJvcGVydGllcy5hZGRlZEFuaW1hdGlvbnMucmVtb3ZlRmlyc3RNYXRj
aGluZyhbJmtleV0oYXV0byYgcGFpcikgewotICAgICAgICAgICAgcmV0dXJuIHBhaXIuZmlyc3Qg
PT0ga2V5OwotICAgICAgICB9KTsKLSAgICB9Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVBhdGhzT2ZB
bmltYXRpb25zVG9SZW1vdmUuYWRkKGtleSk7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0
aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6QW5pbWF0aW9uc0NoYW5nZWQp
OwotfQotCi1SZWZQdHI8UGxhdGZvcm1DQUFuaW1hdGlvbj4gUGxhdGZvcm1DQUxheWVyUmVtb3Rl
OjphbmltYXRpb25Gb3JLZXkoY29uc3QgU3RyaW5nJiBrZXkpCi17Ci0gICAgcmV0dXJuIG1fYW5p
bWF0aW9ucy5nZXQoa2V5KTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzRXF1aXZhbGVudExh
eWVyKGNvbnN0IFBsYXRmb3JtQ0FMYXllciogbGF5ZXIsIEdyYXBoaWNzTGF5ZXI6OlBsYXRmb3Jt
TGF5ZXJJRCBsYXllcklEKQotewotICAgIEdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCBu
ZXdMYXllcklEID0gbGF5ZXIgPyBsYXllci0+bGF5ZXJJRCgpIDogMDsKLSAgICByZXR1cm4gbGF5
ZXJJRCA9PSBuZXdMYXllcklEOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6YW5p
bWF0aW9uU3RhcnRlZChjb25zdCBTdHJpbmcmIGtleSwgQ0ZUaW1lSW50ZXJ2YWwgYmVnaW5UaW1l
KQotewotICAgIGF1dG8gaXQgPSBtX2FuaW1hdGlvbnMuZmluZChrZXkpOwotICAgIGlmIChpdCAh
PSBtX2FuaW1hdGlvbnMuZW5kKCkpCi0gICAgICAgIGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGU+KCppdC0+dmFsdWUpLmRpZFN0YXJ0KGJlZ2luVGltZSk7Ci0gICAgCi0gICAgaWYg
KG1fb3duZXIpCi0gICAgICAgIG1fb3duZXItPnBsYXRmb3JtQ0FMYXllckFuaW1hdGlvblN0YXJ0
ZWQoa2V5LCBiZWdpblRpbWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6YW5p
bWF0aW9uRW5kZWQoY29uc3QgU3RyaW5nJiBrZXkpCi17Ci0gICAgaWYgKG1fb3duZXIpCi0gICAg
ICAgIG1fb3duZXItPnBsYXRmb3JtQ0FMYXllckFuaW1hdGlvbkVuZGVkKGtleSk7Ci19Ci0KLXZv
aWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRNYXNrKFBsYXRmb3JtQ0FMYXllciogbGF5ZXIp
Ci17Ci0gICAgaWYgKGlzRXF1aXZhbGVudExheWVyKGxheWVyLCBtX3Byb3BlcnRpZXMubWFza0xh
eWVySUQpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKGxheWVyKSB7Ci0gICAgICAg
IG1fbWFza0xheWVyID0gZG93bmNhc3Q8UGxhdGZvcm1DQUxheWVyUmVtb3RlPihsYXllcik7Ci0g
ICAgICAgIG1fcHJvcGVydGllcy5tYXNrTGF5ZXJJRCA9IG1fbWFza0xheWVyLT5sYXllcklEKCk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9tYXNrTGF5ZXIgPSBudWxscHRyOwotICAgICAgICBt
X3Byb3BlcnRpZXMubWFza0xheWVySUQgPSAwOwotICAgIH0KLQotICAgIG1fcHJvcGVydGllcy5u
b3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246Ok1hc2tMYXll
ckNoYW5nZWQpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0Q2xvbmVkTGF5
ZXIoY29uc3QgUGxhdGZvcm1DQUxheWVyKiBsYXllcikKLXsKLSAgICBpZiAoaXNFcXVpdmFsZW50
TGF5ZXIobGF5ZXIsIG1fcHJvcGVydGllcy5jbG9uZWRMYXllcklEKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgaWYgKGxheWVyKQotICAgICAgICBtX3Byb3BlcnRpZXMuY2xvbmVkTGF5ZXJJRCA9
IGxheWVyLT5sYXllcklEKCk7Ci0gICAgZWxzZQotICAgICAgICBtX3Byb3BlcnRpZXMuY2xvbmVk
TGF5ZXJJRCA9IDA7Ci0KLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJl
bW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDbG9uZWRDb250ZW50c0NoYW5nZWQpOwotfQotCi1i
b29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6aXNPcGFxdWUoKSBjb25zdAotewotICAgIHJldHVy
biBtX3Byb3BlcnRpZXMub3BhcXVlOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
c2V0T3BhcXVlKGJvb2wgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLm9wYXF1ZSA9IHZhbHVl
OwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVl
VHJhbnNhY3Rpb246Ok9wYXF1ZUNoYW5nZWQpOwotCi0gICAgdXBkYXRlQmFja2luZ1N0b3JlKCk7
Ci19Ci0KLUZsb2F0UmVjdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmJvdW5kcygpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5ib3VuZHM7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjpzZXRCb3VuZHMoY29uc3QgRmxvYXRSZWN0JiB2YWx1ZSkKLXsKLSAgICBpZiAo
dmFsdWUgPT0gbV9wcm9wZXJ0aWVzLmJvdW5kcykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9w
cm9wZXJ0aWVzLmJvdW5kcyA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGll
c0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkJvdW5kc0NoYW5nZWQpOwotICAg
IAotICAgIGlmIChyZXF1aXJlc0N1c3RvbUFwcGVhcmFuY2VVcGRhdGVPbkJvdW5kc0NoYW5nZSgp
KQotICAgICAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVy
VHJlZVRyYW5zYWN0aW9uOjpDdXN0b21BcHBlYXJhbmNlQ2hhbmdlZCk7Ci0KLSAgICB1cGRhdGVC
YWNraW5nU3RvcmUoKTsKLX0KLQotRmxvYXRQb2ludDNEIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
cG9zaXRpb24oKSBjb25zdAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMucG9zaXRpb247Ci19
Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRQb3NpdGlvbihjb25zdCBGbG9hdFBv
aW50M0QmIHZhbHVlKQotewotICAgIC8vIFdlIGNhbid0IGVhcmx5IHJldHVybiBoZXJlIGlmIHRo
ZSBwb3NpdGlvbiBoYXMgbm90IGNoYW5nZWQsIHNpbmNlIEdyYXBoaWNzTGF5ZXJDQTo6c3luY1Bv
c2l0aW9uKCkgbWF5IGhhdmUgY2hhbmdlZAotICAgIC8vIHRoZSBHcmFwaGljc0xheWVyIHBvc2l0
aW9uICh3aGljaCBkb2Vzbid0IGZvcmNlIGEgZ2VvbWV0cnkgdXBkYXRlKSBidXQgd2Ugd2FudCBh
IHN1YnNlcXVlbnQgR3JhcGhpY3NMYXllckNBOjpzZXRQb3NpdGlvbigpCi0gICAgLy8gdG8gcHVz
aCBhIG5ldyBwb3NpdGlvbiB0byB0aGUgVUkgcHJvY2VzcywgZXZlbiB0aG91Z2ggb3VyIG1fcHJv
cGVydGllcy5wb3NpdGlvbiBoYXNuJ3QgY2hhbmdlZC4KLSAgICBtX3Byb3BlcnRpZXMucG9zaXRp
b24gPSB2YWx1ZTsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90
ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpQb3NpdGlvbkNoYW5nZWQpOwotfQotCi1GbG9hdFBvaW50
M0QgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjphbmNob3JQb2ludCgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIG1fcHJvcGVydGllcy5hbmNob3JQb2ludDsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGU6OnNldEFuY2hvclBvaW50KGNvbnN0IEZsb2F0UG9pbnQzRCYgdmFsdWUpCi17Ci0gICAg
aWYgKHZhbHVlID09IG1fcHJvcGVydGllcy5hbmNob3JQb2ludCkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgbV9wcm9wZXJ0aWVzLmFuY2hvclBvaW50ID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVz
Lm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6QW5jaG9y
UG9pbnRDaGFuZ2VkKTsKLX0KLQotVHJhbnNmb3JtYXRpb25NYXRyaXggUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjp0cmFuc2Zvcm0oKSBjb25zdAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMudHJh
bnNmb3JtID8gKm1fcHJvcGVydGllcy50cmFuc2Zvcm0gOiBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgp
OwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0VHJhbnNmb3JtKGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMudHJhbnNmb3Jt
ID0gc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2Zvcm1hdGlvbk1hdHJpeD4odmFsdWUpOwotICAgIG1f
cHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rp
b246OlRyYW5zZm9ybUNoYW5nZWQpOwotfQotCi1UcmFuc2Zvcm1hdGlvbk1hdHJpeCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6OnN1YmxheWVyVHJhbnNmb3JtKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bV9wcm9wZXJ0aWVzLnN1YmxheWVyVHJhbnNmb3JtID8gKm1fcHJvcGVydGllcy5zdWJsYXllclRy
YW5zZm9ybSA6IFRyYW5zZm9ybWF0aW9uTWF0cml4KCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjpzZXRTdWJsYXllclRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCYgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLnN1YmxheWVyVHJhbnNmb3JtID0gc3RkOjpt
YWtlX3VuaXF1ZTxUcmFuc2Zvcm1hdGlvbk1hdHJpeD4odmFsdWUpOwotICAgIG1fcHJvcGVydGll
cy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlN1Ymxh
eWVyVHJhbnNmb3JtQ2hhbmdlZCk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpp
c0hpZGRlbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5oaWRkZW47Ci19Ci0K
LXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRIaWRkZW4oYm9vbCB2YWx1ZSkKLXsKLSAg
ICBpZiAobV9wcm9wZXJ0aWVzLmhpZGRlbiA9PSB2YWx1ZSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgbV9wcm9wZXJ0aWVzLmhpZGRlbiA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJv
cGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkhpZGRlbkNoYW5nZWQp
OwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y29udGVudHNIaWRkZW4oKSBjb25z
dAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMuY29udGVudHNIaWRkZW47Ci19Ci0KLXZvaWQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRDb250ZW50c0hpZGRlbihib29sIHZhbHVlKQotewot
ICAgIGlmIChtX3Byb3BlcnRpZXMuY29udGVudHNIaWRkZW4gPT0gdmFsdWUpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIG1fcHJvcGVydGllcy5jb250ZW50c0hpZGRlbiA9IHZhbHVlOwotICAgIG1f
cHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rp
b246OkNvbnRlbnRzSGlkZGVuQ2hhbmdlZCk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjp1c2VySW50ZXJhY3Rpb25FbmFibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9w
ZXJ0aWVzLnVzZXJJbnRlcmFjdGlvbkVuYWJsZWQ7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjpzZXRVc2VySW50ZXJhY3Rpb25FbmFibGVkKGJvb2wgdmFsdWUpCi17Ci0gICAgaWYg
KG1fcHJvcGVydGllcy51c2VySW50ZXJhY3Rpb25FbmFibGVkID09IHZhbHVlKQotICAgICAgICBy
ZXR1cm47Ci0gICAgCi0gICAgbV9wcm9wZXJ0aWVzLnVzZXJJbnRlcmFjdGlvbkVuYWJsZWQgPSB2
YWx1ZTsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVy
VHJlZVRyYW5zYWN0aW9uOjpVc2VySW50ZXJhY3Rpb25FbmFibGVkQ2hhbmdlZCk7Ci19Ci0KLXZv
aWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCYWNraW5nU3RvcmVBdHRhY2hlZChib29sIHZh
bHVlKQotewotICAgIGlmIChtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlQXR0YWNoZWQgPT0gdmFs
dWUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmVBdHRh
Y2hlZCA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkJhY2tpbmdTdG9yZUF0dGFjaG1lbnRDaGFuZ2VkKTsK
LX0KLQotYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmJhY2tpbmdTdG9yZUF0dGFjaGVkKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZUF0dGFjaGVkOwot
fQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0R2VvbWV0cnlGbGlwcGVkKGJvb2wg
dmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLmdlb21ldHJ5RmxpcHBlZCA9IHZhbHVlOwotICAg
IG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNh
Y3Rpb246Okdlb21ldHJ5RmxpcHBlZENoYW5nZWQpOwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6Z2VvbWV0cnlGbGlwcGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0
aWVzLmdlb21ldHJ5RmxpcHBlZDsKLX0KLQotYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6Omlz
RG91YmxlU2lkZWQoKSBjb25zdAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMuZG91YmxlU2lk
ZWQ7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXREb3VibGVTaWRlZChib29s
IHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5kb3VibGVTaWRlZCA9IHZhbHVlOwotICAgIG1f
cHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rp
b246OkRvdWJsZVNpZGVkQ2hhbmdlZCk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
OjptYXNrc1RvQm91bmRzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLm1hc2tz
VG9Cb3VuZHM7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRNYXNrc1RvQm91
bmRzKGJvb2wgdmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlID09IG1fcHJvcGVydGllcy5tYXNrc1Rv
Qm91bmRzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMubWFza3NUb0JvdW5k
cyA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3Rl
TGF5ZXJUcmVlVHJhbnNhY3Rpb246Ok1hc2tzVG9Cb3VuZHNDaGFuZ2VkKTsKLX0KLQotYm9vbCBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmFjY2VsZXJhdGVzRHJhd2luZygpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1fYWNjZWxlcmF0ZXNEcmF3aW5nOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJl
bW90ZTo6c2V0QWNjZWxlcmF0ZXNEcmF3aW5nKGJvb2wgYWNjZWxlcmF0ZXNEcmF3aW5nKQotewot
ICAgIG1fYWNjZWxlcmF0ZXNEcmF3aW5nID0gYWNjZWxlcmF0ZXNEcmF3aW5nOwotICAgIHVwZGF0
ZUJhY2tpbmdTdG9yZSgpOwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6d2FudHNE
ZWVwQ29sb3JCYWNraW5nU3RvcmUoKSBjb25zdAotewotICAgIHJldHVybiBtX3dhbnRzRGVlcENv
bG9yQmFja2luZ1N0b3JlOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0V2Fu
dHNEZWVwQ29sb3JCYWNraW5nU3RvcmUoYm9vbCB3YW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZSkK
LXsKLSAgICBtX3dhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlID0gd2FudHNEZWVwQ29sb3JCYWNr
aW5nU3RvcmU7Ci0gICAgdXBkYXRlQmFja2luZ1N0b3JlKCk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjpzdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRT
dXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KGJvb2wpCi17Ci19Ci0KLUNGVHlwZVJlZiBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNvbnRlbnRzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbnVs
bHB0cjsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldENvbnRlbnRzKENGVHlw
ZVJlZiB2YWx1ZSkKLXsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldENvbnRl
bnRzUmVjdChjb25zdCBGbG9hdFJlY3QmIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5jb250
ZW50c1JlY3QgPSB2YWx1ZTsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2Vk
KFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDb250ZW50c1JlY3RDaGFuZ2VkKTsKLX0KLQot
dm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldE1pbmlmaWNhdGlvbkZpbHRlcihGaWx0ZXJU
eXBlIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5taW5pZmljYXRpb25GaWx0ZXIgPSB2YWx1
ZTsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJl
ZVRyYW5zYWN0aW9uOjpNaW5pZmljYXRpb25GaWx0ZXJDaGFuZ2VkKTsKLX0KLQotdm9pZCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldE1hZ25pZmljYXRpb25GaWx0ZXIoRmlsdGVyVHlwZSB2YWx1
ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMubWFnbmlmaWNhdGlvbkZpbHRlciA9IHZhbHVlOwotICAg
IG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNh
Y3Rpb246Ok1hZ25pZmljYXRpb25GaWx0ZXJDaGFuZ2VkKTsKLX0KLQotQ29sb3IgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjpiYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIHJldHVybiBtX3By
b3BlcnRpZXMuYmFja2dyb3VuZENvbG9yOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90
ZTo6c2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yJiB2YWx1ZSkKLXsKLSAgICBtX3Byb3Bl
cnRpZXMuYmFja2dyb3VuZENvbG9yID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9w
ZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6QmFja2dyb3VuZENvbG9y
Q2hhbmdlZCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCb3JkZXJXaWR0
aChmbG9hdCB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUgPT0gbV9wcm9wZXJ0aWVzLmJvcmRlcldp
ZHRoKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMuYm9yZGVyV2lkdGggPSB2
YWx1ZTsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVy
VHJlZVRyYW5zYWN0aW9uOjpCb3JkZXJXaWR0aENoYW5nZWQpOwotfQotCi12b2lkIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6c2V0Qm9yZGVyQ29sb3IoY29uc3QgQ29sb3ImIHZhbHVlKQotewotICAg
IGlmICh2YWx1ZSA9PSBtX3Byb3BlcnRpZXMuYm9yZGVyQ29sb3IpCi0gICAgICAgIHJldHVybjsK
LQotICAgIG1fcHJvcGVydGllcy5ib3JkZXJDb2xvciA9IHZhbHVlOwotICAgIG1fcHJvcGVydGll
cy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkJvcmRl
ckNvbG9yQ2hhbmdlZCk7Ci19Ci0KLWZsb2F0IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6b3BhY2l0
eSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5vcGFjaXR5OwotfQotCi12b2lk
IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0T3BhY2l0eShmbG9hdCB2YWx1ZSkKLXsKLSAgICBt
X3Byb3BlcnRpZXMub3BhY2l0eSA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVy
dGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246Ok9wYWNpdHlDaGFuZ2VkKTsK
LX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEZpbHRlcnMoY29uc3QgRmlsdGVy
T3BlcmF0aW9ucyYgZmlsdGVycykKLXsKLSAgICBtX3Byb3BlcnRpZXMuZmlsdGVycyA9IHN0ZDo6
bWFrZV91bmlxdWU8RmlsdGVyT3BlcmF0aW9ucz4oZmlsdGVycyk7Ci0gICAgbV9wcm9wZXJ0aWVz
Lm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6RmlsdGVy
c0NoYW5nZWQpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y29weUZpbHRlcnNG
cm9tKGNvbnN0IFBsYXRmb3JtQ0FMYXllciYgc291cmNlTGF5ZXIpCi17Ci0gICAgaWYgKGNvbnN0
IEZpbHRlck9wZXJhdGlvbnMqIGZpbHRlcnMgPSBkb3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU+KHNvdXJjZUxheWVyKS5tX3Byb3BlcnRpZXMuZmlsdGVycy5nZXQoKSkKLSAgICAgICAgc2V0
RmlsdGVycygqZmlsdGVycyk7Ci0gICAgZWxzZSBpZiAobV9wcm9wZXJ0aWVzLmZpbHRlcnMpCi0g
ICAgICAgIG1fcHJvcGVydGllcy5maWx0ZXJzID0gbnVsbHB0cjsKLQotICAgIG1fcHJvcGVydGll
cy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkZpbHRl
cnNDaGFuZ2VkKTsKLX0KLQotI2lmIEVOQUJMRShDU1NfQ09NUE9TSVRJTkcpCi12b2lkIFBsYXRm
b3JtQ0FMYXllclJlbW90ZTo6c2V0QmxlbmRNb2RlKEJsZW5kTW9kZSBibGVuZE1vZGUpCi17Ci0g
ICAgbV9wcm9wZXJ0aWVzLmJsZW5kTW9kZSA9IGJsZW5kTW9kZTsKLSAgICBtX3Byb3BlcnRpZXMu
bm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpCbGVuZE1v
ZGVDaGFuZ2VkKTsKLX0KLSNlbmRpZgotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Zmls
dGVyc0NhbkJlQ29tcG9zaXRlZChjb25zdCBGaWx0ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKQotewot
ICAgIHJldHVybiBQbGF0Zm9ybUNBTGF5ZXJDb2NvYTo6ZmlsdGVyc0NhbkJlQ29tcG9zaXRlZChm
aWx0ZXJzKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldE5hbWUoY29uc3Qg
U3RyaW5nJiB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMubmFtZSA9IHZhbHVlOwotICAgIG1f
cHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rp
b246Ok5hbWVDaGFuZ2VkKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFNw
ZWVkKGZsb2F0IHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5zcGVlZCA9IHZhbHVlOwotICAg
IG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNh
Y3Rpb246OlNwZWVkQ2hhbmdlZCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpz
ZXRUaW1lT2Zmc2V0KENGVGltZUludGVydmFsIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy50
aW1lT2Zmc2V0ID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdl
ZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6VGltZU9mZnNldENoYW5nZWQpOwotfQotCi1m
bG9hdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNvbnRlbnRzU2NhbGUoKSBjb25zdAotewotICAg
IHJldHVybiBtX3Byb3BlcnRpZXMuY29udGVudHNTY2FsZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU6OnNldENvbnRlbnRzU2NhbGUoZmxvYXQgdmFsdWUpCi17Ci0gICAgbV9wcm9w
ZXJ0aWVzLmNvbnRlbnRzU2NhbGUgPSB2YWx1ZTsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3Bl
cnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDb250ZW50c1NjYWxlQ2hh
bmdlZCk7Ci0KLSAgICB1cGRhdGVCYWNraW5nU3RvcmUoKTsKLX0KLQotZmxvYXQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjpjb3JuZXJSYWRpdXMoKSBjb25zdAotewotICAgIHJldHVybiBtX3Byb3Bl
cnRpZXMuY29ybmVyUmFkaXVzOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0
Q29ybmVyUmFkaXVzKGZsb2F0IHZhbHVlKQotewotICAgIGlmIChtX3Byb3BlcnRpZXMuY29ybmVy
UmFkaXVzID09IHZhbHVlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMuY29y
bmVyUmFkaXVzID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdl
ZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q29ybmVyUmFkaXVzQ2hhbmdlZCk7Ci19Ci0K
LXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRFZGdlQW50aWFsaWFzaW5nTWFzayh1bnNp
Z25lZCB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMuZWRnZUFudGlhbGlhc2luZ01hc2sgPSB2
YWx1ZTsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVy
VHJlZVRyYW5zYWN0aW9uOjpFZGdlQW50aWFsaWFzaW5nTWFza0NoYW5nZWQpOwotfQotCi1GbG9h
dFJvdW5kZWRSZWN0IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2hhcGVSb3VuZGVkUmVjdCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5zaGFwZVJvdW5kZWRSZWN0ID8gKm1fcHJv
cGVydGllcy5zaGFwZVJvdW5kZWRSZWN0IDogRmxvYXRSb3VuZGVkUmVjdChGbG9hdFJlY3QoKSk7
Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRTaGFwZVJvdW5kZWRSZWN0KGNv
bnN0IEZsb2F0Um91bmRlZFJlY3QmIHJvdW5kZWRSZWN0KQotewotICAgIGlmIChtX3Byb3BlcnRp
ZXMuc2hhcGVSb3VuZGVkUmVjdCAmJiAqbV9wcm9wZXJ0aWVzLnNoYXBlUm91bmRlZFJlY3QgPT0g
cm91bmRlZFJlY3QpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVydGllcy5zaGFwZVJv
dW5kZWRSZWN0ID0gc3RkOjptYWtlX3VuaXF1ZTxGbG9hdFJvdW5kZWRSZWN0Pihyb3VuZGVkUmVj
dCk7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRy
ZWVUcmFuc2FjdGlvbjo6U2hhcGVSb3VuZGVkUmVjdENoYW5nZWQpOwotfQotCi1QYXRoIFBsYXRm
b3JtQ0FMYXllclJlbW90ZTo6c2hhcGVQYXRoKCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9sYXll
clR5cGUgPT0gTGF5ZXJUeXBlU2hhcGVMYXllcik7Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5z
aGFwZVBhdGg7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRTaGFwZVBhdGgo
Y29uc3QgUGF0aCYgcGF0aCkKLXsKLSAgICBBU1NFUlQobV9sYXllclR5cGUgPT0gTGF5ZXJUeXBl
U2hhcGVMYXllcik7Ci0gICAgbV9wcm9wZXJ0aWVzLnNoYXBlUGF0aCA9IHBhdGg7Ci0gICAgbV9w
cm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlv
bjo6U2hhcGVQYXRoQ2hhbmdlZCk7Ci19Ci0KLVdpbmRSdWxlIFBsYXRmb3JtQ0FMYXllclJlbW90
ZTo6c2hhcGVXaW5kUnVsZSgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fbGF5ZXJUeXBlID09IExh
eWVyVHlwZVNoYXBlTGF5ZXIpOwotICAgIHJldHVybiBtX3Byb3BlcnRpZXMud2luZFJ1bGU7Ci19
Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRTaGFwZVdpbmRSdWxlKFdpbmRSdWxl
IHdpbmRSdWxlKQotewotICAgIEFTU0VSVChtX2xheWVyVHlwZSA9PSBMYXllclR5cGVTaGFwZUxh
eWVyKTsKLSAgICBtX3Byb3BlcnRpZXMud2luZFJ1bGUgPSB3aW5kUnVsZTsKLSAgICBtX3Byb3Bl
cnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpX
aW5kUnVsZUNoYW5nZWQpOwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVxdWly
ZXNDdXN0b21BcHBlYXJhbmNlVXBkYXRlT25Cb3VuZHNDaGFuZ2UoKSBjb25zdAotewotICAgIHJl
dHVybiBtX3Byb3BlcnRpZXMuY3VzdG9tQXBwZWFyYW5jZSA9PSBHcmFwaGljc0xheWVyOjpTY3Jv
bGxpbmdTaGFkb3c7Ci19Ci0KLUdyYXBoaWNzTGF5ZXI6OkN1c3RvbUFwcGVhcmFuY2UgUGxhdGZv
cm1DQUxheWVyUmVtb3RlOjpjdXN0b21BcHBlYXJhbmNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bV9wcm9wZXJ0aWVzLmN1c3RvbUFwcGVhcmFuY2U7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjp1cGRhdGVDdXN0b21BcHBlYXJhbmNlKEdyYXBoaWNzTGF5ZXI6OkN1c3RvbUFwcGVh
cmFuY2UgY3VzdG9tQXBwZWFyYW5jZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMuY3VzdG9tQXBwZWFy
YW5jZSA9IGN1c3RvbUFwcGVhcmFuY2U7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVz
Q2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q3VzdG9tQXBwZWFyYW5jZUNoYW5n
ZWQpOwotfQotCi1SZWY8UGxhdGZvcm1DQUxheWVyPiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNy
ZWF0ZUNvbXBhdGlibGVMYXllcihQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSBsYXllclR5cGUs
IFBsYXRmb3JtQ0FMYXllckNsaWVudCogY2xpZW50KSBjb25zdAotewotICAgIHJldHVybiBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6OmNyZWF0ZShsYXllclR5cGUsIGNsaWVudCwgKm1fY29udGV4dCk7
Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjplbnVtZXJhdGVSZWN0c0JlaW5nRHJh
d24oQ0dDb250ZXh0UmVmIGNvbnRleHQsIHZvaWQgKF5ibG9jaykoQ0dSZWN0KSkKLXsKLSAgICBt
X3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlLT5lbnVtZXJhdGVSZWN0c0JlaW5nRHJhd24oY29udGV4
dCwgYmxvY2spOwotfQotCi11aW50MzJfdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6Omhvc3RpbmdD
b250ZXh0SUQoKQotewotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiAwOwot
fQotCi11bnNpZ25lZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmJhY2tpbmdTdG9yZUJ5dGVzUGVy
UGl4ZWwoKSBjb25zdAotewotICAgIGlmICghbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZSkKLSAg
ICAgICAgcmV0dXJuIDQ7Ci0KLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZS0+
Ynl0ZXNQZXJQaXhlbCgpOwotfQotCi1MYXllclBvb2wmIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
bGF5ZXJQb29sKCkKLXsKLSAgICByZXR1cm4gbV9jb250ZXh0LT5sYXllclBvb2woKTsKLX0KLQot
fSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nl
c3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlLmggYi9Tb3VyY2UvV2ViS2l0L1dl
YlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlLmgKZGVsZXRlZCBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IGE5NjM1ZWY5MWYzMTljNzI3ZGVjYzIyY2IxYTg4ZmMwNzY4MDA4
MGQuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNl
L1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5oCisr
KyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAot
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIlJlbW90ZUxheWVy
VHJlZVRyYW5zYWN0aW9uLmgiCi0jaW5jbHVkZSA8V2ViQ29yZS9QbGF0Zm9ybUNBTGF5ZXIuaD4K
LSNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtTGF5ZXIuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUg
ewotY2xhc3MgTGF5ZXJQb29sOwotfQotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotY2xhc3MgUmVt
b3RlTGF5ZXJUcmVlQ29udGV4dDsKLQotY2xhc3MgUGxhdGZvcm1DQUxheWVyUmVtb3RlIDogcHVi
bGljIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllciB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU+IGNyZWF0ZShXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6Okxh
eWVyVHlwZSwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiwgUmVtb3RlTGF5ZXJUcmVl
Q29udGV4dCYpOwotICAgIHN0YXRpYyBSZWY8UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBjcmVhdGUo
UGxhdGZvcm1MYXllciAqLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqLCBSZW1vdGVM
YXllclRyZWVDb250ZXh0Jik7Ci0gICAgc3RhdGljIFJlZjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+
IGNyZWF0ZShjb25zdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmLCBXZWJDb3JlOjpQbGF0Zm9ybUNB
TGF5ZXJDbGllbnQqLCBSZW1vdGVMYXllclRyZWVDb250ZXh0Jik7Ci0KLSAgICB2aXJ0dWFsIH5Q
bGF0Zm9ybUNBTGF5ZXJSZW1vdGUoKTsKLQotICAgIFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5
ZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9Ci0KLSAgICB2b2lkIHJlY3Vy
c2l2ZUJ1aWxkVHJhbnNhY3Rpb24oUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYsIFJlbW90ZUxheWVy
VHJlZVRyYW5zYWN0aW9uJik7Ci0KLSAgICB2b2lkIHNldE5lZWRzRGlzcGxheUluUmVjdChjb25z
dCBXZWJDb3JlOjpGbG9hdFJlY3QmIGRpcnR5UmVjdCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRO
ZWVkc0Rpc3BsYXkoKSBvdmVycmlkZTsKLQotICAgIHZvaWQgY29weUNvbnRlbnRzRnJvbUxheWVy
KFBsYXRmb3JtQ0FMYXllciopIG92ZXJyaWRlOwotCi0gICAgV2ViQ29yZTo6UGxhdGZvcm1DQUxh
eWVyKiBzdXBlcmxheWVyKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCByZW1vdmVGcm9tU3Vw
ZXJsYXllcigpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0U3VibGF5ZXJzKGNvbnN0IFdlYkNvcmU6
OlBsYXRmb3JtQ0FMYXllckxpc3QmKSBvdmVycmlkZTsKLSAgICB2b2lkIHJlbW92ZUFsbFN1Ymxh
eWVycygpIG92ZXJyaWRlOwotICAgIHZvaWQgYXBwZW5kU3VibGF5ZXIoV2ViQ29yZTo6UGxhdGZv
cm1DQUxheWVyJikgb3ZlcnJpZGU7Ci0gICAgdm9pZCBpbnNlcnRTdWJsYXllcihXZWJDb3JlOjpQ
bGF0Zm9ybUNBTGF5ZXImLCBzaXplX3QgaW5kZXgpIG92ZXJyaWRlOwotICAgIHZvaWQgcmVwbGFj
ZVN1YmxheWVyKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllciYgcmVmZXJlbmNlLCBXZWJDb3JlOjpQ
bGF0Zm9ybUNBTGF5ZXImKSBvdmVycmlkZTsKLSAgICBjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNB
TGF5ZXJMaXN0KiBjdXN0b21TdWJsYXllcnMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBudWxs
cHRyOyB9Ci0gICAgdm9pZCBhZG9wdFN1YmxheWVycyhXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXIm
IHNvdXJjZSkgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGFkZEFuaW1hdGlvbkZvcktleShjb25zdCBT
dHJpbmcmIGtleSwgV2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbiYpIG92ZXJyaWRlOwotICAg
IHZvaWQgcmVtb3ZlQW5pbWF0aW9uRm9yS2V5KGNvbnN0IFN0cmluZyYga2V5KSBvdmVycmlkZTsK
LSAgICBSZWZQdHI8V2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbj4gYW5pbWF0aW9uRm9yS2V5
KGNvbnN0IFN0cmluZyYga2V5KSBvdmVycmlkZTsKLSAgICB2b2lkIGFuaW1hdGlvblN0YXJ0ZWQo
Y29uc3QgU3RyaW5nJiBrZXksIENGVGltZUludGVydmFsIGJlZ2luVGltZSkgb3ZlcnJpZGU7Ci0g
ICAgdm9pZCBhbmltYXRpb25FbmRlZChjb25zdCBTdHJpbmcmIGtleSkgb3ZlcnJpZGU7Ci0KLSAg
ICB2b2lkIHNldE1hc2soV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyKikgb3ZlcnJpZGU7Ci0KLSAg
ICBib29sIGlzT3BhcXVlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRPcGFxdWUoYm9v
bCkgb3ZlcnJpZGU7Ci0KLSAgICBXZWJDb3JlOjpGbG9hdFJlY3QgYm91bmRzKCkgY29uc3Qgb3Zl
cnJpZGU7Ci0gICAgdm9pZCBzZXRCb3VuZHMoY29uc3QgV2ViQ29yZTo6RmxvYXRSZWN0Jikgb3Zl
cnJpZGU7Ci0KLSAgICBXZWJDb3JlOjpGbG9hdFBvaW50M0QgcG9zaXRpb24oKSBjb25zdCBvdmVy
cmlkZTsKLSAgICB2b2lkIHNldFBvc2l0aW9uKGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQzRCYp
IG92ZXJyaWRlOwotCi0gICAgV2ViQ29yZTo6RmxvYXRQb2ludDNEIGFuY2hvclBvaW50KCkgY29u
c3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRBbmNob3JQb2ludChjb25zdCBXZWJDb3JlOjpGbG9h
dFBvaW50M0QmKSBvdmVycmlkZTsKLQotICAgIFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4
IHRyYW5zZm9ybSgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0VHJhbnNmb3JtKGNvbnN0
IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4Jikgb3ZlcnJpZGU7Ci0KLSAgICBXZWJDb3Jl
OjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCBzdWJsYXllclRyYW5zZm9ybSgpIGNvbnN0IG92ZXJyaWRl
OwotICAgIHZvaWQgc2V0U3VibGF5ZXJUcmFuc2Zvcm0oY29uc3QgV2ViQ29yZTo6VHJhbnNmb3Jt
YXRpb25NYXRyaXgmKSBvdmVycmlkZTsKLQotICAgIGJvb2wgaXNIaWRkZW4oKSBjb25zdCBvdmVy
cmlkZTsKLSAgICB2b2lkIHNldEhpZGRlbihib29sKSBvdmVycmlkZTsKLQotICAgIGJvb2wgY29u
dGVudHNIaWRkZW4oKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldENvbnRlbnRzSGlkZGVu
KGJvb2wpIG92ZXJyaWRlOwotCi0gICAgYm9vbCB1c2VySW50ZXJhY3Rpb25FbmFibGVkKCkgY29u
c3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRVc2VySW50ZXJhY3Rpb25FbmFibGVkKGJvb2wpIG92
ZXJyaWRlOwotCi0gICAgdm9pZCBzZXRCYWNraW5nU3RvcmVBdHRhY2hlZChib29sKSBvdmVycmlk
ZTsKLSAgICBib29sIGJhY2tpbmdTdG9yZUF0dGFjaGVkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAg
ICBib29sIGdlb21ldHJ5RmxpcHBlZCgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0R2Vv
bWV0cnlGbGlwcGVkKGJvb2wpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBpc0RvdWJsZVNpZGVkKCkg
Y29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXREb3VibGVTaWRlZChib29sKSBvdmVycmlkZTsK
LQotICAgIGJvb2wgbWFza3NUb0JvdW5kcygpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0
TWFza3NUb0JvdW5kcyhib29sKSBvdmVycmlkZTsKLQotICAgIGJvb2wgYWNjZWxlcmF0ZXNEcmF3
aW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRBY2NlbGVyYXRlc0RyYXdpbmcoYm9v
bCkgb3ZlcnJpZGU7Ci0KLSAgICBib29sIHdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKCkgY29u
c3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRXYW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZShib29s
KSBvdmVycmlkZTsKLQotICAgIGJvb2wgc3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dCgp
IGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0U3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2Vk
VGV4dChib29sKSBvdmVycmlkZTsKLQotICAgIENGVHlwZVJlZiBjb250ZW50cygpIGNvbnN0IG92
ZXJyaWRlOwotICAgIHZvaWQgc2V0Q29udGVudHMoQ0ZUeXBlUmVmKSBvdmVycmlkZTsKLQotICAg
IHZvaWQgc2V0Q29udGVudHNSZWN0KGNvbnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYpIG92ZXJyaWRl
OwotCi0gICAgdm9pZCBzZXRNaW5pZmljYXRpb25GaWx0ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxh
eWVyOjpGaWx0ZXJUeXBlKSBvdmVycmlkZTsKLSAgICB2b2lkIHNldE1hZ25pZmljYXRpb25GaWx0
ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyOjpGaWx0ZXJUeXBlKSBvdmVycmlkZTsKLQotICAg
IFdlYkNvcmU6OkNvbG9yIGJhY2tncm91bmRDb2xvcigpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZv
aWQgc2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IFdlYkNvcmU6OkNvbG9yJikgb3ZlcnJpZGU7Ci0K
LSAgICB2b2lkIHNldEJvcmRlcldpZHRoKGZsb2F0KSBvdmVycmlkZTsKLSAgICB2b2lkIHNldEJv
cmRlckNvbG9yKGNvbnN0IFdlYkNvcmU6OkNvbG9yJikgb3ZlcnJpZGU7Ci0KLSAgICBmbG9hdCBv
cGFjaXR5KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRPcGFjaXR5KGZsb2F0KSBvdmVy
cmlkZTsKLQotICAgIHZvaWQgc2V0RmlsdGVycyhjb25zdCBXZWJDb3JlOjpGaWx0ZXJPcGVyYXRp
b25zJikgb3ZlcnJpZGU7Ci0gICAgc3RhdGljIGJvb2wgZmlsdGVyc0NhbkJlQ29tcG9zaXRlZChj
b25zdCBXZWJDb3JlOjpGaWx0ZXJPcGVyYXRpb25zJik7Ci0gICAgdm9pZCBjb3B5RmlsdGVyc0Zy
b20oY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyJikgb3ZlcnJpZGU7Ci0KLSNpZiBFTkFC
TEUoQ1NTX0NPTVBPU0lUSU5HKQotICAgIHZvaWQgc2V0QmxlbmRNb2RlKFdlYkNvcmU6OkJsZW5k
TW9kZSkgb3ZlcnJpZGU7Ci0jZW5kaWYKLQotICAgIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcm
KSBvdmVycmlkZTsKLQotICAgIHZvaWQgc2V0U3BlZWQoZmxvYXQpIG92ZXJyaWRlOwotCi0gICAg
dm9pZCBzZXRUaW1lT2Zmc2V0KENGVGltZUludGVydmFsKSBvdmVycmlkZTsKLQotICAgIGZsb2F0
IGNvbnRlbnRzU2NhbGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldENvbnRlbnRzU2Nh
bGUoZmxvYXQpIG92ZXJyaWRlOwotCi0gICAgZmxvYXQgY29ybmVyUmFkaXVzKCkgY29uc3Qgb3Zl
cnJpZGU7Ci0gICAgdm9pZCBzZXRDb3JuZXJSYWRpdXMoZmxvYXQpIG92ZXJyaWRlOwotCi0gICAg
dm9pZCBzZXRFZGdlQW50aWFsaWFzaW5nTWFzayh1bnNpZ25lZCkgb3ZlcnJpZGU7Ci0KLSAgICAv
LyBGSVhNRTogSGF2aW5nIGJvdGggc2hhcGVSb3VuZGVkUmVjdCBhbmQgc2hhcGVQYXRoIGlzIHJl
ZHVuZGFudC4gV2UgY291bGQgdXNlIHNoYXBlUGF0aCBmb3IgZXZlcnl0aGluZy4KLSAgICBXZWJD
b3JlOjpGbG9hdFJvdW5kZWRSZWN0IHNoYXBlUm91bmRlZFJlY3QoKSBjb25zdCBvdmVycmlkZTsK
LSAgICB2b2lkIHNldFNoYXBlUm91bmRlZFJlY3QoY29uc3QgV2ViQ29yZTo6RmxvYXRSb3VuZGVk
UmVjdCYpIG92ZXJyaWRlOwotCi0gICAgV2ViQ29yZTo6UGF0aCBzaGFwZVBhdGgoKSBjb25zdCBv
dmVycmlkZTsKLSAgICB2b2lkIHNldFNoYXBlUGF0aChjb25zdCBXZWJDb3JlOjpQYXRoJikgb3Zl
cnJpZGU7Ci0KLSAgICBXZWJDb3JlOjpXaW5kUnVsZSBzaGFwZVdpbmRSdWxlKCkgY29uc3Qgb3Zl
cnJpZGU7Ci0gICAgdm9pZCBzZXRTaGFwZVdpbmRSdWxlKFdlYkNvcmU6OldpbmRSdWxlKSBvdmVy
cmlkZTsKLQotICAgIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OkN1c3RvbUFwcGVhcmFuY2UgY3Vz
dG9tQXBwZWFyYW5jZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgdXBkYXRlQ3VzdG9tQXBw
ZWFyYW5jZShXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpDdXN0b21BcHBlYXJhbmNlKSBvdmVycmlk
ZTsKLQotICAgIFdlYkNvcmU6OlRpbGVkQmFja2luZyogdGlsZWRCYWNraW5nKCkgb3ZlcnJpZGUg
eyByZXR1cm4gbnVsbHB0cjsgfQotCi0gICAgUmVmPFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcj4g
Y2xvbmUoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikgY29uc3Qgb3ZlcnJp
ZGU7Ci0KLSAgICBSZWY8UGxhdGZvcm1DQUxheWVyPiBjcmVhdGVDb21wYXRpYmxlTGF5ZXIoV2Vi
Q29yZTo6UGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGUsIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXll
ckNsaWVudCopIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgdm9pZCBlbnVtZXJhdGVSZWN0c0JlaW5n
RHJhd24oQ0dDb250ZXh0UmVmLCB2b2lkICheYmxvY2spKENHUmVjdCkpIG92ZXJyaWRlOwotCi0g
ICAgdmlydHVhbCB1aW50MzJfdCBob3N0aW5nQ29udGV4dElEKCk7Ci0KLSAgICB1bnNpZ25lZCBi
YWNraW5nU3RvcmVCeXRlc1BlclBpeGVsKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNl
dENsb25lZExheWVyKGNvbnN0IFBsYXRmb3JtQ0FMYXllciopOwotCi0gICAgUmVtb3RlTGF5ZXJU
cmVlVHJhbnNhY3Rpb246OkxheWVyUHJvcGVydGllcyYgcHJvcGVydGllcygpIHsgcmV0dXJuIG1f
cHJvcGVydGllczsgfQotICAgIGNvbnN0IFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpMYXll
clByb3BlcnRpZXMmIHByb3BlcnRpZXMoKSBjb25zdCB7IHJldHVybiBtX3Byb3BlcnRpZXM7IH0K
LQotICAgIHZvaWQgZGlkQ29tbWl0KCk7Ci0KLSAgICB2b2lkIGNsZWFyQ29udGV4dCgpIHsgbV9j
b250ZXh0ID0gbnVsbHB0cjsgfQotICAgIFJlbW90ZUxheWVyVHJlZUNvbnRleHQqIGNvbnRleHQo
KSBjb25zdCB7IHJldHVybiBtX2NvbnRleHQ7IH0KLQotcHJvdGVjdGVkOgotICAgIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZShXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSwgV2ViQ29y
ZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYg
Y29udGV4dCk7Ci0gICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlKGNvbnN0IFBsYXRmb3JtQ0FMYXll
clJlbW90ZSYsIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckNsaWVudCosIFJlbW90ZUxheWVyVHJl
ZUNvbnRleHQmKTsKLQotICAgIHZvaWQgdXBkYXRlQ2xvbmVkTGF5ZXJQcm9wZXJ0aWVzKFBsYXRm
b3JtQ0FMYXllclJlbW90ZSYgY2xvbmUsIGJvb2wgY29weUNvbnRlbnRzID0gdHJ1ZSkgY29uc3Q7
Ci0KLXByaXZhdGU6Ci0gICAgYm9vbCBpc1BsYXRmb3JtQ0FMYXllclJlbW90ZSgpIGNvbnN0IG92
ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLSAgICB2b2lkIGVuc3VyZUJhY2tpbmdTdG9yZSgpOwot
ICAgIHZvaWQgdXBkYXRlQmFja2luZ1N0b3JlKCk7Ci0gICAgdm9pZCByZW1vdmVTdWJsYXllcihQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGUqKTsKLQotICAgIGJvb2wgcmVxdWlyZXNDdXN0b21BcHBlYXJh
bmNlVXBkYXRlT25Cb3VuZHNDaGFuZ2UoKSBjb25zdDsKLQotICAgIFdlYkNvcmU6OkxheWVyUG9v
bCYgbGF5ZXJQb29sKCkgb3ZlcnJpZGU7Ci0KLSAgICBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlv
bjo6TGF5ZXJQcm9wZXJ0aWVzIG1fcHJvcGVydGllczsKLSAgICBXZWJDb3JlOjpQbGF0Zm9ybUNB
TGF5ZXJMaXN0IG1fY2hpbGRyZW47Ci0gICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlKiBtX3N1cGVy
bGF5ZXIgeyBudWxscHRyIH07Ci0gICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlKiBtX21hc2tMYXll
ciB7IG51bGxwdHIgfTsKLSAgICBIYXNoTWFwPFN0cmluZywgUmVmUHRyPFdlYkNvcmU6OlBsYXRm
b3JtQ0FBbmltYXRpb24+PiBtX2FuaW1hdGlvbnM7Ci0KLSAgICBib29sIG1fYWNjZWxlcmF0ZXNE
cmF3aW5nIHsgZmFsc2UgfTsKLSAgICBib29sIG1fd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUg
eyBmYWxzZSB9OwotCi0gICAgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCogbV9jb250ZXh0OwotfTsK
LQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfUExBVEZP
Uk1fQ0FMQVlFUihXZWJLaXQ6OlBsYXRmb3JtQ0FMYXllclJlbW90ZSwgaXNQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGUoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdl
L21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20uaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20uaApkZWxldGVkIGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkNjRjZjBjZmI0MDFmMGI3Y2UzZjE2YjRjMGFiNGQwOGQy
NjY0MS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3Vy
Y2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3Vz
dG9tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
LSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGUuaCIKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIExheWVy
SG9zdGluZ0NvbnRleHQ7Ci0KLS8vIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbSBpcyB1c2Vk
IGZvciBDQUxheWVycyB0aGF0IGxpdmUgaW4gdGhlIHdlYiBwcm9jZXNzIGFuZCBhcmUgaG9zdGVk
IGludG8gdGhlIFVJIHByb2Nlc3MgdmlhIHJlbW90ZSBjb250ZXh0LgotY2xhc3MgUGxhdGZvcm1D
QUxheWVyUmVtb3RlQ3VzdG9tIGZpbmFsIDogcHVibGljIFBsYXRmb3JtQ0FMYXllclJlbW90ZSB7
Ci0gICAgZnJpZW5kIGNsYXNzIFBsYXRmb3JtQ0FMYXllclJlbW90ZTsKLXB1YmxpYzoKLSAgICBz
dGF0aWMgUmVmPFBsYXRmb3JtQ0FMYXllclJlbW90ZT4gY3JlYXRlKFBsYXRmb3JtTGF5ZXIgKiwg
V2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYp
OwotCi0gICAgdmlydHVhbCB+UGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKCk7Ci0KLSAgICBQ
bGF0Zm9ybUxheWVyKiBwbGF0Zm9ybUxheWVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbV9w
bGF0Zm9ybUxheWVyLmdldCgpOyB9Ci0KLSAgICB1aW50MzJfdCBob3N0aW5nQ29udGV4dElEKCkg
b3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBXZWJDb3Jl
OjpGbG9hdFJlY3QmIGRpcnR5UmVjdCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXROZWVkc0Rpc3Bs
YXkoKSBvdmVycmlkZTsKLQotcHJpdmF0ZToKLSAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0
b20oV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGUsIFBsYXRmb3JtTGF5ZXIgKiwg
V2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3RlTGF5ZXJUcmVlQ29u
dGV4dCYpOwotCi0gICAgUmVmPFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcj4gY2xvbmUoV2ViQ29y
ZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICBi
b29sIGlzUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1
cm4gdHJ1ZTsgfQotCi0gICAgQ0ZUeXBlUmVmIGNvbnRlbnRzKCkgY29uc3Qgb3ZlcnJpZGU7Ci0g
ICAgdm9pZCBzZXRDb250ZW50cyhDRlR5cGVSZWYpIG92ZXJyaWRlOwotCi0gICAgc3RkOjp1bmlx
dWVfcHRyPExheWVySG9zdGluZ0NvbnRleHQ+IG1fbGF5ZXJIb3N0aW5nQ29udGV4dDsKLSAgICBS
ZXRhaW5QdHI8UGxhdGZvcm1MYXllcj4gbV9wbGF0Zm9ybUxheWVyOwotICAgIGJvb2wgbV9wcm92
aWRlc0NvbnRlbnRzOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0KLVNQRUNJQUxJWkVf
VFlQRV9UUkFJVFNfUExBVEZPUk1fQ0FMQVlFUihXZWJLaXQ6OlBsYXRmb3JtQ0FMYXllclJlbW90
ZUN1c3RvbSwgaXNQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20u
bW0gYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVy
UmVtb3RlQ3VzdG9tLm1tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjliOWIzMTVh
YzgzZGI2ZDc4OGM4ZjEzNjMyMmU4Njc3NjJjNjAwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21h
Yy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20ubW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNjQg
KzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0g
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
LSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0g
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNp
bmNsdWRlICJjb25maWcuaCIKLSNpbXBvcnQgIlBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5o
IgotCi0jaW1wb3J0ICJMYXllckhvc3RpbmdDb250ZXh0LmgiCi0jaW1wb3J0ICJSZW1vdGVMYXll
clRyZWVDb250ZXh0LmgiCi0jaW1wb3J0ICJSZW1vdGVMYXllclRyZWVQcm9wZXJ0eUFwcGxpZXIu
aCIKLSNpbXBvcnQgIldlYlByb2Nlc3MuaCIKLSNpbXBvcnQgPEFWRm91bmRhdGlvbi9BVkZvdW5k
YXRpb24uaD4KLSNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NMYXllckNBLmg+Ci0jaW1wb3J0IDxX
ZWJDb3JlL1BsYXRmb3JtQ0FMYXllckNvY29hLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL1dlYkNvcmVD
QUxheWVyRXh0cmFzLmg+Ci0jaW1wb3J0IDx3dGYvUmV0YWluUHRyLmg+Ci0jaW1wb3J0IDx3dGYv
U29mdExpbmtpbmcuaD4KLQotU09GVF9MSU5LX0ZSQU1FV09SS19PUFRJT05BTChBVkZvdW5kYXRp
b24pCi1TT0ZUX0xJTktfQ0xBU1NfT1BUSU9OQUwoQVZGb3VuZGF0aW9uLCBBVlBsYXllckxheWVy
KQotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLXN0
YXRpYyBOU1N0cmluZyAqIGNvbnN0IHBsYXRmb3JtQ0FMYXllclBvaW50ZXIgPSBAIldLUGxhdGZv
cm1DQUxheWVyIjsKLQotUmVmPFBsYXRmb3JtQ0FMYXllclJlbW90ZT4gUGxhdGZvcm1DQUxheWVy
UmVtb3RlQ3VzdG9tOjpjcmVhdGUoUGxhdGZvcm1MYXllciAqcGxhdGZvcm1MYXllciwgUGxhdGZv
cm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCkK
LXsKLSAgICBhdXRvIGxheWVyID0gYWRvcHRSZWYoKm5ldyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVD
dXN0b20oUGxhdGZvcm1DQUxheWVyQ29jb2E6OmxheWVyVHlwZUZvclBsYXRmb3JtTGF5ZXIocGxh
dGZvcm1MYXllciksIHBsYXRmb3JtTGF5ZXIsIG93bmVyLCBjb250ZXh0KSk7Ci0gICAgY29udGV4
dC5sYXllcldhc0NyZWF0ZWQobGF5ZXIuZ2V0KCksIGxheWVyLT5sYXllclR5cGUoKSk7Ci0gICAg
cmV0dXJuIFdURk1vdmUobGF5ZXIpOwotfQotCi1QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b206
OlBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbShMYXllclR5cGUgbGF5ZXJUeXBlLCBQbGF0Zm9y
bUxheWVyICogY3VzdG9tTGF5ZXIsIFBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIsIFJlbW90
ZUxheWVyVHJlZUNvbnRleHQmIGNvbnRleHQpCi0gICAgOiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUo
bGF5ZXJUeXBlLCBvd25lciwgY29udGV4dCkKLXsKLSAgICBzd2l0Y2ggKGNvbnRleHQubGF5ZXJI
b3N0aW5nTW9kZSgpKSB7Ci0gICAgY2FzZSBMYXllckhvc3RpbmdNb2RlOjpJblByb2Nlc3M6Ci0g
ICAgICAgIG1fbGF5ZXJIb3N0aW5nQ29udGV4dCA9IExheWVySG9zdGluZ0NvbnRleHQ6OmNyZWF0
ZUZvclBvcnQoV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkuY29tcG9zaXRpbmdSZW5kZXJTZXJ2ZXJQ
b3J0KCkpOwotICAgICAgICBicmVhazsKLSNpZiBIQVZFKE9VVF9PRl9QUk9DRVNTX0xBWUVSX0hP
U1RJTkcpCi0gICAgY2FzZSBMYXllckhvc3RpbmdNb2RlOjpPdXRPZlByb2Nlc3M6Ci0gICAgICAg
IG1fbGF5ZXJIb3N0aW5nQ29udGV4dCA9IExheWVySG9zdGluZ0NvbnRleHQ6OmNyZWF0ZUZvckV4
dGVybmFsSG9zdGluZ1Byb2Nlc3MoKTsKLSNpZiBQTEFURk9STShJT1MpCi0gICAgICAgIGlmIChs
YXllclR5cGUgPT0gTGF5ZXJUeXBlQVZQbGF5ZXJMYXllcikgewotICAgICAgICAgICAgZmxvYXQg
c2NhbGVGYWN0b3IgPSBjb250ZXh0LmRldmljZVNjYWxlRmFjdG9yKCk7Ci0gICAgICAgICAgICAv
LyBTZXQgYSBzY2FsZSBmYWN0b3IgaGVyZSB0byBtYWtlIGNvbnZlcnRSZWN0OnRvTGF5ZXI6bmls
IHRha2Ugc2NhbGUgZmFjdG9yIGludG8gYWNjb3VudC4gPHJkYXI6Ly9wcm9ibGVtLzE4MzE2NTQy
Pi4KLSAgICAgICAgICAgIC8vIFRoaXMgc2NhbGUgZmFjdG9yIGlzIGludmVydGVkIGluIHRoZSBo
b3N0aW5nIHByb2Nlc3MuCi0gICAgICAgICAgICBbY3VzdG9tTGF5ZXIgc2V0VHJhbnNmb3JtOkNB
VHJhbnNmb3JtM0RNYWtlU2NhbGUoc2NhbGVGYWN0b3IsIHNjYWxlRmFjdG9yLCAxKV07Ci0gICAg
ICAgIH0KLSNlbmRpZgotICAgICAgICBicmVhazsKLSNlbmRpZgotICAgIH0KLQotICAgIG1fbGF5
ZXJIb3N0aW5nQ29udGV4dC0+c2V0Um9vdExheWVyKGN1c3RvbUxheWVyKTsKLSAgICBbY3VzdG9t
TGF5ZXIgc2V0VmFsdWU6W05TVmFsdWUgdmFsdWVXaXRoUG9pbnRlcjp0aGlzXSBmb3JLZXk6cGxh
dGZvcm1DQUxheWVyUG9pbnRlcl07Ci0KLSAgICBtX3BsYXRmb3JtTGF5ZXIgPSBjdXN0b21MYXll
cjsKLSAgICBbY3VzdG9tTGF5ZXIgd2ViX2Rpc2FibGVBbGxBY3Rpb25zXTsKLQotICAgIG1fcHJv
dmlkZXNDb250ZW50cyA9IGxheWVyVHlwZSA9PSBMYXllclR5cGVDb250ZW50c1Byb3ZpZGVkTGF5
ZXI7Ci0KLSAgICBwcm9wZXJ0aWVzKCkucG9zaXRpb24gPSBGbG9hdFBvaW50M0QoY3VzdG9tTGF5
ZXIucG9zaXRpb24ueCwgY3VzdG9tTGF5ZXIucG9zaXRpb24ueSwgY3VzdG9tTGF5ZXIuelBvc2l0
aW9uKTsKLSAgICBwcm9wZXJ0aWVzKCkuYW5jaG9yUG9pbnQgPSBGbG9hdFBvaW50M0QoY3VzdG9t
TGF5ZXIuYW5jaG9yUG9pbnQueCwgY3VzdG9tTGF5ZXIuYW5jaG9yUG9pbnQueSwgY3VzdG9tTGF5
ZXIuYW5jaG9yUG9pbnRaKTsKLSAgICBwcm9wZXJ0aWVzKCkuYm91bmRzID0gY3VzdG9tTGF5ZXIu
Ym91bmRzOwotICAgIHByb3BlcnRpZXMoKS5jb250ZW50c1JlY3QgPSBjdXN0b21MYXllci5jb250
ZW50c1JlY3Q7Ci19Ci0KLVBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6flBsYXRmb3JtQ0FM
YXllclJlbW90ZUN1c3RvbSgpCi17Ci0gICAgW21fcGxhdGZvcm1MYXllciBzZXRWYWx1ZTpuaWwg
Zm9yS2V5OnBsYXRmb3JtQ0FMYXllclBvaW50ZXJdOwotfQotCi11aW50MzJfdCBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGVDdXN0b206Omhvc3RpbmdDb250ZXh0SUQoKQotewotICAgIHJldHVybiBtX2xh
eWVySG9zdGluZ0NvbnRleHQtPmNvbnRleHRJRCgpOwotfQotCi1SZWY8V2ViQ29yZTo6UGxhdGZv
cm1DQUxheWVyPiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b206OmNsb25lKFBsYXRmb3JtQ0FM
YXllckNsaWVudCogb3duZXIpIGNvbnN0Ci17Ci0gICAgUmV0YWluUHRyPENBTGF5ZXIgKj4gY2xv
bmVkTGF5ZXI7Ci0gICAgYm9vbCBjb3B5Q29udGVudHMgPSB0cnVlOwotCi0gICAgaWYgKGxheWVy
VHlwZSgpID09IExheWVyVHlwZUFWUGxheWVyTGF5ZXIpIHsKLSAgICAgICAgCi0gICAgICAgIGlm
IChbcGxhdGZvcm1MYXllcigpIGlzS2luZE9mQ2xhc3M6Z2V0QVZQbGF5ZXJMYXllckNsYXNzKCld
KSB7Ci0gICAgICAgICAgICBjbG9uZWRMYXllciA9IGFkb3B0TlMoW2FsbG9jQVZQbGF5ZXJMYXll
ckluc3RhbmNlKCkgaW5pdF0pOwotCi0gICAgICAgICAgICBBVlBsYXllckxheWVyKiBkZXN0aW5h
dGlvblBsYXllckxheWVyID0gc3RhdGljX2Nhc3Q8QVZQbGF5ZXJMYXllciAqPihjbG9uZWRMYXll
ci5nZXQoKSk7Ci0gICAgICAgICAgICBBVlBsYXllckxheWVyKiBzb3VyY2VQbGF5ZXJMYXllciA9
IHN0YXRpY19jYXN0PEFWUGxheWVyTGF5ZXIgKj4ocGxhdGZvcm1MYXllcigpKTsKLSAgICAgICAg
ICAgIGRpc3BhdGNoX2FzeW5jKGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIF57Ci0gICAgICAg
ICAgICAgICAgW2Rlc3RpbmF0aW9uUGxheWVyTGF5ZXIgc2V0UGxheWVyOltzb3VyY2VQbGF5ZXJM
YXllciBwbGF5ZXJdXTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgLy8gT24gaU9TLCB0aGUgQVZQbGF5ZXJMYXllciBpcyBpbnNpZGUgYSBXZWJWaWRlb0Nv
bnRhaW5lckxheWVyLiBUaGlzIGNvZGUgbmVlZHMgdG8gc2hhcmUgbG9naWMgd2l0aCBNZWRpYVBs
YXllclByaXZhdGVBVkZvdW5kYXRpb25PYmpDOjpjcmVhdGVBVlBsYXllckxheWVyKCkuCi0gICAg
ICAgICAgICBjbG9uZWRMYXllciA9IGFkb3B0TlMoW1tDQUxheWVyIGFsbG9jXSBpbml0XSk7Ci0g
ICAgICAgIH0KLQotICAgICAgICBjb3B5Q29udGVudHMgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYg
KGxheWVyVHlwZSgpID09IExheWVyVHlwZUNvbnRlbnRzUHJvdmlkZWRMYXllcikgewotICAgICAg
ICBjbG9uZWRMYXllciA9IGFkb3B0TlMoW1tDQUxheWVyIGFsbG9jXSBpbml0XSk7Ci0gICAgICAg
IC8vIEZJWE1FOiBjdXJyZW50bHkgY29weWluZyBXZWJHTCBjb250ZW50cyBicmVha3MgdGhlIG9y
aWdpbmFsIGxheWVyLgotICAgICAgICBjb3B5Q29udGVudHMgPSBmYWxzZTsKLSAgICB9Ci0KLSAg
ICBhdXRvIGNsb25lID0gYWRvcHRSZWYoKm5ldyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20o
bGF5ZXJUeXBlKCksIGNsb25lZExheWVyLmdldCgpLCBvd25lciwgKmNvbnRleHQoKSkpOwotICAg
IGNvbnRleHQoKS0+bGF5ZXJXYXNDcmVhdGVkKGNsb25lLmdldCgpLCBjbG9uZS0+bGF5ZXJUeXBl
KCkpOwotCi0gICAgdXBkYXRlQ2xvbmVkTGF5ZXJQcm9wZXJ0aWVzKGNsb25lLmdldCgpLCBjb3B5
Q29udGVudHMpOwotCi0gICAgY2xvbmUtPnNldENsb25lZExheWVyKHRoaXMpOwotICAgIHJldHVy
biBXVEZNb3ZlKGNsb25lKTsKLX0KLQotQ0ZUeXBlUmVmIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1
c3RvbTo6Y29udGVudHMoKSBjb25zdAotewotICAgIHJldHVybiBbbV9wbGF0Zm9ybUxheWVyIGNv
bnRlbnRzXTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b206OnNldENvbnRl
bnRzKENGVHlwZVJlZiBjb250ZW50cykKLXsKLSAgICBbbV9wbGF0Zm9ybUxheWVyIHNldENvbnRl
bnRzOihpZCljb250ZW50c107Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9t
OjpzZXROZWVkc0Rpc3BsYXlJblJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQotewotICAgIGlm
IChtX3Byb3ZpZGVzQ29udGVudHMpCi0gICAgICAgIFttX3BsYXRmb3JtTGF5ZXIgc2V0TmVlZHNE
aXNwbGF5SW5SZWN0OnJlY3RdOwotICAgIGVsc2UKLSAgICAgICAgUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjpzZXROZWVkc0Rpc3BsYXlJblJlY3QocmVjdCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlQ3VzdG9tOjpzZXROZWVkc0Rpc3BsYXkoKQotewotICAgIGlmIChtX3Byb3ZpZGVz
Q29udGVudHMpCi0gICAgICAgIFttX3BsYXRmb3JtTGF5ZXIgc2V0TmVlZHNEaXNwbGF5XTsKLSAg
ICBlbHNlCi0gICAgICAgIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TmVlZHNEaXNwbGF5KCk7
Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9X
ZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5j
cHAgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVy
UmVtb3RlVGlsZWRCYWNraW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVj
MzBjMmQyMTZlN2E0OWIyYzJmZjEzZWU2OWYwOWVhNzg1YTI4MS4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2Vi
UGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nLmNwcAorKysgL2Rldi9u
dWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0g
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVy
UmVtb3RlVGlsZWRCYWNraW5nLmgiCi0KLSNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZUNvbnRleHQu
aCIKLSNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NMYXllckNBLmg+Ci0jaW1wb3J0IDxXZWJDb3Jl
L1BsYXRmb3JtQ0FMYXllckNvY29hLmg+Ci0jaW1wb3J0IDx3dGYvUmV0YWluUHRyLmg+Ci0KLXVz
aW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotUGxhdGZvcm1D
QUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tp
bmcoTGF5ZXJUeXBlIGxheWVyVHlwZSwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVt
b3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCkKLSAgICA6IFBsYXRmb3JtQ0FMYXllclJlbW90
ZShsYXllclR5cGUsIG93bmVyLCBjb250ZXh0KQotICAgICwgbV90aWxlQ29udHJvbGxlcihzdGQ6
Om1ha2VfdW5pcXVlPFRpbGVDb250cm9sbGVyPih0aGlzKSkKLXsKLX0KLQotUGxhdGZvcm1DQUxh
eWVyUmVtb3RlVGlsZWRCYWNraW5nOjp+UGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5n
KCkKLXsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldE5l
ZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmIGRpcnR5UmVjdCkKLXsKLSAgICBtX3Rp
bGVDb250cm9sbGVyLT5zZXROZWVkc0Rpc3BsYXlJblJlY3QoZW5jbG9zaW5nSW50UmVjdChkaXJ0
eVJlY3QpKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNl
dE5lZWRzRGlzcGxheSgpCi17Ci0gICAgbV90aWxlQ29udHJvbGxlci0+c2V0TmVlZHNEaXNwbGF5
KCk7Ci19Ci0KLWNvbnN0IFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckxpc3QqIFBsYXRmb3JtQ0FM
YXllclJlbW90ZVRpbGVkQmFja2luZzo6Y3VzdG9tU3VibGF5ZXJzKCkgY29uc3QKLXsKLSAgICBt
X2N1c3RvbVN1YmxheWVycyA9IG1fdGlsZUNvbnRyb2xsZXItPmNvbnRhaW5lckxheWVycygpOwot
ICAgIHJldHVybiAmbV9jdXN0b21TdWJsYXllcnM7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVy
UmVtb3RlVGlsZWRCYWNraW5nOjpzZXRCb3VuZHMoY29uc3QgV2ViQ29yZTo6RmxvYXRSZWN0JiBi
b3VuZHMpCi17Ci0gICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCb3VuZHMoYm91bmRzKTsK
LSAgICBtX3RpbGVDb250cm9sbGVyLT50aWxlQ2FjaGVMYXllckJvdW5kc0NoYW5nZWQoKTsKLX0K
LQotYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OmlzT3BhcXVlKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV90aWxlQ29udHJvbGxlci0+dGlsZXNBcmVPcGFxdWUoKTsKLX0K
LQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldE9wYXF1ZShib29s
IG9wYXF1ZSkKLXsKLSAgICBtX3RpbGVDb250cm9sbGVyLT5zZXRUaWxlc09wYXF1ZShvcGFxdWUp
OwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6YWNjZWxlcmF0
ZXNEcmF3aW5nKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV90aWxlQ29udHJvbGxlci0+YWNjZWxl
cmF0ZXNEcmF3aW5nKCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNr
aW5nOjpzZXRBY2NlbGVyYXRlc0RyYXdpbmcoYm9vbCBhY2NlbGVyYXRlc0RyYXdpbmcpCi17Ci0g
ICAgbV90aWxlQ29udHJvbGxlci0+c2V0QWNjZWxlcmF0ZXNEcmF3aW5nKGFjY2VsZXJhdGVzRHJh
d2luZyk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjp3YW50
c0RlZXBDb2xvckJhY2tpbmdTdG9yZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fdGlsZUNvbnRy
b2xsZXItPndhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRXYW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZShi
b29sIHdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKQotewotICAgIG1fdGlsZUNvbnRyb2xsZXIt
PnNldFdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKHdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3Jl
KTsKLX0KLQotYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnN1cHBvcnRz
U3VicGl4ZWxBbnRpYWxpYXNlZFRleHQoKSBjb25zdAotewotICAgIHJldHVybiBtX3RpbGVDb250
cm9sbGVyLT5zdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KCk7Ci19Ci0KLXZvaWQgUGxh
dGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRTdXBwb3J0c1N1YnBpeGVsQW50aWFs
aWFzZWRUZXh0KGJvb2wgc3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dCkKLXsKLSAgICBt
X3RpbGVDb250cm9sbGVyLT5zZXRTdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KHN1cHBv
cnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRleHQpOwotfQotCi1mbG9hdCBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGVUaWxlZEJhY2tpbmc6OmNvbnRlbnRzU2NhbGUoKSBjb25zdAotewotICAgIHJldHVybiBt
X3RpbGVDb250cm9sbGVyLT5jb250ZW50c1NjYWxlKCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRDb250ZW50c1NjYWxlKGZsb2F0IHNjYWxlKQotewot
ICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldENvbnRlbnRzU2NhbGUoc2NhbGUpOwotfQotCi12b2lk
IFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6c2V0Qm9yZGVyV2lkdGgoZmxvYXQg
Ym9yZGVyV2lkdGgpCi17Ci0gICAgbV90aWxlQ29udHJvbGxlci0+c2V0VGlsZURlYnVnQm9yZGVy
V2lkdGgoYm9yZGVyV2lkdGggLyAyKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVU
aWxlZEJhY2tpbmc6OnNldEJvcmRlckNvbG9yKGNvbnN0IFdlYkNvcmU6OkNvbG9yJiBjb2xvcikK
LXsKLSAgICBtX3RpbGVDb250cm9sbGVyLT5zZXRUaWxlRGVidWdCb3JkZXJDb2xvcihjb2xvcik7
Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9X
ZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5o
IGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJl
bW90ZVRpbGVkQmFja2luZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGRmY2U4
NTJkNTEyNzAzZDM0ZjQzNTJhMzlmNDVhM2U1ZDE1YTU5Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdl
L21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuaAorKysgL2Rldi9udWxsCkBA
IC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUg
bWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0g
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jaWZuZGVmIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZ19oCi0jZGVmaW5l
IFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZ19oCi0KLSNpbmNsdWRlICJQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGUuaCIKLSNpbmNsdWRlIDxXZWJDb3JlL1RpbGVDb250cm9sbGVyLmg+Ci0K
LW5hbWVzcGFjZSBXZWJLaXQgewotCi1jbGFzcyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJh
Y2tpbmcgZmluYWwgOiBwdWJsaWMgUGxhdGZvcm1DQUxheWVyUmVtb3RlIHsKLSAgICBmcmllbmQg
Y2xhc3MgUGxhdGZvcm1DQUxheWVyUmVtb3RlOwotcHVibGljOgotICAgIHZpcnR1YWwgflBsYXRm
b3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZygpOwotCi1wcml2YXRlOgotICAgIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZVRpbGVkQmFja2luZyhXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVy
VHlwZSwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3RlTGF5ZXJU
cmVlQ29udGV4dCYpOwotCi0gICAgV2ViQ29yZTo6VGlsZWRCYWNraW5nKiB0aWxlZEJhY2tpbmco
KSBvdmVycmlkZSB7IHJldHVybiBtX3RpbGVDb250cm9sbGVyLmdldCgpOyB9Ci0KLSAgICB2b2lk
IHNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmIGRpcnR5UmVj
dCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKSBvdmVycmlkZTsKLQotICAg
IGNvbnN0IFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckxpc3QqIGN1c3RvbVN1YmxheWVycygpIGNv
bnN0IG92ZXJyaWRlOwotCi0gICAgdm9pZCBzZXRCb3VuZHMoY29uc3QgV2ViQ29yZTo6RmxvYXRS
ZWN0Jikgb3ZlcnJpZGU7Ci0gICAgCi0gICAgYm9vbCBpc09wYXF1ZSgpIGNvbnN0IG92ZXJyaWRl
OwotICAgIHZvaWQgc2V0T3BhcXVlKGJvb2wpIG92ZXJyaWRlOwotICAgIAotICAgIGJvb2wgYWNj
ZWxlcmF0ZXNEcmF3aW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRBY2NlbGVyYXRl
c0RyYXdpbmcoYm9vbCkgb3ZlcnJpZGU7Ci0KLSAgICBib29sIHdhbnRzRGVlcENvbG9yQmFja2lu
Z1N0b3JlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRXYW50c0RlZXBDb2xvckJhY2tp
bmdTdG9yZShib29sKSBvdmVycmlkZTsKLQotICAgIGJvb2wgc3VwcG9ydHNTdWJwaXhlbEFudGlh
bGlhc2VkVGV4dCgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0U3VwcG9ydHNTdWJwaXhl
bEFudGlhbGlhc2VkVGV4dChib29sKSBvdmVycmlkZTsKLQotICAgIGZsb2F0IGNvbnRlbnRzU2Nh
bGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldENvbnRlbnRzU2NhbGUoZmxvYXQpIG92
ZXJyaWRlOwotICAgIAotICAgIHZvaWQgc2V0Qm9yZGVyV2lkdGgoZmxvYXQpIG92ZXJyaWRlOwot
ICAgIHZvaWQgc2V0Qm9yZGVyQ29sb3IoY29uc3QgV2ViQ29yZTo6Q29sb3ImKSBvdmVycmlkZTsK
LQotICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpUaWxlQ29udHJvbGxlcj4gbV90aWxlQ29u
dHJvbGxlcjsKLSAgICBtdXRhYmxlIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckxpc3QgbV9jdXN0
b21TdWJsYXllcnM7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKLQotI2VuZGlmIC8vIFBs
YXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZ19oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5oIGIvU291
cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1JlbW90ZUxheWVyVHJlZUNvbnRleHQu
aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1NDhlYTFjOTQ1MDNhZTlhMGIwNWQz
NjJiNDcxYjFkMDBhMGNiOC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJU
cmVlQ29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHly
aWdodCAoQykgMjAxMiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0g
KgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0g
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
IElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICog
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0K
LSNpZm5kZWYgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dF9oCi0jZGVmaW5lIFJlbW90ZUxheWVyVHJl
ZUNvbnRleHRfaAotCi0jaW5jbHVkZSAiTGF5ZXJUcmVlQ29udGV4dC5oIgotI2luY2x1ZGUgIlJl
bW90ZUxheWVyQmFja2luZ1N0b3JlQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgIlJlbW90ZUxheWVy
VHJlZVRyYW5zYWN0aW9uLmgiCi0jaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0xheWVyRmFjdG9y
eS5oPgotI2luY2x1ZGUgPFdlYkNvcmUvTGF5ZXJQb29sLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9Q
bGF0Zm9ybUNBTGF5ZXIuaD4KLSNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBX
ZWJLaXQgewotCi1jbGFzcyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU7Ci1jbGFzcyBXZWJQYWdlOwot
Ci0vLyBGSVhNRTogVGhpcyBjbGFzcyBkb2Vzbid0IGRvIG11Y2ggbm93LiBSb2xsIGludG8gUmVt
b3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE/Ci1jbGFzcyBSZW1vdGVMYXllclRyZWVDb250ZXh0IDog
cHVibGljIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJGYWN0b3J5IHsKLXB1YmxpYzoKLSAgICBleHBs
aWNpdCBSZW1vdGVMYXllclRyZWVDb250ZXh0KFdlYlBhZ2UmKTsKLSAgICB+UmVtb3RlTGF5ZXJU
cmVlQ29udGV4dCgpOwotCi0gICAgdm9pZCBsYXllcldhc0NyZWF0ZWQoUGxhdGZvcm1DQUxheWVy
UmVtb3RlJiwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGUpOwotICAgIHZvaWQg
bGF5ZXJXaWxsQmVEZXN0cm95ZWQoUGxhdGZvcm1DQUxheWVyUmVtb3RlJik7Ci0KLSAgICB2b2lk
IGJhY2tpbmdTdG9yZVdhc0NyZWF0ZWQoUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUmKTsKLSAgICB2
b2lkIGJhY2tpbmdTdG9yZVdpbGxCZURlc3Ryb3llZChSZW1vdGVMYXllckJhY2tpbmdTdG9yZSYp
OwotICAgIGJvb2wgYmFja2luZ1N0b3JlV2lsbEJlRGlzcGxheWVkKFJlbW90ZUxheWVyQmFja2lu
Z1N0b3JlJik7Ci0KLSAgICBXZWJDb3JlOjpMYXllclBvb2wmIGxheWVyUG9vbCgpIHsgcmV0dXJu
IG1fbGF5ZXJQb29sOyB9Ci0KLSAgICBmbG9hdCBkZXZpY2VTY2FsZUZhY3RvcigpIGNvbnN0Owot
Ci0gICAgTGF5ZXJIb3N0aW5nTW9kZSBsYXllckhvc3RpbmdNb2RlKCkgY29uc3Q7Ci0KLSAgICB2
b2lkIGJ1aWxkVHJhbnNhY3Rpb24oUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24mLCBXZWJDb3Jl
OjpQbGF0Zm9ybUNBTGF5ZXImIHJvb3RMYXllcik7Ci0KLSAgICB2b2lkIGxheWVyUHJvcGVydHlD
aGFuZ2VkV2hpbGVCdWlsZGluZ1RyYW5zYWN0aW9uKFBsYXRmb3JtQ0FMYXllclJlbW90ZSYpOwot
Ci0gICAgLy8gRnJvbSB0aGUgVUkgcHJvY2VzcwotICAgIHZvaWQgYW5pbWF0aW9uRGlkU3RhcnQo
V2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklELCBjb25zdCBTdHJpbmcmIGtl
eSwgZG91YmxlIHN0YXJ0VGltZSk7Ci0gICAgdm9pZCBhbmltYXRpb25EaWRFbmQoV2ViQ29yZTo6
R3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklELCBjb25zdCBTdHJpbmcmIGtleSk7Ci0KLSAg
ICB2b2lkIHdpbGxTdGFydEFuaW1hdGlvbk9uTGF5ZXIoUGxhdGZvcm1DQUxheWVyUmVtb3RlJik7
Ci0KLSAgICBSZW1vdGVMYXllckJhY2tpbmdTdG9yZUNvbGxlY3Rpb24mIGJhY2tpbmdTdG9yZUNv
bGxlY3Rpb24oKSB7IHJldHVybiBtX2JhY2tpbmdTdG9yZUNvbGxlY3Rpb247IH0KLSAgICAKLSAg
ICB2b2lkIHNldE5leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQoYm9vbCBuZXh0Rmx1c2hJc0Zv
ckltbWVkaWF0ZVBhaW50KSB7IG1fbmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludCA9IG5leHRG
bHVzaElzRm9ySW1tZWRpYXRlUGFpbnQ7IH0KLSAgICBib29sIG5leHRGbHVzaElzRm9ySW1tZWRp
YXRlUGFpbnQoKSBjb25zdCB7IHJldHVybiBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQ7
IH0KLQotcHJpdmF0ZToKLSAgICAvLyBXZWJDb3JlOjpHcmFwaGljc0xheWVyRmFjdG9yeQotICAg
IHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpHcmFwaGljc0xheWVyPiBjcmVhdGVHcmFwaGljc0xh
eWVyKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlR5cGUsIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJD
bGllbnQmKSBvdmVycmlkZTsKLQotICAgIFdlYlBhZ2UmIG1fd2ViUGFnZTsKLQotICAgIEhhc2hN
YXA8V2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklELCBSZW1vdGVMYXllclRy
ZWVUcmFuc2FjdGlvbjo6TGF5ZXJDcmVhdGlvblByb3BlcnRpZXM+IG1fY3JlYXRlZExheWVyczsK
LSAgICBWZWN0b3I8V2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklEPiBtX2Rl
c3Ryb3llZExheWVyczsKLQotICAgIEhhc2hNYXA8V2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6UGxh
dGZvcm1MYXllcklELCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUqPiBtX2xpdmVMYXllcnM7Ci0gICAg
SGFzaE1hcDxXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQsIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZSo+IG1fbGF5ZXJzV2l0aEFuaW1hdGlvbnM7Ci0KLSAgICBSZW1vdGVMYXll
ckJhY2tpbmdTdG9yZUNvbGxlY3Rpb24gbV9iYWNraW5nU3RvcmVDb2xsZWN0aW9uOwotICAgIAot
ICAgIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uKiBtX2N1cnJlbnRUcmFuc2FjdGlvbjsKLQot
ICAgIFdlYkNvcmU6OkxheWVyUG9vbCBtX2xheWVyUG9vbDsKLSAgICAKLSAgICBib29sIG1fbmV4
dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludCB7IGZhbHNlIH07Ci19OwotCi19IC8vIG5hbWVzcGFj
ZSBXZWJLaXQKLQotI2VuZGlmIC8vIFJlbW90ZUxheWVyVHJlZUNvbnRleHRfaApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1JlbW90ZUxheWVyVHJlZUNv
bnRleHQubW0gYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5
ZXJUcmVlQ29udGV4dC5tbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBjNDg2YjU4
MmIwZDE1ODcwNTZhNDhkMTgxMmRiMzlmN2I1MmIwMi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9t
YWMvUmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5tbQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2ltcG9ydCAiY29uZmlnLmgiCi0jaW1wb3J0ICJSZW1vdGVMYXll
clRyZWVDb250ZXh0LmgiCi0KLSNpbXBvcnQgIkdlbmVyaWNDYWxsYmFjay5oIgotI2ltcG9ydCAi
R3JhcGhpY3NMYXllckNBUmVtb3RlLmgiCi0jaW1wb3J0ICJQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUu
aCIKLSNpbXBvcnQgIlJlbW90ZUxheWVyQmFja2luZ1N0b3JlQ29sbGVjdGlvbi5oIgotI2ltcG9y
dCAiUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24uaCIKLSNpbXBvcnQgIldlYlBhZ2UuaCIKLSNp
bXBvcnQgPFdlYkNvcmUvRnJhbWVWaWV3Lmg+Ci0jaW1wb3J0IDxXZWJDb3JlL01haW5GcmFtZS5o
PgotI2ltcG9ydCA8V2ViQ29yZS9QYWdlLmg+Ci0jaW1wb3J0IDx3dGYvU2V0Rm9yU2NvcGUuaD4K
LSNpbXBvcnQgPHd0Zi9TeXN0ZW1UcmFjaW5nLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OwotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6UmVtb3Rl
TGF5ZXJUcmVlQ29udGV4dChXZWJQYWdlJiB3ZWJQYWdlKQotICAgIDogbV93ZWJQYWdlKHdlYlBh
Z2UpCi0gICAgLCBtX2N1cnJlbnRUcmFuc2FjdGlvbihudWxscHRyKQotewotfQotCi1SZW1vdGVM
YXllclRyZWVDb250ZXh0Ojp+UmVtb3RlTGF5ZXJUcmVlQ29udGV4dCgpCi17Ci0gICAgZm9yIChh
dXRvJiBsYXllciA6IG1fbGl2ZUxheWVycy52YWx1ZXMoKSkKLSAgICAgICAgbGF5ZXItPmNsZWFy
Q29udGV4dCgpOwotfQotCi1mbG9hdCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpkZXZpY2VTY2Fs
ZUZhY3RvcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fd2ViUGFnZS5kZXZpY2VTY2FsZUZhY3Rv
cigpOwotfQotCi1MYXllckhvc3RpbmdNb2RlIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmxheWVy
SG9zdGluZ01vZGUoKSBjb25zdAotewotICAgIHJldHVybiBtX3dlYlBhZ2UubGF5ZXJIb3N0aW5n
TW9kZSgpOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmxheWVyV2FzQ3JlYXRl
ZChQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmIGxheWVyLCBQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlw
ZSB0eXBlKQotewotICAgIEdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCBsYXllcklEID0g
bGF5ZXIubGF5ZXJJRCgpOwotCi0gICAgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkxheWVy
Q3JlYXRpb25Qcm9wZXJ0aWVzIGNyZWF0aW9uUHJvcGVydGllczsKLSAgICBjcmVhdGlvblByb3Bl
cnRpZXMubGF5ZXJJRCA9IGxheWVySUQ7Ci0gICAgY3JlYXRpb25Qcm9wZXJ0aWVzLnR5cGUgPSB0
eXBlOwotCi0gICAgaWYgKGxheWVyLmlzUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKCkpIHsK
LSAgICAgICAgY3JlYXRpb25Qcm9wZXJ0aWVzLmhvc3RpbmdDb250ZXh0SUQgPSBsYXllci5ob3N0
aW5nQ29udGV4dElEKCk7Ci0gICAgICAgIGNyZWF0aW9uUHJvcGVydGllcy5ob3N0aW5nRGV2aWNl
U2NhbGVGYWN0b3IgPSBkZXZpY2VTY2FsZUZhY3RvcigpOwotICAgIH0KLQotICAgIG1fY3JlYXRl
ZExheWVycy5hZGQobGF5ZXJJRCwgV1RGTW92ZShjcmVhdGlvblByb3BlcnRpZXMpKTsKLSAgICBt
X2xpdmVMYXllcnMuYWRkKGxheWVySUQsICZsYXllcik7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJU
cmVlQ29udGV4dDo6bGF5ZXJXaWxsQmVEZXN0cm95ZWQoUGxhdGZvcm1DQUxheWVyUmVtb3RlJiBs
YXllcikKLXsKLSAgICBBU1NFUlQobGF5ZXIubGF5ZXJJRCgpKTsKLSAgICBHcmFwaGljc0xheWVy
OjpQbGF0Zm9ybUxheWVySUQgbGF5ZXJJRCA9IGxheWVyLmxheWVySUQoKTsKLQotICAgIG1fY3Jl
YXRlZExheWVycy5yZW1vdmUobGF5ZXJJRCk7Ci0gICAgbV9saXZlTGF5ZXJzLnJlbW92ZShsYXll
cklEKTsKLQotICAgIEFTU0VSVCghbV9kZXN0cm95ZWRMYXllcnMuY29udGFpbnMobGF5ZXJJRCkp
OwotICAgIG1fZGVzdHJveWVkTGF5ZXJzLmFwcGVuZChsYXllcklEKTsKLSAgICAKLSAgICBtX2xh
eWVyc1dpdGhBbmltYXRpb25zLnJlbW92ZShsYXllcklEKTsKLX0KLQotdm9pZCBSZW1vdGVMYXll
clRyZWVDb250ZXh0OjpiYWNraW5nU3RvcmVXYXNDcmVhdGVkKFJlbW90ZUxheWVyQmFja2luZ1N0
b3JlJiBiYWNraW5nU3RvcmUpCi17Ci0gICAgbV9iYWNraW5nU3RvcmVDb2xsZWN0aW9uLmJhY2tp
bmdTdG9yZVdhc0NyZWF0ZWQoYmFja2luZ1N0b3JlKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRy
ZWVDb250ZXh0OjpiYWNraW5nU3RvcmVXaWxsQmVEZXN0cm95ZWQoUmVtb3RlTGF5ZXJCYWNraW5n
U3RvcmUmIGJhY2tpbmdTdG9yZSkKLXsKLSAgICBtX2JhY2tpbmdTdG9yZUNvbGxlY3Rpb24uYmFj
a2luZ1N0b3JlV2lsbEJlRGVzdHJveWVkKGJhY2tpbmdTdG9yZSk7Ci19Ci0KLWJvb2wgUmVtb3Rl
TGF5ZXJUcmVlQ29udGV4dDo6YmFja2luZ1N0b3JlV2lsbEJlRGlzcGxheWVkKFJlbW90ZUxheWVy
QmFja2luZ1N0b3JlJiBiYWNraW5nU3RvcmUpCi17Ci0gICAgcmV0dXJuIG1fYmFja2luZ1N0b3Jl
Q29sbGVjdGlvbi5iYWNraW5nU3RvcmVXaWxsQmVEaXNwbGF5ZWQoYmFja2luZ1N0b3JlKTsKLX0K
LQotc3RkOjp1bmlxdWVfcHRyPEdyYXBoaWNzTGF5ZXI+IFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6
OmNyZWF0ZUdyYXBoaWNzTGF5ZXIoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6VHlwZSBsYXllclR5
cGUsIEdyYXBoaWNzTGF5ZXJDbGllbnQmIGNsaWVudCkKLXsKLSAgICByZXR1cm4gc3RkOjptYWtl
X3VuaXF1ZTxHcmFwaGljc0xheWVyQ0FSZW1vdGU+KGxheWVyVHlwZSwgY2xpZW50LCAqdGhpcyk7
Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6YnVpbGRUcmFuc2FjdGlvbihSZW1v
dGVMYXllclRyZWVUcmFuc2FjdGlvbiYgdHJhbnNhY3Rpb24sIFBsYXRmb3JtQ0FMYXllciYgcm9v
dExheWVyKQotewotICAgIFRyYWNlU2NvcGUgdHJhY2luZ1Njb3BlKEJ1aWxkVHJhbnNhY3Rpb25T
dGFydCwgQnVpbGRUcmFuc2FjdGlvbkVuZCk7Ci0KLSAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUm
IHJvb3RMYXllclJlbW90ZSA9IGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4ocm9vdExh
eWVyKTsKLSAgICB0cmFuc2FjdGlvbi5zZXRSb290TGF5ZXJJRChyb290TGF5ZXJSZW1vdGUubGF5
ZXJJRCgpKTsKLQotICAgIG1fY3VycmVudFRyYW5zYWN0aW9uID0gJnRyYW5zYWN0aW9uOwotICAg
IHJvb3RMYXllclJlbW90ZS5yZWN1cnNpdmVCdWlsZFRyYW5zYWN0aW9uKCp0aGlzLCB0cmFuc2Fj
dGlvbik7Ci0gICAgbV9jdXJyZW50VHJhbnNhY3Rpb24gPSBudWxscHRyOwotCi0gICAgVmVjdG9y
PFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpMYXllckNyZWF0aW9uUHJvcGVydGllcz4gY3Jl
YXRlZExheWVyUHJvcGVydGllczsKLSAgICBjb3B5VmFsdWVzVG9WZWN0b3IobV9jcmVhdGVkTGF5
ZXJzLCBjcmVhdGVkTGF5ZXJQcm9wZXJ0aWVzKTsKLSAgICB0cmFuc2FjdGlvbi5zZXRDcmVhdGVk
TGF5ZXJzKFdURk1vdmUoY3JlYXRlZExheWVyUHJvcGVydGllcykpOwotICAgIHRyYW5zYWN0aW9u
LnNldERlc3Ryb3llZExheWVySURzKFdURk1vdmUobV9kZXN0cm95ZWRMYXllcnMpKTsKLSAgICAK
LSAgICBtX2NyZWF0ZWRMYXllcnMuY2xlYXIoKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVD
b250ZXh0OjpsYXllclByb3BlcnR5Q2hhbmdlZFdoaWxlQnVpbGRpbmdUcmFuc2FjdGlvbihQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGUmIGxheWVyKQotewotICAgIGlmIChtX2N1cnJlbnRUcmFuc2FjdGlv
bikKLSAgICAgICAgbV9jdXJyZW50VHJhbnNhY3Rpb24tPmxheWVyUHJvcGVydGllc0NoYW5nZWQo
bGF5ZXIpOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OndpbGxTdGFydEFuaW1h
dGlvbk9uTGF5ZXIoUGxhdGZvcm1DQUxheWVyUmVtb3RlJiBsYXllcikKLXsKLSAgICBtX2xheWVy
c1dpdGhBbmltYXRpb25zLmFkZChsYXllci5sYXllcklEKCksICZsYXllcik7Ci19Ci0KLXZvaWQg
UmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6YW5pbWF0aW9uRGlkU3RhcnQoV2ViQ29yZTo6R3JhcGhp
Y3NMYXllcjo6UGxhdGZvcm1MYXllcklEIGxheWVySUQsIGNvbnN0IFN0cmluZyYga2V5LCBkb3Vi
bGUgc3RhcnRUaW1lKQotewotICAgIGF1dG8gaXQgPSBtX2xheWVyc1dpdGhBbmltYXRpb25zLmZp
bmQobGF5ZXJJRCk7Ci0gICAgaWYgKGl0ICE9IG1fbGF5ZXJzV2l0aEFuaW1hdGlvbnMuZW5kKCkp
Ci0gICAgICAgIGl0LT52YWx1ZS0+YW5pbWF0aW9uU3RhcnRlZChrZXksIHN0YXJ0VGltZSk7Ci19
Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6YW5pbWF0aW9uRGlkRW5kKFdlYkNvcmU6
OkdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCBsYXllcklELCBjb25zdCBTdHJpbmcmIGtl
eSkKLXsKLSAgICBhdXRvIGl0ID0gbV9sYXllcnNXaXRoQW5pbWF0aW9ucy5maW5kKGxheWVySUQp
OwotICAgIGlmIChpdCAhPSBtX2xheWVyc1dpdGhBbmltYXRpb25zLmVuZCgpKQotICAgICAgICBp
dC0+dmFsdWUtPmFuaW1hdGlvbkVuZGVkKGtleSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktp
dApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1JlbW90
ZUxheWVyVHJlZURyYXdpbmdBcmVhLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFn
ZS9tYWMvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggNDI3NWFlMzExNWE2ZDI1MTg0YmMyYmRkZDgyZDA0YTU1YTk5OTdiZi4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dl
YlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEuaAorKysgL2Rl
di9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTQg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
Ci0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
LSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UK
LQotI2luY2x1ZGUgIkNhbGxiYWNrSUQuaCIKLSNpbmNsdWRlICJEcmF3aW5nQXJlYS5oIgotI2lu
Y2x1ZGUgIkdyYXBoaWNzTGF5ZXJDQVJlbW90ZS5oIgotI2luY2x1ZGUgIlJlbW90ZUxheWVyVHJl
ZVRyYW5zYWN0aW9uLmgiCi0jaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0xheWVyQ2xpZW50Lmg+
Ci0jaW5jbHVkZSA8V2ViQ29yZS9UaW1lci5oPgotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRl
IDxkaXNwYXRjaC9kaXNwYXRjaC5oPgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Ci0jaW5jbHVk
ZSA8d3RmL1dlYWtQdHIuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotY2xhc3MgUGxhdGZvcm1D
QUxheWVyOwotfQotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotY2xhc3MgUmVtb3RlTGF5ZXJUcmVl
Q29udGV4dDsKLWNsYXNzIFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcjsKLQot
Y2xhc3MgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEgOiBwdWJsaWMgRHJhd2luZ0FyZWEsIHB1
YmxpYyBXZWJDb3JlOjpHcmFwaGljc0xheWVyQ2xpZW50IHsKLSAgICBmcmllbmQgY2xhc3MgUmVt
b3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yOwotcHVibGljOgotICAgIFJlbW90ZUxh
eWVyVHJlZURyYXdpbmdBcmVhKFdlYlBhZ2UmLCBjb25zdCBXZWJQYWdlQ3JlYXRpb25QYXJhbWV0
ZXJzJik7Ci0gICAgdmlydHVhbCB+UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEoKTsKLQotICAg
IHVpbnQ2NF90IG5leHRUcmFuc2FjdGlvbklEKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50VHJh
bnNhY3Rpb25JRCArIDE7IH0KLSAgICB1aW50NjRfdCBsYXN0Q29tbWl0dGVkVHJhbnNhY3Rpb25J
RCgpIGNvbnN0IHsgcmV0dXJuIG1fY3VycmVudFRyYW5zYWN0aW9uSUQ7IH0KLQotICAgIFdlYWtQ
dHI8UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE+IGNyZWF0ZVdlYWtQdHIoKSB7IHJldHVybiBt
X3dlYWtQdHJGYWN0b3J5LmNyZWF0ZVdlYWtQdHIoKTsgfQotCi1wcml2YXRlOgotICAgIC8vIERy
YXdpbmdBcmVhCi0gICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKSBvdmVycmlkZTsKLSAgICB2b2lk
IHNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBXZWJDb3JlOjpJbnRSZWN0Jikgb3ZlcnJpZGU7
Ci0gICAgdm9pZCBzY3JvbGwoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgc2Nyb2xsUmVjdCwgY29u
c3QgV2ViQ29yZTo6SW50U2l6ZSYgc2Nyb2xsRGVsdGEpIG92ZXJyaWRlOwotICAgIHZvaWQgdXBk
YXRlR2VvbWV0cnkoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYgdmlld1NpemUsIGNvbnN0IFdlYkNv
cmU6OkludFNpemUmIGxheWVyUG9zaXRpb24sIGJvb2wgZmx1c2hTeW5jaHJvbm91c2x5LCBjb25z
dCBXZWJDb3JlOjpNYWNoU2VuZFJpZ2h0JiBmZW5jZVBvcnQpIG92ZXJyaWRlOwotCi0gICAgV2Vi
Q29yZTo6R3JhcGhpY3NMYXllckZhY3RvcnkqIGdyYXBoaWNzTGF5ZXJGYWN0b3J5KCkgb3ZlcnJp
ZGU7Ci0gICAgdm9pZCBzZXRSb290Q29tcG9zaXRpbmdMYXllcihXZWJDb3JlOjpHcmFwaGljc0xh
eWVyKikgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgp
IG92ZXJyaWRlOwotICAgIHZvaWQgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2hJbW1lZGlh
dGVseSgpIG92ZXJyaWRlOwotICAgIHZvaWQgYXR0YWNoVmlld092ZXJsYXlHcmFwaGljc0xheWVy
KFdlYkNvcmU6OkZyYW1lKiwgV2ViQ29yZTo6R3JhcGhpY3NMYXllciopIG92ZXJyaWRlOwotCi0g
ICAgdm9pZCBhZGRUcmFuc2FjdGlvbkNhbGxiYWNrSUQoQ2FsbGJhY2tJRCkgb3ZlcnJpZGU7Ci0K
LSAgICBSZWZQdHI8V2ViQ29yZTo6RGlzcGxheVJlZnJlc2hNb25pdG9yPiBjcmVhdGVEaXNwbGF5
UmVmcmVzaE1vbml0b3IoV2ViQ29yZTo6UGxhdGZvcm1EaXNwbGF5SUQpIG92ZXJyaWRlOwotICAg
IHZvaWQgd2lsbERlc3Ryb3lEaXNwbGF5UmVmcmVzaE1vbml0b3IoV2ViQ29yZTo6RGlzcGxheVJl
ZnJlc2hNb25pdG9yKik7Ci0KLSAgICBib29sIHNob3VsZFVzZVRpbGVkQmFja2luZ0ZvckZyYW1l
Vmlldyhjb25zdCBXZWJDb3JlOjpGcmFtZVZpZXcmKSBvdmVycmlkZTsKLQotICAgIHZvaWQgdXBk
YXRlUHJlZmVyZW5jZXMoY29uc3QgV2ViUHJlZmVyZW5jZXNTdG9yZSYpIG92ZXJyaWRlOwotCi0g
ICAgYm9vbCBzdXBwb3J0c0FzeW5jU2Nyb2xsaW5nKCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsg
fQotCi0gICAgdm9pZCBzZXRMYXllclRyZWVTdGF0ZUlzRnJvemVuKGJvb2wpIG92ZXJyaWRlOwot
Ci0gICAgdm9pZCBmb3JjZVJlcGFpbnQoKSBvdmVycmlkZTsKLSAgICBib29sIGZvcmNlUmVwYWlu
dEFzeW5jKENhbGxiYWNrSUQpIG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICB2b2lk
IHNldFZpZXdFeHBvc2VkUmVjdChzdGQ6Om9wdGlvbmFsPFdlYkNvcmU6OkZsb2F0UmVjdD4pIG92
ZXJyaWRlOwotICAgIHN0ZDo6b3B0aW9uYWw8V2ViQ29yZTo6RmxvYXRSZWN0PiB2aWV3RXhwb3Nl
ZFJlY3QoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX3Njcm9sbGVkVmlld0V4cG9zZWRSZWN0
OyB9Ci0KLSAgICB2b2lkIGFjY2VsZXJhdGVkQW5pbWF0aW9uRGlkU3RhcnQodWludDY0X3QgbGF5
ZXJJRCwgY29uc3QgU3RyaW5nJiBrZXksIGRvdWJsZSBzdGFydFRpbWUpIG92ZXJyaWRlOwotICAg
IHZvaWQgYWNjZWxlcmF0ZWRBbmltYXRpb25EaWRFbmQodWludDY0X3QgbGF5ZXJJRCwgY29uc3Qg
U3RyaW5nJiBrZXkpIG92ZXJyaWRlOwotCi0jaWYgUExBVEZPUk0oSU9TKQotICAgIFdlYkNvcmU6
OkZsb2F0UmVjdCBleHBvc2VkQ29udGVudFJlY3QoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lk
IHNldEV4cG9zZWRDb250ZW50UmVjdChjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmKSBvdmVycmlk
ZTsKLSNlbmRpZgotCi0gICAgdm9pZCBkaWRVcGRhdGUoKSBvdmVycmlkZTsKLQotI2lmIFBMQVRG
T1JNKElPUykKLSAgICB2b2lkIHNldERldmljZVNjYWxlRmFjdG9yKGZsb2F0KSBvdmVycmlkZTsK
LSNlbmRpZgotCi0gICAgdm9pZCBtYWluRnJhbWVDb250ZW50U2l6ZUNoYW5nZWQoY29uc3QgV2Vi
Q29yZTo6SW50U2l6ZSYpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBhY3Rpdml0eVN0YXRlRGlkQ2hh
bmdlKFdlYkNvcmU6OkFjdGl2aXR5U3RhdGU6OkZsYWdzIGNoYW5nZWQsIGJvb2wgd2FudHNEaWRV
cGRhdGVBY3Rpdml0eVN0YXRlLCBjb25zdCBWZWN0b3I8Q2FsbGJhY2tJRD4mIGNhbGxiYWNrSURz
KSBvdmVycmlkZTsKLQotICAgIGJvb2wgYWRqdXN0TGF5ZXJGbHVzaFRocm90dGxpbmcoV2ViQ29y
ZTo6TGF5ZXJGbHVzaFRocm90dGxlU3RhdGU6OkZsYWdzKSBvdmVycmlkZTsKLQotICAgIGJvb2wg
ZGlzcGF0Y2hEaWRSZWFjaExheW91dE1pbGVzdG9uZShXZWJDb3JlOjpMYXlvdXRNaWxlc3RvbmVz
KSBvdmVycmlkZTsKLQotICAgIHZvaWQgdXBkYXRlU2Nyb2xsZWRFeHBvc2VkUmVjdCgpOwotICAg
IHZvaWQgdXBkYXRlUm9vdExheWVycygpOwotCi0gICAgdm9pZCBmbHVzaExheWVycygpOwotCi0g
ICAgV2ViQ29yZTo6VGlsZWRCYWNraW5nKiBtYWluRnJhbWVUaWxlZEJhY2tpbmcoKSBjb25zdDsK
LQotICAgIHVpbnQ2NF90IHRha2VOZXh0VHJhbnNhY3Rpb25JRCgpIHsgcmV0dXJuICsrbV9jdXJy
ZW50VHJhbnNhY3Rpb25JRDsgfQotCi0gICAgYm9vbCBtYXJrTGF5ZXJzVm9sYXRpbGVJbW1lZGlh
dGVseUlmUG9zc2libGUoKSBvdmVycmlkZTsKLQotICAgIGNsYXNzIEJhY2tpbmdTdG9yZUZsdXNo
ZXIgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8QmFja2luZ1N0b3JlRmx1c2hlcj4gewot
ICAgIHB1YmxpYzoKLSAgICAgICAgc3RhdGljIFJlZjxCYWNraW5nU3RvcmVGbHVzaGVyPiBjcmVh
dGUoSVBDOjpDb25uZWN0aW9uKiwgc3RkOjp1bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4sIFZlY3Rv
cjxSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPj4pOwotCi0gICAgICAgIHZvaWQgZmx1c2goKTsKLSAg
ICAgICAgYm9vbCBoYXNGbHVzaGVkKCkgY29uc3QgeyByZXR1cm4gbV9oYXNGbHVzaGVkOyB9Ci0K
LSAgICBwcml2YXRlOgotICAgICAgICBCYWNraW5nU3RvcmVGbHVzaGVyKElQQzo6Q29ubmVjdGlv
biosIHN0ZDo6dW5pcXVlX3B0cjxJUEM6OkVuY29kZXI+LCBWZWN0b3I8UmV0YWluUHRyPENHQ29u
dGV4dFJlZj4+KTsKLQotICAgICAgICBSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiBtX2Nvbm5lY3Rp
b247Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUEM6OkVuY29kZXI+IG1fY29tbWl0RW5jb2Rl
cjsKLSAgICAgICAgVmVjdG9yPFJldGFpblB0cjxDR0NvbnRleHRSZWY+PiBtX2NvbnRleHRzVG9G
bHVzaDsKLQotICAgICAgICBzdGQ6OmF0b21pYzxib29sPiBtX2hhc0ZsdXNoZWQ7Ci0gICAgfTsK
LQotICAgIHN0ZDo6dW5pcXVlX3B0cjxSZW1vdGVMYXllclRyZWVDb250ZXh0PiBtX3JlbW90ZUxh
eWVyVHJlZUNvbnRleHQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXI+IG1fcm9vdExheWVyOwotCi0gICAgV2ViQ29yZTo6SW50U2l6ZSBtX3ZpZXdTaXplOwotCi0g
ICAgc3RkOjpvcHRpb25hbDxXZWJDb3JlOjpGbG9hdFJlY3Q+IG1fdmlld0V4cG9zZWRSZWN0Owot
ICAgIHN0ZDo6b3B0aW9uYWw8V2ViQ29yZTo6RmxvYXRSZWN0PiBtX3Njcm9sbGVkVmlld0V4cG9z
ZWRSZWN0OwotCi0gICAgV2ViQ29yZTo6VGltZXIgbV9sYXllckZsdXNoVGltZXI7Ci0gICAgYm9v
bCBtX2lzRmx1c2hpbmdTdXNwZW5kZWQgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9oYXNEZWZlcnJl
ZEZsdXNoIHsgZmFsc2UgfTsKLSAgICBib29sIG1faXNUaHJvdHRsaW5nTGF5ZXJGbHVzaGVzIHsg
ZmFsc2UgfTsKLSAgICBib29sIG1faXNMYXllckZsdXNoVGhyb3R0bGluZ1RlbXBvcmFyaWx5RGlz
YWJsZWRGb3JJbnRlcmFjdGlvbiB7IGZhbHNlIH07Ci0gICAgYm9vbCBtX2lzSW5pdGlhbFRocm90
dGxlZExheWVyRmx1c2ggeyBmYWxzZSB9OwotCi0gICAgYm9vbCBtX3dhaXRpbmdGb3JCYWNraW5n
U3RvcmVTd2FwIHsgZmFsc2UgfTsKLSAgICBib29sIG1faGFkRmx1c2hEZWZlcnJlZFdoaWxlV2Fp
dGluZ0ZvckJhY2tpbmdTdG9yZVN3YXAgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9uZXh0Rmx1c2hJ
c0ZvckltbWVkaWF0ZVBhaW50IHsgZmFsc2UgfTsKLQotICAgIGRpc3BhdGNoX3F1ZXVlX3QgbV9j
b21taXRRdWV1ZTsKLSAgICBSZWZQdHI8QmFja2luZ1N0b3JlRmx1c2hlcj4gbV9wZW5kaW5nQmFj
a2luZ1N0b3JlRmx1c2hlcjsKLQotICAgIEhhc2hTZXQ8UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJl
ZnJlc2hNb25pdG9yKj4gbV9kaXNwbGF5UmVmcmVzaE1vbml0b3JzOwotICAgIEhhc2hTZXQ8UmVt
b3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yKj4qIG1fZGlzcGxheVJlZnJlc2hNb25p
dG9yc1RvTm90aWZ5IHsgbnVsbHB0ciB9OwotCi0gICAgdWludDY0X3QgbV9jdXJyZW50VHJhbnNh
Y3Rpb25JRCB7IDAgfTsKLSAgICBWZWN0b3I8UmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlRy
YW5zYWN0aW9uQ2FsbGJhY2tJRD4gbV9wZW5kaW5nQ2FsbGJhY2tJRHM7Ci0KLSAgICBXZWJDb3Jl
OjpMYXlvdXRNaWxlc3RvbmVzIG1fcGVuZGluZ05ld2x5UmVhY2hlZExheW91dE1pbGVzdG9uZXMg
eyAwIH07Ci0KLSAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBtX2NvbnRlbnRMYXllciB7IG51
bGxwdHIgfTsKLSAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBtX3ZpZXdPdmVybGF5Um9vdExh
eWVyIHsgbnVsbHB0ciB9OwotICAgIAotICAgIFdlYWtQdHJGYWN0b3J5PFJlbW90ZUxheWVyVHJl
ZURyYXdpbmdBcmVhPiBtX3dlYWtQdHJGYWN0b3J5OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgV2Vi
S2l0Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfRFJBV0lOR19BUkVBKFJlbW90ZUxheWVyVHJl
ZURyYXdpbmdBcmVhLCBEcmF3aW5nQXJlYVR5cGVSZW1vdGVMYXllclRyZWUpCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJUcmVlRHJh
d2luZ0FyZWEubW0gYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWEubW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYx
NDZmYTBmMGI4NjY1YzlkMjQwNjA4ZGVkNzFlY2I4MzU2M2ExNjMuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dl
YlBhZ2UvbWFjL1JlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhLm1tCisrKyAvZGV2L251bGwKQEAg
LTEsNTE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAq
IGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICog
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbXBvcnQgImNvbmZpZy5oIgotI2lt
cG9ydCAiUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEuaCIKLQotI2ltcG9ydCAiRHJhd2luZ0Fy
ZWFQcm94eU1lc3NhZ2VzLmgiCi0jaW1wb3J0ICJHcmFwaGljc0xheWVyQ0FSZW1vdGUuaCIKLSNp
bXBvcnQgIlBsYXRmb3JtQ0FMYXllclJlbW90ZS5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJCYWNr
aW5nU3RvcmVDb2xsZWN0aW9uLmgiCi0jaW1wb3J0ICJSZW1vdGVMYXllclRyZWVDb250ZXh0Lmgi
Ci0jaW1wb3J0ICJSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IuaCIKLSNpbXBv
cnQgIlJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhUHJveHlNZXNzYWdlcy5oIgotI2ltcG9ydCAi
UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaCIKLSNpbXBvcnQgIlJlbW90ZVNjcm9sbGluZ0Nv
b3JkaW5hdG9yVHJhbnNhY3Rpb24uaCIKLSNpbXBvcnQgIldlYlBhZ2UuaCIKLSNpbXBvcnQgIldl
YlByb2Nlc3MuaCIKLSNpbXBvcnQgPFF1YXJ0ekNvcmUvUXVhcnR6Q29yZS5oPgotI2ltcG9ydCA8
V2ViQ29yZS9EZWJ1Z1BhZ2VPdmVybGF5cy5oPgotI2ltcG9ydCA8V2ViQ29yZS9GcmFtZS5oPgot
I2ltcG9ydCA8V2ViQ29yZS9GcmFtZVZpZXcuaD4KLSNpbXBvcnQgPFdlYkNvcmUvSW5zcGVjdG9y
Q29udHJvbGxlci5oPgotI2ltcG9ydCA8V2ViQ29yZS9NYWluRnJhbWUuaD4KLSNpbXBvcnQgPFdl
YkNvcmUvUGFnZU92ZXJsYXlDb250cm9sbGVyLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL1JlbmRlckxh
eWVyQ29tcG9zaXRvci5oPgotI2ltcG9ydCA8V2ViQ29yZS9SZW5kZXJWaWV3Lmg+Ci0jaW1wb3J0
IDxXZWJDb3JlL1NldHRpbmdzLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL1RpbGVkQmFja2luZy5oPgot
I2ltcG9ydCA8cGFsL3NwaS9jb2NvYS9RdWFydHpDb3JlU1BJLmg+Ci0jaW1wb3J0IDx3dGYvU3lz
dGVtVHJhY2luZy5oPgotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQotbmFtZXNwYWNlIFdl
YktpdCB7Ci0KLVJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpSZW1vdGVMYXllclRyZWVEcmF3
aW5nQXJlYShXZWJQYWdlJiB3ZWJQYWdlLCBjb25zdCBXZWJQYWdlQ3JlYXRpb25QYXJhbWV0ZXJz
JikKLSAgICA6IERyYXdpbmdBcmVhKERyYXdpbmdBcmVhVHlwZVJlbW90ZUxheWVyVHJlZSwgd2Vi
UGFnZSkKLSAgICAsIG1fcmVtb3RlTGF5ZXJUcmVlQ29udGV4dChzdGQ6Om1ha2VfdW5pcXVlPFJl
bW90ZUxheWVyVHJlZUNvbnRleHQ+KHdlYlBhZ2UpKQotICAgICwgbV9yb290TGF5ZXIoR3JhcGhp
Y3NMYXllcjo6Y3JlYXRlKGdyYXBoaWNzTGF5ZXJGYWN0b3J5KCksICp0aGlzKSkKLSAgICAsIG1f
bGF5ZXJGbHVzaFRpbWVyKCp0aGlzLCAmUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmZsdXNo
TGF5ZXJzKQotICAgICwgbV93ZWFrUHRyRmFjdG9yeSh0aGlzKQotewotICAgIHdlYlBhZ2UuY29y
ZVBhZ2UoKS0+c2V0dGluZ3MoKS5zZXRGb3JjZUNvbXBvc2l0aW5nTW9kZSh0cnVlKTsKLSNpZiBQ
TEFURk9STShJT1MpCi0gICAgd2ViUGFnZS5jb3JlUGFnZSgpLT5zZXR0aW5ncygpLnNldERlbGVn
YXRlc1BhZ2VTY2FsaW5nKHRydWUpOwotI2VuZGlmCi0gICAgbV9yb290TGF5ZXItPnNldE5hbWUo
ImRyYXdpbmcgYXJlYSByb290Iik7Ci0KLSAgICBtX2NvbW1pdFF1ZXVlID0gZGlzcGF0Y2hfcXVl
dWVfY3JlYXRlKCJjb20uYXBwbGUuV2ViS2l0LldlYkNvbnRlbnQuUmVtb3RlTGF5ZXJUcmVlRHJh
d2luZ0FyZWEuQ29tbWl0UXVldWUiLCBudWxscHRyKTsKLQotICAgIC8vIEluIG9yZGVyIHRvIGVu
c3VyZSB0aGF0IHdlIGdldCBhIHVuaXF1ZSBEaXNwbGF5UmVmcmVzaE1vbml0b3IgcGVyLURyYXdp
bmdBcmVhIChuZWNlc3NhcnkgYmVjYXVzZSBEaXNwbGF5UmVmcmVzaE1vbml0b3IKLSAgICAvLyBp
cyBkcml2ZW4gYnkgdGhpcyBjbGFzcyksIGdpdmUgZWFjaCBwYWdlIGEgdW5pcXVlIERpc3BsYXlJ
RCBkZXJpdmVkIGZyb20gV2ViUGFnZSdzIHVuaXF1ZSBJRC4KLSAgICAvLyBGSVhNRTogV2hpbGUg
dXNpbmcgdGhlIGhpZ2ggZW5kIG9mIHRoZSByYW5nZSBvZiBEaXNwbGF5SURzIG1ha2VzIGEgY29s
bGlzaW9uIHdpdGggcmVhbCwgbm9uLVJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhCi0gICAgLy8g
RGlzcGxheUlEcyBsZXNzIGxpa2VseSwgaXQgaXMgbm90IGVudGlyZWx5IHNhZmUgdG8gaGF2ZSBh
IFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhIGFuZCBUaWxlZENvcmVBbmltYXRpb25EcmF3aW5n
QXJlYQotICAgIC8vIGNvZWV4aXN0IGluIHRoZSBzYW1lIHByb2Nlc3MuCi0gICAgd2ViUGFnZS53
aW5kb3dTY3JlZW5EaWRDaGFuZ2Uoc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgp
IC0gd2ViUGFnZS5wYWdlSUQoKSk7Ci19Ci0KLVJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjp+
UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEoKQotewotICAgIGRpc3BhdGNoX3JlbGVhc2UobV9j
b21taXRRdWV1ZSk7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnNldE5l
ZWRzRGlzcGxheSgpCi17Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnNl
dE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBJbnRSZWN0JikKLXsKLX0KLQotdm9pZCBSZW1vdGVM
YXllclRyZWVEcmF3aW5nQXJlYTo6c2Nyb2xsKGNvbnN0IEludFJlY3QmIHNjcm9sbFJlY3QsIGNv
bnN0IEludFNpemUmIHNjcm9sbERlbHRhKQotewotfQotCi1HcmFwaGljc0xheWVyRmFjdG9yeSog
UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmdyYXBoaWNzTGF5ZXJGYWN0b3J5KCkKLXsKLSAg
ICByZXR1cm4gbV9yZW1vdGVMYXllclRyZWVDb250ZXh0LmdldCgpOwotfQotCi1SZWZQdHI8RGlz
cGxheVJlZnJlc2hNb25pdG9yPiBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6Y3JlYXRlRGlz
cGxheVJlZnJlc2hNb25pdG9yKFBsYXRmb3JtRGlzcGxheUlEIGRpc3BsYXlJRCkKLXsKLSAgICBh
dXRvIG1vbml0b3IgPSBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3I6OmNyZWF0
ZShkaXNwbGF5SUQsICp0aGlzKTsKLSAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnMuYWRkKG1v
bml0b3IucHRyKCkpOwotICAgIHJldHVybiBXVEZNb3ZlKG1vbml0b3IpOwotfQotCi12b2lkIFJl
bW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjp3aWxsRGVzdHJveURpc3BsYXlSZWZyZXNoTW9uaXRv
cihEaXNwbGF5UmVmcmVzaE1vbml0b3IqIG1vbml0b3IpCi17Ci0gICAgYXV0byByZW1vdGVNb25p
dG9yID0gc3RhdGljX2Nhc3Q8UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yKj4o
bW9uaXRvcik7Ci0gICAgbV9kaXNwbGF5UmVmcmVzaE1vbml0b3JzLnJlbW92ZShyZW1vdGVNb25p
dG9yKTsKLQotICAgIGlmIChtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnNUb05vdGlmeSkKLSAgICAg
ICAgbV9kaXNwbGF5UmVmcmVzaE1vbml0b3JzVG9Ob3RpZnktPnJlbW92ZShyZW1vdGVNb25pdG9y
KTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6dXBkYXRlUm9vdExheWVy
cygpCi17Ci0gICAgVmVjdG9yPEdyYXBoaWNzTGF5ZXIqPiBjaGlsZHJlbjsKLSAgICBpZiAobV9j
b250ZW50TGF5ZXIpIHsKLSAgICAgICAgY2hpbGRyZW4uYXBwZW5kKG1fY29udGVudExheWVyKTsK
LSAgICAgICAgaWYgKG1fdmlld092ZXJsYXlSb290TGF5ZXIpCi0gICAgICAgICAgICBjaGlsZHJl
bi5hcHBlbmQobV92aWV3T3ZlcmxheVJvb3RMYXllcik7Ci0gICAgfQotCi0gICAgbV9yb290TGF5
ZXItPnNldENoaWxkcmVuKGNoaWxkcmVuKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVEcmF3
aW5nQXJlYTo6YXR0YWNoVmlld092ZXJsYXlHcmFwaGljc0xheWVyKEZyYW1lKiBmcmFtZSwgR3Jh
cGhpY3NMYXllciogdmlld092ZXJsYXlSb290TGF5ZXIpCi17Ci0gICAgaWYgKCFmcmFtZS0+aXNN
YWluRnJhbWUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV92aWV3T3ZlcmxheVJvb3RMYXll
ciA9IHZpZXdPdmVybGF5Um9vdExheWVyOwotICAgIHVwZGF0ZVJvb3RMYXllcnMoKTsKLX0KLQot
dm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6c2V0Um9vdENvbXBvc2l0aW5nTGF5ZXIo
R3JhcGhpY3NMYXllciogcm9vdExheWVyKQotewotICAgIG1fY29udGVudExheWVyID0gcm9vdExh
eWVyOwotICAgIHVwZGF0ZVJvb3RMYXllcnMoKTsKLSAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5
ZXJGbHVzaCgpOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjp1cGRhdGVH
ZW9tZXRyeShjb25zdCBJbnRTaXplJiB2aWV3U2l6ZSwgY29uc3QgSW50U2l6ZSYgbGF5ZXJQb3Np
dGlvbiwgYm9vbCBmbHVzaFN5bmNocm9ub3VzbHksIGNvbnN0IFdlYkNvcmU6Ok1hY2hTZW5kUmln
aHQmKQotewotICAgIG1fdmlld1NpemUgPSB2aWV3U2l6ZTsKLSAgICBtX3dlYlBhZ2Uuc2V0U2l6
ZSh2aWV3U2l6ZSk7Ci0KLSAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOwotCi0g
ICAgbV93ZWJQYWdlLnNlbmQoTWVzc2FnZXM6OkRyYXdpbmdBcmVhUHJveHk6OkRpZFVwZGF0ZUdl
b21ldHJ5KCkpOwotfQotCi1ib29sIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzaG91bGRV
c2VUaWxlZEJhY2tpbmdGb3JGcmFtZVZpZXcoY29uc3QgRnJhbWVWaWV3JiBmcmFtZVZpZXcpCi17
Ci0gICAgcmV0dXJuIGZyYW1lVmlldy5mcmFtZSgpLmlzTWFpbkZyYW1lKCk7Ci19Ci0KLXZvaWQg
UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnVwZGF0ZVByZWZlcmVuY2VzKGNvbnN0IFdlYlBy
ZWZlcmVuY2VzU3RvcmUmKQotewotICAgIFNldHRpbmdzJiBzZXR0aW5ncyA9IG1fd2ViUGFnZS5j
b3JlUGFnZSgpLT5zZXR0aW5ncygpOwotCi0gICAgLy8gRml4ZWQgcG9zaXRpb24gZWxlbWVudHMg
bmVlZCB0byBiZSBjb21wb3NpdGVkIGFuZCBjcmVhdGUgc3RhY2tpbmcgY29udGV4dHMKLSAgICAv
LyBpbiBvcmRlciB0byBiZSBzY3JvbGxlZCBieSB0aGUgU2Nyb2xsaW5nQ29vcmRpbmF0b3IuCi0g
ICAgc2V0dGluZ3Muc2V0QWNjZWxlcmF0ZWRDb21wb3NpdGluZ0ZvckZpeGVkUG9zaXRpb25FbmFi
bGVkKHRydWUpOwotCi0gICAgbV9yb290TGF5ZXItPnNldFNob3dEZWJ1Z0JvcmRlcihzZXR0aW5n
cy5zaG93RGVidWdCb3JkZXJzKCkpOwotCi0gICAgaWYgKE1haW5GcmFtZSogbWFpbkZyYW1lID0g
bV93ZWJQYWdlLm1haW5GcmFtZSgpKQotICAgICAgICBEZWJ1Z1BhZ2VPdmVybGF5czo6c2V0dGlu
Z3NDaGFuZ2VkKCptYWluRnJhbWUpOwotfQotCi0jaWYgUExBVEZPUk0oSU9TKQotdm9pZCBSZW1v
dGVMYXllclRyZWVEcmF3aW5nQXJlYTo6c2V0RGV2aWNlU2NhbGVGYWN0b3IoZmxvYXQgZGV2aWNl
U2NhbGVGYWN0b3IpCi17Ci0gICAgbV93ZWJQYWdlLnNldERldmljZVNjYWxlRmFjdG9yKGRldmlj
ZVNjYWxlRmFjdG9yKTsKLX0KLSNlbmRpZgotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdB
cmVhOjpzZXRMYXllclRyZWVTdGF0ZUlzRnJvemVuKGJvb2wgaXNGcm96ZW4pCi17Ci0gICAgaWYg
KG1faXNGbHVzaGluZ1N1c3BlbmRlZCA9PSBpc0Zyb3plbikKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgbV9pc0ZsdXNoaW5nU3VzcGVuZGVkID0gaXNGcm96ZW47Ci0KLSAgICBpZiAoIW1faXNGbHVz
aGluZ1N1c3BlbmRlZCAmJiBtX2hhc0RlZmVycmVkRmx1c2gpIHsKLSAgICAgICAgbV9oYXNEZWZl
cnJlZEZsdXNoID0gZmFsc2U7Ci0gICAgICAgIHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllckZsdXNo
KCk7Ci0gICAgfQotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpmb3JjZVJl
cGFpbnQoKQotewotICAgIGlmIChtX2lzRmx1c2hpbmdTdXNwZW5kZWQpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGZvciAoRnJhbWUqIGZyYW1lID0gJm1fd2ViUGFnZS5jb3JlUGFnZSgpLT5tYWlu
RnJhbWUoKTsgZnJhbWU7IGZyYW1lID0gZnJhbWUtPnRyZWUoKS50cmF2ZXJzZU5leHQoKSkgewot
ICAgICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IGZyYW1lLT52aWV3KCk7Ci0gICAgICAgIGlm
ICghZnJhbWVWaWV3IHx8ICFmcmFtZVZpZXctPnRpbGVkQmFja2luZygpKQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgZnJhbWVWaWV3LT50aWxlZEJhY2tpbmcoKS0+Zm9yY2VSZXBh
aW50KCk7Ci0gICAgfQotCi0gICAgZmx1c2hMYXllcnMoKTsKLX0KLQotdm9pZCBSZW1vdGVMYXll
clRyZWVEcmF3aW5nQXJlYTo6YWNjZWxlcmF0ZWRBbmltYXRpb25EaWRTdGFydCh1aW50NjRfdCBs
YXllcklELCBjb25zdCBTdHJpbmcmIGtleSwgZG91YmxlIHN0YXJ0VGltZSkKLXsKLSAgICBtX3Jl
bW90ZUxheWVyVHJlZUNvbnRleHQtPmFuaW1hdGlvbkRpZFN0YXJ0KGxheWVySUQsIGtleSwgc3Rh
cnRUaW1lKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6YWNjZWxlcmF0
ZWRBbmltYXRpb25EaWRFbmQodWludDY0X3QgbGF5ZXJJRCwgY29uc3QgU3RyaW5nJiBrZXkpCi17
Ci0gICAgbV9yZW1vdGVMYXllclRyZWVDb250ZXh0LT5hbmltYXRpb25EaWRFbmQobGF5ZXJJRCwg
a2V5KTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6c2V0Vmlld0V4cG9z
ZWRSZWN0KHN0ZDo6b3B0aW9uYWw8V2ViQ29yZTo6RmxvYXRSZWN0PiB2aWV3RXhwb3NlZFJlY3Qp
Ci17Ci0gICAgbV92aWV3RXhwb3NlZFJlY3QgPSB2aWV3RXhwb3NlZFJlY3Q7Ci0gICAgdXBkYXRl
U2Nyb2xsZWRFeHBvc2VkUmVjdCgpOwotfQotCi0jaWYgUExBVEZPUk0oSU9TKQotV2ViQ29yZTo6
RmxvYXRSZWN0IFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpleHBvc2VkQ29udGVudFJlY3Qo
KSBjb25zdAotewotICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gbV93ZWJQYWdlLm1haW5GcmFt
ZVZpZXcoKTsKLSAgICBpZiAoIWZyYW1lVmlldykKLSAgICAgICAgcmV0dXJuIEZsb2F0UmVjdCgp
OwotCi0gICAgcmV0dXJuIGZyYW1lVmlldy0+ZXhwb3NlZENvbnRlbnRSZWN0KCk7Ci19Ci0KLXZv
aWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnNldEV4cG9zZWRDb250ZW50UmVjdChjb25z
dCBGbG9hdFJlY3QmIGV4cG9zZWRDb250ZW50UmVjdCkKLXsKLSAgICBGcmFtZVZpZXcqIGZyYW1l
VmlldyA9IG1fd2ViUGFnZS5tYWluRnJhbWVWaWV3KCk7Ci0gICAgaWYgKCFmcmFtZVZpZXcpCi0g
ICAgICAgIHJldHVybjsKLSAgICBpZiAoZnJhbWVWaWV3LT5leHBvc2VkQ29udGVudFJlY3QoKSA9
PSBleHBvc2VkQ29udGVudFJlY3QpCi0gICAgICAgIHJldHVybjsKLQotICAgIGZyYW1lVmlldy0+
c2V0RXhwb3NlZENvbnRlbnRSZWN0KGV4cG9zZWRDb250ZW50UmVjdCk7Ci0gICAgc2NoZWR1bGVD
b21wb3NpdGluZ0xheWVyRmx1c2goKTsKLX0KLSNlbmRpZgotCi12b2lkIFJlbW90ZUxheWVyVHJl
ZURyYXdpbmdBcmVhOjp1cGRhdGVTY3JvbGxlZEV4cG9zZWRSZWN0KCkKLXsKLSAgICBGcmFtZVZp
ZXcqIGZyYW1lVmlldyA9IG1fd2ViUGFnZS5tYWluRnJhbWVWaWV3KCk7Ci0gICAgaWYgKCFmcmFt
ZVZpZXcpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fc2Nyb2xsZWRWaWV3RXhwb3NlZFJlY3Qg
PSBtX3ZpZXdFeHBvc2VkUmVjdDsKLQotI2lmICFQTEFURk9STShJT1MpCi0gICAgaWYgKG1fdmll
d0V4cG9zZWRSZWN0KSB7Ci0gICAgICAgIFNjcm9sbE9mZnNldCBzY3JvbGxPZmZzZXQgPSBmcmFt
ZVZpZXctPnNjcm9sbE9mZnNldEZyb21Qb3NpdGlvbihmcmFtZVZpZXctPnNjcm9sbFBvc2l0aW9u
KCkpOwotICAgICAgICBtX3Njcm9sbGVkVmlld0V4cG9zZWRSZWN0LnZhbHVlKCkubW92ZUJ5KHNj
cm9sbE9mZnNldCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBmcmFtZVZpZXctPnNldFZpZXdFeHBv
c2VkUmVjdChtX3Njcm9sbGVkVmlld0V4cG9zZWRSZWN0KTsKLX0KLQotVGlsZWRCYWNraW5nKiBS
ZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6bWFpbkZyYW1lVGlsZWRCYWNraW5nKCkgY29uc3QK
LXsKLSAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IG1fd2ViUGFnZS5tYWluRnJhbWVWaWV3KCk7
Ci0gICAgcmV0dXJuIGZyYW1lVmlldyA/IGZyYW1lVmlldy0+dGlsZWRCYWNraW5nKCkgOiBudWxs
cHRyOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzY2hlZHVsZUNvbXBv
c2l0aW5nTGF5ZXJGbHVzaEltbWVkaWF0ZWx5KCkKLXsKLSAgICBtX2xheWVyRmx1c2hUaW1lci5z
dGFydE9uZVNob3QoMF9zKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6
c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKQotewotICAgIGlmIChtX2lzRmx1c2hpbmdT
dXNwZW5kZWQpIHsKLSAgICAgICAgbV9pc0xheWVyRmx1c2hUaHJvdHRsaW5nVGVtcG9yYXJpbHlE
aXNhYmxlZEZvckludGVyYWN0aW9uID0gZmFsc2U7Ci0gICAgICAgIG1faGFzRGVmZXJyZWRGbHVz
aCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1faXNMYXllckZsdXNo
VGhyb3R0bGluZ1RlbXBvcmFyaWx5RGlzYWJsZWRGb3JJbnRlcmFjdGlvbikgewotICAgICAgICBt
X2lzTGF5ZXJGbHVzaFRocm90dGxpbmdUZW1wb3JhcmlseURpc2FibGVkRm9ySW50ZXJhY3Rpb24g
PSBmYWxzZTsKLSAgICAgICAgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2hJbW1lZGlhdGVs
eSgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1fbGF5ZXJGbHVzaFRpbWVy
LmlzQWN0aXZlKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0IFNlY29uZHMgaW5pdGlh
bEZsdXNoRGVsYXkgPSA1MDBfbXM7Ci0gICAgY29uc3QgU2Vjb25kcyBmbHVzaERlbGF5ID0gMTUw
MF9tczsKLSAgICBTZWNvbmRzIHRocm90dGxlRGVsYXkgPSBtX2lzVGhyb3R0bGluZ0xheWVyRmx1
c2hlcyA/IChtX2lzSW5pdGlhbFRocm90dGxlZExheWVyRmx1c2ggPyBpbml0aWFsRmx1c2hEZWxh
eSA6IGZsdXNoRGVsYXkpIDogMF9zOwotICAgIG1faXNJbml0aWFsVGhyb3R0bGVkTGF5ZXJGbHVz
aCA9IGZhbHNlOwotCi0gICAgbV9sYXllckZsdXNoVGltZXIuc3RhcnRPbmVTaG90KHRocm90dGxl
RGVsYXkpOwotfQotCi1ib29sIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphZGp1c3RMYXll
ckZsdXNoVGhyb3R0bGluZyhXZWJDb3JlOjpMYXllckZsdXNoVGhyb3R0bGVTdGF0ZTo6RmxhZ3Mg
ZmxhZ3MpCi17Ci0gICAgaWYgKGZsYWdzICYgV2ViQ29yZTo6TGF5ZXJGbHVzaFRocm90dGxlU3Rh
dGU6OlVzZXJJc0ludGVyYWN0aW5nKQotICAgICAgICBtX2lzTGF5ZXJGbHVzaFRocm90dGxpbmdU
ZW1wb3JhcmlseURpc2FibGVkRm9ySW50ZXJhY3Rpb24gPSB0cnVlOwotCi0gICAgYm9vbCB3YXNU
aHJvdHRsaW5nTGF5ZXJGbHVzaGVzID0gbV9pc1Rocm90dGxpbmdMYXllckZsdXNoZXM7Ci0gICAg
bV9pc1Rocm90dGxpbmdMYXllckZsdXNoZXMgPSBmbGFncyAmIFdlYkNvcmU6OkxheWVyRmx1c2hU
aHJvdHRsZVN0YXRlOjpFbmFibGVkOwotCi0gICAgaWYgKCF3YXNUaHJvdHRsaW5nTGF5ZXJGbHVz
aGVzICYmIG1faXNUaHJvdHRsaW5nTGF5ZXJGbHVzaGVzKQotICAgICAgICBtX2lzSW5pdGlhbFRo
cm90dGxlZExheWVyRmx1c2ggPSB0cnVlOwotCi0gICAgLy8gUmUtc2NoZWR1bGUgdGhlIGZsdXNo
IGlmIHdlIHN0b3BwZWQgdGhyb3R0bGluZy4KLSAgICBpZiAod2FzVGhyb3R0bGluZ0xheWVyRmx1
c2hlcyAmJiAhbV9pc1Rocm90dGxpbmdMYXllckZsdXNoZXMgJiYgbV9sYXllckZsdXNoVGltZXIu
aXNBY3RpdmUoKSkgewotICAgICAgICBtX2xheWVyRmx1c2hUaW1lci5zdG9wKCk7Ci0gICAgICAg
IHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllckZsdXNoKCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVl
OwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpmbHVzaExheWVycygpCi17
Ci0gICAgaWYgKCFtX3Jvb3RMYXllcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKG1faXNG
bHVzaGluZ1N1c3BlbmRlZCkgewotICAgICAgICBtX2hhc0RlZmVycmVkRmx1c2ggPSB0cnVlOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1fd2FpdGluZ0ZvckJhY2tpbmdTdG9y
ZVN3YXApIHsKLSAgICAgICAgbV9oYWRGbHVzaERlZmVycmVkV2hpbGVXYWl0aW5nRm9yQmFja2lu
Z1N0b3JlU3dhcCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBSRUxFQVNF
X0FTU0VSVCghbV9wZW5kaW5nQmFja2luZ1N0b3JlRmx1c2hlciB8fCBtX3BlbmRpbmdCYWNraW5n
U3RvcmVGbHVzaGVyLT5oYXNGbHVzaGVkKCkpOwotCi0gICAgUmVtb3RlTGF5ZXJCYWNraW5nU3Rv
cmVDb2xsZWN0aW9uJiBiYWNraW5nU3RvcmVDb2xsZWN0aW9uID0gbV9yZW1vdGVMYXllclRyZWVD
b250ZXh0LT5iYWNraW5nU3RvcmVDb2xsZWN0aW9uKCk7Ci0gICAgYmFja2luZ1N0b3JlQ29sbGVj
dGlvbi53aWxsRmx1c2hMYXllcnMoKTsKLQotICAgIG1fd2ViUGFnZS5sYXlvdXRJZk5lZWRlZCgp
OwotCi0gICAgRmxvYXRSZWN0IHZpc2libGVSZWN0KEZsb2F0UG9pbnQoKSwgbV92aWV3U2l6ZSk7
Ci0gICAgaWYgKG1fc2Nyb2xsZWRWaWV3RXhwb3NlZFJlY3QpCi0gICAgICAgIHZpc2libGVSZWN0
LmludGVyc2VjdChtX3Njcm9sbGVkVmlld0V4cG9zZWRSZWN0LnZhbHVlKCkpOwotCi0gICAgUmVm
UHRyPFdlYlBhZ2U+IHJldGFpbmVkUGFnZSA9ICZtX3dlYlBhZ2U7Ci0gICAgW0NBVHJhbnNhY3Rp
b24gYWRkQ29tbWl0SGFuZGxlcjpbcmV0YWluZWRQYWdlXSB7Ci0gICAgICAgIGlmIChQYWdlKiBj
b3JlUGFnZSA9IHJldGFpbmVkUGFnZS0+Y29yZVBhZ2UoKSkgewotICAgICAgICAgICAgaWYgKEZy
YW1lKiBjb3JlRnJhbWUgPSByZXRhaW5lZFBhZ2UtPm1haW5GcmFtZSgpKQotICAgICAgICAgICAg
ICAgIGNvcmVQYWdlLT5pbnNwZWN0b3JDb250cm9sbGVyKCkuZGlkQ29tcG9zaXRlKCpjb3JlRnJh
bWUpOwotICAgICAgICB9Ci0gICAgfSBmb3JQaGFzZTprQ0FUcmFuc2FjdGlvblBoYXNlUG9zdENv
bW1pdF07Ci0KLSAgICBtX3dlYlBhZ2UubWFpbkZyYW1lVmlldygpLT5mbHVzaENvbXBvc2l0aW5n
U3RhdGVJbmNsdWRpbmdTdWJmcmFtZXMoKTsKLQotICAgIC8vIEJlY2F1c2Ugb3VyIHZpZXctcmVs
YXRpdmUgb3ZlcmxheSByb290IGxheWVyIGlzIG5vdCBhdHRhY2hlZCB0byB0aGUgRnJhbWVWaWV3
J3MgR3JhcGhpY3NMYXllciB0cmVlLCB3ZSBuZWVkIHRvIGZsdXNoIGl0IG1hbnVhbGx5LgotICAg
IGlmIChtX3ZpZXdPdmVybGF5Um9vdExheWVyKQotICAgICAgICBtX3ZpZXdPdmVybGF5Um9vdExh
eWVyLT5mbHVzaENvbXBvc2l0aW5nU3RhdGUodmlzaWJsZVJlY3QpOwotCi0gICAgbV9yb290TGF5
ZXItPmZsdXNoQ29tcG9zaXRpbmdTdGF0ZUZvclRoaXNMYXllck9ubHkoKTsKLQotICAgIC8vIEZJ
WE1FOiBNaW5pbWl6ZSB0aGVzZSB0cmFuc2FjdGlvbnMgaWYgbm90aGluZyBjaGFuZ2VkLgotICAg
IFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uIGxheWVyVHJhbnNhY3Rpb247Ci0gICAgbGF5ZXJU
cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbklEKHRha2VOZXh0VHJhbnNhY3Rpb25JRCgpKTsKLSAg
ICBsYXllclRyYW5zYWN0aW9uLnNldENhbGxiYWNrSURzKFdURk1vdmUobV9wZW5kaW5nQ2FsbGJh
Y2tJRHMpKTsKLSAgICBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQtPnNldE5leHRGbHVzaElzRm9y
SW1tZWRpYXRlUGFpbnQobV9uZXh0Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50KTsKLSAgICBtX3Jl
bW90ZUxheWVyVHJlZUNvbnRleHQtPmJ1aWxkVHJhbnNhY3Rpb24obGF5ZXJUcmFuc2FjdGlvbiwg
KmRvd25jYXN0PEdyYXBoaWNzTGF5ZXJDQVJlbW90ZT4oKm1fcm9vdExheWVyKS5wbGF0Zm9ybUNB
TGF5ZXIoKSk7Ci0gICAgbV9yZW1vdGVMYXllclRyZWVDb250ZXh0LT5zZXROZXh0Rmx1c2hJc0Zv
ckltbWVkaWF0ZVBhaW50KGZhbHNlKTsKLSAgICBiYWNraW5nU3RvcmVDb2xsZWN0aW9uLndpbGxD
b21taXRMYXllclRyZWUobGF5ZXJUcmFuc2FjdGlvbik7Ci0gICAgbV93ZWJQYWdlLndpbGxDb21t
aXRMYXllclRyZWUobGF5ZXJUcmFuc2FjdGlvbik7Ci0KLSAgICBsYXllclRyYW5zYWN0aW9uLnNl
dE5ld2x5UmVhY2hlZExheW91dE1pbGVzdG9uZXMobV9wZW5kaW5nTmV3bHlSZWFjaGVkTGF5b3V0
TWlsZXN0b25lcyk7Ci0gICAgbV9wZW5kaW5nTmV3bHlSZWFjaGVkTGF5b3V0TWlsZXN0b25lcyA9
IDA7Ci0KLSAgICBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvclRyYW5zYWN0aW9uIHNjcm9sbGlu
Z1RyYW5zYWN0aW9uOwotI2lmIEVOQUJMRShBU1lOQ19TQ1JPTExJTkcpCi0gICAgaWYgKG1fd2Vi
UGFnZS5zY3JvbGxpbmdDb29yZGluYXRvcigpKQotICAgICAgICBkb3duY2FzdDxSZW1vdGVTY3Jv
bGxpbmdDb29yZGluYXRvcj4oKm1fd2ViUGFnZS5zY3JvbGxpbmdDb29yZGluYXRvcigpKS5idWls
ZFRyYW5zYWN0aW9uKHNjcm9sbGluZ1RyYW5zYWN0aW9uKTsKLSNlbmRpZgotCi0gICAgbV9uZXh0
Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50ID0gZmFsc2U7Ci0gICAgbV93YWl0aW5nRm9yQmFja2lu
Z1N0b3JlU3dhcCA9IHRydWU7Ci0KLSAgICBtX3dlYlBhZ2Uuc2VuZChNZXNzYWdlczo6UmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWFQcm94eTo6V2lsbENvbW1pdExheWVyVHJlZShsYXllclRyYW5z
YWN0aW9uLnRyYW5zYWN0aW9uSUQoKSkpOwotCi0gICAgTWVzc2FnZXM6OlJlbW90ZUxheWVyVHJl
ZURyYXdpbmdBcmVhUHJveHk6OkNvbW1pdExheWVyVHJlZSBtZXNzYWdlKGxheWVyVHJhbnNhY3Rp
b24sIHNjcm9sbGluZ1RyYW5zYWN0aW9uKTsKLSAgICBhdXRvIGNvbW1pdEVuY29kZXIgPSBzdGQ6
Om1ha2VfdW5pcXVlPElQQzo6RW5jb2Rlcj4oTWVzc2FnZXM6OlJlbW90ZUxheWVyVHJlZURyYXdp
bmdBcmVhUHJveHk6OkNvbW1pdExheWVyVHJlZTo6cmVjZWl2ZXJOYW1lKCksIE1lc3NhZ2VzOjpS
ZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYVByb3h5OjpDb21taXRMYXllclRyZWU6Om5hbWUoKSwg
bV93ZWJQYWdlLnBhZ2VJRCgpKTsKLSAgICBjb21taXRFbmNvZGVyLT5lbmNvZGUobWVzc2FnZS5h
cmd1bWVudHMoKSk7Ci0KLSAgICAvLyBGSVhNRTogTW92ZSBhbGwgYmFja2luZyBzdG9yZSBmbHVz
aGluZyBtYW5hZ2VtZW50IHRvIFJlbW90ZUxheWVyQmFja2luZ1N0b3JlQ29sbGVjdGlvbi4KLSAg
ICBib29sIGhhZEFueUNoYW5nZWRCYWNraW5nU3RvcmUgPSBmYWxzZTsKLSAgICBWZWN0b3I8UmV0
YWluUHRyPENHQ29udGV4dFJlZj4+IGNvbnRleHRzVG9GbHVzaDsKLSAgICBmb3IgKGF1dG8mIGxh
eWVyIDogbGF5ZXJUcmFuc2FjdGlvbi5jaGFuZ2VkTGF5ZXJzKCkpIHsKLSAgICAgICAgaWYgKGxh
eWVyLT5wcm9wZXJ0aWVzKCkuY2hhbmdlZFByb3BlcnRpZXMgJiBSZW1vdGVMYXllclRyZWVUcmFu
c2FjdGlvbjo6TGF5ZXJDaGFuZ2VzOjpCYWNraW5nU3RvcmVDaGFuZ2VkKSB7Ci0gICAgICAgICAg
ICBoYWRBbnlDaGFuZ2VkQmFja2luZ1N0b3JlID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChsYXll
ci0+cHJvcGVydGllcygpLmJhY2tpbmdTdG9yZSkgewotICAgICAgICAgICAgICAgIGlmIChhdXRv
IGNvbnRleHRQZW5kaW5nRmx1c2ggPSBsYXllci0+cHJvcGVydGllcygpLmJhY2tpbmdTdG9yZS0+
dGFrZUZyb250Q29udGV4dFBlbmRpbmdGbHVzaCgpKQotICAgICAgICAgICAgICAgICAgICBjb250
ZXh0c1RvRmx1c2guYXBwZW5kKGNvbnRleHRQZW5kaW5nRmx1c2gpOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0KLSAgICAgICAgbGF5ZXItPmRpZENvbW1pdCgpOwotICAgIH0KLQotICAgIGJh
Y2tpbmdTdG9yZUNvbGxlY3Rpb24uZGlkRmx1c2hMYXllcnMoKTsKLQotICAgIGlmIChoYWRBbnlD
aGFuZ2VkQmFja2luZ1N0b3JlKQotICAgICAgICBiYWNraW5nU3RvcmVDb2xsZWN0aW9uLnNjaGVk
dWxlVm9sYXRpbGl0eVRpbWVyKCk7Ci0KLSAgICBSZWZQdHI8QmFja2luZ1N0b3JlRmx1c2hlcj4g
YmFja2luZ1N0b3JlRmx1c2hlciA9IEJhY2tpbmdTdG9yZUZsdXNoZXI6OmNyZWF0ZShXZWJQcm9j
ZXNzOjpzaW5nbGV0b24oKS5wYXJlbnRQcm9jZXNzQ29ubmVjdGlvbigpLCBXVEZNb3ZlKGNvbW1p
dEVuY29kZXIpLCBXVEZNb3ZlKGNvbnRleHRzVG9GbHVzaCkpOwotICAgIG1fcGVuZGluZ0JhY2tp
bmdTdG9yZUZsdXNoZXIgPSBiYWNraW5nU3RvcmVGbHVzaGVyOwotCi0gICAgdWludDY0X3QgcGFn
ZUlEID0gbV93ZWJQYWdlLnBhZ2VJRCgpOwotICAgIGRpc3BhdGNoX2FzeW5jKG1fY29tbWl0UXVl
dWUsIFtiYWNraW5nU3RvcmVGbHVzaGVyLCBwYWdlSURdIHsKLSAgICAgICAgYmFja2luZ1N0b3Jl
Rmx1c2hlci0+Zmx1c2goKTsKLQotICAgICAgICBNb25vdG9uaWNUaW1lIHRpbWVzdGFtcCA9IE1v
bm90b25pY1RpbWU6Om5vdygpOwotICAgICAgICBkaXNwYXRjaF9hc3luYyhkaXNwYXRjaF9nZXRf
bWFpbl9xdWV1ZSgpLCBbcGFnZUlELCB0aW1lc3RhbXBdIHsKLSAgICAgICAgICAgIGlmIChXZWJQ
YWdlKiB3ZWJQYWdlID0gV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkud2ViUGFnZShwYWdlSUQpKQot
ICAgICAgICAgICAgICAgIHdlYlBhZ2UtPmRpZEZsdXNoTGF5ZXJUcmVlQXRUaW1lKHRpbWVzdGFt
cCk7Ci0gICAgICAgIH0pOwotICAgIH0pOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdp
bmdBcmVhOjpkaWRVcGRhdGUoKQotewotICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgYSBj
b3VudGVkIHJlcGxhY2VtZW50IGZvciBzZXRMYXllclRyZWVTdGF0ZUlzRnJvemVuLCBidXQKLSAg
ICAvLyB0aGUgY2FsbGVycyBvZiB0aGF0IGZ1bmN0aW9uIGFyZSBub3Qgc3RyaWN0bHkgcGFpcmVk
LgotCi0gICAgbV93YWl0aW5nRm9yQmFja2luZ1N0b3JlU3dhcCA9IGZhbHNlOwotCi0gICAgaWYg
KG1faGFkRmx1c2hEZWZlcnJlZFdoaWxlV2FpdGluZ0ZvckJhY2tpbmdTdG9yZVN3YXApIHsKLSAg
ICAgICAgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKTsKLSAgICAgICAgbV9oYWRGbHVz
aERlZmVycmVkV2hpbGVXYWl0aW5nRm9yQmFja2luZ1N0b3JlU3dhcCA9IGZhbHNlOwotICAgIH0K
LQotICAgIC8vIFRoaXMgZW1wdHkgdHJhbnNhY3Rpb24gc2VydmVzIHRvIHRyaWdnZXIgQ0EncyBn
YXJiYWdlIGNvbGxlY3Rpb24gb2YgSU9TdXJmYWNlcy4gU2VlIDxyZGFyOi8vcHJvYmxlbS8xNjEx
MDY4Nz4KLSAgICBbQ0FUcmFuc2FjdGlvbiBiZWdpbl07Ci0gICAgW0NBVHJhbnNhY3Rpb24gY29t
bWl0XTsKLQotICAgIEhhc2hTZXQ8UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9y
Kj4gbW9uaXRvcnNUb05vdGlmeSA9IG1fZGlzcGxheVJlZnJlc2hNb25pdG9yczsKLSAgICBBU1NF
UlQoIW1fZGlzcGxheVJlZnJlc2hNb25pdG9yc1RvTm90aWZ5KTsKLSAgICBtX2Rpc3BsYXlSZWZy
ZXNoTW9uaXRvcnNUb05vdGlmeSA9ICZtb25pdG9yc1RvTm90aWZ5OwotICAgIHdoaWxlICghbW9u
aXRvcnNUb05vdGlmeS5pc0VtcHR5KCkpCi0gICAgICAgIG1vbml0b3JzVG9Ob3RpZnkudGFrZUFu
eSgpLT5kaWRVcGRhdGVMYXllcnMoKTsKLSAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnNUb05v
dGlmeSA9IG51bGxwdHI7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6Om1h
aW5GcmFtZUNvbnRlbnRTaXplQ2hhbmdlZChjb25zdCBJbnRTaXplJiBjb250ZW50c1NpemUpCi17
Ci0gICAgbV9yb290TGF5ZXItPnNldFNpemUoY29udGVudHNTaXplKTsKLX0KLQotYm9vbCBSZW1v
dGVMYXllclRyZWVEcmF3aW5nQXJlYTo6bWFya0xheWVyc1ZvbGF0aWxlSW1tZWRpYXRlbHlJZlBv
c3NpYmxlKCkKLXsKLSAgICByZXR1cm4gbV9yZW1vdGVMYXllclRyZWVDb250ZXh0LT5iYWNraW5n
U3RvcmVDb2xsZWN0aW9uKCkubWFya0FsbEJhY2tpbmdTdG9yZVZvbGF0aWxlSW1tZWRpYXRlbHlJ
ZlBvc3NpYmxlKCk7Ci19Ci0KLVJlZjxSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6QmFja2lu
Z1N0b3JlRmx1c2hlcj4gUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OkJhY2tpbmdTdG9yZUZs
dXNoZXI6OmNyZWF0ZShJUEM6OkNvbm5lY3Rpb24qIGNvbm5lY3Rpb24sIHN0ZDo6dW5pcXVlX3B0
cjxJUEM6OkVuY29kZXI+IGVuY29kZXIsIFZlY3RvcjxSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPj4g
Y29udGV4dHNUb0ZsdXNoKQotewotICAgIHJldHVybiBhZG9wdFJlZigqbmV3IFJlbW90ZUxheWVy
VHJlZURyYXdpbmdBcmVhOjpCYWNraW5nU3RvcmVGbHVzaGVyKGNvbm5lY3Rpb24sIFdURk1vdmUo
ZW5jb2RlciksIFdURk1vdmUoY29udGV4dHNUb0ZsdXNoKSkpOwotfQotCi1SZW1vdGVMYXllclRy
ZWVEcmF3aW5nQXJlYTo6QmFja2luZ1N0b3JlRmx1c2hlcjo6QmFja2luZ1N0b3JlRmx1c2hlcihJ
UEM6OkNvbm5lY3Rpb24qIGNvbm5lY3Rpb24sIHN0ZDo6dW5pcXVlX3B0cjxJUEM6OkVuY29kZXI+
IGVuY29kZXIsIFZlY3RvcjxSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPj4gY29udGV4dHNUb0ZsdXNo
KQotICAgIDogbV9jb25uZWN0aW9uKGNvbm5lY3Rpb24pCi0gICAgLCBtX2NvbW1pdEVuY29kZXIo
V1RGTW92ZShlbmNvZGVyKSkKLSAgICAsIG1fY29udGV4dHNUb0ZsdXNoKFdURk1vdmUoY29udGV4
dHNUb0ZsdXNoKSkKLSAgICAsIG1faGFzRmx1c2hlZChmYWxzZSkKLXsKLX0KLQotdm9pZCBSZW1v
dGVMYXllclRyZWVEcmF3aW5nQXJlYTo6QmFja2luZ1N0b3JlRmx1c2hlcjo6Zmx1c2goKQotewot
ICAgIEFTU0VSVCghbV9oYXNGbHVzaGVkKTsKLQotICAgIFRyYWNlU2NvcGUgdHJhY2luZ1Njb3Bl
KEJhY2tpbmdTdG9yZUZsdXNoU3RhcnQsIEJhY2tpbmdTdG9yZUZsdXNoRW5kKTsKLSAgICAKLSAg
ICBmb3IgKGF1dG8mIGNvbnRleHQgOiBtX2NvbnRleHRzVG9GbHVzaCkKLSAgICAgICAgQ0dDb250
ZXh0Rmx1c2goY29udGV4dC5nZXQoKSk7Ci0gICAgbV9oYXNGbHVzaGVkID0gdHJ1ZTsKLQotICAg
IG1fY29ubmVjdGlvbi0+c2VuZE1lc3NhZ2UoV1RGTW92ZShtX2NvbW1pdEVuY29kZXIpLCB7IH0p
OwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphY3Rpdml0eVN0YXRlRGlk
Q2hhbmdlKEFjdGl2aXR5U3RhdGU6OkZsYWdzLCBib29sIHdhbnRzRGlkVXBkYXRlQWN0aXZpdHlT
dGF0ZSwgY29uc3QgVmVjdG9yPENhbGxiYWNrSUQ+JikKLXsKLSAgICAvLyBGSVhNRTogU2hvdWxk
IHdlIHN1c3BlbmQgcGFpbnRpbmcgd2hpbGUgbm90IHZpc2libGUsIGxpa2UgVGlsZWRDb3JlQW5p
bWF0aW9uRHJhd2luZ0FyZWE/IFByb2JhYmx5LgotCi0gICAgaWYgKHdhbnRzRGlkVXBkYXRlQWN0
aXZpdHlTdGF0ZSkgewotICAgICAgICBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQgPSB0
cnVlOwotICAgICAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaEltbWVkaWF0ZWx5KCk7
Ci0gICAgfQotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphZGRUcmFuc2Fj
dGlvbkNhbGxiYWNrSUQoQ2FsbGJhY2tJRCBjYWxsYmFja0lEKQotewotICAgIC8vIEFzc3VtZSB0
aGF0IGlmIHNvbWVvbmUgaXMgbGlzdGVuaW5nIGZvciB0aGlzIHRyYW5zYWN0aW9uJ3MgY29tcGxl
dGlvbiwgdGhhdCB0aGV5IHdhbnQgaXQgdG8KLSAgICAvLyBiZSBhICJjb21wbGV0ZSIgcGFpbnQg
KGluY2x1ZGluZyBpbWFnZXMgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBhc3luY2hyb25vdXNseSBk
ZWNvZGluZykuCi0gICAgbV9uZXh0Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50ID0gdHJ1ZTsKLQot
ICAgIG1fcGVuZGluZ0NhbGxiYWNrSURzLmFwcGVuZChzdGF0aWNfY2FzdDxSZW1vdGVMYXllclRy
ZWVUcmFuc2FjdGlvbjo6VHJhbnNhY3Rpb25DYWxsYmFja0lEPihjYWxsYmFja0lEKSk7Ci0gICAg
c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKTsKLX0KLQotYm9vbCBSZW1vdGVMYXllclRy
ZWVEcmF3aW5nQXJlYTo6ZGlzcGF0Y2hEaWRSZWFjaExheW91dE1pbGVzdG9uZShXZWJDb3JlOjpM
YXlvdXRNaWxlc3RvbmVzIGxheW91dE1pbGVzdG9uZXMpCi17Ci0gICAgbV9wZW5kaW5nTmV3bHlS
ZWFjaGVkTGF5b3V0TWlsZXN0b25lcyB8PSBsYXlvdXRNaWxlc3RvbmVzOwotICAgIHJldHVybiB0
cnVlOwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319706</attachid>
            <date>2017-09-02 01:17:20 -0700</date>
            <delta_ts>2017-09-02 01:41:24 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-176271-20170902011719.patch</filename>
            <type>text/plain</type>
            <size>332303</size>
            <attacher name="Tim Horton">thorton</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjIxNTE0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDIxMDE0YmM0N2FjNjEwZWNj
OTNhNTM3YzQ4OWRhZGRmODQ0ZTA4MmIuLjk3MmY3ZTc3Y2Q1YjdkMmVjNjdmNWU3ZWIzM2Y5Mjg0
ZjZiMzExZTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzUgQEAKKzIwMTctMDktMDIgIFRpbSBIb3J0
b24gIDx0aW1vdGh5X2hvcnRvbkBhcHBsZS5jb20+CisKKyAgICAgICAgTW92ZSBXZWIgUHJvY2Vz
cyBwYXJ0IG9mIHRoZSBSZW1vdGUgTGF5ZXIgVHJlZSBjb2RlIG91dCBvZiBhIE1hYy1zcGVjaWZp
YyBkaXJlY3RvcnkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE3NjI3MQorCisgICAgICAgIFJ1YmJlci1zdGFtcGVkIGJ5IERhbiBCZXJuc3RlaW4uCisK
KyAgICAgICAgVUktc2lkZSBjb21wb3NpdGluZyB3b3JrcyBvbiBhbGwgQ29jb2EgcGxhdGZvcm1z
LCBzbyB0aGUgY29kZSBzaG91bGQKKyAgICAgICAgbm90IGxpdmUgaW5zaWRlIE1hYy8uIEFsc28g
bWVyZ2UgdGhlIFNjcm9sbGluZyBkaXJlY3RvcnkgaW4gaGVyZSwKKyAgICAgICAgc2luY2UgdGhv
c2UgZmlsZXMgYXJlIHZlcnkgcmVsYXRlZC4KKworICAgICAgICAqIFdlYktpdC54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXll
clRyZWUvR3JhcGhpY3NMYXllckNBUmVtb3RlLmNwcDogUmVuYW1lZCBmcm9tIFdlYlByb2Nlc3Mv
V2ViUGFnZS9tYWMvR3JhcGhpY3NMYXllckNBUmVtb3RlLmNwcC4KKyAgICAgICAgKiBXZWJQcm9j
ZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5oOiBSZW5h
bWVkIGZyb20gV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9HcmFwaGljc0xheWVyQ0FSZW1vdGUuaC4K
KyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGUuaDogUmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxh
dGZvcm1DQUFuaW1hdGlvblJlbW90ZS5oLgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9S
ZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5tbTogUmVuYW1lZCBmcm9t
IFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5tbS4KKyAg
ICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXll
clJlbW90ZS5jcHA6IFJlbmFtZWQgZnJvbSBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3Jt
Q0FMYXllclJlbW90ZS5jcHAuCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxh
eWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaDogUmVuYW1lZCBmcm9tIFdlYlByb2Nlc3Mv
V2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlLmguCisgICAgICAgICogV2ViUHJvY2Vz
cy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20uaDog
UmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3Rl
Q3VzdG9tLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9Q
bGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20ubW06IFJlbmFtZWQgZnJvbSBXZWJQcm9jZXNzL1dl
YlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5tbS4KKyAgICAgICAgKiBXZWJQ
cm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVk
QmFja2luZy5jcHA6IFJlbmFtZWQgZnJvbSBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3Jt
Q0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5jcHAuCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQ
YWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuaDog
UmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3Rl
VGlsZWRCYWNraW5nLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVy
VHJlZS9SZW1vdGVMYXllclRyZWVDb250ZXh0Lmg6IFJlbmFtZWQgZnJvbSBXZWJQcm9jZXNzL1dl
YlBhZ2UvbWFjL1JlbW90ZUxheWVyVHJlZUNvbnRleHQuaC4KKyAgICAgICAgKiBXZWJQcm9jZXNz
L1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZUNvbnRleHQubW06IFJlbmFt
ZWQgZnJvbSBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1JlbW90ZUxheWVyVHJlZUNvbnRleHQubW0u
CisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXll
clRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IuaDogUmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvV2Vi
UGFnZS9Db2NvYS9SZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IuaC4KKyAgICAg
ICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZURp
c3BsYXlSZWZyZXNoTW9uaXRvci5tbTogUmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvV2ViUGFnZS9D
b2NvYS9SZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IubW0uCisgICAgICAgICog
V2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVEcmF3aW5n
QXJlYS5oOiBSZW5hbWVkIGZyb20gV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXllclRy
ZWVEcmF3aW5nQXJlYS5oLgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXll
clRyZWUvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEubW06IFJlbmFtZWQgZnJvbSBXZWJQcm9j
ZXNzL1dlYlBhZ2UvbWFjL1JlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhLm1tLgorICAgICAgICAq
IFdlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUmVtb3RlU2Nyb2xsaW5nQ29vcmRp
bmF0b3IuaDogUmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGlu
Z0Nvb3JkaW5hdG9yLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVy
VHJlZS9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdlcy5pbjogUmVuYW1lZCBmcm9t
IFdlYlByb2Nlc3MvU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1lc3NhZ2Vz
LmluLgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUmVtb3Rl
U2Nyb2xsaW5nQ29vcmRpbmF0b3IubW06IFJlbmFtZWQgZnJvbSBXZWJQcm9jZXNzL1Njcm9sbGlu
Zy9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tbS4KKwogMjAxNy0wOS0wMiAgQ2FybG9zIEdh
cmNpYSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5jb20+CiAKICAgICAgICAgW0dUS11bV2F5bGFu
ZF0gT3BlbmluZyBGZWRvcmFQcm9qZWN0J3MgcGFzdGViaW4gY2hld3MgQ1BVCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L0Rlcml2ZWRTb3VyY2VzLm1ha2UgYi9Tb3VyY2UvV2ViS2l0L0Rlcml2
ZWRTb3VyY2VzLm1ha2UKaW5kZXggYmNkNTVjODc1YmVhZTEyZTNkNzNjNWE3YzVlNWY5OTFjODIx
NzYyNi4uZjc2MThiMWJjMmUzNTdlMTcwZjU4NmNhMWQyMjJjNDE5YTU0MjVkNyAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYktpdC9EZXJpdmVkU291cmNlcy5tYWtlCisrKyBiL1NvdXJjZS9XZWJLaXQv
RGVyaXZlZFNvdXJjZXMubWFrZQpAQCAtNTQsOCArNTQsOCBAQCBWUEFUSCA9IFwKICAgICAkKFdl
YktpdDIpL1dlYlByb2Nlc3MvTm90aWZpY2F0aW9ucyBcCiAgICAgJChXZWJLaXQyKS9XZWJQcm9j
ZXNzL09yaWdpbkRhdGEgXAogICAgICQoV2ViS2l0MikvV2ViUHJvY2Vzcy9QbHVnaW5zIFwKKyAg
ICAkKFdlYktpdDIpL1dlYlByb2Nlc3MvUmVtb3RlTGF5ZXJUcmVlIFwKICAgICAkKFdlYktpdDIp
L1dlYlByb2Nlc3MvUmVzb3VyY2VDYWNoZSBcCi0gICAgJChXZWJLaXQyKS9XZWJQcm9jZXNzL1Nj
cm9sbGluZyBcCiAgICAgJChXZWJLaXQyKS9XZWJQcm9jZXNzL1N0b3JhZ2UgXAogICAgICQoV2Vi
S2l0MikvV2ViUHJvY2Vzcy9Vc2VyQ29udGVudCBcCiAgICAgJChXZWJLaXQyKS9XZWJQcm9jZXNz
L1dlYkNvcmVTdXBwb3J0IFwKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvUGxhdGZvcm1NYWMu
Y21ha2UgYi9Tb3VyY2UvV2ViS2l0L1BsYXRmb3JtTWFjLmNtYWtlCmluZGV4IDllZmJlOGU2NWNk
MzkyZWJmODMzZTI5MjIzNjc2OTZmMWIyMTBjNGUuLjNlMjg5ODMyZGI5M2M0ZjQwMDcxMGQ1YmM2
YTZmNzVjY2VkODhiNTYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvUGxhdGZvcm1NYWMuY21h
a2UKKysrIGIvU291cmNlL1dlYktpdC9QbGF0Zm9ybU1hYy5jbWFrZQpAQCAtMzQ3LDcgKzM0Nywx
NSBAQCBsaXN0KEFQUEVORCBXZWJLaXQyX1NPVVJDRVMKICAgICBXZWJQcm9jZXNzL1BsdWdpbnMv
UERGL1BERlBsdWdpblBhc3N3b3JkRmllbGQubW0KICAgICBXZWJQcm9jZXNzL1BsdWdpbnMvUERG
L1BERlBsdWdpblRleHRBbm5vdGF0aW9uLm1tCiAKLSAgICBXZWJQcm9jZXNzL1Njcm9sbGluZy9S
ZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tbQorICAgIFdlYlByb2Nlc3MvUmVtb3RlTGF5ZXJU
cmVlL0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5jcHAKKyAgICBXZWJQcm9jZXNzL1JlbW90ZUxheWVy
VHJlZS9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLm1tCisgICAgV2ViUHJvY2Vzcy9SZW1vdGVM
YXllclRyZWUvUGxhdGZvcm1DQUxheWVyUmVtb3RlLmNwcAorICAgIFdlYlByb2Nlc3MvUmVtb3Rl
TGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5tbQorICAgIFdlYlByb2Nlc3Mv
UmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5jcHAKKyAg
ICBXZWJQcm9jZXNzL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVDb250ZXh0Lm1tCisg
ICAgV2ViUHJvY2Vzcy9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJl
c2hNb25pdG9yLm1tCisgICAgV2ViUHJvY2Vzcy9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJU
cmVlRHJhd2luZ0FyZWEubW0KKyAgICBXZWJQcm9jZXNzL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVT
Y3JvbGxpbmdDb29yZGluYXRvci5tbQogCiAgICAgV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9X
ZWJQYXN0ZWJvYXJkT3ZlcnJpZGVzLmNwcAogICAgIFdlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQv
V2ViVmFsaWRhdGlvbk1lc3NhZ2VDbGllbnQuY3BwCkBAIC0zNjIsMTcgKzM3MCw5IEBAIGxpc3Qo
QVBQRU5EIFdlYktpdDJfU09VUkNFUwogCiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL1ZpZXdHZXN0
dXJlR2VvbWV0cnlDb2xsZWN0b3IuY3BwCiAKLSAgICBXZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2Ev
UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yLm1tCiAgICAgV2ViUHJvY2Vzcy9X
ZWJQYWdlL0NvY29hL1dlYlBhZ2VDb2NvYS5tbQogCi0gICAgV2ViUHJvY2Vzcy9XZWJQYWdlL21h
Yy9HcmFwaGljc0xheWVyQ0FSZW1vdGUuY3BwCiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9Q
YWdlQmFubmVyTWFjLm1tCi0gICAgV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBQW5p
bWF0aW9uUmVtb3RlLm1tCi0gICAgV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5
ZXJSZW1vdGUuY3BwCi0gICAgV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGVDdXN0b20ubW0KLSAgICBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXll
clJlbW90ZVRpbGVkQmFja2luZy5jcHAKLSAgICBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1JlbW90
ZUxheWVyVHJlZUNvbnRleHQubW0KLSAgICBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1JlbW90ZUxh
eWVyVHJlZURyYXdpbmdBcmVhLm1tCiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9UaWxlZENv
cmVBbmltYXRpb25EcmF3aW5nQXJlYS5tbQogICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvV0tB
Y2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdEJhc2UubW0KICAgICBXZWJQcm9jZXNzL1dlYlBhZ2Uv
bWFjL1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RNYWMubW0KZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvV2ViS2l0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9Tb3VyY2UvV2ViS2l0
L1dlYktpdC54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IGFlYmM0NzZiMGNjNzA0Mzdm
YzQ5OGM0OWUyNTFhYjliOGNhNzc5NTkuLmRkZjMwOTMxZjc4N2JlYzI5MzEyMmZiNmRmNjAyODRk
MjdmNGE5NjkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViS2l0Lnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oKKysrIGIvU291cmNlL1dlYktpdC9XZWJLaXQueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvagpAQCAtMjI3Nyw5ICsyMjc3LDkgQEAKIAkJMEYxNzRBQTYxNDJBQUM2MTAwMzkyNTBG
IC8qIFdLR2VvbWV0cnkuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
V0tHZW9tZXRyeS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGM0M3MjU3MTk2
RjVGNTAwMEFFREQwQyAvKiBXS0luc3BlY3RvckhpZ2hsaWdodFZpZXcubW0gKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBXS0luc3BlY3RvckhpZ2hsaWdodFZpZXcubW07
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGM0M3MjU5MTk2RjVGNjgwMEFFREQwQyAv
KiBXS0luc3BlY3RvckhpZ2hsaWdodFZpZXcuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gV0tJbnNwZWN0b3JIaWdobGlnaHRWaWV3Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07Ci0JCTBGNTk0NzhEMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1vdGVTY3JvbGxpbmdDb29yZGlu
YXRvci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBSZW1vdGVTY3JvbGxpbmdD
b29yZGluYXRvci5oOyBwYXRoID0gU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9y
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTBGNTk0NzhFMTg3QjNCM0EwMDQzNzg1
NyAvKiBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdlcy5pbiAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRl
eHQ7IG5hbWUgPSBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdlcy5pbjsgcGF0aCA9
IFNjcm9sbGluZy9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdlcy5pbjsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJMEY1OTQ3OEYxODdCM0IzQTAwNDM3ODU3IC8qIFJlbW90
ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3Bw
OyBuYW1lID0gUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubW07IHBhdGggPSBTY3JvbGxpbmcv
UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCTBGNTk0NzhEMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRv
ci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZW1vdGVTY3JvbGxpbmdDb29y
ZGluYXRvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRjU5NDc4RTE4N0IzQjNB
MDA0Mzc4NTcgLyogUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMuaW4gKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSB0ZXh0OyBwYXRoID0gUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMuaW47
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGNTk0NzhGMTg3QjNCM0EwMDQzNzg1NyAv
KiBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
Lm9iamNwcDsgcGF0aCA9IFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1tOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQkwRjU5NDc5NDE4N0IzQjYwMDA0Mzc4NTcgLyogUmVtb3RlU2Ny
b2xsaW5nQ29vcmRpbmF0b3JQcm94eS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IG5hbWUgPSBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvclByb3h5LmNwcDsgcGF0aCA9IFNjcm9s
bGluZy9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvclByb3h5LmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJMEY1OTQ3OTUxODdCM0I2MDAwNDM3ODU3IC8qIFJlbW90ZVNjcm9sbGlu
Z0Nvb3JkaW5hdG9yUHJveHkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gUmVt
b3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JQcm94eS5oOyBwYXRoID0gU2Nyb2xsaW5nL1JlbW90ZVNj
cm9sbGluZ0Nvb3JkaW5hdG9yUHJveHkuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
MEY1OTQ3OTYxODdCM0I2MDAwNDM3ODU3IC8qIFJlbW90ZVNjcm9sbGluZ1RyZWUuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gUmVtb3RlU2Nyb2xsaW5nVHJlZS5jcHA7
IHBhdGggPSBTY3JvbGxpbmcvUmVtb3RlU2Nyb2xsaW5nVHJlZS5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CkBAIC00NjMxLDE2ICs0NjMxLDYgQEAKIAkJCXRhYldpZHRoID0gODsKIAkJ
CXVzZXNUYWJzID0gMDsKIAkJfTsKLQkJMEY1OTQ3OEMxODdCM0IyQTAwNDM3ODU3IC8qIFNjcm9s
bGluZyAqLyA9IHsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJY2hpbGRyZW4gPSAoCi0JCQkJMEY1
OTQ3OEQxODdCM0IzQTAwNDM3ODU3IC8qIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmggKi8s
Ci0JCQkJMEY1OTQ3OEUxODdCM0IzQTAwNDM3ODU3IC8qIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5h
dG9yLm1lc3NhZ2VzLmluICovLAotCQkJCTBGNTk0NzhGMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1v
dGVTY3JvbGxpbmdDb29yZGluYXRvci5tbSAqLywKLQkJCSk7Ci0JCQluYW1lID0gU2Nyb2xsaW5n
OwotCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKLQkJfTsKIAkJMEY1OTQ3OTMxODdCM0I0QzAw
NDM3ODU3IC8qIFNjcm9sbGluZyAqLyA9IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJY2hpbGRy
ZW4gPSAoCkBAIC01NDMzLDYgKzU0MjMsMzIgQEAKIAkJCW5hbWUgPSBDdXN0b21Qcm90b2NvbHM7
CiAJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwogCQl9OworCQkyRDE1NTFBODFGNUE5NTIyMDAw
NkUzRkUgLyogUmVtb3RlTGF5ZXJUcmVlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQlj
aGlsZHJlbiA9ICgKKwkJCQkyREEwNDlCNTE4MENDRDBBMDBBQUZBOUUgLyogR3JhcGhpY3NMYXll
ckNBUmVtb3RlLmNwcCAqLywKKwkJCQkyREEwNDlCNjE4MENDRDBBMDBBQUZBOUUgLyogR3JhcGhp
Y3NMYXllckNBUmVtb3RlLmggKi8sCisJCQkJMEY1RTIwMDIxOEU3NzA1MTAwM0VDM0U1IC8qIFBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGUuaCAqLywKKwkJCQkwRjVFMjAwMTE4RTc3MDUxMDAzRUMz
RTUgLyogUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5tbSAqLywKKwkJCQkyREEwNDlCMTE4MEND
Q0QzMDBBQUZBOUUgLyogUGxhdGZvcm1DQUxheWVyUmVtb3RlLmNwcCAqLywKKwkJCQkyREEwNDlC
MjE4MENDQ0QzMDBBQUZBOUUgLyogUGxhdGZvcm1DQUxheWVyUmVtb3RlLmggKi8sCisJCQkJMkQ4
NzEwMTUxODI4NDE1RDAwMThGQTAxIC8qIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5oICov
LAorCQkJCTJEODcxMDE0MTgyODQxNUQwMDE4RkEwMSAvKiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVD
dXN0b20ubW0gKi8sCisJCQkJMkQ4OTQ5RUUxODIwNDRGNjAwRTg5OEFBIC8qIFBsYXRmb3JtQ0FM
YXllclJlbW90ZVRpbGVkQmFja2luZy5jcHAgKi8sCisJCQkJMkQ4OTQ5RUYxODIwNDRGNjAwRTg5
OEFBIC8qIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5oICovLAorCQkJCTFBQjE2
QUU4MTY0QjNBODgwMDI5MEQ2MiAvKiBSZW1vdGVMYXllclRyZWVDb250ZXh0LmggKi8sCisJCQkJ
MUFCMTZBRTcxNjRCM0E4ODAwMjkwRDYyIC8qIFJlbW90ZUxheWVyVHJlZUNvbnRleHQubW0gKi8s
CisJCQkJMkQyOUVDQ0UxOTJGMkMyRTAwOTg0Qjc4IC8qIFJlbW90ZUxheWVyVHJlZURpc3BsYXlS
ZWZyZXNoTW9uaXRvci5oICovLAorCQkJCTJEMjlFQ0NGMTkyRjJDMkUwMDk4NEI3OCAvKiBSZW1v
dGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IubW0gKi8sCisJCQkJMUFCMTZBREMxNjQ4
NTk4NDAwMjkwRDYyIC8qIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhLmggKi8sCisJCQkJMUFC
MTZBREIxNjQ4NTk4NDAwMjkwRDYyIC8qIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhLm1tICov
LAorCQkJCTBGNTk0NzhEMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1vdGVTY3JvbGxpbmdDb29yZGlu
YXRvci5oICovLAorCQkJCTBGNTk0NzhFMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1vdGVTY3JvbGxp
bmdDb29yZGluYXRvci5tZXNzYWdlcy5pbiAqLywKKwkJCQkwRjU5NDc4RjE4N0IzQjNBMDA0Mzc4
NTcgLyogUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubW0gKi8sCisJCQkpOworCQkJcGF0aCA9
IFJlbW90ZUxheWVyVHJlZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CiAJCTJE
MjhGM0RGMTg4NUNDQjQwMDRCOUVBRSAvKiBpb3MgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsK
IAkJCWNoaWxkcmVuID0gKApAQCAtNTQ0OCw4ICs1NDY0LDYgQEAKIAkJMkQyOUVDQ0QxOTJGMkMy
RTAwOTg0Qjc4IC8qIENvY29hICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJl
biA9ICgKLQkJCQkyRDI5RUNDRTE5MkYyQzJFMDA5ODRCNzggLyogUmVtb3RlTGF5ZXJUcmVlRGlz
cGxheVJlZnJlc2hNb25pdG9yLmggKi8sCi0JCQkJMkQyOUVDQ0YxOTJGMkMyRTAwOTg0Qjc4IC8q
IFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5tbSAqLywKIAkJCQkyREM0Q0Y3
QTFEMkRFMjRCMDBFQ0NDOTQgLyogV2ViUGFnZUNvY29hLm1tICovLAogCQkJKTsKIAkJCXBhdGgg
PSBDb2NvYTsKQEAgLTY2OTEsNyArNjcwNSw2IEBACiAJCQkJNTEwNUIwRDIxNjJGN0E1RTAwRTI3
NzA5IC8qIE5ldHdvcmsgKi8sCiAJCQkJMzEwOTk5NzQxNDZDOEFBODAwMjlERUI5IC8qIE5vdGlm
aWNhdGlvbnMgKFVzZXIpICovLAogCQkJCTFBNkZCN0FBMTFFNjRCNDkwMERCMTM3MSAvKiBQbHVn
aW5zICovLAotCQkJCTBGNTk0NzhDMTg3QjNCMkEwMDQzNzg1NyAvKiBTY3JvbGxpbmcgKi8sCiAJ
CQkJNTExOEU5OTgxRjI5NTI1OTAwM0VGOUY1IC8qIFN0b3JhZ2UgKi8sCiAJCQkJMUFBRjA4QUEx
OTI2OTMwQjAwQjYzOTBDIC8qIFVzZXJDb250ZW50ICovLAogCQkJCUJDMDMyRDVEMTBGNDM3MjIw
MDU4QzE1QSAvKiBXZWJDb3JlU3VwcG9ydCAqLywKQEAgLTY3NjYsNiArNjc3OSw3IEBACiAJCQkJ
MkQyOUVDQ0QxOTJGMkMyRTAwOTg0Qjc4IC8qIENvY29hICovLAogCQkJCTJEQTk0NEI0MTg4NEVB
MkEwMEVEODZEQiAvKiBpb3MgKi8sCiAJCQkJQkM5NjNENkMxMTNERDE5NTAwNTc0QkUyIC8qIG1h
YyAqLywKKwkJCQkyRDE1NTFBODFGNUE5NTIyMDAwNkUzRkUgLyogUmVtb3RlTGF5ZXJUcmVlICov
LAogCQkJCUJDODQ1MkE1MTE2MkM4MDkwMENBQjlCNSAvKiBEcmF3aW5nQXJlYS5jcHAgKi8sCiAJ
CQkJQkM4NDUyQTYxMTYyQzgwOTAwQ0FCOUI1IC8qIERyYXdpbmdBcmVhLmggKi8sCiAJCQkJMUE2
NDIyOEExMkREMDI0NzAwQ0FBRTJDIC8qIERyYXdpbmdBcmVhLm1lc3NhZ2VzLmluICovLApAQCAt
NzYxMCwyMSArNzYyNCw3IEBACiAJCUJDOTYzRDZDMTEzREQxOTUwMDU3NEJFMiAvKiBtYWMgKi8g
PSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKAotCQkJCTJEQTA0OUI1MTgw
Q0NEMEEwMEFBRkE5RSAvKiBHcmFwaGljc0xheWVyQ0FSZW1vdGUuY3BwICovLAotCQkJCTJEQTA0
OUI2MTgwQ0NEMEEwMEFBRkE5RSAvKiBHcmFwaGljc0xheWVyQ0FSZW1vdGUuaCAqLywKIAkJCQk3
QzZEMzdGQTE3MkY1NTVGMDA5RDI4NDcgLyogUGFnZUJhbm5lck1hYy5tbSAqLywKLQkJCQkwRjVF
MjAwMjE4RTc3MDUxMDAzRUMzRTUgLyogUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5oICovLAot
CQkJCTBGNUUyMDAxMThFNzcwNTEwMDNFQzNFNSAvKiBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3Rl
Lm1tICovLAotCQkJCTJEQTA0OUIxMTgwQ0NDRDMwMEFBRkE5RSAvKiBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGUuY3BwICovLAotCQkJCTJEQTA0OUIyMTgwQ0NDRDMwMEFBRkE5RSAvKiBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGUuaCAqLywKLQkJCQkyRDg3MTAxNTE4Mjg0MTVEMDAxOEZBMDEgLyogUGxhdGZv
cm1DQUxheWVyUmVtb3RlQ3VzdG9tLmggKi8sCi0JCQkJMkQ4NzEwMTQxODI4NDE1RDAwMThGQTAx
IC8qIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5tbSAqLywKLQkJCQkyRDg5NDlFRTE4MjA0
NEY2MDBFODk4QUEgLyogUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nLmNwcCAqLywK
LQkJCQkyRDg5NDlFRjE4MjA0NEY2MDBFODk4QUEgLyogUGxhdGZvcm1DQUxheWVyUmVtb3RlVGls
ZWRCYWNraW5nLmggKi8sCi0JCQkJMUFCMTZBRTgxNjRCM0E4ODAwMjkwRDYyIC8qIFJlbW90ZUxh
eWVyVHJlZUNvbnRleHQuaCAqLywKLQkJCQkxQUIxNkFFNzE2NEIzQTg4MDAyOTBENjIgLyogUmVt
b3RlTGF5ZXJUcmVlQ29udGV4dC5tbSAqLywKLQkJCQkxQUIxNkFEQzE2NDg1OTg0MDAyOTBENjIg
LyogUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEuaCAqLywKLQkJCQkxQUIxNkFEQjE2NDg1OTg0
MDAyOTBENjIgLyogUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEubW0gKi8sCiAJCQkJMUFBRjI2
MzcxNDY4N0MzOTAwNEExRThBIC8qIFRpbGVkQ29yZUFuaW1hdGlvbkRyYXdpbmdBcmVhLmggKi8s
CiAJCQkJMUFBRjI2MzYxNDY4N0MzOTAwNEExRThBIC8qIFRpbGVkQ29yZUFuaW1hdGlvbkRyYXdp
bmdBcmVhLm1tICovLAogCQkJCTFDOEUyREFEMTI3OEM1QjIwMEJDN0JEMCAvKiBXZWJJbnNwZWN0
b3JVSU1hYy5tbSAqLywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TY3Jv
bGxpbmcvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9TY3JvbGxpbmcvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaApkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggY2Y1ZGNlZDNiNGM3NDJiYjA5MzZjZjNlOGUzYmVjNDNkMmQyMDE3
MS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L1dlYlByb2Nlc3MvU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmgK
KysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0
LTIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAot
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09O
VFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVm
IFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yX2gKLSNkZWZpbmUgUmVtb3RlU2Nyb2xsaW5nQ29v
cmRpbmF0b3JfaAotCi0jaWYgRU5BQkxFKEFTWU5DX1NDUk9MTElORykKLQotI2luY2x1ZGUgIk1l
c3NhZ2VSZWNlaXZlci5oIgotI2luY2x1ZGUgPFdlYkNvcmUvQXN5bmNTY3JvbGxpbmdDb29yZGlu
YXRvci5oPgotI2luY2x1ZGUgPFdlYkNvcmUvU2Nyb2xsVHlwZXMuaD4KLSNpbmNsdWRlIDxXZWJD
b3JlL1Njcm9sbGluZ0NvbnN0cmFpbnRzLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9UaW1lci5oPgot
Ci1uYW1lc3BhY2UgSVBDIHsKLWNsYXNzIERlY29kZXI7Ci1jbGFzcyBFbmNvZGVyOwotfQotCi1u
YW1lc3BhY2UgV2ViS2l0IHsKLQotY2xhc3MgV2ViUGFnZTsKLWNsYXNzIFJlbW90ZVNjcm9sbGlu
Z0Nvb3JkaW5hdG9yVHJhbnNhY3Rpb247Ci0KLWNsYXNzIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5h
dG9yIDogcHVibGljIFdlYkNvcmU6OkFzeW5jU2Nyb2xsaW5nQ29vcmRpbmF0b3IsIHB1YmxpYyBJ
UEM6Ok1lc3NhZ2VSZWNlaXZlciB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxSZW1vdGVTY3Jv
bGxpbmdDb29yZGluYXRvcj4gY3JlYXRlKFdlYlBhZ2UqIHBhZ2UpCi0gICAgewotICAgICAgICBy
ZXR1cm4gYWRvcHRSZWYoKm5ldyBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcihwYWdlKSk7Ci0g
ICAgfQotCi0gICAgdm9pZCBidWlsZFRyYW5zYWN0aW9uKFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5h
dG9yVHJhbnNhY3Rpb24mKTsKLQotcHJpdmF0ZToKLSAgICBSZW1vdGVTY3JvbGxpbmdDb29yZGlu
YXRvcihXZWJQYWdlKik7Ci0gICAgdmlydHVhbCB+UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3Io
KTsKLQotICAgIGJvb2wgaXNSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcigpIGNvbnN0IG92ZXJy
aWRlIHsgcmV0dXJuIHRydWU7IH0KLSAgICAKLSAgICAvLyBTY3JvbGxpbmdDb29yZGluYXRvcgot
ICAgIGJvb2wgY29vcmRpbmF0ZXNTY3JvbGxpbmdGb3JGcmFtZVZpZXcoY29uc3QgV2ViQ29yZTo6
RnJhbWVWaWV3JikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzY2hlZHVsZVRyZWVTdGF0ZUNv
bW1pdCgpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBpc1J1YmJlckJhbmRJblByb2dyZXNzKCkgY29u
c3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRTY3JvbGxQaW5uaW5nQmVoYXZpb3IoV2ViQ29yZTo6
U2Nyb2xsUGlubmluZ0JlaGF2aW9yKSBvdmVycmlkZTsKLSAgICBib29sIGlzU2Nyb2xsU25hcElu
UHJvZ3Jlc3MoKSBjb25zdCBvdmVycmlkZTsKLQotICAgIC8vIElQQzo6TWVzc2FnZVJlY2VpdmVy
Ci0gICAgdm9pZCBkaWRSZWNlaXZlTWVzc2FnZShJUEM6OkNvbm5lY3Rpb24mLCBJUEM6OkRlY29k
ZXImKSBvdmVycmlkZTsKLSAgICAKLSAgICAvLyBSZXNwb25kIHRvIFVJIHByb2Nlc3MgY2hhbmdl
cy4KLSAgICB2b2lkIHNjcm9sbFBvc2l0aW9uQ2hhbmdlZEZvck5vZGUoV2ViQ29yZTo6U2Nyb2xs
aW5nTm9kZUlELCBjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50JiBzY3JvbGxQb3NpdGlvbiwgYm9v
bCBzeW5jTGF5ZXJQb3NpdGlvbik7Ci0gICAgdm9pZCBjdXJyZW50U25hcFBvaW50SW5kaWNlc0No
YW5nZWRGb3JOb2RlKFdlYkNvcmU6OlNjcm9sbGluZ05vZGVJRCwgdW5zaWduZWQgaG9yaXpvbnRh
bCwgdW5zaWduZWQgdmVydGljYWwpOwotCi0gICAgV2ViUGFnZSogbV93ZWJQYWdlOwotfTsKLQot
fSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfU0NST0xMSU5H
X0NPT1JESU5BVE9SKFdlYktpdDo6UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IsIGlzUmVtb3Rl
U2Nyb2xsaW5nQ29vcmRpbmF0b3IoKSk7Ci0KLSNlbmRpZiAvLyBFTkFCTEUoQVNZTkNfU0NST0xM
SU5HKQotCi0jZW5kaWYgLy8gUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JfaApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1Njcm9sbGluZy9SZW1vdGVTY3JvbGxpbmdDb29y
ZGluYXRvci5tZXNzYWdlcy5pbiBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TY3JvbGxpbmcv
UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMuaW4KZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDJjMDk4YTEwOTcwMjM2N2MzODMzNzFlODhlNWE3NjFkNDVlMTk5YWQuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1Njcm9sbGluZy9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdl
cy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE0
LTIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMg
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCi0jIGFyZSBtZXQ6Ci0jIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAyLiAgUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0jCi0jIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycgQU5ECi0jIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0jIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSMgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IKLSMgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotIyBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIyBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUgotIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIyBPUiBUT1JUIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaWYgRU5BQkxFKEFTWU5DX1NDUk9MTElORykKLQot
bWVzc2FnZXMgLT4gUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IgewotICAgIFNjcm9sbFBvc2l0
aW9uQ2hhbmdlZEZvck5vZGUodWludDY0X3Qgbm9kZUlELCBXZWJDb3JlOjpGbG9hdFBvaW50IHNj
cm9sbFBvc2l0aW9uLCBib29sIHN5bmNMYXllclBvc2l0aW9uKTsKLSAgICBDdXJyZW50U25hcFBv
aW50SW5kaWNlc0NoYW5nZWRGb3JOb2RlKHVpbnQ2NF90IG5vZGVJRCwgdW5zaWduZWQgaG9yaXpv
bnRhbCwgdW5zaWduZWQgdmVydGljYWwpOwotfQotCi0jZW5kaWYgLy8gRU5BQkxFKEFTWU5DX1ND
Uk9MTElORykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TY3JvbGxpbmcv
UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubW0gYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3Mv
U2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1tCmRlbGV0ZWQgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCA4ODY0MTUyNWU1MmI5NzlkZTQwM2E2ZTZhNzEwMmNkM2EyNWQzMjUyLi4w
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJL
aXQvV2ViUHJvY2Vzcy9TY3JvbGxpbmcvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubW0KKysr
IC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNC0y
MDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMg
YGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2ltcG9ydCAi
Y29uZmlnLmgiCi0jaW1wb3J0ICJSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5oIgotCi0jaWYg
RU5BQkxFKEFTWU5DX1NDUk9MTElORykKLQotI2ltcG9ydCAiQXJndW1lbnRDb2RlcnMuaCIKLSNp
bXBvcnQgIkdyYXBoaWNzTGF5ZXJDQVJlbW90ZS5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVl
RHJhd2luZ0FyZWEuaCIKLSNpbXBvcnQgIlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yTWVzc2Fn
ZXMuaCIKLSNpbXBvcnQgIlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yVHJhbnNhY3Rpb24uaCIK
LSNpbXBvcnQgIldlYkNvcmVBcmd1bWVudENvZGVycy5oIgotI2ltcG9ydCAiV2ViUGFnZS5oIgot
I2ltcG9ydCAiV2ViUHJvY2Vzcy5oIgotI2ltcG9ydCA8V2ViQ29yZS9HcmFwaGljc0xheWVyLmg+
Ci0jaW1wb3J0IDxXZWJDb3JlL0ZyYW1lVmlldy5oPgotI2ltcG9ydCA8V2ViQ29yZS9GcmFtZS5o
PgotI2ltcG9ydCA8V2ViQ29yZS9SZW5kZXJMYXllckNvbXBvc2l0b3IuaD4KLSNpbXBvcnQgPFdl
YkNvcmUvUmVuZGVyVmlldy5oPgotI2ltcG9ydCA8V2ViQ29yZS9TY3JvbGxpbmdUcmVlRml4ZWRO
b2RlLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL1Njcm9sbGluZ1RyZWVTdGlja3lOb2RlLmg+Ci0KLXVz
aW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotUmVtb3RlU2Ny
b2xsaW5nQ29vcmRpbmF0b3I6OlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yKFdlYlBhZ2UqIHBh
Z2UpCi0gICAgOiBBc3luY1Njcm9sbGluZ0Nvb3JkaW5hdG9yKHBhZ2UtPmNvcmVQYWdlKCkpCi0g
ICAgLCBtX3dlYlBhZ2UocGFnZSkKLXsKLSAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5hZGRN
ZXNzYWdlUmVjZWl2ZXIoTWVzc2FnZXM6OlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yOjptZXNz
YWdlUmVjZWl2ZXJOYW1lKCksIG1fd2ViUGFnZS0+cGFnZUlEKCksICp0aGlzKTsKLX0KLQotUmVt
b3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I6On5SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcigpCi17
Ci0gICAgV2ViUHJvY2Vzczo6c2luZ2xldG9uKCkucmVtb3ZlTWVzc2FnZVJlY2VpdmVyKE1lc3Nh
Z2VzOjpSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcjo6bWVzc2FnZVJlY2VpdmVyTmFtZSgpLCBt
X3dlYlBhZ2UtPnBhZ2VJRCgpKTsKLX0KLQotdm9pZCBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRv
cjo6c2NoZWR1bGVUcmVlU3RhdGVDb21taXQoKQotewotICAgIG1fd2ViUGFnZS0+ZHJhd2luZ0Fy
ZWEoKS0+c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKTsKLX0KLQotYm9vbCBSZW1vdGVT
Y3JvbGxpbmdDb29yZGluYXRvcjo6Y29vcmRpbmF0ZXNTY3JvbGxpbmdGb3JGcmFtZVZpZXcoY29u
c3QgRnJhbWVWaWV3JiBmcmFtZVZpZXcpIGNvbnN0Ci17Ci0gICAgUmVuZGVyVmlldyogcmVuZGVy
VmlldyA9IGZyYW1lVmlldy5yZW5kZXJWaWV3KCk7Ci0gICAgcmV0dXJuIHJlbmRlclZpZXcgJiYg
cmVuZGVyVmlldy0+dXNlc0NvbXBvc2l0aW5nKCk7Ci19Ci0KLWJvb2wgUmVtb3RlU2Nyb2xsaW5n
Q29vcmRpbmF0b3I6OmlzUnViYmVyQmFuZEluUHJvZ3Jlc3MoKSBjb25zdAotewotICAgIC8vIEZJ
WE1FOiBuZWVkIHRvIG1haW50YWluIHN0YXRlIGluIHRoZSB3ZWIgcHJvY2Vzcz8KLSAgICByZXR1
cm4gZmFsc2U7Ci19Ci0KLWJvb2wgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I6OmlzU2Nyb2xs
U25hcEluUHJvZ3Jlc3MoKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBuZWVkIHRvIG1haW50YWlu
IHN0YXRlIGluIHRoZSB3ZWIgcHJvY2Vzcz8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQg
UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I6OnNldFNjcm9sbFBpbm5pbmdCZWhhdmlvcihTY3Jv
bGxQaW5uaW5nQmVoYXZpb3IpCi17Ci0gICAgLy8gRklYTUU6IHNlbmQgdG8gdGhlIFVJIHByb2Nl
c3MuCi19Ci0KLXZvaWQgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I6OmJ1aWxkVHJhbnNhY3Rp
b24oUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JUcmFuc2FjdGlvbiYgdHJhbnNhY3Rpb24pCi17
Ci0gICAgd2lsbENvbW1pdFRyZWUoKTsKLSAgICB0cmFuc2FjdGlvbi5zZXRTdGF0ZVRyZWVUb0Vu
Y29kZShzY3JvbGxpbmdTdGF0ZVRyZWUoKS0+Y29tbWl0KExheWVyUmVwcmVzZW50YXRpb246OlBs
YXRmb3JtTGF5ZXJJRFJlcHJlc2VudGF0aW9uKSk7Ci19Ci0KLS8vIE5vdGlmaWNhdGlvbiBmcm9t
IHRoZSBVSSBwcm9jZXNzIHRoYXQgd2Ugc2Nyb2xsZWQuCi12b2lkIFJlbW90ZVNjcm9sbGluZ0Nv
b3JkaW5hdG9yOjpzY3JvbGxQb3NpdGlvbkNoYW5nZWRGb3JOb2RlKFNjcm9sbGluZ05vZGVJRCBu
b2RlSUQsIGNvbnN0IEZsb2F0UG9pbnQmIHNjcm9sbFBvc2l0aW9uLCBib29sIHN5bmNMYXllclBv
c2l0aW9uKQotewotICAgIHNjaGVkdWxlVXBkYXRlU2Nyb2xsUG9zaXRpb25BZnRlckFzeW5jU2Ny
b2xsKG5vZGVJRCwgc2Nyb2xsUG9zaXRpb24sIHN0ZDo6bnVsbG9wdCwgZmFsc2UgLyogRklYTUUg
Ki8sIHN5bmNMYXllclBvc2l0aW9uID8gU2Nyb2xsaW5nTGF5ZXJQb3NpdGlvbkFjdGlvbjo6U3lu
YyA6IFNjcm9sbGluZ0xheWVyUG9zaXRpb25BY3Rpb246OlNldCk7Ci19Ci0KLXZvaWQgUmVtb3Rl
U2Nyb2xsaW5nQ29vcmRpbmF0b3I6OmN1cnJlbnRTbmFwUG9pbnRJbmRpY2VzQ2hhbmdlZEZvck5v
ZGUoU2Nyb2xsaW5nTm9kZUlEIG5vZGVJRCwgdW5zaWduZWQgaG9yaXpvbnRhbCwgdW5zaWduZWQg
dmVydGljYWwpCi17Ci0gICAgc2V0QWN0aXZlU2Nyb2xsU25hcEluZGljZXMobm9kZUlELCBob3Jp
em9udGFsLCB2ZXJ0aWNhbCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdAotCi0jZW5kaWYg
Ly8gRU5BQkxFKEFTWU5DX1NDUk9MTElORykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRv
ci5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJU
cmVlRGlzcGxheVJlZnJlc2hNb25pdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDMyYjdmNWFhMTdhMzA2MzhjMmJkMGIwODE0OGNjZmQwN2Q4NjhkYjAuLjAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNz
L1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yLmgKKysr
IC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgVVNFKFJFUVVFU1RfQU5JTUFU
SU9OX0ZSQU1FX0RJU1BMQVlfTU9OSVRPUikKLQotI2luY2x1ZGUgIlJlbW90ZUxheWVyVHJlZURy
YXdpbmdBcmVhLmgiCi0jaW5jbHVkZSA8V2ViQ29yZS9EaXNwbGF5UmVmcmVzaE1vbml0b3IuaD4K
LQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZy
ZXNoTW9uaXRvciA6IHB1YmxpYyBXZWJDb3JlOjpEaXNwbGF5UmVmcmVzaE1vbml0b3IgewotcHVi
bGljOgotICAgIHN0YXRpYyBSZWY8UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9y
PiBjcmVhdGUoV2ViQ29yZTo6UGxhdGZvcm1EaXNwbGF5SUQgZGlzcGxheUlELCBSZW1vdGVMYXll
clRyZWVEcmF3aW5nQXJlYSYgZHJhd2luZ0FyZWEpCi0gICAgewotICAgICAgICByZXR1cm4gYWRv
cHRSZWYoKm5ldyBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IoZGlzcGxheUlE
LCBkcmF3aW5nQXJlYSkpOwotICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIH5SZW1vdGVMYXllclRy
ZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IoKTsKLQotICAgIGJvb2wgcmVxdWVzdFJlZnJlc2hDYWxs
YmFjaygpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBkaWRVcGRhdGVMYXllcnMoKTsKLQotcHJpdmF0
ZToKLSAgICBleHBsaWNpdCBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IoV2Vi
Q29yZTo6UGxhdGZvcm1EaXNwbGF5SUQsIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhJik7Ci0K
LSAgICBXZWFrUHRyPFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhPiBtX2RyYXdpbmdBcmVhOwot
fTsKLQotfQotCi0jZW5kaWYgLy8gVVNFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FX0RJU1BMQVlf
TU9OSVRPUikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0Nv
Y29hL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5tbSBiL1NvdXJjZS9XZWJL
aXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNo
TW9uaXRvci5tbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyZDY1NzE1NTk4Zjc3
NGFiZjllMzQ0OTA3NTcxNjNjYzQ0NTA4Mi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9S
ZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IubW0KKysrIC9kZXYvbnVsbApAQCAt
MSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1l
dDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICov
Ci0KLSNpbXBvcnQgImNvbmZpZy5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJl
ZnJlc2hNb25pdG9yLmgiCi0KLSNpZiBVU0UoUkVRVUVTVF9BTklNQVRJT05fRlJBTUVfRElTUExB
WV9NT05JVE9SKQotCi0jaW1wb3J0IDx3dGYvQ3VycmVudFRpbWUuaD4KLQotdXNpbmcgbmFtZXNw
YWNlIFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1SZW1vdGVMYXllclRyZWVEaXNw
bGF5UmVmcmVzaE1vbml0b3I6OlJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcihQ
bGF0Zm9ybURpc3BsYXlJRCBkaXNwbGF5SUQsIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhJiBk
cmF3aW5nQXJlYSkKLSAgICA6IERpc3BsYXlSZWZyZXNoTW9uaXRvcihkaXNwbGF5SUQpCi0gICAg
LCBtX2RyYXdpbmdBcmVhKGRyYXdpbmdBcmVhLmNyZWF0ZVdlYWtQdHIoKSkKLXsKLX0KLQotUmVt
b3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yOjp+UmVtb3RlTGF5ZXJUcmVlRGlzcGxh
eVJlZnJlc2hNb25pdG9yKCkKLXsKLSAgICBpZiAobV9kcmF3aW5nQXJlYSkKLSAgICAgICAgbV9k
cmF3aW5nQXJlYS0+d2lsbERlc3Ryb3lEaXNwbGF5UmVmcmVzaE1vbml0b3IodGhpcyk7Ci19Ci0K
LWJvb2wgUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yOjpyZXF1ZXN0UmVmcmVz
aENhbGxiYWNrKCkKLXsKLSAgICBpZiAoIW1fZHJhd2luZ0FyZWEgfHwgIWlzQWN0aXZlKCkpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghaXNTY2hlZHVsZWQoKSkKLSAgICAgICAg
c3RhdGljX2Nhc3Q8RHJhd2luZ0FyZWEmPigqbV9kcmF3aW5nQXJlYS5nZXQoKSkuc2NoZWR1bGVD
b21wb3NpdGluZ0xheWVyRmx1c2goKTsKLQotICAgIHNldElzQWN0aXZlKHRydWUpOwotICAgIHNl
dElzU2NoZWR1bGVkKHRydWUpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJlbW90ZUxh
eWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcjo6ZGlkVXBkYXRlTGF5ZXJzKCkKLXsKLSAgICBz
ZXRJc1NjaGVkdWxlZChmYWxzZSk7Ci0KLSAgICBpZiAoIWlzUHJldmlvdXNGcmFtZURvbmUoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgc2V0SXNQcmV2aW91c0ZyYW1lRG9uZShmYWxzZSk7Ci0g
ICAgaGFuZGxlRGlzcGxheVJlZnJlc2hlZE5vdGlmaWNhdGlvbk9uTWFpblRocmVhZCh0aGlzKTsK
LX0KLQotfQotCi0jZW5kaWYgLy8gVVNFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FX0RJU1BMQVlf
TU9OSVRPUikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1Jl
bW90ZUxheWVyVHJlZS9HcmFwaGljc0xheWVyQ0FSZW1vdGUuY3BwIGIvU291cmNlL1dlYktpdC9X
ZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uMmRmNDJlOTQ3MzBmMTYzODNmOWI1YTczMmU4Mjk2Y2I1YzFhMjVmMAot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90
ZUxheWVyVHJlZS9HcmFwaGljc0xheWVyQ0FSZW1vdGUuY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllckNBUmVtb3RlLmgiCisjaW5jbHVkZSAiUGxh
dGZvcm1DQUFuaW1hdGlvblJlbW90ZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ0FMYXllclJlbW90
ZS5oIgorI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1TY3JlZW4uaD4KKwordXNpbmcgbmFtZXNw
YWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitHcmFwaGljc0xheWVyQ0FSZW1v
dGU6On5HcmFwaGljc0xheWVyQ0FSZW1vdGUoKQoreworfQorCitib29sIEdyYXBoaWNzTGF5ZXJD
QVJlbW90ZTo6ZmlsdGVyc0NhbkJlQ29tcG9zaXRlZChjb25zdCBGaWx0ZXJPcGVyYXRpb25zJiBm
aWx0ZXJzKQoreworICAgIHJldHVybiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmZpbHRlcnNDYW5C
ZUNvbXBvc2l0ZWQoZmlsdGVycyk7Cit9CisKK1JlZjxQbGF0Zm9ybUNBTGF5ZXI+IEdyYXBoaWNz
TGF5ZXJDQVJlbW90ZTo6Y3JlYXRlUGxhdGZvcm1DQUxheWVyKFBsYXRmb3JtQ0FMYXllcjo6TGF5
ZXJUeXBlIGxheWVyVHlwZSwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikKK3sKKyAgICBh
dXRvIHJlc3VsdCA9IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y3JlYXRlKGxheWVyVHlwZSwgb3du
ZXIsIG1fY29udGV4dCk7CisKKyAgICBpZiAocmVzdWx0LT5jYW5IYXZlQmFja2luZ1N0b3JlKCkp
CisgICAgICAgIHJlc3VsdC0+c2V0V2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUoc2NyZWVuU3Vw
cG9ydHNFeHRlbmRlZENvbG9yKCkpOworCisgICAgcmV0dXJuIFdURk1vdmUocmVzdWx0KTsKK30K
KworUmVmPFBsYXRmb3JtQ0FMYXllcj4gR3JhcGhpY3NMYXllckNBUmVtb3RlOjpjcmVhdGVQbGF0
Zm9ybUNBTGF5ZXIoUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllciwgUGxhdGZvcm1DQUxheWVy
Q2xpZW50KiBvd25lcikKK3sKKyAgICByZXR1cm4gUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjcmVh
dGUocGxhdGZvcm1MYXllciwgb3duZXIsIG1fY29udGV4dCk7Cit9CisKK1JlZjxQbGF0Zm9ybUNB
QW5pbWF0aW9uPiBHcmFwaGljc0xheWVyQ0FSZW1vdGU6OmNyZWF0ZVBsYXRmb3JtQ0FBbmltYXRp
b24oUGxhdGZvcm1DQUFuaW1hdGlvbjo6QW5pbWF0aW9uVHlwZSB0eXBlLCBjb25zdCBTdHJpbmcm
IGtleVBhdGgpCit7CisgICAgcmV0dXJuIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNyZWF0
ZSh0eXBlLCBrZXlQYXRoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvR3JhcGhp
Y3NMYXllckNBUmVtb3RlLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1v
dGVMYXllclRyZWUvR3JhcGhpY3NMYXllckNBUmVtb3RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZTRhOTI1N2E2
OWFiMmFlZmQxZWE4NmQwYzhiYzU2Yzg1Njc4YTc2YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9HcmFwaGljc0xheWVy
Q0FSZW1vdGUuaApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxXZWJDb3JlL0dyYXBo
aWNzTGF5ZXJDQS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1MYXllci5oPgorCituYW1l
c3BhY2UgV2ViS2l0IHsKKworY2xhc3MgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDsKKworY2xhc3Mg
R3JhcGhpY3NMYXllckNBUmVtb3RlIGZpbmFsIDogcHVibGljIFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXJDQSB7CitwdWJsaWM6CisgICAgR3JhcGhpY3NMYXllckNBUmVtb3RlKFR5cGUgbGF5ZXJUeXBl
LCBXZWJDb3JlOjpHcmFwaGljc0xheWVyQ2xpZW50JiBjbGllbnQsIFJlbW90ZUxheWVyVHJlZUNv
bnRleHQmIGNvbnRleHQpCisgICAgICAgIDogR3JhcGhpY3NMYXllckNBKGxheWVyVHlwZSwgY2xp
ZW50KQorICAgICAgICAsIG1fY29udGV4dChjb250ZXh0KQorICAgIHsKKyAgICB9CisKKyAgICB2
aXJ0dWFsIH5HcmFwaGljc0xheWVyQ0FSZW1vdGUoKTsKKworICAgIGJvb2wgZmlsdGVyc0NhbkJl
Q29tcG9zaXRlZChjb25zdCBXZWJDb3JlOjpGaWx0ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKSBvdmVy
cmlkZTsKKworcHJpdmF0ZToKKyAgICBib29sIGlzR3JhcGhpY3NMYXllckNBUmVtb3RlKCkgY29u
c3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgUmVmPFdlYkNvcmU6OlBsYXRmb3Jt
Q0FMYXllcj4gY3JlYXRlUGxhdGZvcm1DQUxheWVyKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcjo6
TGF5ZXJUeXBlLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyKSBvdmVycmlk
ZTsKKyAgICBSZWY8V2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyPiBjcmVhdGVQbGF0Zm9ybUNBTGF5
ZXIoUGxhdGZvcm1MYXllciosIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIp
IG92ZXJyaWRlOworICAgIFJlZjxXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uPiBjcmVhdGVQ
bGF0Zm9ybUNBQW5pbWF0aW9uKFdlYkNvcmU6OlBsYXRmb3JtQ0FBbmltYXRpb246OkFuaW1hdGlv
blR5cGUsIGNvbnN0IFN0cmluZyYga2V5UGF0aCkgb3ZlcnJpZGU7CisKKyAgICAvLyBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGUgY2FuJ3QgY3VycmVudGx5IHByb3h5IGRpcmVjdGx5IGNvbXBvc2l0ZWQg
aW1hZ2UgY29udGVudHMsIHNvIG9wdCBvdXQgb2YgdGhpcyBvcHRpbWl6YXRpb24uCisgICAgYm9v
bCBzaG91bGREaXJlY3RseUNvbXBvc2l0ZUltYWdlKFdlYkNvcmU6OkltYWdlKikgY29uc3Qgb3Zl
cnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICBSZW1vdGVMYXllclRyZWVDb250ZXh0
JiBtX2NvbnRleHQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworU1BFQ0lBTElaRV9U
WVBFX1RSQUlUU19HUkFQSElDU0xBWUVSKFdlYktpdDo6R3JhcGhpY3NMYXllckNBUmVtb3RlLCBp
c0dyYXBoaWNzTGF5ZXJDQVJlbW90ZSgpKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUu
aCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzJkNjhkZTg1MjQxYTMyZTU4MjFk
OGU3ZjNiY2QwZGU3MzVhODc5ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3Rl
LmgKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaWZuZGVmIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGVfaAorI2RlZmluZSBQ
bGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlX2gKKworI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1D
QUFuaW1hdGlvbi5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL0hh
c2hTZXQuaD4KKworbmFtZXNwYWNlIElQQyB7CitjbGFzcyBFbmNvZGVyOworY2xhc3MgRGVjb2Rl
cjsKK307CisKK25hbWVzcGFjZSBXVEYgeworY2xhc3MgVGV4dFN0cmVhbTsKK307CisKK09CSkNf
Q0xBU1MgQ0FMYXllcjsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFJlbW90ZUxheWVy
VHJlZUhvc3Q7CisKK2NsYXNzIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUgZmluYWwgOiBwdWJs
aWMgV2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbiB7CitwdWJsaWM6CisgICAgc3RhdGljIFJl
ZjxQbGF0Zm9ybUNBQW5pbWF0aW9uPiBjcmVhdGUoQW5pbWF0aW9uVHlwZSwgY29uc3QgU3RyaW5n
JiBrZXlQYXRoKTsKKworICAgIHZpcnR1YWwgflBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUoKSB7
IH0KKworICAgIGJvb2wgaXNQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlKCkgY29uc3Qgb3ZlcnJp
ZGUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgUmVmPFBsYXRmb3JtQ0FBbmltYXRpb24+IGNvcHko
KSBjb25zdCBvdmVycmlkZTsKKworICAgIFN0cmluZyBrZXlQYXRoKCkgY29uc3Qgb3ZlcnJpZGU7
CisKKyAgICBDRlRpbWVJbnRlcnZhbCBiZWdpblRpbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2
b2lkIHNldEJlZ2luVGltZShDRlRpbWVJbnRlcnZhbCkgb3ZlcnJpZGU7CisKKyAgICBDRlRpbWVJ
bnRlcnZhbCBkdXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0RHVyYXRpb24o
Q0ZUaW1lSW50ZXJ2YWwpIG92ZXJyaWRlOworCisgICAgZmxvYXQgc3BlZWQoKSBjb25zdCBvdmVy
cmlkZTsKKyAgICB2b2lkIHNldFNwZWVkKGZsb2F0KSBvdmVycmlkZTsKKworICAgIENGVGltZUlu
dGVydmFsIHRpbWVPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFRpbWVPZmZz
ZXQoQ0ZUaW1lSW50ZXJ2YWwpIG92ZXJyaWRlOworCisgICAgZmxvYXQgcmVwZWF0Q291bnQoKSBj
b25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFJlcGVhdENvdW50KGZsb2F0KSBvdmVycmlkZTsK
KworICAgIGJvb2wgYXV0b3JldmVyc2VzKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRB
dXRvcmV2ZXJzZXMoYm9vbCkgb3ZlcnJpZGU7CisKKyAgICBGaWxsTW9kZVR5cGUgZmlsbE1vZGUo
KSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldEZpbGxNb2RlKEZpbGxNb2RlVHlwZSkgb3Zl
cnJpZGU7CisKKyAgICB2b2lkIHNldFRpbWluZ0Z1bmN0aW9uKGNvbnN0IFdlYkNvcmU6OlRpbWlu
Z0Z1bmN0aW9uKiwgYm9vbCByZXZlcnNlID0gZmFsc2UpIG92ZXJyaWRlOworICAgIHZvaWQgY29w
eVRpbWluZ0Z1bmN0aW9uRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uJikg
b3ZlcnJpZGU7CisKKyAgICBib29sIGlzUmVtb3ZlZE9uQ29tcGxldGlvbigpIGNvbnN0IG92ZXJy
aWRlOworICAgIHZvaWQgc2V0UmVtb3ZlZE9uQ29tcGxldGlvbihib29sKSBvdmVycmlkZTsKKwor
ICAgIGJvb2wgaXNBZGRpdGl2ZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0QWRkaXRp
dmUoYm9vbCkgb3ZlcnJpZGU7CisKKyAgICBWYWx1ZUZ1bmN0aW9uVHlwZSB2YWx1ZUZ1bmN0aW9u
KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRWYWx1ZUZ1bmN0aW9uKFZhbHVlRnVuY3Rp
b25UeXBlKSBvdmVycmlkZTsKKworICAgIC8vIEJhc2ljLWFuaW1hdGlvbiBwcm9wZXJ0aWVzLgor
ICAgIHZvaWQgc2V0RnJvbVZhbHVlKGZsb2F0KSBvdmVycmlkZTsKKyAgICB2b2lkIHNldEZyb21W
YWx1ZShjb25zdCBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCYpIG92ZXJyaWRlOworICAg
IHZvaWQgc2V0RnJvbVZhbHVlKGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQzRCYpIG92ZXJyaWRl
OworICAgIHZvaWQgc2V0RnJvbVZhbHVlKGNvbnN0IFdlYkNvcmU6OkNvbG9yJikgb3ZlcnJpZGU7
CisgICAgdm9pZCBzZXRGcm9tVmFsdWUoY29uc3QgV2ViQ29yZTo6RmlsdGVyT3BlcmF0aW9uKiwg
aW50IGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCkgb3ZlcnJpZGU7CisgICAgdm9pZCBjb3B5
RnJvbVZhbHVlRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uJikgb3ZlcnJp
ZGU7CisKKyAgICB2b2lkIHNldFRvVmFsdWUoZmxvYXQpIG92ZXJyaWRlOworICAgIHZvaWQgc2V0
VG9WYWx1ZShjb25zdCBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCYpIG92ZXJyaWRlOwor
ICAgIHZvaWQgc2V0VG9WYWx1ZShjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50M0QmKSBvdmVycmlk
ZTsKKyAgICB2b2lkIHNldFRvVmFsdWUoY29uc3QgV2ViQ29yZTo6Q29sb3ImKSBvdmVycmlkZTsK
KyAgICB2b2lkIHNldFRvVmFsdWUoY29uc3QgV2ViQ29yZTo6RmlsdGVyT3BlcmF0aW9uKiwgaW50
IGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCkgb3ZlcnJpZGU7CisgICAgdm9pZCBjb3B5VG9W
YWx1ZUZyb20oY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbiYpIG92ZXJyaWRlOwor
CisgICAgLy8gS2V5ZnJhbWUtYW5pbWF0aW9uIHByb3BlcnRpZXMuCisgICAgdm9pZCBzZXRWYWx1
ZXMoY29uc3QgVmVjdG9yPGZsb2F0PiYpIG92ZXJyaWRlOworICAgIHZvaWQgc2V0VmFsdWVzKGNv
bnN0IFZlY3RvcjxXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeD4mKSBvdmVycmlkZTsKKyAg
ICB2b2lkIHNldFZhbHVlcyhjb25zdCBWZWN0b3I8V2ViQ29yZTo6RmxvYXRQb2ludDNEPiYpIG92
ZXJyaWRlOworICAgIHZvaWQgc2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpDb2xvcj4m
KSBvdmVycmlkZTsKKyAgICB2b2lkIHNldFZhbHVlcyhjb25zdCBWZWN0b3I8UmVmUHRyPFdlYkNv
cmU6OkZpbHRlck9wZXJhdGlvbj4+JiwgaW50IGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCkg
b3ZlcnJpZGU7CisgICAgdm9pZCBjb3B5VmFsdWVzRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9y
bUNBQW5pbWF0aW9uJikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldEtleVRpbWVzKGNvbnN0IFZl
Y3RvcjxmbG9hdD4mKSBvdmVycmlkZTsKKyAgICB2b2lkIGNvcHlLZXlUaW1lc0Zyb20oY29uc3Qg
V2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbiYpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRU
aW1pbmdGdW5jdGlvbnMoY29uc3QgVmVjdG9yPGNvbnN0IFdlYkNvcmU6OlRpbWluZ0Z1bmN0aW9u
Kj4mLCBib29sIHJldmVyc2UgPSBmYWxzZSkgb3ZlcnJpZGU7CisgICAgdm9pZCBjb3B5VGltaW5n
RnVuY3Rpb25zRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uJikgb3ZlcnJp
ZGU7CisKKyAgICBBbmltYXRpb25UeXBlIGFuaW1hdGlvblR5cGUoKSBjb25zdCB7IHJldHVybiBt
X3Byb3BlcnRpZXMuYW5pbWF0aW9uVHlwZTsgfQorICAgIHZvaWQgc2V0SGFzRXhwbGljaXRCZWdp
blRpbWUoYm9vbCBoYXNFeHBsaWNpdEJlZ2luVGltZSkgeyBtX3Byb3BlcnRpZXMuaGFzRXhwbGlj
aXRCZWdpblRpbWUgPSBoYXNFeHBsaWNpdEJlZ2luVGltZTsgfQorICAgIGJvb2wgaGFzRXhwbGlj
aXRCZWdpblRpbWUoKSBjb25zdCB7IHJldHVybiBtX3Byb3BlcnRpZXMuaGFzRXhwbGljaXRCZWdp
blRpbWU7IH0KKworICAgIHZvaWQgZGlkU3RhcnQoQ0ZUaW1lSW50ZXJ2YWwgYmVnaW5UaW1lKSB7
IG1fcHJvcGVydGllcy5iZWdpblRpbWUgPSBiZWdpblRpbWU7IH0KKworICAgIGNsYXNzIEtleWZy
YW1lVmFsdWUgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBLZXlmcmFtZVR5cGUgeworICAg
ICAgICAgICAgTnVtYmVyS2V5VHlwZSwKKyAgICAgICAgICAgIENvbG9yS2V5VHlwZSwKKyAgICAg
ICAgICAgIFBvaW50S2V5VHlwZSwKKyAgICAgICAgICAgIFRyYW5zZm9ybUtleVR5cGUsCisgICAg
ICAgICAgICBGaWx0ZXJLZXlUeXBlLAorICAgICAgICB9OworCisgICAgICAgIH5LZXlmcmFtZVZh
bHVlKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgS2V5ZnJhbWVWYWx1ZShmbG9h
dCB2YWx1ZSA9IDApCisgICAgICAgICAgICA6IGtleVR5cGUoTnVtYmVyS2V5VHlwZSkKKyAgICAg
ICAgICAgICwgbnVtYmVyKHZhbHVlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBL
ZXlmcmFtZVZhbHVlKFdlYkNvcmU6OkNvbG9yIHZhbHVlKQorICAgICAgICAgICAgOiBrZXlUeXBl
KENvbG9yS2V5VHlwZSkKKyAgICAgICAgICAgICwgY29sb3IodmFsdWUpCisgICAgICAgIHsKKyAg
ICAgICAgfQorCisgICAgICAgIEtleWZyYW1lVmFsdWUoY29uc3QgV2ViQ29yZTo6RmxvYXRQb2lu
dDNEJiB2YWx1ZSkKKyAgICAgICAgICAgIDoga2V5VHlwZShQb2ludEtleVR5cGUpCisgICAgICAg
ICAgICAsIHBvaW50KHZhbHVlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBLZXlm
cmFtZVZhbHVlKGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4JiB2YWx1ZSkKKyAg
ICAgICAgICAgIDoga2V5VHlwZShUcmFuc2Zvcm1LZXlUeXBlKQorICAgICAgICAgICAgLCB0cmFu
c2Zvcm0odmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEtleWZyYW1lVmFs
dWUoUmVmUHRyPFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbj4mJiB2YWx1ZSkKKyAgICAgICAgICAg
IDoga2V5VHlwZShGaWx0ZXJLZXlUeXBlKQorICAgICAgICAgICAgLCBmaWx0ZXIoV1RGTW92ZSh2
YWx1ZSkpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEtleWZyYW1lVmFsdWUoY29u
c3QgS2V5ZnJhbWVWYWx1ZSYgb3RoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgICp0aGlzID0g
b3RoZXI7CisgICAgICAgIH0KKworICAgICAgICBLZXlmcmFtZVZhbHVlJiBvcGVyYXRvcj0oY29u
c3QgS2V5ZnJhbWVWYWx1ZSYgb3RoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGtleVR5cGUg
PSBvdGhlci5rZXlUeXBlOworICAgICAgICAgICAgc3dpdGNoIChrZXlUeXBlKSB7CisgICAgICAg
ICAgICBjYXNlIE51bWJlcktleVR5cGU6CisgICAgICAgICAgICAgICAgbnVtYmVyID0gb3RoZXIu
bnVtYmVyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDb2xvcktl
eVR5cGU6CisgICAgICAgICAgICAgICAgY29sb3IgPSBvdGhlci5jb2xvcjsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUG9pbnRLZXlUeXBlOgorICAgICAgICAgICAg
ICAgIHBvaW50ID0gb3RoZXIucG9pbnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBjYXNlIFRyYW5zZm9ybUtleVR5cGU6CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0g
b3RoZXIudHJhbnNmb3JtOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2Fz
ZSBGaWx0ZXJLZXlUeXBlOgorICAgICAgICAgICAgICAgIGZpbHRlciA9IG90aGVyLmZpbHRlcjsK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0
dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgS2V5ZnJhbWVUeXBlIGtleWZyYW1lVHlw
ZSgpIGNvbnN0IHsgcmV0dXJuIGtleVR5cGU7IH0KKworICAgICAgICBmbG9hdCBudW1iZXJWYWx1
ZSgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChrZXlUeXBlID09IE51bWJl
cktleVR5cGUpOworICAgICAgICAgICAgcmV0dXJuIG51bWJlcjsKKyAgICAgICAgfQorCisgICAg
ICAgIFdlYkNvcmU6OkNvbG9yIGNvbG9yVmFsdWUoKSBjb25zdAorICAgICAgICB7CisgICAgICAg
ICAgICBBU1NFUlQoa2V5VHlwZSA9PSBDb2xvcktleVR5cGUpOworICAgICAgICAgICAgcmV0dXJu
IGNvbG9yOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludDNE
JiBwb2ludFZhbHVlKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKGtleVR5
cGUgPT0gUG9pbnRLZXlUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBwb2ludDsKKyAgICAgICAg
fQorCisgICAgICAgIGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zv
cm1WYWx1ZSgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChrZXlUeXBlID09
IFRyYW5zZm9ybUtleVR5cGUpOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybTsKKyAgICAg
ICAgfQorCisgICAgICAgIGNvbnN0IFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbiogZmlsdGVyVmFs
dWUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoa2V5VHlwZSA9PSBGaWx0
ZXJLZXlUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXIuZ2V0KCk7CisgICAgICAgIH0K
KworICAgICAgICB2b2lkIGVuY29kZShJUEM6OkVuY29kZXImKSBjb25zdDsKKyAgICAgICAgc3Rh
dGljIGJvb2wgZGVjb2RlKElQQzo6RGVjb2RlciYsIEtleWZyYW1lVmFsdWUmKTsKKworICAgIHBy
aXZhdGU6CisgICAgICAgIEtleWZyYW1lVHlwZSBrZXlUeXBlOworICAgICAgICB1bmlvbiB7Cisg
ICAgICAgICAgICBmbG9hdCBudW1iZXI7CisgICAgICAgICAgICBXZWJDb3JlOjpDb2xvciBjb2xv
cjsKKyAgICAgICAgICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQzRCBwb2ludDsKKyAgICAgICAgICAg
IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybTsKKyAgICAgICAgfTsKKyAg
ICAgICAgUmVmUHRyPFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbj4gZmlsdGVyOworICAgIH07CisK
KyAgICBzdHJ1Y3QgUHJvcGVydGllcyB7CisgICAgICAgIFByb3BlcnRpZXMoKQorICAgICAgICAg
ICAgOiBhbmltYXRpb25UeXBlKEJhc2ljKQorICAgICAgICAgICAgLCBiZWdpblRpbWUoMCkKKyAg
ICAgICAgICAgICwgZHVyYXRpb24oMCkKKyAgICAgICAgICAgICwgdGltZU9mZnNldCgwKQorICAg
ICAgICAgICAgLCByZXBlYXRDb3VudCgxKQorICAgICAgICAgICAgLCBzcGVlZCgxKQorICAgICAg
ICAgICAgLCBmaWxsTW9kZShOb0ZpbGxNb2RlKQorICAgICAgICAgICAgLCB2YWx1ZUZ1bmN0aW9u
KE5vVmFsdWVGdW5jdGlvbikKKyAgICAgICAgICAgICwgYXV0b1JldmVyc2VzKGZhbHNlKQorICAg
ICAgICAgICAgLCByZW1vdmVkT25Db21wbGV0aW9uKHRydWUpCisgICAgICAgICAgICAsIGFkZGl0
aXZlKGZhbHNlKQorICAgICAgICAgICAgLCByZXZlcnNlVGltaW5nRnVuY3Rpb25zKGZhbHNlKQor
ICAgICAgICAgICAgLCBoYXNFeHBsaWNpdEJlZ2luVGltZShmYWxzZSkKKyAgICAgICAgeworICAg
ICAgICB9CisKKyAgICAgICAgdm9pZCBlbmNvZGUoSVBDOjpFbmNvZGVyJikgY29uc3Q7CisgICAg
ICAgIHN0YXRpYyBib29sIGRlY29kZShJUEM6OkRlY29kZXImLCBQcm9wZXJ0aWVzJik7CisKKyAg
ICAgICAgU3RyaW5nIGtleVBhdGg7CisgICAgICAgIFBsYXRmb3JtQ0FBbmltYXRpb246OkFuaW1h
dGlvblR5cGUgYW5pbWF0aW9uVHlwZTsKKworICAgICAgICBkb3VibGUgYmVnaW5UaW1lOworICAg
ICAgICBkb3VibGUgZHVyYXRpb247CisgICAgICAgIGRvdWJsZSB0aW1lT2Zmc2V0OworICAgICAg
ICBmbG9hdCByZXBlYXRDb3VudDsKKyAgICAgICAgZmxvYXQgc3BlZWQ7CisKKyAgICAgICAgUGxh
dGZvcm1DQUFuaW1hdGlvbjo6RmlsbE1vZGVUeXBlIGZpbGxNb2RlOworICAgICAgICBQbGF0Zm9y
bUNBQW5pbWF0aW9uOjpWYWx1ZUZ1bmN0aW9uVHlwZSB2YWx1ZUZ1bmN0aW9uOworCisgICAgICAg
IGJvb2wgYXV0b1JldmVyc2VzOworICAgICAgICBib29sIHJlbW92ZWRPbkNvbXBsZXRpb247Cisg
ICAgICAgIGJvb2wgYWRkaXRpdmU7CisgICAgICAgIGJvb2wgcmV2ZXJzZVRpbWluZ0Z1bmN0aW9u
czsKKyAgICAgICAgYm9vbCBoYXNFeHBsaWNpdEJlZ2luVGltZTsKKworICAgICAgICAvLyBGb3Ig
YmFzaWMgYW5pbWF0aW9ucywgdGhlc2UgdmVjdG9ycyBoYXZlIHR3byBlbnRyaWVzLiBGb3Iga2V5
ZnJhbWUgYW5pbWF0aW9ucywgdHdvIG9yIG1vcmUuCisgICAgICAgIC8vIHRpbWluZ0Z1bmN0aW9u
cyBoYXMgbi0xIGVudHJpZXMuCisgICAgICAgIFZlY3RvcjxLZXlmcmFtZVZhbHVlPiBrZXlWYWx1
ZXM7CisgICAgICAgIFZlY3RvcjxmbG9hdD4ga2V5VGltZXM7CisgICAgICAgIFZlY3RvcjxSZWZQ
dHI8V2ViQ29yZTo6VGltaW5nRnVuY3Rpb24+PiB0aW1pbmdGdW5jdGlvbnM7CisgICAgfTsKKwor
ICAgIGNvbnN0IFByb3BlcnRpZXMmIHByb3BlcnRpZXMoKSBjb25zdCB7IHJldHVybiBtX3Byb3Bl
cnRpZXM7IH0KKworICAgIHR5cGVkZWYgVmVjdG9yPHN0ZDo6cGFpcjxTdHJpbmcsIFByb3BlcnRp
ZXM+PiBBbmltYXRpb25zTGlzdDsKKyAgICBzdGF0aWMgdm9pZCB1cGRhdGVMYXllckFuaW1hdGlv
bnMoQ0FMYXllciAqLCBSZW1vdGVMYXllclRyZWVIb3N0KiwgY29uc3QgQW5pbWF0aW9uc0xpc3Qm
IGFuaW1hdGlvbnNUb0FkZCwgY29uc3QgSGFzaFNldDxTdHJpbmc+JiBhbmltYXRpb25zVG9SZW1v
dmUpOworCitwcml2YXRlOgorICAgIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUoQW5pbWF0aW9u
VHlwZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRoKTsKKworICAgIFByb3BlcnRpZXMgbV9wcm9wZXJ0
aWVzOworfTsKKworV1RGOjpUZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFdURjo6VGV4dFN0cmVhbSYs
IGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWUmKTsKK1dURjo6
VGV4dFN0cmVhbSYgb3BlcmF0b3I8PChXVEY6OlRleHRTdHJlYW0mLCBjb25zdCBQbGF0Zm9ybUNB
QW5pbWF0aW9uUmVtb3RlOjpQcm9wZXJ0aWVzJik7CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAor
CitTUEVDSUFMSVpFX1RZUEVfVFJBSVRTX0NBQU5JTUFUSU9OKFdlYktpdDo6UGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZSwgaXNQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlKCkpCisKKyNlbmRpZiAv
LyBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVt
b3RlLm1tIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVl
L1BsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDZlMjczYzNhNzE5ZTY5
MTAwZDE1ZjVhMzFhMWEyZDQ1ZmY2ZmY0MgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJL
aXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlLm1tCkBAIC0wLDAgKzEsOTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2ltcG9ydCAiUGxhdGZvcm1D
QUFuaW1hdGlvblJlbW90ZS5oIgorCisjaW1wb3J0ICJBcmd1bWVudENvZGVycy5oIgorI2ltcG9y
dCAiUmVtb3RlTGF5ZXJUcmVlSG9zdC5oIgorI2ltcG9ydCAiV2ViQ29yZUFyZ3VtZW50Q29kZXJz
LmgiCisjaW1wb3J0IDxRdWFydHpDb3JlL1F1YXJ0ekNvcmUuaD4KKyNpbXBvcnQgPFdlYkNvcmUv
R3JhcGhpY3NMYXllci5oPgorI2ltcG9ydCA8V2ViQ29yZS9QbGF0Zm9ybUNBQW5pbWF0aW9uQ29j
b2EuaD4KKyNpbXBvcnQgPFdlYkNvcmUvUGxhdGZvcm1DQUZpbHRlcnMuaD4KKyNpbXBvcnQgPFdl
YkNvcmUvVGltaW5nRnVuY3Rpb24uaD4KKyNpbXBvcnQgPHBhbC9zcGkvY29jb2EvUXVhcnR6Q29y
ZVNQSS5oPgorI2ltcG9ydCA8d3RmL0Jsb2NrT2JqQ0V4Y2VwdGlvbnMuaD4KKyNpbXBvcnQgPHd0
Zi9DdXJyZW50VGltZS5oPgorI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgorI2ltcG9ydCA8d3Rm
L3RleHQvVGV4dFN0cmVhbS5oPgorCit1c2luZyBuYW1lc3BhY2UgV1RGOwordXNpbmcgbmFtZXNw
YWNlIFdlYkNvcmU7CisKK3N0YXRpYyBkb3VibGUgbWVkaWFUaW1lVG9DdXJyZW50VGltZShDRlRp
bWVJbnRlcnZhbCB0KQoreworICAgIHJldHVybiBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUo
KSArIHQgLSBDQUN1cnJlbnRNZWRpYVRpbWUoKTsKK30KKworc3RhdGljIE5TU3RyaW5nICogY29u
c3QgV0tFeHBsaWNpdEJlZ2luVGltZUZsYWcgPSBAIldLUGxhdGZvcm1DQUFuaW1hdGlvbkV4cGxp
Y2l0QmVnaW5UaW1lRmxhZyI7CisKK0BpbnRlcmZhY2UgV0tBbmltYXRpb25EZWxlZ2F0ZSA6IE5T
T2JqZWN0IDxDQUFuaW1hdGlvbkRlbGVnYXRlPiB7CisgICAgR3JhcGhpY3NMYXllcjo6UGxhdGZv
cm1MYXllcklEIF9sYXllcklEOworICAgIFdlYktpdDo6UmVtb3RlTGF5ZXJUcmVlSG9zdCogX2xh
eWVyVHJlZUhvc3Q7Cit9CisKKy0gKGluc3RhbmNldHlwZSlpbml0V2l0aExheWVySUQ6KEdyYXBo
aWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRClsYXllcklEIGxheWVyVHJlZUhvc3Q6KFdlYktpdDo6
UmVtb3RlTGF5ZXJUcmVlSG9zdCopbGF5ZXJUcmVlSG9zdDsKKy0gKHZvaWQpaW52YWxpZGF0ZTsK
K0BlbmQKKworQGltcGxlbWVudGF0aW9uIFdLQW5pbWF0aW9uRGVsZWdhdGUKKworLSAoaW5zdGFu
Y2V0eXBlKWluaXRXaXRoTGF5ZXJJRDooR3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklEKWxh
eWVySUQgbGF5ZXJUcmVlSG9zdDooV2ViS2l0OjpSZW1vdGVMYXllclRyZWVIb3N0KilsYXllclRy
ZWVIb3N0Cit7CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSkgeworICAgICAgICBfbGF5
ZXJJRCA9IGxheWVySUQ7CisgICAgICAgIF9sYXllclRyZWVIb3N0ID0gbGF5ZXJUcmVlSG9zdDsK
KyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpaW52YWxpZGF0ZQoreworICAg
IF9sYXllclRyZWVIb3N0ID0gbnVsbHB0cjsKK30KKworLSAodm9pZClhbmltYXRpb25EaWRTdGFy
dDooQ0FBbmltYXRpb24gKilhbmltYXRpb24KK3sKKyAgICBpZiAoIV9sYXllclRyZWVIb3N0KQor
ICAgICAgICByZXR1cm47CisKKyAgICBib29sIGhhc0V4cGxpY2l0QmVnaW5UaW1lID0gW1thbmlt
YXRpb24gdmFsdWVGb3JLZXk6V0tFeHBsaWNpdEJlZ2luVGltZUZsYWddIGJvb2xWYWx1ZV07Cisg
ICAgQ0ZUaW1lSW50ZXJ2YWwgc3RhcnRUaW1lOworCisgICAgaWYgKGhhc0V4cGxpY2l0QmVnaW5U
aW1lKSB7CisgICAgICAgIC8vIFdlIGRvbid0IGtub3cgd2hhdCB0aW1lIENBIHVzZWQgdG8gY29t
bWl0IHRoZSBhbmltYXRpb24sIHNvIGp1c3QgdXNlIHRoZSBjdXJyZW50IHRpbWUKKyAgICAgICAg
Ly8gKGV2ZW4gdGhvdWdoIHRoaXMgd2lsbCBiZSBzbGlnaHRseSBvZmYpLgorICAgICAgICBzdGFy
dFRpbWUgPSBtZWRpYVRpbWVUb0N1cnJlbnRUaW1lKENBQ3VycmVudE1lZGlhVGltZSgpKTsKKyAg
ICB9IGVsc2UKKyAgICAgICAgc3RhcnRUaW1lID0gbWVkaWFUaW1lVG9DdXJyZW50VGltZShbYW5p
bWF0aW9uIGJlZ2luVGltZV0pOworCisgICAgX2xheWVyVHJlZUhvc3QtPmFuaW1hdGlvbkRpZFN0
YXJ0KF9sYXllcklELCBhbmltYXRpb24sIHN0YXJ0VGltZSk7Cit9CisKKy0gKHZvaWQpYW5pbWF0
aW9uRGlkU3RvcDooQ0FBbmltYXRpb24gKilhbmltYXRpb24gZmluaXNoZWQ6KEJPT0wpZmluaXNo
ZWQKK3sKKyAgICBpZiAoIV9sYXllclRyZWVIb3N0KQorICAgICAgICByZXR1cm47CisKKyAgICBf
bGF5ZXJUcmVlSG9zdC0+YW5pbWF0aW9uRGlkRW5kKF9sYXllcklELCBhbmltYXRpb24pOworfQor
CitAZW5kCisKK25hbWVzcGFjZSBXZWJLaXQgeworCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OktleWZyYW1lVmFsdWU6OmVuY29kZShJUEM6OkVuY29kZXImIGVuY29kZXIpIGNvbnN0
Cit7CisgICAgZW5jb2Rlci5lbmNvZGVFbnVtKGtleVR5cGUpOworCisgICAgc3dpdGNoIChrZXlU
eXBlKSB7CisgICAgY2FzZSBOdW1iZXJLZXlUeXBlOgorICAgICAgICBlbmNvZGVyIDw8IG51bWJl
cjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb2xvcktleVR5cGU6CisgICAgICAgIGVuY29k
ZXIgPDwgY29sb3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUG9pbnRLZXlUeXBlOgorICAg
ICAgICBlbmNvZGVyIDw8IHBvaW50OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRyYW5zZm9y
bUtleVR5cGU6CisgICAgICAgIGVuY29kZXIgPDwgdHJhbnNmb3JtOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIEZpbHRlcktleVR5cGU6CisgICAgICAgIGVuY29kZXIgPDwgKmZpbHRlci5nZXQo
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitib29sIFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OktleWZyYW1lVmFsdWU6OmRlY29kZShJUEM6OkRlY29kZXImIGRlY29kZXIsIFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWUmIHZhbHVlKQoreworICAgIGlmICgh
ZGVjb2Rlci5kZWNvZGVFbnVtKHZhbHVlLmtleVR5cGUpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBzd2l0Y2ggKHZhbHVlLmtleVR5cGUpIHsKKyAgICBjYXNlIE51bWJlcktleVR5cGU6
CisgICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUodmFsdWUubnVtYmVyKSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb2xvcktleVR5cGU6Cisg
ICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUodmFsdWUuY29sb3IpKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBvaW50S2V5VHlwZToKKyAgICAg
ICAgaWYgKCFkZWNvZGVyLmRlY29kZSh2YWx1ZS5wb2ludCkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVHJhbnNmb3JtS2V5VHlwZToKKyAgICAg
ICAgaWYgKCFkZWNvZGVyLmRlY29kZSh2YWx1ZS50cmFuc2Zvcm0pKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZpbHRlcktleVR5cGU6CisgICAg
ICAgIGlmICghZGVjb2RlRmlsdGVyT3BlcmF0aW9uKGRlY29kZXIsIHZhbHVlLmZpbHRlcikpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJl
dHVybiB0cnVlOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRp
ZXM6OmVuY29kZShJUEM6OkVuY29kZXImIGVuY29kZXIpIGNvbnN0Cit7CisgICAgZW5jb2RlciA8
PCBrZXlQYXRoOworICAgIGVuY29kZXIuZW5jb2RlRW51bShhbmltYXRpb25UeXBlKTsKKworICAg
IGVuY29kZXIgPDwgYmVnaW5UaW1lOworICAgIGVuY29kZXIgPDwgZHVyYXRpb247CisgICAgZW5j
b2RlciA8PCB0aW1lT2Zmc2V0OworICAgIGVuY29kZXIgPDwgcmVwZWF0Q291bnQ7CisgICAgZW5j
b2RlciA8PCBzcGVlZDsKKworICAgIGVuY29kZXIuZW5jb2RlRW51bShmaWxsTW9kZSk7CisgICAg
ZW5jb2Rlci5lbmNvZGVFbnVtKHZhbHVlRnVuY3Rpb24pOworCisgICAgZW5jb2RlciA8PCBhdXRv
UmV2ZXJzZXM7CisgICAgZW5jb2RlciA8PCByZW1vdmVkT25Db21wbGV0aW9uOworICAgIGVuY29k
ZXIgPDwgYWRkaXRpdmU7CisgICAgZW5jb2RlciA8PCByZXZlcnNlVGltaW5nRnVuY3Rpb25zOwor
ICAgIGVuY29kZXIgPDwgaGFzRXhwbGljaXRCZWdpblRpbWU7CisgICAgCisgICAgZW5jb2RlciA8
PCBrZXlWYWx1ZXM7CisgICAgZW5jb2RlciA8PCBrZXlUaW1lczsKKyAgICAKKyAgICBlbmNvZGVy
IDw8IHN0YXRpY19jYXN0PHVpbnQ2NF90Pih0aW1pbmdGdW5jdGlvbnMuc2l6ZSgpKTsKKyAgICBm
b3IgKGNvbnN0IGF1dG8mIHRpbWluZ0Z1bmN0aW9uIDogdGltaW5nRnVuY3Rpb25zKSB7CisgICAg
ICAgIHN3aXRjaCAodGltaW5nRnVuY3Rpb24tPnR5cGUoKSkgeworICAgICAgICBjYXNlIFRpbWlu
Z0Z1bmN0aW9uOjpMaW5lYXJGdW5jdGlvbjoKKyAgICAgICAgICAgIGVuY29kZXIgPDwgKnN0YXRp
Y19jYXN0PExpbmVhclRpbWluZ0Z1bmN0aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBUaW1pbmdGdW5jdGlv
bjo6Q3ViaWNCZXppZXJGdW5jdGlvbjoKKyAgICAgICAgICAgIGVuY29kZXIgPDwgKnN0YXRpY19j
YXN0PEN1YmljQmV6aWVyVGltaW5nRnVuY3Rpb24qPih0aW1pbmdGdW5jdGlvbi5nZXQoKSk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIGNhc2UgVGltaW5nRnVuY3Rpb246
OlN0ZXBzRnVuY3Rpb246CisgICAgICAgICAgICBlbmNvZGVyIDw8ICpzdGF0aWNfY2FzdDxTdGVw
c1RpbWluZ0Z1bmN0aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpOworICAgICAgICAgICAgYnJl
YWs7CisKKyAgICAgICAgY2FzZSBUaW1pbmdGdW5jdGlvbjo6U3ByaW5nRnVuY3Rpb246CisgICAg
ICAgICAgICBlbmNvZGVyIDw8ICpzdGF0aWNfY2FzdDxTcHJpbmdUaW1pbmdGdW5jdGlvbio+KHRp
bWluZ0Z1bmN0aW9uLmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
fQorfQorCitib29sIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXM6OmRlY29k
ZShJUEM6OkRlY29kZXImIGRlY29kZXIsIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3Bl
cnRpZXMmIHByb3BlcnRpZXMpCit7CisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVz
LmtleVBhdGgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWRlY29kZXIuZGVj
b2RlRW51bShwcm9wZXJ0aWVzLmFuaW1hdGlvblR5cGUpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMuYmVnaW5UaW1lKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmR1
cmF0aW9uKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29k
ZShwcm9wZXJ0aWVzLnRpbWVPZmZzZXQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBp
ZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMucmVwZWF0Q291bnQpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMuc3BlZWQpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWRlY29kZXIuZGVjb2RlRW51bShwcm9w
ZXJ0aWVzLmZpbGxNb2RlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFkZWNv
ZGVyLmRlY29kZUVudW0ocHJvcGVydGllcy52YWx1ZUZ1bmN0aW9uKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmF1dG9SZXZlcnNl
cykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghZGVjb2Rlci5kZWNvZGUocHJv
cGVydGllcy5yZW1vdmVkT25Db21wbGV0aW9uKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmFkZGl0aXZlKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLnJldmVyc2VU
aW1pbmdGdW5jdGlvbnMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWRlY29k
ZXIuZGVjb2RlKHByb3BlcnRpZXMuaGFzRXhwbGljaXRCZWdpblRpbWUpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMua2V5VmFsdWVz
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9w
ZXJ0aWVzLmtleVRpbWVzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdWludDY0X3Qg
bnVtVGltaW5nRnVuY3Rpb25zOworICAgIGlmICghZGVjb2Rlci5kZWNvZGUobnVtVGltaW5nRnVu
Y3Rpb25zKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIGlmIChudW1UaW1pbmdG
dW5jdGlvbnMpIHsKKyAgICAgICAgcHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMucmVzZXJ2ZUlu
aXRpYWxDYXBhY2l0eShudW1UaW1pbmdGdW5jdGlvbnMpOworCisgICAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbnVtVGltaW5nRnVuY3Rpb25zOyArK2kpIHsKKyAgICAgICAgCisgICAgICAg
ICAgICBUaW1pbmdGdW5jdGlvbjo6VGltaW5nRnVuY3Rpb25UeXBlIHR5cGU7CisgICAgICAgICAg
ICBpZiAoIWRlY29kZXIuZGVjb2RlRW51bSh0eXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgICAgIFJlZlB0cjxUaW1pbmdGdW5jdGlvbj4gdGltaW5nRnVuY3Rp
b247CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVGltaW5n
RnVuY3Rpb246OkxpbmVhckZ1bmN0aW9uOgorICAgICAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9u
ID0gTGluZWFyVGltaW5nRnVuY3Rpb246OmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIGlmICgh
ZGVjb2Rlci5kZWNvZGUoKnN0YXRpY19jYXN0PExpbmVhclRpbWluZ0Z1bmN0aW9uKj4odGltaW5n
RnVuY3Rpb24uZ2V0KCkpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBU
aW1pbmdGdW5jdGlvbjo6Q3ViaWNCZXppZXJGdW5jdGlvbjoKKyAgICAgICAgICAgICAgICB0aW1p
bmdGdW5jdGlvbiA9IEN1YmljQmV6aWVyVGltaW5nRnVuY3Rpb246OmNyZWF0ZSgpOworICAgICAg
ICAgICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUoKnN0YXRpY19jYXN0PEN1YmljQmV6aWVyVGlt
aW5nRnVuY3Rpb24qPih0aW1pbmdGdW5jdGlvbi5nZXQoKSkpKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIGNhc2UgVGltaW5nRnVuY3Rpb246OlN0ZXBzRnVuY3Rpb246CisgICAgICAgICAg
ICAgICAgdGltaW5nRnVuY3Rpb24gPSBTdGVwc1RpbWluZ0Z1bmN0aW9uOjpjcmVhdGUoKTsKKyAg
ICAgICAgICAgICAgICBpZiAoIWRlY29kZXIuZGVjb2RlKCpzdGF0aWNfY2FzdDxTdGVwc1RpbWlu
Z0Z1bmN0aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpKSkKKyAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNl
IFRpbWluZ0Z1bmN0aW9uOjpTcHJpbmdGdW5jdGlvbjoKKyAgICAgICAgICAgICAgICB0aW1pbmdG
dW5jdGlvbiA9IFNwcmluZ1RpbWluZ0Z1bmN0aW9uOjpjcmVhdGUoKTsKKyAgICAgICAgICAgICAg
ICBpZiAoIWRlY29kZXIuZGVjb2RlKCpzdGF0aWNfY2FzdDxTcHJpbmdUaW1pbmdGdW5jdGlvbio+
KHRpbWluZ0Z1bmN0aW9uLmdldCgpKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgcHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMudW5jaGVja2VkQXBwZW5kKFdU
Rk1vdmUodGltaW5nRnVuY3Rpb24pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0
cnVlOworfQorICAgIAorUmVmPFBsYXRmb3JtQ0FBbmltYXRpb24+IFBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGU6OmNyZWF0ZShQbGF0Zm9ybUNBQW5pbWF0aW9uOjpBbmltYXRpb25UeXBlIHR5cGUs
IGNvbnN0IFN0cmluZyYga2V5UGF0aCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBQbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlKHR5cGUsIGtleVBhdGgpKTsKK30KKworUmVmPFBsYXRmb3Jt
Q0FBbmltYXRpb24+IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNvcHkoKSBjb25zdAorewor
ICAgIGF1dG8gYW5pbWF0aW9uID0gY3JlYXRlKGFuaW1hdGlvblR5cGUoKSwga2V5UGF0aCgpKTsK
KyAgICAKKyAgICBhbmltYXRpb24tPnNldEJlZ2luVGltZShiZWdpblRpbWUoKSk7CisgICAgYW5p
bWF0aW9uLT5zZXREdXJhdGlvbihkdXJhdGlvbigpKTsKKyAgICBhbmltYXRpb24tPnNldFNwZWVk
KHNwZWVkKCkpOworICAgIGFuaW1hdGlvbi0+c2V0VGltZU9mZnNldCh0aW1lT2Zmc2V0KCkpOwor
ICAgIGFuaW1hdGlvbi0+c2V0UmVwZWF0Q291bnQocmVwZWF0Q291bnQoKSk7CisgICAgYW5pbWF0
aW9uLT5zZXRBdXRvcmV2ZXJzZXMoYXV0b3JldmVyc2VzKCkpOworICAgIGFuaW1hdGlvbi0+c2V0
RmlsbE1vZGUoZmlsbE1vZGUoKSk7CisgICAgYW5pbWF0aW9uLT5zZXRSZW1vdmVkT25Db21wbGV0
aW9uKGlzUmVtb3ZlZE9uQ29tcGxldGlvbigpKTsKKyAgICBhbmltYXRpb24tPnNldEFkZGl0aXZl
KGlzQWRkaXRpdmUoKSk7CisgICAgYW5pbWF0aW9uLT5jb3B5VGltaW5nRnVuY3Rpb25Gcm9tKCp0
aGlzKTsKKyAgICBhbmltYXRpb24tPnNldFZhbHVlRnVuY3Rpb24odmFsdWVGdW5jdGlvbigpKTsK
KworICAgIGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KGFuaW1hdGlvbi5nZXQo
KSkuc2V0SGFzRXhwbGljaXRCZWdpblRpbWUoaGFzRXhwbGljaXRCZWdpblRpbWUoKSk7CisgICAg
CisgICAgLy8gQ29weSB0aGUgc3BlY2lmaWMgQmFzaWMgb3IgS2V5ZnJhbWUgdmFsdWVzLgorICAg
IGlmIChhbmltYXRpb25UeXBlKCkgPT0gS2V5ZnJhbWUpIHsKKyAgICAgICAgYW5pbWF0aW9uLT5j
b3B5VmFsdWVzRnJvbSgqdGhpcyk7CisgICAgICAgIGFuaW1hdGlvbi0+Y29weUtleVRpbWVzRnJv
bSgqdGhpcyk7CisgICAgICAgIGFuaW1hdGlvbi0+Y29weVRpbWluZ0Z1bmN0aW9uc0Zyb20oKnRo
aXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuaW1hdGlvbi0+Y29weUZyb21WYWx1ZUZyb20o
KnRoaXMpOworICAgICAgICBhbmltYXRpb24tPmNvcHlUb1ZhbHVlRnJvbSgqdGhpcyk7CisgICAg
fQorICAgIAorICAgIHJldHVybiBhbmltYXRpb247Cit9CisKK1BsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OlBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUoQW5pbWF0aW9uVHlwZSB0eXBlLCBjb25z
dCBTdHJpbmcmIGtleVBhdGgpCisgICAgOiBQbGF0Zm9ybUNBQW5pbWF0aW9uKHR5cGUpCit7Cisg
ICAgbV9wcm9wZXJ0aWVzLmtleVBhdGggPSBrZXlQYXRoOworICAgIG1fcHJvcGVydGllcy5hbmlt
YXRpb25UeXBlID0gdHlwZTsKK30KKworU3RyaW5nIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6
OmtleVBhdGgoKSBjb25zdAoreworICAgIHJldHVybiBtX3Byb3BlcnRpZXMua2V5UGF0aDsKK30K
KworQ0ZUaW1lSW50ZXJ2YWwgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6YmVnaW5UaW1lKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmJlZ2luVGltZTsKK30KKwordm9pZCBQ
bGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRCZWdpblRpbWUoQ0ZUaW1lSW50ZXJ2YWwgdmFs
dWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLmJlZ2luVGltZSA9IHZhbHVlOworICAgIAorICAgIC8v
IEFsc28gc2V0IGEgZmxhZyB0byB0ZWxsIHVzIGlmIHdlJ3ZlIHBhc3NlZCBpbiBhIDAgdmFsdWUu
IAorICAgIC8vIFRoZSBmbGFnIGlzIG5lZWRlZCBiZWNhdXNlIGxhdGVyIGJlZ2luVGltZSB3aWxs
IGdldCBjaGFuZ2VkCisgICAgLy8gdG8gdGhlIHRpbWUgYXQgd2hpY2ggaXQgZmlyZWQgYW5kIHdl
IG5lZWQgdG8ga25vdyB3aGV0aGVyCisgICAgLy8gb3Igbm90IGl0IHdhcyAwIHRvIGJlZ2luIHdp
dGguCisgICAgaWYgKHZhbHVlKQorICAgICAgICBtX3Byb3BlcnRpZXMuaGFzRXhwbGljaXRCZWdp
blRpbWUgPSB2YWx1ZTsKK30KKworQ0ZUaW1lSW50ZXJ2YWwgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6ZHVyYXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtX3Byb3BlcnRpZXMuZHVyYXRp
b247Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0RHVyYXRpb24oQ0ZU
aW1lSW50ZXJ2YWwgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLmR1cmF0aW9uID0gdmFsdWU7
Cit9CisKK2Zsb2F0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNwZWVkKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnNwZWVkOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmlt
YXRpb25SZW1vdGU6OnNldFNwZWVkKGZsb2F0IHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5z
cGVlZCA9IHZhbHVlOworfQorCitDRlRpbWVJbnRlcnZhbCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVt
b3RlOjp0aW1lT2Zmc2V0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnRpbWVP
ZmZzZXQ7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VGltZU9mZnNl
dChDRlRpbWVJbnRlcnZhbCB2YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMudGltZU9mZnNldCA9
IHZhbHVlOworfQorCitmbG9hdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpyZXBlYXRDb3Vu
dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5yZXBlYXRDb3VudDsKK30KKwor
dm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRSZXBlYXRDb3VudChmbG9hdCB2YWx1
ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMucmVwZWF0Q291bnQgPSB2YWx1ZTsKK30KKworYm9vbCBQ
bGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjphdXRvcmV2ZXJzZXMoKSBjb25zdAoreworICAgIHJl
dHVybiBtX3Byb3BlcnRpZXMuYXV0b1JldmVyc2VzOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmlt
YXRpb25SZW1vdGU6OnNldEF1dG9yZXZlcnNlcyhib29sIHZhbHVlKQoreworICAgIG1fcHJvcGVy
dGllcy5hdXRvUmV2ZXJzZXMgPSB2YWx1ZTsKK30KKworUGxhdGZvcm1DQUFuaW1hdGlvbjo6Rmls
bE1vZGVUeXBlIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmZpbGxNb2RlKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmZpbGxNb2RlOworfQorCit2b2lkIFBsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGU6OnNldEZpbGxNb2RlKEZpbGxNb2RlVHlwZSB2YWx1ZSkKK3sKKyAgICBt
X3Byb3BlcnRpZXMuZmlsbE1vZGUgPSB2YWx1ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0
aW9uUmVtb3RlOjpzZXRUaW1pbmdGdW5jdGlvbihjb25zdCBUaW1pbmdGdW5jdGlvbiogdmFsdWUs
IGJvb2wgcmV2ZXJzZSkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPFRpbWluZ0Z1bmN0aW9uPj4gdGlt
aW5nRnVuY3Rpb25zOworICAgIHRpbWluZ0Z1bmN0aW9ucy5hcHBlbmQodmFsdWUtPmNsb25lKCkp
OworCisgICAgbV9wcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucyA9IFdURk1vdmUodGltaW5nRnVu
Y3Rpb25zKTsKKyAgICBtX3Byb3BlcnRpZXMucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyA9IHJldmVy
c2U7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6Y29weVRpbWluZ0Z1bmN0
aW9uRnJvbShjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uJiB2YWx1ZSkKK3sKKyAgICBjb3B5VGlt
aW5nRnVuY3Rpb25zRnJvbSh2YWx1ZSk7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6aXNSZW1vdmVkT25Db21wbGV0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9w
ZXJ0aWVzLnJlbW92ZWRPbkNvbXBsZXRpb247Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlv
blJlbW90ZTo6c2V0UmVtb3ZlZE9uQ29tcGxldGlvbihib29sIHZhbHVlKQoreworICAgIG1fcHJv
cGVydGllcy5yZW1vdmVkT25Db21wbGV0aW9uID0gdmFsdWU7Cit9CisKK2Jvb2wgUGxhdGZvcm1D
QUFuaW1hdGlvblJlbW90ZTo6aXNBZGRpdGl2ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJv
cGVydGllcy5hZGRpdGl2ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpz
ZXRBZGRpdGl2ZShib29sIHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5hZGRpdGl2ZSA9IHZh
bHVlOworfQorCitQbGF0Zm9ybUNBQW5pbWF0aW9uOjpWYWx1ZUZ1bmN0aW9uVHlwZSBQbGF0Zm9y
bUNBQW5pbWF0aW9uUmVtb3RlOjp2YWx1ZUZ1bmN0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bV9wcm9wZXJ0aWVzLnZhbHVlRnVuY3Rpb247Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlv
blJlbW90ZTo6c2V0VmFsdWVGdW5jdGlvbihWYWx1ZUZ1bmN0aW9uVHlwZSB2YWx1ZSkKK3sKKyAg
ICBtX3Byb3BlcnRpZXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlOworfQorCit2b2lkIFBsYXRmb3Jt
Q0FBbmltYXRpb25SZW1vdGU6OnNldEZyb21WYWx1ZShmbG9hdCB2YWx1ZSkKK3sKKyAgICBpZiAo
YW5pbWF0aW9uVHlwZSgpICE9IEJhc2ljKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3Bl
cnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzBd
ID0gS2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6c2V0RnJvbVZhbHVlKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB2YWx1ZSkKK3sK
KyAgICBpZiAoYW5pbWF0aW9uVHlwZSgpICE9IEJhc2ljKQorICAgICAgICByZXR1cm47CisKKyAg
ICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKKyAgICBtX3Byb3BlcnRpZXMua2V5
VmFsdWVzWzBdID0gS2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZTo6c2V0RnJvbVZhbHVlKGNvbnN0IEZsb2F0UG9pbnQzRCYgdmFsdWUpCit7
CisgICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKKyAgICAgICAgcmV0dXJuOworCisg
ICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9wcm9wZXJ0aWVzLmtl
eVZhbHVlc1swXSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOworfQorCit2b2lkIFBsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGU6OnNldEZyb21WYWx1ZShjb25zdCBDb2xvciYgdmFsdWUpCit7CisgICAg
aWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9w
cm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVl
c1swXSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGU6OnNldEZyb21WYWx1ZShjb25zdCBGaWx0ZXJPcGVyYXRpb24qIG9wZXJhdGlvbiwg
aW50IGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCkKK3sKKyAgICBpZiAoYW5pbWF0aW9uVHlw
ZSgpICE9IEJhc2ljKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFs
dWVzLnJlc2l6ZSgyKTsKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzBdID0gS2V5ZnJhbWVW
YWx1ZShvcGVyYXRpb24tPmNsb25lKCkpOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OmNvcHlGcm9tVmFsdWVGcm9tKGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb24mIHZhbHVl
KQoreworICAgIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUmIG90aGVyID0gZG93bmNh
c3Q8UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4odmFsdWUpOworCisgICAgaWYgKG90aGVyLm1f
cHJvcGVydGllcy5rZXlWYWx1ZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisgICAgCisg
ICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9wcm9wZXJ0aWVzLmtl
eVZhbHVlc1swXSA9IG90aGVyLm1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMF07Cit9CisKK3ZvaWQg
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VG9WYWx1ZShmbG9hdCB2YWx1ZSkKK3sKKyAg
ICBpZiAoYW5pbWF0aW9uVHlwZSgpICE9IEJhc2ljKQorICAgICAgICByZXR1cm47CisKKyAgICBt
X3Byb3BlcnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFs
dWVzWzFdID0gS2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1h
dGlvblJlbW90ZTo6c2V0VG9WYWx1ZShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdmFsdWUp
Cit7CisgICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9wcm9wZXJ0aWVz
LmtleVZhbHVlc1sxXSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOworfQorCit2b2lkIFBsYXRmb3Jt
Q0FBbmltYXRpb25SZW1vdGU6OnNldFRvVmFsdWUoY29uc3QgRmxvYXRQb2ludDNEJiB2YWx1ZSkK
K3sKKyAgICBpZiAoYW5pbWF0aW9uVHlwZSgpICE9IEJhc2ljKQorICAgICAgICByZXR1cm47CisK
KyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKKyAgICBtX3Byb3BlcnRpZXMu
a2V5VmFsdWVzWzFdID0gS2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1D
QUFuaW1hdGlvblJlbW90ZTo6c2V0VG9WYWx1ZShjb25zdCBDb2xvciYgdmFsdWUpCit7CisgICAg
aWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9w
cm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVl
c1sxXSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGU6OnNldFRvVmFsdWUoY29uc3QgRmlsdGVyT3BlcmF0aW9uKiBvcGVyYXRpb24sIGlu
dCBpbnRlcm5hbEZpbHRlclByb3BlcnR5SW5kZXgpCit7CisgICAgaWYgKGFuaW1hdGlvblR5cGUo
KSAhPSBCYXNpYykKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIFVOVVNFRF9QQVJBTShpbnRl
cm5hbEZpbHRlclByb3BlcnR5SW5kZXgpOworICAgIEFTU0VSVChvcGVyYXRpb24pOworICAgIG1f
cHJvcGVydGllcy5rZXlWYWx1ZXMucmVzaXplKDIpOworICAgIG1fcHJvcGVydGllcy5rZXlWYWx1
ZXNbMV0gPSBLZXlmcmFtZVZhbHVlKG9wZXJhdGlvbi0+Y2xvbmUoKSk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6Y29weVRvVmFsdWVGcm9tKGNvbnN0IFBsYXRmb3JtQ0FB
bmltYXRpb24mIHZhbHVlKQoreworICAgIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUm
IG90aGVyID0gZG93bmNhc3Q8UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4odmFsdWUpOworCisg
ICAgaWYgKG90aGVyLm1fcHJvcGVydGllcy5rZXlWYWx1ZXMuc2l6ZSgpIDwgMikKKyAgICAgICAg
cmV0dXJuOworICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMucmVzaXplKDIpOworICAgIG1fcHJv
cGVydGllcy5rZXlWYWx1ZXNbMV0gPSBvdGhlci5tX3Byb3BlcnRpZXMua2V5VmFsdWVzWzFdOwor
fQorCisvLyBLZXlmcmFtZS1hbmltYXRpb24gcHJvcGVydGllcy4KK3ZvaWQgUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZTo6c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxmbG9hdD4mIHZhbHVlcykKK3sK
KyAgICBpZiAoYW5pbWF0aW9uVHlwZSgpICE9IEtleWZyYW1lKQorICAgICAgICByZXR1cm47CisK
KyAgICBWZWN0b3I8S2V5ZnJhbWVWYWx1ZT4ga2V5ZnJhbWVzOworICAgIGtleWZyYW1lcy5yZXNl
cnZlSW5pdGlhbENhcGFjaXR5KHZhbHVlcy5zaXplKCkpOworICAgIAorICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKTsgKytpKQorICAgICAgICBrZXlmcmFtZXMudW5jaGVj
a2VkQXBwZW5kKEtleWZyYW1lVmFsdWUodmFsdWVzW2ldKSk7CisgICAgCisgICAgbV9wcm9wZXJ0
aWVzLmtleVZhbHVlcyA9IFdURk1vdmUoa2V5ZnJhbWVzKTsKK30KKwordm9pZCBQbGF0Zm9ybUNB
QW5pbWF0aW9uUmVtb3RlOjpzZXRWYWx1ZXMoY29uc3QgVmVjdG9yPFRyYW5zZm9ybWF0aW9uTWF0
cml4PiYgdmFsdWVzKQoreworICAgIGlmIChhbmltYXRpb25UeXBlKCkgIT0gS2V5ZnJhbWUpCisg
ICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgVmVjdG9yPEtleWZyYW1lVmFsdWU+IGtleWZy
YW1lczsKKyAgICBrZXlmcmFtZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eSh2YWx1ZXMuc2l6ZSgp
KTsKKyAgICAKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7ICsraSkK
KyAgICAgICAga2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlmcmFtZVZhbHVlKHZhbHVlc1tp
XSkpOworICAgIAorICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMgPSBXVEZNb3ZlKGtleWZyYW1l
cyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VmFsdWVzKGNvbnN0
IFZlY3RvcjxGbG9hdFBvaW50M0Q+JiB2YWx1ZXMpCit7CisgICAgaWYgKGFuaW1hdGlvblR5cGUo
KSAhPSBLZXlmcmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICBWZWN0b3I8S2V5
ZnJhbWVWYWx1ZT4ga2V5ZnJhbWVzOworICAgIGtleWZyYW1lcy5yZXNlcnZlSW5pdGlhbENhcGFj
aXR5KHZhbHVlcy5zaXplKCkpOworICAgIAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFs
dWVzLnNpemUoKTsgKytpKQorICAgICAgICBrZXlmcmFtZXMudW5jaGVja2VkQXBwZW5kKEtleWZy
YW1lVmFsdWUodmFsdWVzW2ldKSk7CisgICAgCisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcyA9
IFdURk1vdmUoa2V5ZnJhbWVzKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3Rl
OjpzZXRWYWx1ZXMoY29uc3QgVmVjdG9yPENvbG9yPiYgdmFsdWVzKQoreworICAgIGlmIChhbmlt
YXRpb25UeXBlKCkgIT0gS2V5ZnJhbWUpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAg
VmVjdG9yPEtleWZyYW1lVmFsdWU+IGtleWZyYW1lczsKKyAgICBrZXlmcmFtZXMucmVzZXJ2ZUlu
aXRpYWxDYXBhY2l0eSh2YWx1ZXMuc2l6ZSgpKTsKKyAgICAKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHZhbHVlcy5zaXplKCk7ICsraSkKKyAgICAgICAga2V5ZnJhbWVzLnVuY2hlY2tlZEFw
cGVuZChLZXlmcmFtZVZhbHVlKHZhbHVlc1tpXSkpOworICAgIAorICAgIG1fcHJvcGVydGllcy5r
ZXlWYWx1ZXMgPSBXVEZNb3ZlKGtleWZyYW1lcyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1h
dGlvblJlbW90ZTo6c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9u
Pj4mIHZhbHVlcywgaW50IGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCkKK3sKKyAgICBVTlVT
RURfUEFSQU0oaW50ZXJuYWxGaWx0ZXJQcm9wZXJ0eUluZGV4KTsKKyAgICAKKyAgICBpZiAoYW5p
bWF0aW9uVHlwZSgpICE9IEtleWZyYW1lKQorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAg
IFZlY3RvcjxLZXlmcmFtZVZhbHVlPiBrZXlmcmFtZXM7CisgICAga2V5ZnJhbWVzLnJlc2VydmVJ
bml0aWFsQ2FwYWNpdHkodmFsdWVzLnNpemUoKSk7CisgICAgCisgICAgZm9yIChhdXRvJiB2YWx1
ZSA6IHZhbHVlcykKKyAgICAgICAga2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlmcmFtZVZh
bHVlIHsgdmFsdWUuY29weVJlZigpIH0pOworICAgIAorICAgIG1fcHJvcGVydGllcy5rZXlWYWx1
ZXMgPSBXVEZNb3ZlKGtleWZyYW1lcyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6Y29weVZhbHVlc0Zyb20oY29uc3QgUGxhdGZvcm1DQUFuaW1hdGlvbiYgdmFsdWUpCit7
CisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcyA9IGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGU+KHZhbHVlKS5tX3Byb3BlcnRpZXMua2V5VmFsdWVzOworfQorCit2b2lkIFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU6OnNldEtleVRpbWVzKGNvbnN0IFZlY3RvcjxmbG9hdD4mIGtl
eVRpbWVzKQoreworICAgIG1fcHJvcGVydGllcy5rZXlUaW1lcyA9IGtleVRpbWVzOworfQorCit2
b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNvcHlLZXlUaW1lc0Zyb20oY29uc3QgUGxh
dGZvcm1DQUFuaW1hdGlvbiYgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLmtleVRpbWVzID0g
ZG93bmNhc3Q8UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4odmFsdWUpLm1fcHJvcGVydGllcy5r
ZXlUaW1lczsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRUaW1pbmdG
dW5jdGlvbnMoY29uc3QgVmVjdG9yPGNvbnN0IFRpbWluZ0Z1bmN0aW9uKj4mIHZhbHVlcywgYm9v
bCByZXZlcnNlKQoreworICAgIFZlY3RvcjxSZWZQdHI8V2ViQ29yZTo6VGltaW5nRnVuY3Rpb24+
PiB0aW1pbmdGdW5jdGlvbnM7CisgICAgdGltaW5nRnVuY3Rpb25zLnJlc2VydmVJbml0aWFsQ2Fw
YWNpdHkodmFsdWVzLnNpemUoKSk7CisgICAgCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2
YWx1ZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIHRpbWluZ0Z1bmN0aW9ucy51bmNoZWNrZWRBcHBl
bmQodmFsdWVzW2ldLT5jbG9uZSgpKTsKKyAgICAKKyAgICBtX3Byb3BlcnRpZXMudGltaW5nRnVu
Y3Rpb25zID0gV1RGTW92ZSh0aW1pbmdGdW5jdGlvbnMpOworICAgIG1fcHJvcGVydGllcy5yZXZl
cnNlVGltaW5nRnVuY3Rpb25zID0gcmV2ZXJzZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0
aW9uUmVtb3RlOjpjb3B5VGltaW5nRnVuY3Rpb25zRnJvbShjb25zdCBQbGF0Zm9ybUNBQW5pbWF0
aW9uJiB2YWx1ZSkKK3sKKyAgICBjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlJiBvdGhl
ciA9IGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KHZhbHVlKTsKKworICAgIG1f
cHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMgPSBvdGhlci5tX3Byb3BlcnRpZXMudGltaW5nRnVu
Y3Rpb25zOworICAgIG1fcHJvcGVydGllcy5yZXZlcnNlVGltaW5nRnVuY3Rpb25zID0gb3RoZXIu
bV9wcm9wZXJ0aWVzLnJldmVyc2VUaW1pbmdGdW5jdGlvbnM7Cit9CisKK3N0YXRpYyBOU09iamVj
dCogYW5pbWF0aW9uVmFsdWVGcm9tS2V5ZnJhbWVWYWx1ZShjb25zdCBQbGF0Zm9ybUNBQW5pbWF0
aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVlJiBrZXlmcmFtZVZhbHVlKQoreworICAgIHN3aXRjaCAo
a2V5ZnJhbWVWYWx1ZS5rZXlmcmFtZVR5cGUoKSkgeworICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1h
dGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6TnVtYmVyS2V5VHlwZToKKyAgICAgICAgcmV0dXJu
IEAoa2V5ZnJhbWVWYWx1ZS5udW1iZXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIAorICAgIGNhc2Ug
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6Q29sb3JLZXlUeXBlOiB7
CisgICAgICAgIENvbG9yIGNvbG9yID0ga2V5ZnJhbWVWYWx1ZS5jb2xvclZhbHVlKCk7CisgICAg
ICAgIHJldHVybiBAWyBAKGNvbG9yLnJlZCgpKSwgQChjb2xvci5ncmVlbigpKSwgQChjb2xvci5i
bHVlKCkpLCBAKGNvbG9yLmFscGhhKCkpIF07CisgICAgfQorCisgICAgY2FzZSBQbGF0Zm9ybUNB
QW5pbWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVlOjpQb2ludEtleVR5cGU6IHsKKyAgICAgICAg
RmxvYXRQb2ludDNEIHBvaW50ID0ga2V5ZnJhbWVWYWx1ZS5wb2ludFZhbHVlKCk7CisgICAgICAg
IHJldHVybiBAWyBAKHBvaW50LngoKSksIEAocG9pbnQueSgpKSwgQChwb2ludC56KCkpIF07Cisg
ICAgfQorICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6
VHJhbnNmb3JtS2V5VHlwZToKKyAgICAgICAgcmV0dXJuIFtOU1ZhbHVlIHZhbHVlV2l0aENBVHJh
bnNmb3JtM0Q6a2V5ZnJhbWVWYWx1ZS50cmFuc2Zvcm1WYWx1ZSgpXTsKKyAgICAgICAgICAgIAor
ICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6RmlsdGVy
S2V5VHlwZToKKyAgICAgICAgcmV0dXJuIFBsYXRmb3JtQ0FGaWx0ZXJzOjpmaWx0ZXJWYWx1ZUZv
ck9wZXJhdGlvbihrZXlmcmFtZVZhbHVlLmZpbHRlclZhbHVlKCksIDAgLyogdW51c2VkICovKS5h
dXRvcmVsZWFzZSgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYWRkQW5pbWF0aW9uVG9MYXll
cihDQUxheWVyICpsYXllciwgUmVtb3RlTGF5ZXJUcmVlSG9zdCogbGF5ZXJUcmVlSG9zdCwgY29u
c3QgU3RyaW5nJiBrZXksIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRp
ZXMmIHByb3BlcnRpZXMpCit7CisgICAgUmV0YWluUHRyPENBUHJvcGVydHlBbmltYXRpb24+IGNh
QW5pbWF0aW9uOworICAgIHN3aXRjaCAocHJvcGVydGllcy5hbmltYXRpb25UeXBlKSB7CisgICAg
Y2FzZSBQbGF0Zm9ybUNBQW5pbWF0aW9uOjpCYXNpYzogeworICAgICAgICBSZXRhaW5QdHI8Q0FC
YXNpY0FuaW1hdGlvbj4gYmFzaWNBbmltYXRpb247CisgICAgICAgIGJhc2ljQW5pbWF0aW9uID0g
W0NBQmFzaWNBbmltYXRpb24gYW5pbWF0aW9uV2l0aEtleVBhdGg6cHJvcGVydGllcy5rZXlQYXRo
XTsKKyAgICAgICAgCisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmtleVZhbHVlcy5zaXplKCkgPiAx
KSB7CisgICAgICAgICAgICBbYmFzaWNBbmltYXRpb24gc2V0RnJvbVZhbHVlOmFuaW1hdGlvblZh
bHVlRnJvbUtleWZyYW1lVmFsdWUocHJvcGVydGllcy5rZXlWYWx1ZXNbMF0pXTsKKyAgICAgICAg
ICAgIFtiYXNpY0FuaW1hdGlvbiBzZXRUb1ZhbHVlOmFuaW1hdGlvblZhbHVlRnJvbUtleWZyYW1l
VmFsdWUocHJvcGVydGllcy5rZXlWYWx1ZXNbMV0pXTsKKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgaWYgKHByb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zLnNpemUoKSkKKyAgICAgICAgICAg
IFtiYXNpY0FuaW1hdGlvbiBzZXRUaW1pbmdGdW5jdGlvbjp0b0NBTWVkaWFUaW1pbmdGdW5jdGlv
bihwcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9uc1swXS5nZXQoKSwgcHJvcGVydGllcy5yZXZlcnNl
VGltaW5nRnVuY3Rpb25zKV07CisgICAgICAgIAorICAgICAgICBjYUFuaW1hdGlvbiA9IGJhc2lj
QW5pbWF0aW9uOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQbGF0Zm9ybUNBQW5p
bWF0aW9uOjpLZXlmcmFtZTogeworICAgICAgICBSZXRhaW5QdHI8Q0FLZXlmcmFtZUFuaW1hdGlv
bj4ga2V5ZnJhbWVBbmltYXRpb247CisgICAgICAgIGtleWZyYW1lQW5pbWF0aW9uID0gW0NBS2V5
ZnJhbWVBbmltYXRpb24gYW5pbWF0aW9uV2l0aEtleVBhdGg6cHJvcGVydGllcy5rZXlQYXRoXTsK
KworICAgICAgICBpZiAocHJvcGVydGllcy5rZXlWYWx1ZXMuc2l6ZSgpKSB7CisgICAgICAgICAg
ICBSZXRhaW5QdHI8TlNNdXRhYmxlQXJyYXk+IGtleWZyYW1lcyA9IGFkb3B0TlMoW1tOU011dGFi
bGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpwcm9wZXJ0aWVzLmtleVZhbHVlcy5zaXpl
KCldKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdmFsdWUgOiBwcm9wZXJ0aWVzLmtl
eVZhbHVlcykKKyAgICAgICAgICAgICAgICBba2V5ZnJhbWVzIGFkZE9iamVjdDphbmltYXRpb25W
YWx1ZUZyb21LZXlmcmFtZVZhbHVlKHZhbHVlKV07CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IFtrZXlmcmFtZUFuaW1hdGlvbiBzZXRWYWx1ZXM6a2V5ZnJhbWVzLmdldCgpXTsKKyAgICAgICAg
fQorCisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmtleVRpbWVzLnNpemUoKSkgeworICAgICAgICAg
ICAgUmV0YWluUHRyPE5TTXV0YWJsZUFycmF5PiBrZXlUaW1lcyA9IGFkb3B0TlMoW1tOU011dGFi
bGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpwcm9wZXJ0aWVzLmtleVRpbWVzLnNpemUo
KV0pOworICAgICAgICAgICAgZm9yIChhdXRvIGtleVRpbWUgOiBwcm9wZXJ0aWVzLmtleVRpbWVz
KQorICAgICAgICAgICAgICAgIFtrZXlUaW1lcyBhZGRPYmplY3Q6QChrZXlUaW1lKV07CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIFtrZXlmcmFtZUFuaW1hdGlvbiBzZXRLZXlUaW1lczprZXlU
aW1lcy5nZXQoKV07CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvcGVydGllcy50aW1pbmdG
dW5jdGlvbnMuc2l6ZSgpKSB7CisgICAgICAgICAgICBSZXRhaW5QdHI8TlNNdXRhYmxlQXJyYXk+
IHRpbWluZ0Z1bmN0aW9ucyA9IGFkb3B0TlMoW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdp
dGhDYXBhY2l0eTpwcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucy5zaXplKCldKTsKKyAgICAgICAg
ICAgIGZvciAoY29uc3QgYXV0byYgdGltaW5nRnVuY3Rpb24gOiBwcm9wZXJ0aWVzLnRpbWluZ0Z1
bmN0aW9ucykKKyAgICAgICAgICAgICAgICBbdGltaW5nRnVuY3Rpb25zIGFkZE9iamVjdDp0b0NB
TWVkaWFUaW1pbmdGdW5jdGlvbih0aW1pbmdGdW5jdGlvbi5nZXQoKSwgcHJvcGVydGllcy5yZXZl
cnNlVGltaW5nRnVuY3Rpb25zKV07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFtrZXlmcmFt
ZUFuaW1hdGlvbiBzZXRUaW1pbmdGdW5jdGlvbnM6dGltaW5nRnVuY3Rpb25zLmdldCgpXTsKKyAg
ICAgICAgfQorICAgICAgICAKKyAgICAgICAgY2FBbmltYXRpb24gPSBrZXlmcmFtZUFuaW1hdGlv
bjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvbjo6
U3ByaW5nOiB7CisgICAgICAgIFJldGFpblB0cjxDQVNwcmluZ0FuaW1hdGlvbj4gc3ByaW5nQW5p
bWF0aW9uOworICAgICAgICBzcHJpbmdBbmltYXRpb24gPSBbQ0FTcHJpbmdBbmltYXRpb24gYW5p
bWF0aW9uV2l0aEtleVBhdGg6cHJvcGVydGllcy5rZXlQYXRoXTsKKyAgICAgICAgCisgICAgICAg
IGlmIChwcm9wZXJ0aWVzLmtleVZhbHVlcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBbc3By
aW5nQW5pbWF0aW9uIHNldEZyb21WYWx1ZTphbmltYXRpb25WYWx1ZUZyb21LZXlmcmFtZVZhbHVl
KHByb3BlcnRpZXMua2V5VmFsdWVzWzBdKV07CisgICAgICAgICAgICBbc3ByaW5nQW5pbWF0aW9u
IHNldFRvVmFsdWU6YW5pbWF0aW9uVmFsdWVGcm9tS2V5ZnJhbWVWYWx1ZShwcm9wZXJ0aWVzLmtl
eVZhbHVlc1sxXSldOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocHJvcGVydGll
cy50aW1pbmdGdW5jdGlvbnMuc2l6ZSgpKSB7CisgICAgICAgICAgICBhdXRvJiB0aW1pbmdGdW5j
dGlvbiA9IHByb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zWzBdOworICAgICAgICAgICAgaWYgKHRp
bWluZ0Z1bmN0aW9uLT5pc1NwcmluZ1RpbWluZ0Z1bmN0aW9uKCkpIHsKKyAgICAgICAgICAgICAg
ICBhdXRvJiBmdW5jdGlvbiA9ICpzdGF0aWNfY2FzdDxjb25zdCBTcHJpbmdUaW1pbmdGdW5jdGlv
bio+KHRpbWluZ0Z1bmN0aW9uLmdldCgpKTsKKyAgICAgICAgICAgICAgICBbc3ByaW5nQW5pbWF0
aW9uIHNldE1hc3M6ZnVuY3Rpb24ubWFzcygpXTsKKyAgICAgICAgICAgICAgICBbc3ByaW5nQW5p
bWF0aW9uIHNldFN0aWZmbmVzczpmdW5jdGlvbi5zdGlmZm5lc3MoKV07CisgICAgICAgICAgICAg
ICAgW3NwcmluZ0FuaW1hdGlvbiBzZXREYW1waW5nOmZ1bmN0aW9uLmRhbXBpbmcoKV07CisgICAg
ICAgICAgICAgICAgW3NwcmluZ0FuaW1hdGlvbiBzZXRJbml0aWFsVmVsb2NpdHk6ZnVuY3Rpb24u
aW5pdGlhbFZlbG9jaXR5KCldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNh
QW5pbWF0aW9uID0gc3ByaW5nQW5pbWF0aW9uOworICAgICAgICBicmVhazsKKyAgICB9CisgICAg
fQorICAgIAorICAgIFtjYUFuaW1hdGlvbiBzZXRCZWdpblRpbWU6cHJvcGVydGllcy5iZWdpblRp
bWVdOworICAgIFtjYUFuaW1hdGlvbiBzZXREdXJhdGlvbjpwcm9wZXJ0aWVzLmR1cmF0aW9uXTsK
KyAgICBbY2FBbmltYXRpb24gc2V0VGltZU9mZnNldDpwcm9wZXJ0aWVzLnRpbWVPZmZzZXRdOwor
ICAgIFtjYUFuaW1hdGlvbiBzZXRSZXBlYXRDb3VudDpwcm9wZXJ0aWVzLnJlcGVhdENvdW50XTsK
KyAgICBbY2FBbmltYXRpb24gc2V0U3BlZWQ6cHJvcGVydGllcy5zcGVlZF07CisgICAgW2NhQW5p
bWF0aW9uIHNldEF1dG9yZXZlcnNlczpwcm9wZXJ0aWVzLmF1dG9SZXZlcnNlc107CisgICAgW2Nh
QW5pbWF0aW9uIHNldFJlbW92ZWRPbkNvbXBsZXRpb246cHJvcGVydGllcy5yZW1vdmVkT25Db21w
bGV0aW9uXTsKKyAgICBbY2FBbmltYXRpb24gc2V0QWRkaXRpdmU6cHJvcGVydGllcy5hZGRpdGl2
ZV07CisgICAgCisgICAgaWYgKHByb3BlcnRpZXMuZmlsbE1vZGUgIT0gUGxhdGZvcm1DQUFuaW1h
dGlvbjo6Tm9GaWxsTW9kZSkKKyAgICAgICAgW2NhQW5pbWF0aW9uIHNldEZpbGxNb2RlOnRvQ0FG
aWxsTW9kZVR5cGUocHJvcGVydGllcy5maWxsTW9kZSldOworCisgICAgaWYgKHByb3BlcnRpZXMu
dmFsdWVGdW5jdGlvbiAhPSBQbGF0Zm9ybUNBQW5pbWF0aW9uOjpOb1ZhbHVlRnVuY3Rpb24pCisg
ICAgICAgIFtjYUFuaW1hdGlvbiBzZXRWYWx1ZUZ1bmN0aW9uOltDQVZhbHVlRnVuY3Rpb24gZnVu
Y3Rpb25XaXRoTmFtZTp0b0NBVmFsdWVGdW5jdGlvblR5cGUocHJvcGVydGllcy52YWx1ZUZ1bmN0
aW9uKV1dOworICAgIAorICAgIGlmIChwcm9wZXJ0aWVzLmhhc0V4cGxpY2l0QmVnaW5UaW1lKQor
ICAgICAgICBbY2FBbmltYXRpb24gc2V0VmFsdWU6QFlFUyBmb3JLZXk6V0tFeHBsaWNpdEJlZ2lu
VGltZUZsYWddOworICAgIAorICAgIGlmIChsYXllclRyZWVIb3N0KSB7CisgICAgICAgIEdyYXBo
aWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCBsYXllcklEID0gUmVtb3RlTGF5ZXJUcmVlSG9zdDo6
bGF5ZXJJRChsYXllcik7CisgICAgCisgICAgICAgIFJldGFpblB0cjxXS0FuaW1hdGlvbkRlbGVn
YXRlPiYgZGVsZWdhdGUgPSBsYXllclRyZWVIb3N0LT5hbmltYXRpb25EZWxlZ2F0ZXMoKS5hZGQo
bGF5ZXJJRCwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOworICAgICAgICBpZiAoIWRlbGVnYXRl
KQorICAgICAgICAgICAgZGVsZWdhdGUgPSBhZG9wdE5TKFtbV0tBbmltYXRpb25EZWxlZ2F0ZSBh
bGxvY10gaW5pdFdpdGhMYXllcklEOmxheWVySUQgbGF5ZXJUcmVlSG9zdDpsYXllclRyZWVIb3N0
XSk7CisKKyAgICAgICAgW2NhQW5pbWF0aW9uIHNldERlbGVnYXRlOmRlbGVnYXRlLmdldCgpXTsK
KyAgICB9CisgICAgCisgICAgW2xheWVyIGFkZEFuaW1hdGlvbjpjYUFuaW1hdGlvbi5nZXQoKSBm
b3JLZXk6a2V5XTsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjp1cGRhdGVM
YXllckFuaW1hdGlvbnMoQ0FMYXllciAqbGF5ZXIsIFJlbW90ZUxheWVyVHJlZUhvc3QqIGxheWVy
VHJlZUhvc3QsIGNvbnN0IEFuaW1hdGlvbnNMaXN0JiBhbmltYXRpb25zVG9BZGQsIGNvbnN0IEhh
c2hTZXQ8U3RyaW5nPiYgYW5pbWF0aW9uc1RvUmVtb3ZlKQoreworICAgIEJFR0lOX0JMT0NLX09C
SkNfRVhDRVBUSU9OUzsKKworICAgIGZvciAoY29uc3QgYXV0byYgdmFsdWUgOiBhbmltYXRpb25z
VG9SZW1vdmUpCisgICAgICAgIFtsYXllciByZW1vdmVBbmltYXRpb25Gb3JLZXk6dmFsdWVdOwor
CisgICAgZm9yIChjb25zdCBhdXRvJiBrZXlBbmltYXRpb25QYWlyIDogYW5pbWF0aW9uc1RvQWRk
KQorICAgICAgICBhZGRBbmltYXRpb25Ub0xheWVyKGxheWVyLCBsYXllclRyZWVIb3N0LCBrZXlB
bmltYXRpb25QYWlyLmZpcnN0LCBrZXlBbmltYXRpb25QYWlyLnNlY29uZCk7CisKKyAgICBFTkRf
QkxPQ0tfT0JKQ19FWENFUFRJT05TOworfQorCitUZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFRleHRT
dHJlYW0mdHMsIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWUm
IHZhbHVlKQoreworICAgIHN3aXRjaCAodmFsdWUua2V5ZnJhbWVUeXBlKCkpIHsKKyAgICBjYXNl
IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6Ok51bWJlcktleVR5cGU6
CisgICAgICAgIHRzIDw8ICJudW1iZXI9IiA8PCB2YWx1ZS5udW1iZXJWYWx1ZSgpOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFs
dWU6OkNvbG9yS2V5VHlwZToKKyAgICAgICAgdHMgPDwgImNvbG9yPSI7CisgICAgICAgIHRzIDw8
IHZhbHVlLmNvbG9yVmFsdWUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybUNB
QW5pbWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVlOjpQb2ludEtleVR5cGU6CisgICAgICAgIHRz
IDw8ICJwb2ludD0iOworICAgICAgICB0cyA8PCB2YWx1ZS5wb2ludFZhbHVlKCk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1
ZTo6VHJhbnNmb3JtS2V5VHlwZToKKyAgICAgICAgdHMgPDwgInRyYW5zZm9ybT0iOworICAgICAg
ICB0cyA8PCB2YWx1ZS50cmFuc2Zvcm1WYWx1ZSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6OkZpbHRlcktleVR5cGU6
CisgICAgICAgIHRzIDw8ICJmaWx0ZXI9IjsKKyAgICAgICAgaWYgKHZhbHVlLmZpbHRlclZhbHVl
KCkpCisgICAgICAgICAgICB0cyA8PCAqdmFsdWUuZmlsdGVyVmFsdWUoKTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgdHMgPDwgIm51bGwiOworICAgICAgICBicmVhazsKKyAgICB9CisgICAg
cmV0dXJuIHRzOworfQorCitUZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFRleHRTdHJlYW0mIHRzLCBj
b25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpQcm9wZXJ0aWVzJiBhbmltYXRpb24pCit7
CisgICAgdHMgPDwgInR5cGU9IjsKKyAgICB0cyA8PCBhbmltYXRpb24uYW5pbWF0aW9uVHlwZTsK
KyAgICB0cyA8PCAiIGtleVBhdGg9IjsKKyAgICB0cyA8PCBhbmltYXRpb24ua2V5UGF0aDsKKwor
ICAgIGlmIChhbmltYXRpb24uYmVnaW5UaW1lKQorICAgICAgICB0cy5kdW1wUHJvcGVydHkoImJl
Z2luVGltZSIsIGFuaW1hdGlvbi5iZWdpblRpbWUpOworCisgICAgaWYgKGFuaW1hdGlvbi5kdXJh
dGlvbikKKyAgICAgICAgdHMuZHVtcFByb3BlcnR5KCJkdXJhdGlvbiIsIGFuaW1hdGlvbi5kdXJh
dGlvbik7CisKKyAgICBpZiAoYW5pbWF0aW9uLnRpbWVPZmZzZXQpCisgICAgICAgIHRzLmR1bXBQ
cm9wZXJ0eSgidGltZU9mZnNldCIsIGFuaW1hdGlvbi50aW1lT2Zmc2V0KTsKKworICAgIHRzLmR1
bXBQcm9wZXJ0eSgicmVwZWF0Q291bnQiLCBhbmltYXRpb24ucmVwZWF0Q291bnQpOworCisgICAg
aWYgKGFuaW1hdGlvbi5zcGVlZCAhPSAxKQorICAgICAgICB0cy5kdW1wUHJvcGVydHkoInNwZWVk
IiwgYW5pbWF0aW9uLnNwZWVkKTsKKworICAgIHRzLmR1bXBQcm9wZXJ0eSgiZmlsbE1vZGUiLCBh
bmltYXRpb24uZmlsbE1vZGUpOworICAgIHRzLmR1bXBQcm9wZXJ0eSgidmFsdWVGdW5jdGlvbiIs
IGFuaW1hdGlvbi52YWx1ZUZ1bmN0aW9uKTsKKworICAgIGlmIChhbmltYXRpb24uYXV0b1JldmVy
c2VzKQorICAgICAgICB0cy5kdW1wUHJvcGVydHkoImF1dG9SZXZlcnNlcyIsIGFuaW1hdGlvbi5h
dXRvUmV2ZXJzZXMpOworCisgICAgaWYgKCFhbmltYXRpb24ucmVtb3ZlZE9uQ29tcGxldGlvbikK
KyAgICAgICAgdHMuZHVtcFByb3BlcnR5KCJyZW1vdmVkT25Db21wbGV0aW9uIiwgYW5pbWF0aW9u
LnJlbW92ZWRPbkNvbXBsZXRpb24pOworCisgICAgaWYgKGFuaW1hdGlvbi5hZGRpdGl2ZSkKKyAg
ICAgICAgdHMuZHVtcFByb3BlcnR5KCJhZGRpdGl2ZSIsIGFuaW1hdGlvbi5hZGRpdGl2ZSk7CisK
KyAgICBpZiAoYW5pbWF0aW9uLnJldmVyc2VUaW1pbmdGdW5jdGlvbnMpCisgICAgICAgIHRzLmR1
bXBQcm9wZXJ0eSgicmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyIsIGFuaW1hdGlvbi5yZXZlcnNlVGlt
aW5nRnVuY3Rpb25zKTsKKworICAgIGlmIChhbmltYXRpb24uaGFzRXhwbGljaXRCZWdpblRpbWUp
CisgICAgICAgIHRzLmR1bXBQcm9wZXJ0eSgiaGFzRXhwbGljaXRCZWdpblRpbWUiLCBhbmltYXRp
b24uaGFzRXhwbGljaXRCZWdpblRpbWUpOworCisgICAgdHMgPDwgIlxuIjsKKyAgICB0cy5pbmNy
ZWFzZUluZGVudCgpOworICAgIHRzLndyaXRlSW5kZW50KCk7CisgICAgdHMgPDwgIigiIDw8ICJr
ZXlmcmFtZXMiOworICAgIHRzLmluY3JlYXNlSW5kZW50KCk7CisKKyAgICBzaXplX3QgbWF4RnJh
bWVzID0gc3RkOjptYXgoYW5pbWF0aW9uLmtleVZhbHVlcy5zaXplKCksIGFuaW1hdGlvbi5rZXlU
aW1lcy5zaXplKCkpOworICAgIG1heEZyYW1lcyA9IHN0ZDo6bWF4KG1heEZyYW1lcywgYW5pbWF0
aW9uLnRpbWluZ0Z1bmN0aW9ucy5zaXplKCkpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBtYXhGcmFtZXM7ICsraSkgeworICAgICAgICB0cyA8PCAiXG4iOworICAgICAgICB0cy53cml0
ZUluZGVudCgpOworICAgICAgICB0cyA8PCAiKGtleWZyYW1lICIgPDwgdW5zaWduZWQoaSk7Cisg
ICAgICAgIGlmIChpIDwgYW5pbWF0aW9uLmtleVRpbWVzLnNpemUoKSkKKyAgICAgICAgICAgIHRz
LmR1bXBQcm9wZXJ0eSgidGltZSIsIGFuaW1hdGlvbi5rZXlUaW1lc1tpXSk7CisKKyAgICAgICAg
aWYgKGkgPCBhbmltYXRpb24udGltaW5nRnVuY3Rpb25zLnNpemUoKSAmJiBhbmltYXRpb24udGlt
aW5nRnVuY3Rpb25zW2ldKQorICAgICAgICAgICAgdHMuZHVtcFByb3BlcnR5PGNvbnN0IFRpbWlu
Z0Z1bmN0aW9uJj4oInRpbWluZyBmdW5jdGlvbiIsICphbmltYXRpb24udGltaW5nRnVuY3Rpb25z
W2ldKTsKKworICAgICAgICBpZiAoaSA8IGFuaW1hdGlvbi5rZXlWYWx1ZXMuc2l6ZSgpKQorICAg
ICAgICAgICAgdHMuZHVtcFByb3BlcnR5KCJ2YWx1ZSIsIGFuaW1hdGlvbi5rZXlWYWx1ZXNbaV0p
OworCisgICAgICAgIHRzIDw8ICIpIjsKKyAgICB9CisKKyAgICB0cy5kZWNyZWFzZUluZGVudCgp
OworICAgIHRzLmRlY3JlYXNlSW5kZW50KCk7CisKKyAgICByZXR1cm4gdHM7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dl
YlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5jcHAgYi9Tb3VyY2Uv
V2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUxheWVy
UmVtb3RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wZDE0ZWVkODExNzcwZmZkMDQ5NTFlOTJiMDEyMTM1NjZj
NWUwYmRmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBh
Z2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5jcHAKQEAgLTAsMCArMSw4
NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW1wb3J0ICJQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaCIKKworI2lt
cG9ydCAiUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tLmgiCisjaW1wb3J0ICJQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuaCIKKyNpbXBvcnQgIlJlbW90ZUxheWVyQmFja2luZ1N0
b3JlLmgiCisjaW1wb3J0ICJSZW1vdGVMYXllclRyZWVDb250ZXh0LmgiCisjaW1wb3J0ICJSZW1v
dGVMYXllclRyZWVQcm9wZXJ0eUFwcGxpZXIuaCIKKyNpbXBvcnQgPFdlYkNvcmUvQW5pbWF0aW9u
VXRpbGl0aWVzLmg+CisjaW1wb3J0IDxXZWJDb3JlL0dyYXBoaWNzQ29udGV4dC5oPgorI2ltcG9y
dCA8V2ViQ29yZS9HcmFwaGljc0xheWVyQ0EuaD4KKyNpbXBvcnQgPFdlYkNvcmUvTGVuZ3RoRnVu
Y3Rpb25zLmg+CisjaW1wb3J0IDxXZWJDb3JlL1BsYXRmb3JtQ0FGaWx0ZXJzLmg+CisjaW1wb3J0
IDxXZWJDb3JlL1BsYXRmb3JtQ0FMYXllckNvY29hLmg+CisjaW1wb3J0IDxXZWJDb3JlL1RpbGVk
QmFja2luZy5oPgorI2ltcG9ydCA8d3RmL0N1cnJlbnRUaW1lLmg+CisKK3VzaW5nIG5hbWVzcGFj
ZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworUmVmPFBsYXRmb3JtQ0FMYXllclJl
bW90ZT4gUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjcmVhdGUoTGF5ZXJUeXBlIGxheWVyVHlwZSwg
UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgY29u
dGV4dCkKK3sKKyAgICBSZWZQdHI8UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBsYXllcjsKKworICAg
IGlmIChsYXllclR5cGUgPT0gTGF5ZXJUeXBlVGlsZWRCYWNraW5nTGF5ZXIgfHwgIGxheWVyVHlw
ZSA9PSBMYXllclR5cGVQYWdlVGlsZWRCYWNraW5nTGF5ZXIpCisgICAgICAgIGxheWVyID0gYWRv
cHRSZWYobmV3IFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZyhsYXllclR5cGUsIG93
bmVyLCBjb250ZXh0KSk7CisgICAgZWxzZQorICAgICAgICBsYXllciA9IGFkb3B0UmVmKG5ldyBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGUobGF5ZXJUeXBlLCBvd25lciwgY29udGV4dCkpOworCisgICAg
Y29udGV4dC5sYXllcldhc0NyZWF0ZWQoKmxheWVyLCBsYXllclR5cGUpOworCisgICAgcmV0dXJu
IGxheWVyLnJlbGVhc2VOb25OdWxsKCk7Cit9CisKK1JlZjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+
IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y3JlYXRlKFBsYXRmb3JtTGF5ZXIgKnBsYXRmb3JtTGF5
ZXIsIFBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIsIFJlbW90ZUxheWVyVHJlZUNvbnRleHQm
IGNvbnRleHQpCit7CisgICAgcmV0dXJuIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6Y3Jl
YXRlKHBsYXRmb3JtTGF5ZXIsIG93bmVyLCBjb250ZXh0KTsKK30KKworUmVmPFBsYXRmb3JtQ0FM
YXllclJlbW90ZT4gUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjcmVhdGUoY29uc3QgUGxhdGZvcm1D
QUxheWVyUmVtb3RlJiBvdGhlciwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25l
ciwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCkKK3sKKyAgICBhdXRvIGxheWVyID0g
YWRvcHRSZWYoKm5ldyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUob3RoZXIsIG93bmVyLCBjb250ZXh0
KSk7CisKKyAgICBjb250ZXh0LmxheWVyV2FzQ3JlYXRlZChsYXllci5nZXQoKSwgb3RoZXIubGF5
ZXJUeXBlKCkpOworCisgICAgcmV0dXJuIGxheWVyOworfQorCitQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6OlBsYXRmb3JtQ0FMYXllclJlbW90ZShMYXllclR5cGUgbGF5ZXJUeXBlLCBQbGF0Zm9ybUNB
TGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250ZXh0KQorICAg
IDogUGxhdGZvcm1DQUxheWVyKGxheWVyVHlwZSwgb3duZXIpCisgICAgLCBtX2NvbnRleHQoJmNv
bnRleHQpCit7CisgICAgaWYgKG93bmVyICYmIGxheWVyVHlwZSAhPSBMYXllclR5cGVDb250ZW50
c1Byb3ZpZGVkTGF5ZXIgJiYgbGF5ZXJUeXBlICE9IExheWVyVHlwZVRyYW5zZm9ybUxheWVyKSB7
CisgICAgICAgIG1fcHJvcGVydGllcy5jb250ZW50c1NjYWxlID0gb3duZXItPnBsYXRmb3JtQ0FM
YXllckRldmljZVNjYWxlRmFjdG9yKCk7CisgICAgICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVy
dGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNvbnRlbnRzU2NhbGVDaGFu
Z2VkKTsKKyAgICB9Cit9CisKK1BsYXRmb3JtQ0FMYXllclJlbW90ZTo6UGxhdGZvcm1DQUxheWVy
UmVtb3RlKGNvbnN0IFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgb3RoZXIsIFBsYXRmb3JtQ0FMYXll
ckNsaWVudCogb3duZXIsIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmIGNvbnRleHQpCisgICAgOiBQ
bGF0Zm9ybUNBTGF5ZXIob3RoZXIubGF5ZXJUeXBlKCksIG93bmVyKQorICAgICwgbV9hY2NlbGVy
YXRlc0RyYXdpbmcob3RoZXIuYWNjZWxlcmF0ZXNEcmF3aW5nKCkpCisgICAgLCBtX2NvbnRleHQo
JmNvbnRleHQpCit7Cit9CisKK1JlZjxQbGF0Zm9ybUNBTGF5ZXI+IFBsYXRmb3JtQ0FMYXllclJl
bW90ZTo6Y2xvbmUoUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikgY29uc3QKK3sKKyAgICBh
dXRvIGNsb25lID0gUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjcmVhdGUoKnRoaXMsIG93bmVyLCAq
bV9jb250ZXh0KTsKKworICAgIHVwZGF0ZUNsb25lZExheWVyUHJvcGVydGllcyhjbG9uZSk7CisK
KyAgICBjbG9uZS0+c2V0Q2xvbmVkTGF5ZXIodGhpcyk7CisgICAgcmV0dXJuIFdURk1vdmUoY2xv
bmUpOworfQorCitQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6On5QbGF0Zm9ybUNBTGF5ZXJSZW1vdGUo
KQoreworICAgIGZvciAoY29uc3QgYXV0byYgbGF5ZXIgOiBtX2NoaWxkcmVuKQorICAgICAgICBk
b3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+KCpsYXllcikubV9zdXBlcmxheWVyID0gbnVs
bHB0cjsKKworICAgIGlmIChtX2NvbnRleHQpCisgICAgICAgIG1fY29udGV4dC0+bGF5ZXJXaWxs
QmVEZXN0cm95ZWQoKnRoaXMpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6dXBk
YXRlQ2xvbmVkTGF5ZXJQcm9wZXJ0aWVzKFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgY2xvbmUsIGJv
b2wgY29weUNvbnRlbnRzKSBjb25zdAoreworICAgIGNsb25lLnNldFBvc2l0aW9uKHBvc2l0aW9u
KCkpOworICAgIGNsb25lLnNldEJvdW5kcyhib3VuZHMoKSk7CisgICAgY2xvbmUuc2V0QW5jaG9y
UG9pbnQoYW5jaG9yUG9pbnQoKSk7CisKKyAgICBpZiAobV9wcm9wZXJ0aWVzLnRyYW5zZm9ybSkK
KyAgICAgICAgY2xvbmUuc2V0VHJhbnNmb3JtKCptX3Byb3BlcnRpZXMudHJhbnNmb3JtKTsKKwor
ICAgIGlmIChtX3Byb3BlcnRpZXMuc3VibGF5ZXJUcmFuc2Zvcm0pCisgICAgICAgIGNsb25lLnNl
dFN1YmxheWVyVHJhbnNmb3JtKCptX3Byb3BlcnRpZXMuc3VibGF5ZXJUcmFuc2Zvcm0pOworCisg
ICAgaWYgKGNvcHlDb250ZW50cykKKyAgICAgICAgY2xvbmUuc2V0Q29udGVudHMoY29udGVudHMo
KSk7CisKKyAgICBjbG9uZS5zZXRNYXNrc1RvQm91bmRzKG1hc2tzVG9Cb3VuZHMoKSk7CisgICAg
Y2xvbmUuc2V0RG91YmxlU2lkZWQoaXNEb3VibGVTaWRlZCgpKTsKKyAgICBjbG9uZS5zZXRPcGFx
dWUoaXNPcGFxdWUoKSk7CisgICAgY2xvbmUuc2V0QmFja2dyb3VuZENvbG9yKGJhY2tncm91bmRD
b2xvcigpKTsKKyAgICBjbG9uZS5zZXRDb250ZW50c1NjYWxlKGNvbnRlbnRzU2NhbGUoKSk7Cisg
ICAgY2xvbmUuc2V0Q29ybmVyUmFkaXVzKGNvcm5lclJhZGl1cygpKTsKKworICAgIGlmICghbV9w
cm9wZXJ0aWVzLnNoYXBlUGF0aC5pc051bGwoKSkKKyAgICAgICAgY2xvbmUuc2V0U2hhcGVQYXRo
KG1fcHJvcGVydGllcy5zaGFwZVBhdGgpOworCisgICAgaWYgKG1fcHJvcGVydGllcy5zaGFwZVJv
dW5kZWRSZWN0KQorICAgICAgICBjbG9uZS5zZXRTaGFwZVJvdW5kZWRSZWN0KCptX3Byb3BlcnRp
ZXMuc2hhcGVSb3VuZGVkUmVjdCk7CisKKyAgICBpZiAobV9wcm9wZXJ0aWVzLmZpbHRlcnMpCisg
ICAgICAgIGNsb25lLmNvcHlGaWx0ZXJzRnJvbSgqdGhpcyk7CisKKyAgICBjbG9uZS51cGRhdGVD
dXN0b21BcHBlYXJhbmNlKGN1c3RvbUFwcGVhcmFuY2UoKSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjpyZWN1cnNpdmVCdWlsZFRyYW5zYWN0aW9uKFJlbW90ZUxheWVyVHJlZUNv
bnRleHQmIGNvbnRleHQsIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uJiB0cmFuc2FjdGlvbikK
K3sKKyAgICBBU1NFUlQoIW1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUgfHwgb3duZXIoKSk7Cisg
ICAgQVNTRVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oJmNvbnRleHQgPT0gbV9jb250ZXh0
KTsKKyAgICAKKyAgICBpZiAobV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZSAmJiAoIW93bmVyKCkg
fHwgIW93bmVyKCktPnBsYXRmb3JtQ0FMYXllckRyYXdzQ29udGVudCgpKSkgeworICAgICAgICBt
X3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlID0gbnVsbHB0cjsKKyAgICAgICAgbV9wcm9wZXJ0aWVz
Lm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6QmFja2lu
Z1N0b3JlQ2hhbmdlZCk7CisgICAgfQorCisgICAgaWYgKG1fcHJvcGVydGllcy5iYWNraW5nU3Rv
cmUgJiYgbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZUF0dGFjaGVkICYmIG1fcHJvcGVydGllcy5i
YWNraW5nU3RvcmUtPmRpc3BsYXkoKSkKKyAgICAgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0
aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6QmFja2luZ1N0b3JlQ2hhbmdl
ZCk7CisKKyAgICBpZiAobV9wcm9wZXJ0aWVzLmNoYW5nZWRQcm9wZXJ0aWVzICE9IFJlbW90ZUxh
eWVyVHJlZVRyYW5zYWN0aW9uOjpOb0NoYW5nZSkgeworICAgICAgICBpZiAobV9wcm9wZXJ0aWVz
LmNoYW5nZWRQcm9wZXJ0aWVzICYgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNoaWxkcmVu
Q2hhbmdlZCkgeworICAgICAgICAgICAgbV9wcm9wZXJ0aWVzLmNoaWxkcmVuLnJlc2l6ZShtX2No
aWxkcmVuLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fY2hp
bGRyZW4uc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgbV9wcm9wZXJ0aWVzLmNoaWxkcmVu
W2ldID0gbV9jaGlsZHJlbltpXS0+bGF5ZXJJRCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYg
KGlzUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKCkpIHsKKyAgICAgICAgICAgIFJlbW90ZUxh
eWVyVHJlZVByb3BlcnR5QXBwbGllcjo6YXBwbHlQcm9wZXJ0aWVzKHBsYXRmb3JtTGF5ZXIoKSwg
bnVsbHB0ciwgbV9wcm9wZXJ0aWVzLCBSZW1vdGVMYXllclRyZWVQcm9wZXJ0eUFwcGxpZXI6OlJl
bGF0ZWRMYXllck1hcCgpLCBSZW1vdGVMYXllckJhY2tpbmdTdG9yZTo6TGF5ZXJDb250ZW50c1R5
cGU6OkNBTWFjaFBvcnQpOworICAgICAgICAgICAgZGlkQ29tbWl0KCk7CisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cmFuc2FjdGlvbi5sYXllclByb3BlcnRpZXND
aGFuZ2VkKCp0aGlzKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fY2hp
bGRyZW4uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlJiBjaGls
ZCA9IGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4oKm1fY2hpbGRyZW5baV0pOworICAg
ICAgICBBU1NFUlQoY2hpbGQuc3VwZXJsYXllcigpID09IHRoaXMpOworICAgICAgICBjaGlsZC5y
ZWN1cnNpdmVCdWlsZFRyYW5zYWN0aW9uKGNvbnRleHQsIHRyYW5zYWN0aW9uKTsKKyAgICB9CisK
KyAgICBpZiAobV9tYXNrTGF5ZXIpCisgICAgICAgIG1fbWFza0xheWVyLT5yZWN1cnNpdmVCdWls
ZFRyYW5zYWN0aW9uKGNvbnRleHQsIHRyYW5zYWN0aW9uKTsKK30KKwordm9pZCBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU6OmRpZENvbW1pdCgpCit7CisgICAgbV9wcm9wZXJ0aWVzLmFkZGVkQW5pbWF0
aW9ucy5jbGVhcigpOworICAgIG1fcHJvcGVydGllcy5rZXlQYXRoc09mQW5pbWF0aW9uc1RvUmVt
b3ZlLmNsZWFyKCk7CisgICAgbV9wcm9wZXJ0aWVzLnJlc2V0Q2hhbmdlZFByb3BlcnRpZXMoKTsK
K30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmVuc3VyZUJhY2tpbmdTdG9yZSgpCit7
CisgICAgQVNTRVJUKG93bmVyKCkpOworICAgIAorICAgIGlmICghbV9wcm9wZXJ0aWVzLmJhY2tp
bmdTdG9yZSkKKyAgICAgICAgbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZSA9IHN0ZDo6bWFrZV91
bmlxdWU8UmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU+KHRoaXMpOworCisgICAgdXBkYXRlQmFja2lu
Z1N0b3JlKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjp1cGRhdGVCYWNraW5n
U3RvcmUoKQoreworICAgIGlmICghbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZS0+ZW5zdXJlQmFja2luZ1N0
b3JlKG1fcHJvcGVydGllcy5ib3VuZHMuc2l6ZSgpLCBtX3Byb3BlcnRpZXMuY29udGVudHNTY2Fs
ZSwgbV9hY2NlbGVyYXRlc0RyYXdpbmcsIG1fd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUsIG1f
cHJvcGVydGllcy5vcGFxdWUpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0
TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBlbnN1cmVC
YWNraW5nU3RvcmUoKTsKKworICAgIC8vIEZJWE1FOiBOZWVkIHRvIG1hcCB0aGlzIHRocm91Z2gg
Y29udGVudHNSZWN0L2V0Yy4KKyAgICBtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlLT5zZXROZWVk
c0Rpc3BsYXkoZW5jbG9zaW5nSW50UmVjdChyZWN0KSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjpzZXROZWVkc0Rpc3BsYXkoKQoreworICAgIGVuc3VyZUJhY2tpbmdTdG9yZSgp
OworCisgICAgbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZS0+c2V0TmVlZHNEaXNwbGF5KCk7Cit9
CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjb3B5Q29udGVudHNGcm9tTGF5ZXIoUGxh
dGZvcm1DQUxheWVyKiBsYXllcikKK3sKKyAgICBBU1NFUlQobV9wcm9wZXJ0aWVzLmNsb25lZExh
eWVySUQgPT0gbGF5ZXItPmxheWVySUQoKSk7CisgICAgCisgICAgaWYgKCFtX3Byb3BlcnRpZXMu
Y2hhbmdlZFByb3BlcnRpZXMpCisgICAgICAgIG1fY29udGV4dC0+bGF5ZXJQcm9wZXJ0eUNoYW5n
ZWRXaGlsZUJ1aWxkaW5nVHJhbnNhY3Rpb24oKnRoaXMpOworCisgICAgbV9wcm9wZXJ0aWVzLm5v
dGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q2xvbmVkQ29u
dGVudHNDaGFuZ2VkKTsKK30KKworUGxhdGZvcm1DQUxheWVyKiBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6OnN1cGVybGF5ZXIoKSBjb25zdAoreworICAgIHJldHVybiBtX3N1cGVybGF5ZXI7Cit9CisK
K3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpyZW1vdmVGcm9tU3VwZXJsYXllcigpCit7Cisg
ICAgaWYgKCFtX3N1cGVybGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIG1fc3VwZXJsYXll
ci0+cmVtb3ZlU3VibGF5ZXIodGhpcyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
OjpyZW1vdmVTdWJsYXllcihQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUqIGxheWVyKQoreworICAgIHNp
emVfdCBjaGlsZEluZGV4ID0gbV9jaGlsZHJlbi5maW5kKGxheWVyKTsKKyAgICBpZiAoY2hpbGRJ
bmRleCAhPSBub3RGb3VuZCkKKyAgICAgICAgbV9jaGlsZHJlbi5yZW1vdmUoY2hpbGRJbmRleCk7
CisgICAgbGF5ZXItPm1fc3VwZXJsYXllciA9IG51bGxwdHI7CisgICAgbV9wcm9wZXJ0aWVzLm5v
dGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q2hpbGRyZW5D
aGFuZ2VkKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFN1YmxheWVycyhj
b25zdCBQbGF0Zm9ybUNBTGF5ZXJMaXN0JiBsaXN0KQoreworICAgIHJlbW92ZUFsbFN1YmxheWVy
cygpOworICAgIG1fY2hpbGRyZW4gPSBsaXN0OworCisgICAgZm9yIChjb25zdCBhdXRvJiBsYXll
ciA6IGxpc3QpIHsKKyAgICAgICAgbGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAg
ICAgIGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4oKmxheWVyKS5tX3N1cGVybGF5ZXIg
PSB0aGlzOworICAgIH0KKworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQo
UmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNoaWxkcmVuQ2hhbmdlZCk7Cit9CisKK3ZvaWQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpyZW1vdmVBbGxTdWJsYXllcnMoKQoreworICAgIFBsYXRm
b3JtQ0FMYXllckxpc3QgbGF5ZXJzVG9SZW1vdmUgPSBtX2NoaWxkcmVuOworICAgIGZvciAoY29u
c3QgYXV0byYgbGF5ZXIgOiBsYXllcnNUb1JlbW92ZSkKKyAgICAgICAgbGF5ZXItPnJlbW92ZUZy
b21TdXBlcmxheWVyKCk7CisgICAgQVNTRVJUKG1fY2hpbGRyZW4uaXNFbXB0eSgpKTsKKyAgICBt
X3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0
aW9uOjpDaGlsZHJlbkNoYW5nZWQpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
YXBwZW5kU3VibGF5ZXIoUGxhdGZvcm1DQUxheWVyJiBsYXllcikKK3sKKyAgICBSZWY8UGxhdGZv
cm1DQUxheWVyPiBsYXllclByb3RlY3RvcihsYXllcik7CisKKyAgICBsYXllci5yZW1vdmVGcm9t
U3VwZXJsYXllcigpOworICAgIG1fY2hpbGRyZW4uYXBwZW5kKCZsYXllcik7CisgICAgZG93bmNh
c3Q8UGxhdGZvcm1DQUxheWVyUmVtb3RlPihsYXllcikubV9zdXBlcmxheWVyID0gdGhpczsKKyAg
ICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5z
YWN0aW9uOjpDaGlsZHJlbkNoYW5nZWQpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90
ZTo6aW5zZXJ0U3VibGF5ZXIoUGxhdGZvcm1DQUxheWVyJiBsYXllciwgc2l6ZV90IGluZGV4KQor
eworICAgIFJlZjxQbGF0Zm9ybUNBTGF5ZXI+IGxheWVyUHJvdGVjdG9yKGxheWVyKTsKKworICAg
IGxheWVyLnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgbV9jaGlsZHJlbi5pbnNlcnQoaW5k
ZXgsICZsYXllcik7CisgICAgZG93bmNhc3Q8UGxhdGZvcm1DQUxheWVyUmVtb3RlPihsYXllciku
bV9zdXBlcmxheWVyID0gdGhpczsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFu
Z2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDaGlsZHJlbkNoYW5nZWQpOworfQorCit2
b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVwbGFjZVN1YmxheWVyKFBsYXRmb3JtQ0FMYXll
ciYgcmVmZXJlbmNlLCBQbGF0Zm9ybUNBTGF5ZXImIGxheWVyKQoreworICAgIEFTU0VSVChyZWZl
cmVuY2Uuc3VwZXJsYXllcigpID09IHRoaXMpOworICAgIFJlZjxQbGF0Zm9ybUNBTGF5ZXI+IGxh
eWVyUHJvdGVjdG9yKGxheWVyKTsKKworICAgIGxheWVyLnJlbW92ZUZyb21TdXBlcmxheWVyKCk7
CisgICAgc2l6ZV90IHJlZmVyZW5jZUluZGV4ID0gbV9jaGlsZHJlbi5maW5kKCZyZWZlcmVuY2Up
OworICAgIGlmIChyZWZlcmVuY2VJbmRleCAhPSBub3RGb3VuZCkgeworICAgICAgICBtX2NoaWxk
cmVuW3JlZmVyZW5jZUluZGV4XS0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKKyAgICAgICAgbV9j
aGlsZHJlbi5pbnNlcnQocmVmZXJlbmNlSW5kZXgsICZsYXllcik7CisgICAgICAgIGRvd25jYXN0
PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4obGF5ZXIpLm1fc3VwZXJsYXllciA9IHRoaXM7CisgICAg
fQorCisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRy
ZWVUcmFuc2FjdGlvbjo6Q2hpbGRyZW5DaGFuZ2VkKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGU6OmFkb3B0U3VibGF5ZXJzKFBsYXRmb3JtQ0FMYXllciYgc291cmNlKQoreworICAg
IFBsYXRmb3JtQ0FMYXllckxpc3QgbGF5ZXJzVG9Nb3ZlID0gZG93bmNhc3Q8UGxhdGZvcm1DQUxh
eWVyUmVtb3RlPihzb3VyY2UpLm1fY2hpbGRyZW47CisKKyAgICBpZiAoY29uc3QgUGxhdGZvcm1D
QUxheWVyTGlzdCogY3VzdG9tTGF5ZXJzID0gc291cmNlLmN1c3RvbVN1YmxheWVycygpKSB7Cisg
ICAgICAgIGZvciAoY29uc3QgYXV0byYgbGF5ZXIgOiAqY3VzdG9tTGF5ZXJzKSB7CisgICAgICAg
ICAgICBzaXplX3QgbGF5ZXJJbmRleCA9IGxheWVyc1RvTW92ZS5maW5kKGxheWVyKTsKKyAgICAg
ICAgICAgIGlmIChsYXllckluZGV4ICE9IG5vdEZvdW5kKQorICAgICAgICAgICAgICAgIGxheWVy
c1RvTW92ZS5yZW1vdmUobGF5ZXJJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzZXRT
dWJsYXllcnMobGF5ZXJzVG9Nb3ZlKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6
OmFkZEFuaW1hdGlvbkZvcktleShjb25zdCBTdHJpbmcmIGtleSwgUGxhdGZvcm1DQUFuaW1hdGlv
biYgYW5pbWF0aW9uKQoreworICAgIGF1dG8gYWRkUmVzdWx0ID0gbV9hbmltYXRpb25zLnNldChr
ZXksICZhbmltYXRpb24pOworICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSkKKyAgICAgICAg
bV9wcm9wZXJ0aWVzLmFkZGVkQW5pbWF0aW9ucy5hcHBlbmQoc3RkOjpwYWlyPFN0cmluZywgUGxh
dGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6UHJvcGVydGllcz4oa2V5LCBkb3duY2FzdDxQbGF0Zm9y
bUNBQW5pbWF0aW9uUmVtb3RlPihhbmltYXRpb24pLnByb3BlcnRpZXMoKSkpOworICAgIGVsc2Ug
eworICAgICAgICBmb3IgKGF1dG8mIGtleUFuaW1hdGlvblBhaXIgOiBtX3Byb3BlcnRpZXMuYWRk
ZWRBbmltYXRpb25zKSB7CisgICAgICAgICAgICBpZiAoa2V5QW5pbWF0aW9uUGFpci5maXJzdCA9
PSBrZXkpIHsKKyAgICAgICAgICAgICAgICBrZXlBbmltYXRpb25QYWlyLnNlY29uZCA9IGRvd25j
YXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KGFuaW1hdGlvbikucHJvcGVydGllcygpOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQor
ICAgIAorICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJU
cmVlVHJhbnNhY3Rpb246OkFuaW1hdGlvbnNDaGFuZ2VkKTsKKworICAgIGlmIChtX2NvbnRleHQp
CisgICAgICAgIG1fY29udGV4dC0+d2lsbFN0YXJ0QW5pbWF0aW9uT25MYXllcigqdGhpcyk7Cit9
CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpyZW1vdmVBbmltYXRpb25Gb3JLZXkoY29u
c3QgU3RyaW5nJiBrZXkpCit7CisgICAgaWYgKG1fYW5pbWF0aW9ucy5yZW1vdmUoa2V5KSkgewor
ICAgICAgICBtX3Byb3BlcnRpZXMuYWRkZWRBbmltYXRpb25zLnJlbW92ZUZpcnN0TWF0Y2hpbmco
WyZrZXldKGF1dG8mIHBhaXIpIHsKKyAgICAgICAgICAgIHJldHVybiBwYWlyLmZpcnN0ID09IGtl
eTsKKyAgICAgICAgfSk7CisgICAgfQorICAgIG1fcHJvcGVydGllcy5rZXlQYXRoc09mQW5pbWF0
aW9uc1RvUmVtb3ZlLmFkZChrZXkpOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0No
YW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkFuaW1hdGlvbnNDaGFuZ2VkKTsKK30K
KworUmVmUHRyPFBsYXRmb3JtQ0FBbmltYXRpb24+IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6YW5p
bWF0aW9uRm9yS2V5KGNvbnN0IFN0cmluZyYga2V5KQoreworICAgIHJldHVybiBtX2FuaW1hdGlv
bnMuZ2V0KGtleSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0VxdWl2YWxlbnRMYXllcihj
b25zdCBQbGF0Zm9ybUNBTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVy
SUQgbGF5ZXJJRCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQgbmV3TGF5
ZXJJRCA9IGxheWVyID8gbGF5ZXItPmxheWVySUQoKSA6IDA7CisgICAgcmV0dXJuIGxheWVySUQg
PT0gbmV3TGF5ZXJJRDsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmFuaW1hdGlv
blN0YXJ0ZWQoY29uc3QgU3RyaW5nJiBrZXksIENGVGltZUludGVydmFsIGJlZ2luVGltZSkKK3sK
KyAgICBhdXRvIGl0ID0gbV9hbmltYXRpb25zLmZpbmQoa2V5KTsKKyAgICBpZiAoaXQgIT0gbV9h
bmltYXRpb25zLmVuZCgpKQorICAgICAgICBkb3duY2FzdDxQbGF0Zm9ybUNBQW5pbWF0aW9uUmVt
b3RlPigqaXQtPnZhbHVlKS5kaWRTdGFydChiZWdpblRpbWUpOworICAgIAorICAgIGlmIChtX293
bmVyKQorICAgICAgICBtX293bmVyLT5wbGF0Zm9ybUNBTGF5ZXJBbmltYXRpb25TdGFydGVkKGtl
eSwgYmVnaW5UaW1lKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmFuaW1hdGlv
bkVuZGVkKGNvbnN0IFN0cmluZyYga2V5KQoreworICAgIGlmIChtX293bmVyKQorICAgICAgICBt
X293bmVyLT5wbGF0Zm9ybUNBTGF5ZXJBbmltYXRpb25FbmRlZChrZXkpOworfQorCit2b2lkIFBs
YXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TWFzayhQbGF0Zm9ybUNBTGF5ZXIqIGxheWVyKQorewor
ICAgIGlmIChpc0VxdWl2YWxlbnRMYXllcihsYXllciwgbV9wcm9wZXJ0aWVzLm1hc2tMYXllcklE
KSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIGlmIChsYXllcikgeworICAgICAgICBtX21h
c2tMYXllciA9IGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4obGF5ZXIpOworICAgICAg
ICBtX3Byb3BlcnRpZXMubWFza0xheWVySUQgPSBtX21hc2tMYXllci0+bGF5ZXJJRCgpOworICAg
IH0gZWxzZSB7CisgICAgICAgIG1fbWFza0xheWVyID0gbnVsbHB0cjsKKyAgICAgICAgbV9wcm9w
ZXJ0aWVzLm1hc2tMYXllcklEID0gMDsKKyAgICB9CisKKyAgICBtX3Byb3BlcnRpZXMubm90ZVBy
b3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpNYXNrTGF5ZXJDaGFu
Z2VkKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldENsb25lZExheWVyKGNv
bnN0IFBsYXRmb3JtQ0FMYXllciogbGF5ZXIpCit7CisgICAgaWYgKGlzRXF1aXZhbGVudExheWVy
KGxheWVyLCBtX3Byb3BlcnRpZXMuY2xvbmVkTGF5ZXJJRCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmIChsYXllcikKKyAgICAgICAgbV9wcm9wZXJ0aWVzLmNsb25lZExheWVySUQgPSBsYXll
ci0+bGF5ZXJJRCgpOworICAgIGVsc2UKKyAgICAgICAgbV9wcm9wZXJ0aWVzLmNsb25lZExheWVy
SUQgPSAwOworCisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVM
YXllclRyZWVUcmFuc2FjdGlvbjo6Q2xvbmVkQ29udGVudHNDaGFuZ2VkKTsKK30KKworYm9vbCBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmlzT3BhcXVlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9w
cm9wZXJ0aWVzLm9wYXF1ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldE9w
YXF1ZShib29sIHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5vcGFxdWUgPSB2YWx1ZTsKKyAg
ICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5z
YWN0aW9uOjpPcGFxdWVDaGFuZ2VkKTsKKworICAgIHVwZGF0ZUJhY2tpbmdTdG9yZSgpOworfQor
CitGbG9hdFJlY3QgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpib3VuZHMoKSBjb25zdAoreworICAg
IHJldHVybiBtX3Byb3BlcnRpZXMuYm91bmRzOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJl
bW90ZTo6c2V0Qm91bmRzKGNvbnN0IEZsb2F0UmVjdCYgdmFsdWUpCit7CisgICAgaWYgKHZhbHVl
ID09IG1fcHJvcGVydGllcy5ib3VuZHMpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcHJvcGVy
dGllcy5ib3VuZHMgPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFu
Z2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpCb3VuZHNDaGFuZ2VkKTsKKyAgICAKKyAg
ICBpZiAocmVxdWlyZXNDdXN0b21BcHBlYXJhbmNlVXBkYXRlT25Cb3VuZHNDaGFuZ2UoKSkKKyAg
ICAgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6Q3VzdG9tQXBwZWFyYW5jZUNoYW5nZWQpOworCisgICAgdXBkYXRlQmFja2lu
Z1N0b3JlKCk7Cit9CisKK0Zsb2F0UG9pbnQzRCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnBvc2l0
aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnBvc2l0aW9uOworfQorCit2
b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludDNE
JiB2YWx1ZSkKK3sKKyAgICAvLyBXZSBjYW4ndCBlYXJseSByZXR1cm4gaGVyZSBpZiB0aGUgcG9z
aXRpb24gaGFzIG5vdCBjaGFuZ2VkLCBzaW5jZSBHcmFwaGljc0xheWVyQ0E6OnN5bmNQb3NpdGlv
bigpIG1heSBoYXZlIGNoYW5nZWQKKyAgICAvLyB0aGUgR3JhcGhpY3NMYXllciBwb3NpdGlvbiAo
d2hpY2ggZG9lc24ndCBmb3JjZSBhIGdlb21ldHJ5IHVwZGF0ZSkgYnV0IHdlIHdhbnQgYSBzdWJz
ZXF1ZW50IEdyYXBoaWNzTGF5ZXJDQTo6c2V0UG9zaXRpb24oKQorICAgIC8vIHRvIHB1c2ggYSBu
ZXcgcG9zaXRpb24gdG8gdGhlIFVJIHByb2Nlc3MsIGV2ZW4gdGhvdWdoIG91ciBtX3Byb3BlcnRp
ZXMucG9zaXRpb24gaGFzbid0IGNoYW5nZWQuCisgICAgbV9wcm9wZXJ0aWVzLnBvc2l0aW9uID0g
dmFsdWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXll
clRyZWVUcmFuc2FjdGlvbjo6UG9zaXRpb25DaGFuZ2VkKTsKK30KKworRmxvYXRQb2ludDNEIFBs
YXRmb3JtQ0FMYXllclJlbW90ZTo6YW5jaG9yUG9pbnQoKSBjb25zdAoreworICAgIHJldHVybiBt
X3Byb3BlcnRpZXMuYW5jaG9yUG9pbnQ7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
OjpzZXRBbmNob3JQb2ludChjb25zdCBGbG9hdFBvaW50M0QmIHZhbHVlKQoreworICAgIGlmICh2
YWx1ZSA9PSBtX3Byb3BlcnRpZXMuYW5jaG9yUG9pbnQpCisgICAgICAgIHJldHVybjsKKworICAg
IG1fcHJvcGVydGllcy5hbmNob3JQb2ludCA9IHZhbHVlOworICAgIG1fcHJvcGVydGllcy5ub3Rl
UHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkFuY2hvclBvaW50
Q2hhbmdlZCk7Cit9CisKK1RyYW5zZm9ybWF0aW9uTWF0cml4IFBsYXRmb3JtQ0FMYXllclJlbW90
ZTo6dHJhbnNmb3JtKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnRyYW5zZm9y
bSA/ICptX3Byb3BlcnRpZXMudHJhbnNmb3JtIDogVHJhbnNmb3JtYXRpb25NYXRyaXgoKTsKK30K
Kwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLnRyYW5zZm9ybSA9IHN0
ZDo6bWFrZV91bmlxdWU8VHJhbnNmb3JtYXRpb25NYXRyaXg+KHZhbHVlKTsKKyAgICBtX3Byb3Bl
cnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpU
cmFuc2Zvcm1DaGFuZ2VkKTsKK30KKworVHJhbnNmb3JtYXRpb25NYXRyaXggUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjpzdWJsYXllclRyYW5zZm9ybSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJv
cGVydGllcy5zdWJsYXllclRyYW5zZm9ybSA/ICptX3Byb3BlcnRpZXMuc3VibGF5ZXJUcmFuc2Zv
cm0gOiBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJl
bW90ZTo6c2V0U3VibGF5ZXJUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHZh
bHVlKQoreworICAgIG1fcHJvcGVydGllcy5zdWJsYXllclRyYW5zZm9ybSA9IHN0ZDo6bWFrZV91
bmlxdWU8VHJhbnNmb3JtYXRpb25NYXRyaXg+KHZhbHVlKTsKKyAgICBtX3Byb3BlcnRpZXMubm90
ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpTdWJsYXllclRy
YW5zZm9ybUNoYW5nZWQpOworfQorCitib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6aXNIaWRk
ZW4oKSBjb25zdAoreworICAgIHJldHVybiBtX3Byb3BlcnRpZXMuaGlkZGVuOworfQorCit2b2lk
IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0SGlkZGVuKGJvb2wgdmFsdWUpCit7CisgICAgaWYg
KG1fcHJvcGVydGllcy5oaWRkZW4gPT0gdmFsdWUpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
cHJvcGVydGllcy5oaWRkZW4gPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRp
ZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpIaWRkZW5DaGFuZ2VkKTsKK30K
KworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNvbnRlbnRzSGlkZGVuKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmNvbnRlbnRzSGlkZGVuOworfQorCit2b2lkIFBsYXRm
b3JtQ0FMYXllclJlbW90ZTo6c2V0Q29udGVudHNIaWRkZW4oYm9vbCB2YWx1ZSkKK3sKKyAgICBp
ZiAobV9wcm9wZXJ0aWVzLmNvbnRlbnRzSGlkZGVuID09IHZhbHVlKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX3Byb3BlcnRpZXMuY29udGVudHNIaWRkZW4gPSB2YWx1ZTsKKyAgICBtX3Byb3Bl
cnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpD
b250ZW50c0hpZGRlbkNoYW5nZWQpOworfQorCitib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
dXNlckludGVyYWN0aW9uRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGll
cy51c2VySW50ZXJhY3Rpb25FbmFibGVkOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90
ZTo6c2V0VXNlckludGVyYWN0aW9uRW5hYmxlZChib29sIHZhbHVlKQoreworICAgIGlmIChtX3By
b3BlcnRpZXMudXNlckludGVyYWN0aW9uRW5hYmxlZCA9PSB2YWx1ZSkKKyAgICAgICAgcmV0dXJu
OworICAgIAorICAgIG1fcHJvcGVydGllcy51c2VySW50ZXJhY3Rpb25FbmFibGVkID0gdmFsdWU7
CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6VXNlckludGVyYWN0aW9uRW5hYmxlZENoYW5nZWQpOworfQorCit2b2lkIFBs
YXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0QmFja2luZ1N0b3JlQXR0YWNoZWQoYm9vbCB2YWx1ZSkK
K3sKKyAgICBpZiAobV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZUF0dGFjaGVkID09IHZhbHVlKQor
ICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlQXR0YWNoZWQg
PSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxh
eWVyVHJlZVRyYW5zYWN0aW9uOjpCYWNraW5nU3RvcmVBdHRhY2htZW50Q2hhbmdlZCk7Cit9CisK
K2Jvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpiYWNraW5nU3RvcmVBdHRhY2hlZCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmVBdHRhY2hlZDsKK30KKwor
dm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEdlb21ldHJ5RmxpcHBlZChib29sIHZhbHVl
KQoreworICAgIG1fcHJvcGVydGllcy5nZW9tZXRyeUZsaXBwZWQgPSB2YWx1ZTsKKyAgICBtX3By
b3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9u
OjpHZW9tZXRyeUZsaXBwZWRDaGFuZ2VkKTsKK30KKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6Omdlb21ldHJ5RmxpcHBlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5n
ZW9tZXRyeUZsaXBwZWQ7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjppc0RvdWJs
ZVNpZGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmRvdWJsZVNpZGVkOwor
fQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0RG91YmxlU2lkZWQoYm9vbCB2YWx1
ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMuZG91YmxlU2lkZWQgPSB2YWx1ZTsKKyAgICBtX3Byb3Bl
cnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpE
b3VibGVTaWRlZENoYW5nZWQpOworfQorCitib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6bWFz
a3NUb0JvdW5kcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5tYXNrc1RvQm91
bmRzOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TWFza3NUb0JvdW5kcyhi
b29sIHZhbHVlKQoreworICAgIGlmICh2YWx1ZSA9PSBtX3Byb3BlcnRpZXMubWFza3NUb0JvdW5k
cykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVzLm1hc2tzVG9Cb3VuZHMgPSB2
YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVy
VHJlZVRyYW5zYWN0aW9uOjpNYXNrc1RvQm91bmRzQ2hhbmdlZCk7Cit9CisKK2Jvb2wgUGxhdGZv
cm1DQUxheWVyUmVtb3RlOjphY2NlbGVyYXRlc0RyYXdpbmcoKSBjb25zdAoreworICAgIHJldHVy
biBtX2FjY2VsZXJhdGVzRHJhd2luZzsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6
OnNldEFjY2VsZXJhdGVzRHJhd2luZyhib29sIGFjY2VsZXJhdGVzRHJhd2luZykKK3sKKyAgICBt
X2FjY2VsZXJhdGVzRHJhd2luZyA9IGFjY2VsZXJhdGVzRHJhd2luZzsKKyAgICB1cGRhdGVCYWNr
aW5nU3RvcmUoKTsKK30KKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OndhbnRzRGVlcENv
bG9yQmFja2luZ1N0b3JlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV93YW50c0RlZXBDb2xvckJh
Y2tpbmdTdG9yZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFdhbnRzRGVl
cENvbG9yQmFja2luZ1N0b3JlKGJvb2wgd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUpCit7Cisg
ICAgbV93YW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZSA9IHdhbnRzRGVlcENvbG9yQmFja2luZ1N0
b3JlOworICAgIHVwZGF0ZUJhY2tpbmdTdG9yZSgpOworfQorCitib29sIFBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6c3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dCgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGZhbHNlOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0U3VwcG9y
dHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dChib29sKQoreworfQorCitDRlR5cGVSZWYgUGxhdGZv
cm1DQUxheWVyUmVtb3RlOjpjb250ZW50cygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG51bGxwdHI7
Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRDb250ZW50cyhDRlR5cGVSZWYg
dmFsdWUpCit7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRDb250ZW50c1Jl
Y3QoY29uc3QgRmxvYXRSZWN0JiB2YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMuY29udGVudHNS
ZWN0ID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1v
dGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q29udGVudHNSZWN0Q2hhbmdlZCk7Cit9CisKK3ZvaWQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRNaW5pZmljYXRpb25GaWx0ZXIoRmlsdGVyVHlwZSB2
YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMubWluaWZpY2F0aW9uRmlsdGVyID0gdmFsdWU7Cisg
ICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFu
c2FjdGlvbjo6TWluaWZpY2F0aW9uRmlsdGVyQ2hhbmdlZCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjpzZXRNYWduaWZpY2F0aW9uRmlsdGVyKEZpbHRlclR5cGUgdmFsdWUpCit7
CisgICAgbV9wcm9wZXJ0aWVzLm1hZ25pZmljYXRpb25GaWx0ZXIgPSB2YWx1ZTsKKyAgICBtX3By
b3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9u
OjpNYWduaWZpY2F0aW9uRmlsdGVyQ2hhbmdlZCk7Cit9CisKK0NvbG9yIFBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6YmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0
aWVzLmJhY2tncm91bmRDb2xvcjsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNl
dEJhY2tncm91bmRDb2xvcihjb25zdCBDb2xvciYgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVz
LmJhY2tncm91bmRDb2xvciA9IHZhbHVlOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGll
c0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkJhY2tncm91bmRDb2xvckNoYW5n
ZWQpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0Qm9yZGVyV2lkdGgoZmxv
YXQgdmFsdWUpCit7CisgICAgaWYgKHZhbHVlID09IG1fcHJvcGVydGllcy5ib3JkZXJXaWR0aCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVzLmJvcmRlcldpZHRoID0gdmFsdWU7
CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6Qm9yZGVyV2lkdGhDaGFuZ2VkKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGU6OnNldEJvcmRlckNvbG9yKGNvbnN0IENvbG9yJiB2YWx1ZSkKK3sKKyAgICBpZiAo
dmFsdWUgPT0gbV9wcm9wZXJ0aWVzLmJvcmRlckNvbG9yKQorICAgICAgICByZXR1cm47CisKKyAg
ICBtX3Byb3BlcnRpZXMuYm9yZGVyQ29sb3IgPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90
ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpCb3JkZXJDb2xv
ckNoYW5nZWQpOworfQorCitmbG9hdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6Om9wYWNpdHkoKSBj
b25zdAoreworICAgIHJldHVybiBtX3Byb3BlcnRpZXMub3BhY2l0eTsKK30KKwordm9pZCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldE9wYWNpdHkoZmxvYXQgdmFsdWUpCit7CisgICAgbV9wcm9w
ZXJ0aWVzLm9wYWNpdHkgPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXND
aGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpPcGFjaXR5Q2hhbmdlZCk7Cit9CisK
K3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRGaWx0ZXJzKGNvbnN0IEZpbHRlck9wZXJh
dGlvbnMmIGZpbHRlcnMpCit7CisgICAgbV9wcm9wZXJ0aWVzLmZpbHRlcnMgPSBzdGQ6Om1ha2Vf
dW5pcXVlPEZpbHRlck9wZXJhdGlvbnM+KGZpbHRlcnMpOworICAgIG1fcHJvcGVydGllcy5ub3Rl
UHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkZpbHRlcnNDaGFu
Z2VkKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNvcHlGaWx0ZXJzRnJvbShj
b25zdCBQbGF0Zm9ybUNBTGF5ZXImIHNvdXJjZUxheWVyKQoreworICAgIGlmIChjb25zdCBGaWx0
ZXJPcGVyYXRpb25zKiBmaWx0ZXJzID0gZG93bmNhc3Q8UGxhdGZvcm1DQUxheWVyUmVtb3RlPihz
b3VyY2VMYXllcikubV9wcm9wZXJ0aWVzLmZpbHRlcnMuZ2V0KCkpCisgICAgICAgIHNldEZpbHRl
cnMoKmZpbHRlcnMpOworICAgIGVsc2UgaWYgKG1fcHJvcGVydGllcy5maWx0ZXJzKQorICAgICAg
ICBtX3Byb3BlcnRpZXMuZmlsdGVycyA9IG51bGxwdHI7CisKKyAgICBtX3Byb3BlcnRpZXMubm90
ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpGaWx0ZXJzQ2hh
bmdlZCk7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX0NPTVBPU0lUSU5HKQordm9pZCBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU6OnNldEJsZW5kTW9kZShCbGVuZE1vZGUgYmxlbmRNb2RlKQoreworICAgIG1f
cHJvcGVydGllcy5ibGVuZE1vZGUgPSBibGVuZE1vZGU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQ
cm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6QmxlbmRNb2RlQ2hh
bmdlZCk7Cit9CisjZW5kaWYKKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmZpbHRlcnND
YW5CZUNvbXBvc2l0ZWQoY29uc3QgRmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycykKK3sKKyAgICBy
ZXR1cm4gUGxhdGZvcm1DQUxheWVyQ29jb2E6OmZpbHRlcnNDYW5CZUNvbXBvc2l0ZWQoZmlsdGVy
cyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXROYW1lKGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLm5hbWUgPSB2YWx1ZTsKKyAgICBtX3Byb3Bl
cnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpO
YW1lQ2hhbmdlZCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRTcGVlZChm
bG9hdCB2YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMuc3BlZWQgPSB2YWx1ZTsKKyAgICBtX3By
b3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9u
OjpTcGVlZENoYW5nZWQpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0VGlt
ZU9mZnNldChDRlRpbWVJbnRlcnZhbCB2YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMudGltZU9m
ZnNldCA9IHZhbHVlOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlRpbWVPZmZzZXRDaGFuZ2VkKTsKK30KKworZmxvYXQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjb250ZW50c1NjYWxlKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9wcm9wZXJ0aWVzLmNvbnRlbnRzU2NhbGU7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjpzZXRDb250ZW50c1NjYWxlKGZsb2F0IHZhbHVlKQoreworICAgIG1fcHJvcGVydGll
cy5jb250ZW50c1NjYWxlID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVz
Q2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q29udGVudHNTY2FsZUNoYW5nZWQp
OworCisgICAgdXBkYXRlQmFja2luZ1N0b3JlKCk7Cit9CisKK2Zsb2F0IFBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6Y29ybmVyUmFkaXVzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVz
LmNvcm5lclJhZGl1czsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldENvcm5l
clJhZGl1cyhmbG9hdCB2YWx1ZSkKK3sKKyAgICBpZiAobV9wcm9wZXJ0aWVzLmNvcm5lclJhZGl1
cyA9PSB2YWx1ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVzLmNvcm5lclJh
ZGl1cyA9IHZhbHVlOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNvcm5lclJhZGl1c0NoYW5nZWQpOworfQorCit2b2lk
IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0RWRnZUFudGlhbGlhc2luZ01hc2sodW5zaWduZWQg
dmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLmVkZ2VBbnRpYWxpYXNpbmdNYXNrID0gdmFsdWU7
CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6RWRnZUFudGlhbGlhc2luZ01hc2tDaGFuZ2VkKTsKK30KKworRmxvYXRSb3Vu
ZGVkUmVjdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNoYXBlUm91bmRlZFJlY3QoKSBjb25zdAor
eworICAgIHJldHVybiBtX3Byb3BlcnRpZXMuc2hhcGVSb3VuZGVkUmVjdCA/ICptX3Byb3BlcnRp
ZXMuc2hhcGVSb3VuZGVkUmVjdCA6IEZsb2F0Um91bmRlZFJlY3QoRmxvYXRSZWN0KCkpOworfQor
Cit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0U2hhcGVSb3VuZGVkUmVjdChjb25zdCBG
bG9hdFJvdW5kZWRSZWN0JiByb3VuZGVkUmVjdCkKK3sKKyAgICBpZiAobV9wcm9wZXJ0aWVzLnNo
YXBlUm91bmRlZFJlY3QgJiYgKm1fcHJvcGVydGllcy5zaGFwZVJvdW5kZWRSZWN0ID09IHJvdW5k
ZWRSZWN0KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3BlcnRpZXMuc2hhcGVSb3VuZGVk
UmVjdCA9IHN0ZDo6bWFrZV91bmlxdWU8RmxvYXRSb3VuZGVkUmVjdD4ocm91bmRlZFJlY3QpOwor
ICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJh
bnNhY3Rpb246OlNoYXBlUm91bmRlZFJlY3RDaGFuZ2VkKTsKK30KKworUGF0aCBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU6OnNoYXBlUGF0aCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1fbGF5ZXJUeXBl
ID09IExheWVyVHlwZVNoYXBlTGF5ZXIpOworICAgIHJldHVybiBtX3Byb3BlcnRpZXMuc2hhcGVQ
YXRoOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0U2hhcGVQYXRoKGNvbnN0
IFBhdGgmIHBhdGgpCit7CisgICAgQVNTRVJUKG1fbGF5ZXJUeXBlID09IExheWVyVHlwZVNoYXBl
TGF5ZXIpOworICAgIG1fcHJvcGVydGllcy5zaGFwZVBhdGggPSBwYXRoOworICAgIG1fcHJvcGVy
dGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlNo
YXBlUGF0aENoYW5nZWQpOworfQorCitXaW5kUnVsZSBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNo
YXBlV2luZFJ1bGUoKSBjb25zdAoreworICAgIEFTU0VSVChtX2xheWVyVHlwZSA9PSBMYXllclR5
cGVTaGFwZUxheWVyKTsKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLndpbmRSdWxlOworfQorCit2
b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0U2hhcGVXaW5kUnVsZShXaW5kUnVsZSB3aW5k
UnVsZSkKK3sKKyAgICBBU1NFUlQobV9sYXllclR5cGUgPT0gTGF5ZXJUeXBlU2hhcGVMYXllcik7
CisgICAgbV9wcm9wZXJ0aWVzLndpbmRSdWxlID0gd2luZFJ1bGU7CisgICAgbV9wcm9wZXJ0aWVz
Lm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6V2luZFJ1
bGVDaGFuZ2VkKTsKK30KKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnJlcXVpcmVzQ3Vz
dG9tQXBwZWFyYW5jZVVwZGF0ZU9uQm91bmRzQ2hhbmdlKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bV9wcm9wZXJ0aWVzLmN1c3RvbUFwcGVhcmFuY2UgPT0gR3JhcGhpY3NMYXllcjo6U2Nyb2xsaW5n
U2hhZG93OworfQorCitHcmFwaGljc0xheWVyOjpDdXN0b21BcHBlYXJhbmNlIFBsYXRmb3JtQ0FM
YXllclJlbW90ZTo6Y3VzdG9tQXBwZWFyYW5jZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJv
cGVydGllcy5jdXN0b21BcHBlYXJhbmNlOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90
ZTo6dXBkYXRlQ3VzdG9tQXBwZWFyYW5jZShHcmFwaGljc0xheWVyOjpDdXN0b21BcHBlYXJhbmNl
IGN1c3RvbUFwcGVhcmFuY2UpCit7CisgICAgbV9wcm9wZXJ0aWVzLmN1c3RvbUFwcGVhcmFuY2Ug
PSBjdXN0b21BcHBlYXJhbmNlOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5n
ZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkN1c3RvbUFwcGVhcmFuY2VDaGFuZ2VkKTsK
K30KKworUmVmPFBsYXRmb3JtQ0FMYXllcj4gUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjcmVhdGVD
b21wYXRpYmxlTGF5ZXIoUGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGUgbGF5ZXJUeXBlLCBQbGF0
Zm9ybUNBTGF5ZXJDbGllbnQqIGNsaWVudCkgY29uc3QKK3sKKyAgICByZXR1cm4gUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjpjcmVhdGUobGF5ZXJUeXBlLCBjbGllbnQsICptX2NvbnRleHQpOworfQor
Cit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6ZW51bWVyYXRlUmVjdHNCZWluZ0RyYXduKENH
Q29udGV4dFJlZiBjb250ZXh0LCB2b2lkICheYmxvY2spKENHUmVjdCkpCit7CisgICAgbV9wcm9w
ZXJ0aWVzLmJhY2tpbmdTdG9yZS0+ZW51bWVyYXRlUmVjdHNCZWluZ0RyYXduKGNvbnRleHQsIGJs
b2NrKTsKK30KKwordWludDMyX3QgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpob3N0aW5nQ29udGV4
dElEKCkKK3sKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKwor
dW5zaWduZWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpiYWNraW5nU3RvcmVCeXRlc1BlclBpeGVs
KCkgY29uc3QKK3sKKyAgICBpZiAoIW1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUpCisgICAgICAg
IHJldHVybiA0OworCisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUtPmJ5dGVz
UGVyUGl4ZWwoKTsKK30KKworTGF5ZXJQb29sJiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmxheWVy
UG9vbCgpCit7CisgICAgcmV0dXJuIG1fY29udGV4dC0+bGF5ZXJQb29sKCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dl
YlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5oIGIvU291cmNlL1dl
YktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJl
bW90ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLmE5NjM1ZWY5MWYzMTljNzI3ZGVjYzIyY2IxYTg4ZmMwNzY4MDA4
MGQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9S
ZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUxheWVyUmVtb3RlLmgKQEAgLTAsMCArMSwyMjcgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9u
Y2UKKworI2luY2x1ZGUgIlJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uLmgiCisjaW5jbHVkZSA8
V2ViQ29yZS9QbGF0Zm9ybUNBTGF5ZXIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtTGF5
ZXIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgTGF5ZXJQb29sOworfQorCituYW1l
c3BhY2UgV2ViS2l0IHsKKworY2xhc3MgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDsKKworY2xhc3Mg
UGxhdGZvcm1DQUxheWVyUmVtb3RlIDogcHVibGljIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllciB7
CitwdWJsaWM6CisgICAgc3RhdGljIFJlZjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+IGNyZWF0ZShX
ZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSwgV2ViQ29yZTo6UGxhdGZvcm1DQUxh
eWVyQ2xpZW50KiwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYpOworICAgIHN0YXRpYyBSZWY8UGxh
dGZvcm1DQUxheWVyUmVtb3RlPiBjcmVhdGUoUGxhdGZvcm1MYXllciAqLCBXZWJDb3JlOjpQbGF0
Zm9ybUNBTGF5ZXJDbGllbnQqLCBSZW1vdGVMYXllclRyZWVDb250ZXh0Jik7CisgICAgc3RhdGlj
IFJlZjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+IGNyZWF0ZShjb25zdCBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGUmLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqLCBSZW1vdGVMYXllclRyZWVD
b250ZXh0Jik7CisKKyAgICB2aXJ0dWFsIH5QbGF0Zm9ybUNBTGF5ZXJSZW1vdGUoKTsKKworICAg
IFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBu
dWxscHRyOyB9CisKKyAgICB2b2lkIHJlY3Vyc2l2ZUJ1aWxkVHJhbnNhY3Rpb24oUmVtb3RlTGF5
ZXJUcmVlQ29udGV4dCYsIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uJik7CisKKyAgICB2b2lk
IHNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmIGRpcnR5UmVj
dCkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKSBvdmVycmlkZTsKKworICAg
IHZvaWQgY29weUNvbnRlbnRzRnJvbUxheWVyKFBsYXRmb3JtQ0FMYXllciopIG92ZXJyaWRlOwor
CisgICAgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyKiBzdXBlcmxheWVyKCkgY29uc3Qgb3ZlcnJp
ZGU7CisgICAgdm9pZCByZW1vdmVGcm9tU3VwZXJsYXllcigpIG92ZXJyaWRlOworICAgIHZvaWQg
c2V0U3VibGF5ZXJzKGNvbnN0IFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckxpc3QmKSBvdmVycmlk
ZTsKKyAgICB2b2lkIHJlbW92ZUFsbFN1YmxheWVycygpIG92ZXJyaWRlOworICAgIHZvaWQgYXBw
ZW5kU3VibGF5ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyJikgb3ZlcnJpZGU7CisgICAgdm9p
ZCBpbnNlcnRTdWJsYXllcihXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXImLCBzaXplX3QgaW5kZXgp
IG92ZXJyaWRlOworICAgIHZvaWQgcmVwbGFjZVN1YmxheWVyKFdlYkNvcmU6OlBsYXRmb3JtQ0FM
YXllciYgcmVmZXJlbmNlLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXImKSBvdmVycmlkZTsKKyAg
ICBjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJMaXN0KiBjdXN0b21TdWJsYXllcnMoKSBj
b25zdCBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9CisgICAgdm9pZCBhZG9wdFN1YmxheWVy
cyhXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXImIHNvdXJjZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lk
IGFkZEFuaW1hdGlvbkZvcktleShjb25zdCBTdHJpbmcmIGtleSwgV2ViQ29yZTo6UGxhdGZvcm1D
QUFuaW1hdGlvbiYpIG92ZXJyaWRlOworICAgIHZvaWQgcmVtb3ZlQW5pbWF0aW9uRm9yS2V5KGNv
bnN0IFN0cmluZyYga2V5KSBvdmVycmlkZTsKKyAgICBSZWZQdHI8V2ViQ29yZTo6UGxhdGZvcm1D
QUFuaW1hdGlvbj4gYW5pbWF0aW9uRm9yS2V5KGNvbnN0IFN0cmluZyYga2V5KSBvdmVycmlkZTsK
KyAgICB2b2lkIGFuaW1hdGlvblN0YXJ0ZWQoY29uc3QgU3RyaW5nJiBrZXksIENGVGltZUludGVy
dmFsIGJlZ2luVGltZSkgb3ZlcnJpZGU7CisgICAgdm9pZCBhbmltYXRpb25FbmRlZChjb25zdCBT
dHJpbmcmIGtleSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldE1hc2soV2ViQ29yZTo6UGxhdGZv
cm1DQUxheWVyKikgb3ZlcnJpZGU7CisKKyAgICBib29sIGlzT3BhcXVlKCkgY29uc3Qgb3ZlcnJp
ZGU7CisgICAgdm9pZCBzZXRPcGFxdWUoYm9vbCkgb3ZlcnJpZGU7CisKKyAgICBXZWJDb3JlOjpG
bG9hdFJlY3QgYm91bmRzKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRCb3VuZHMoY29u
c3QgV2ViQ29yZTo6RmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisKKyAgICBXZWJDb3JlOjpGbG9hdFBv
aW50M0QgcG9zaXRpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFBvc2l0aW9uKGNv
bnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQzRCYpIG92ZXJyaWRlOworCisgICAgV2ViQ29yZTo6Rmxv
YXRQb2ludDNEIGFuY2hvclBvaW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRBbmNo
b3JQb2ludChjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50M0QmKSBvdmVycmlkZTsKKworICAgIFdl
YkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybSgpIGNvbnN0IG92ZXJyaWRlOwor
ICAgIHZvaWQgc2V0VHJhbnNmb3JtKGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4
Jikgb3ZlcnJpZGU7CisKKyAgICBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCBzdWJsYXll
clRyYW5zZm9ybSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0U3VibGF5ZXJUcmFuc2Zv
cm0oY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgmKSBvdmVycmlkZTsKKworICAg
IGJvb2wgaXNIaWRkZW4oKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldEhpZGRlbihib29s
KSBvdmVycmlkZTsKKworICAgIGJvb2wgY29udGVudHNIaWRkZW4oKSBjb25zdCBvdmVycmlkZTsK
KyAgICB2b2lkIHNldENvbnRlbnRzSGlkZGVuKGJvb2wpIG92ZXJyaWRlOworCisgICAgYm9vbCB1
c2VySW50ZXJhY3Rpb25FbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRVc2Vy
SW50ZXJhY3Rpb25FbmFibGVkKGJvb2wpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRCYWNraW5n
U3RvcmVBdHRhY2hlZChib29sKSBvdmVycmlkZTsKKyAgICBib29sIGJhY2tpbmdTdG9yZUF0dGFj
aGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBib29sIGdlb21ldHJ5RmxpcHBlZCgpIGNvbnN0
IG92ZXJyaWRlOworICAgIHZvaWQgc2V0R2VvbWV0cnlGbGlwcGVkKGJvb2wpIG92ZXJyaWRlOwor
CisgICAgYm9vbCBpc0RvdWJsZVNpZGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRE
b3VibGVTaWRlZChib29sKSBvdmVycmlkZTsKKworICAgIGJvb2wgbWFza3NUb0JvdW5kcygpIGNv
bnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0TWFza3NUb0JvdW5kcyhib29sKSBvdmVycmlkZTsK
KworICAgIGJvb2wgYWNjZWxlcmF0ZXNEcmF3aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9p
ZCBzZXRBY2NlbGVyYXRlc0RyYXdpbmcoYm9vbCkgb3ZlcnJpZGU7CisKKyAgICBib29sIHdhbnRz
RGVlcENvbG9yQmFja2luZ1N0b3JlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRXYW50
c0RlZXBDb2xvckJhY2tpbmdTdG9yZShib29sKSBvdmVycmlkZTsKKworICAgIGJvb2wgc3VwcG9y
dHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0
U3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dChib29sKSBvdmVycmlkZTsKKworICAgIENG
VHlwZVJlZiBjb250ZW50cygpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0Q29udGVudHMo
Q0ZUeXBlUmVmKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0Q29udGVudHNSZWN0KGNvbnN0IFdl
YkNvcmU6OkZsb2F0UmVjdCYpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRNaW5pZmljYXRpb25G
aWx0ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyOjpGaWx0ZXJUeXBlKSBvdmVycmlkZTsKKyAg
ICB2b2lkIHNldE1hZ25pZmljYXRpb25GaWx0ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyOjpG
aWx0ZXJUeXBlKSBvdmVycmlkZTsKKworICAgIFdlYkNvcmU6OkNvbG9yIGJhY2tncm91bmRDb2xv
cigpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IFdl
YkNvcmU6OkNvbG9yJikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldEJvcmRlcldpZHRoKGZsb2F0
KSBvdmVycmlkZTsKKyAgICB2b2lkIHNldEJvcmRlckNvbG9yKGNvbnN0IFdlYkNvcmU6OkNvbG9y
Jikgb3ZlcnJpZGU7CisKKyAgICBmbG9hdCBvcGFjaXR5KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAg
dm9pZCBzZXRPcGFjaXR5KGZsb2F0KSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0RmlsdGVycyhj
b25zdCBXZWJDb3JlOjpGaWx0ZXJPcGVyYXRpb25zJikgb3ZlcnJpZGU7CisgICAgc3RhdGljIGJv
b2wgZmlsdGVyc0NhbkJlQ29tcG9zaXRlZChjb25zdCBXZWJDb3JlOjpGaWx0ZXJPcGVyYXRpb25z
Jik7CisgICAgdm9pZCBjb3B5RmlsdGVyc0Zyb20oY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUxh
eWVyJikgb3ZlcnJpZGU7CisKKyNpZiBFTkFCTEUoQ1NTX0NPTVBPU0lUSU5HKQorICAgIHZvaWQg
c2V0QmxlbmRNb2RlKFdlYkNvcmU6OkJsZW5kTW9kZSkgb3ZlcnJpZGU7CisjZW5kaWYKKworICAg
IHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0U3Bl
ZWQoZmxvYXQpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRUaW1lT2Zmc2V0KENGVGltZUludGVy
dmFsKSBvdmVycmlkZTsKKworICAgIGZsb2F0IGNvbnRlbnRzU2NhbGUoKSBjb25zdCBvdmVycmlk
ZTsKKyAgICB2b2lkIHNldENvbnRlbnRzU2NhbGUoZmxvYXQpIG92ZXJyaWRlOworCisgICAgZmxv
YXQgY29ybmVyUmFkaXVzKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRDb3JuZXJSYWRp
dXMoZmxvYXQpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRFZGdlQW50aWFsaWFzaW5nTWFzayh1
bnNpZ25lZCkgb3ZlcnJpZGU7CisKKyAgICAvLyBGSVhNRTogSGF2aW5nIGJvdGggc2hhcGVSb3Vu
ZGVkUmVjdCBhbmQgc2hhcGVQYXRoIGlzIHJlZHVuZGFudC4gV2UgY291bGQgdXNlIHNoYXBlUGF0
aCBmb3IgZXZlcnl0aGluZy4KKyAgICBXZWJDb3JlOjpGbG9hdFJvdW5kZWRSZWN0IHNoYXBlUm91
bmRlZFJlY3QoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFNoYXBlUm91bmRlZFJlY3Qo
Y29uc3QgV2ViQ29yZTo6RmxvYXRSb3VuZGVkUmVjdCYpIG92ZXJyaWRlOworCisgICAgV2ViQ29y
ZTo6UGF0aCBzaGFwZVBhdGgoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFNoYXBlUGF0
aChjb25zdCBXZWJDb3JlOjpQYXRoJikgb3ZlcnJpZGU7CisKKyAgICBXZWJDb3JlOjpXaW5kUnVs
ZSBzaGFwZVdpbmRSdWxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRTaGFwZVdpbmRS
dWxlKFdlYkNvcmU6OldpbmRSdWxlKSBvdmVycmlkZTsKKworICAgIFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXI6OkN1c3RvbUFwcGVhcmFuY2UgY3VzdG9tQXBwZWFyYW5jZSgpIGNvbnN0IG92ZXJyaWRl
OworICAgIHZvaWQgdXBkYXRlQ3VzdG9tQXBwZWFyYW5jZShXZWJDb3JlOjpHcmFwaGljc0xheWVy
OjpDdXN0b21BcHBlYXJhbmNlKSBvdmVycmlkZTsKKworICAgIFdlYkNvcmU6OlRpbGVkQmFja2lu
ZyogdGlsZWRCYWNraW5nKCkgb3ZlcnJpZGUgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgICAgUmVm
PFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcj4gY2xvbmUoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVy
Q2xpZW50KiBvd25lcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBSZWY8UGxhdGZvcm1DQUxheWVy
PiBjcmVhdGVDb21wYXRpYmxlTGF5ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyOjpMYXllclR5
cGUsIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckNsaWVudCopIGNvbnN0IG92ZXJyaWRlOworCisg
ICAgdm9pZCBlbnVtZXJhdGVSZWN0c0JlaW5nRHJhd24oQ0dDb250ZXh0UmVmLCB2b2lkICheYmxv
Y2spKENHUmVjdCkpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB1aW50MzJfdCBob3N0aW5nQ29u
dGV4dElEKCk7CisKKyAgICB1bnNpZ25lZCBiYWNraW5nU3RvcmVCeXRlc1BlclBpeGVsKCkgY29u
c3Qgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldENsb25lZExheWVyKGNvbnN0IFBsYXRmb3JtQ0FM
YXllciopOworCisgICAgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkxheWVyUHJvcGVydGll
cyYgcHJvcGVydGllcygpIHsgcmV0dXJuIG1fcHJvcGVydGllczsgfQorICAgIGNvbnN0IFJlbW90
ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpMYXllclByb3BlcnRpZXMmIHByb3BlcnRpZXMoKSBjb25z
dCB7IHJldHVybiBtX3Byb3BlcnRpZXM7IH0KKworICAgIHZvaWQgZGlkQ29tbWl0KCk7CisKKyAg
ICB2b2lkIGNsZWFyQ29udGV4dCgpIHsgbV9jb250ZXh0ID0gbnVsbHB0cjsgfQorICAgIFJlbW90
ZUxheWVyVHJlZUNvbnRleHQqIGNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRleHQ7IH0K
KworcHJvdGVjdGVkOgorICAgIFBsYXRmb3JtQ0FMYXllclJlbW90ZShXZWJDb3JlOjpQbGF0Zm9y
bUNBTGF5ZXI6OkxheWVyVHlwZSwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25l
ciwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCk7CisgICAgUGxhdGZvcm1DQUxheWVy
UmVtb3RlKGNvbnN0IFBsYXRmb3JtQ0FMYXllclJlbW90ZSYsIFdlYkNvcmU6OlBsYXRmb3JtQ0FM
YXllckNsaWVudCosIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmKTsKKworICAgIHZvaWQgdXBkYXRl
Q2xvbmVkTGF5ZXJQcm9wZXJ0aWVzKFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgY2xvbmUsIGJvb2wg
Y29weUNvbnRlbnRzID0gdHJ1ZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgYm9vbCBpc1BsYXRm
b3JtQ0FMYXllclJlbW90ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2
b2lkIGVuc3VyZUJhY2tpbmdTdG9yZSgpOworICAgIHZvaWQgdXBkYXRlQmFja2luZ1N0b3JlKCk7
CisgICAgdm9pZCByZW1vdmVTdWJsYXllcihQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUqKTsKKworICAg
IGJvb2wgcmVxdWlyZXNDdXN0b21BcHBlYXJhbmNlVXBkYXRlT25Cb3VuZHNDaGFuZ2UoKSBjb25z
dDsKKworICAgIFdlYkNvcmU6OkxheWVyUG9vbCYgbGF5ZXJQb29sKCkgb3ZlcnJpZGU7CisKKyAg
ICBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6TGF5ZXJQcm9wZXJ0aWVzIG1fcHJvcGVydGll
czsKKyAgICBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJMaXN0IG1fY2hpbGRyZW47CisgICAgUGxh
dGZvcm1DQUxheWVyUmVtb3RlKiBtX3N1cGVybGF5ZXIgeyBudWxscHRyIH07CisgICAgUGxhdGZv
cm1DQUxheWVyUmVtb3RlKiBtX21hc2tMYXllciB7IG51bGxwdHIgfTsKKyAgICBIYXNoTWFwPFN0
cmluZywgUmVmUHRyPFdlYkNvcmU6OlBsYXRmb3JtQ0FBbmltYXRpb24+PiBtX2FuaW1hdGlvbnM7
CisKKyAgICBib29sIG1fYWNjZWxlcmF0ZXNEcmF3aW5nIHsgZmFsc2UgfTsKKyAgICBib29sIG1f
d2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUgeyBmYWxzZSB9OworCisgICAgUmVtb3RlTGF5ZXJU
cmVlQ29udGV4dCogbV9jb250ZXh0OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKK1NQ
RUNJQUxJWkVfVFlQRV9UUkFJVFNfUExBVEZPUk1fQ0FMQVlFUihXZWJLaXQ6OlBsYXRmb3JtQ0FM
YXllclJlbW90ZSwgaXNQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUoKSkKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5
ZXJSZW1vdGVDdXN0b20uaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90
ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20uaApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYWQ2
NGNmMGNmYjQwMWYwYjdjZTNmMTZiNGMwYWI0ZDA4ZDI2NjQxCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3Jt
Q0FMYXllclJlbW90ZUN1c3RvbS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlBs
YXRmb3JtQ0FMYXllclJlbW90ZS5oIgorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgTGF5
ZXJIb3N0aW5nQ29udGV4dDsKKworLy8gUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tIGlzIHVz
ZWQgZm9yIENBTGF5ZXJzIHRoYXQgbGl2ZSBpbiB0aGUgd2ViIHByb2Nlc3MgYW5kIGFyZSBob3N0
ZWQgaW50byB0aGUgVUkgcHJvY2VzcyB2aWEgcmVtb3RlIGNvbnRleHQuCitjbGFzcyBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVDdXN0b20gZmluYWwgOiBwdWJsaWMgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
IHsKKyAgICBmcmllbmQgY2xhc3MgUGxhdGZvcm1DQUxheWVyUmVtb3RlOworcHVibGljOgorICAg
IHN0YXRpYyBSZWY8UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBjcmVhdGUoUGxhdGZvcm1MYXllciAq
LCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqLCBSZW1vdGVMYXllclRyZWVDb250ZXh0
Jik7CisKKyAgICB2aXJ0dWFsIH5QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20oKTsKKworICAg
IFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBt
X3BsYXRmb3JtTGF5ZXIuZ2V0KCk7IH0KKworICAgIHVpbnQzMl90IGhvc3RpbmdDb250ZXh0SUQo
KSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IFdlYkNv
cmU6OkZsb2F0UmVjdCYgZGlydHlSZWN0KSBvdmVycmlkZTsKKyAgICB2b2lkIHNldE5lZWRzRGlz
cGxheSgpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1
c3RvbShXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSwgUGxhdGZvcm1MYXllciAq
LCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVD
b250ZXh0Jik7CisKKyAgICBSZWY8V2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyPiBjbG9uZShXZWJD
b3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyKSBjb25zdCBvdmVycmlkZTsKKworICAg
IGJvb2wgaXNQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20oKSBjb25zdCBvdmVycmlkZSB7IHJl
dHVybiB0cnVlOyB9CisKKyAgICBDRlR5cGVSZWYgY29udGVudHMoKSBjb25zdCBvdmVycmlkZTsK
KyAgICB2b2lkIHNldENvbnRlbnRzKENGVHlwZVJlZikgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OnVu
aXF1ZV9wdHI8TGF5ZXJIb3N0aW5nQ29udGV4dD4gbV9sYXllckhvc3RpbmdDb250ZXh0OworICAg
IFJldGFpblB0cjxQbGF0Zm9ybUxheWVyPiBtX3BsYXRmb3JtTGF5ZXI7CisgICAgYm9vbCBtX3By
b3ZpZGVzQ29udGVudHM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworU1BFQ0lBTEla
RV9UWVBFX1RSQUlUU19QTEFURk9STV9DQUxBWUVSKFdlYktpdDo6UGxhdGZvcm1DQUxheWVyUmVt
b3RlQ3VzdG9tLCBpc1BsYXRmb3JtQ0FMYXllclJlbW90ZSgpKQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXll
clJlbW90ZUN1c3RvbS5tbSBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90
ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20ubW0KbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzY5
YjliMzE1YWM4M2RiNmQ3ODhjOGYxMzYzMjJlODY3NzYyYzYwMAotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVDdXN0b20ubW0KQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW1w
b3J0ICJQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20uaCIKKworI2ltcG9ydCAiTGF5ZXJIb3N0
aW5nQ29udGV4dC5oIgorI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5oIgorI2ltcG9y
dCAiUmVtb3RlTGF5ZXJUcmVlUHJvcGVydHlBcHBsaWVyLmgiCisjaW1wb3J0ICJXZWJQcm9jZXNz
LmgiCisjaW1wb3J0IDxBVkZvdW5kYXRpb24vQVZGb3VuZGF0aW9uLmg+CisjaW1wb3J0IDxXZWJD
b3JlL0dyYXBoaWNzTGF5ZXJDQS5oPgorI2ltcG9ydCA8V2ViQ29yZS9QbGF0Zm9ybUNBTGF5ZXJD
b2NvYS5oPgorI2ltcG9ydCA8V2ViQ29yZS9XZWJDb3JlQ0FMYXllckV4dHJhcy5oPgorI2ltcG9y
dCA8d3RmL1JldGFpblB0ci5oPgorI2ltcG9ydCA8d3RmL1NvZnRMaW5raW5nLmg+CisKK1NPRlRf
TElOS19GUkFNRVdPUktfT1BUSU9OQUwoQVZGb3VuZGF0aW9uKQorU09GVF9MSU5LX0NMQVNTX09Q
VElPTkFMKEFWRm91bmRhdGlvbiwgQVZQbGF5ZXJMYXllcikKKwordXNpbmcgbmFtZXNwYWNlIFdl
YkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitzdGF0aWMgTlNTdHJpbmcgKiBjb25zdCBw
bGF0Zm9ybUNBTGF5ZXJQb2ludGVyID0gQCJXS1BsYXRmb3JtQ0FMYXllciI7CisKK1JlZjxQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU+IFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6Y3JlYXRlKFBs
YXRmb3JtTGF5ZXIgKnBsYXRmb3JtTGF5ZXIsIFBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIs
IFJlbW90ZUxheWVyVHJlZUNvbnRleHQmIGNvbnRleHQpCit7CisgICAgYXV0byBsYXllciA9IGFk
b3B0UmVmKCpuZXcgUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKFBsYXRmb3JtQ0FMYXllckNv
Y29hOjpsYXllclR5cGVGb3JQbGF0Zm9ybUxheWVyKHBsYXRmb3JtTGF5ZXIpLCBwbGF0Zm9ybUxh
eWVyLCBvd25lciwgY29udGV4dCkpOworICAgIGNvbnRleHQubGF5ZXJXYXNDcmVhdGVkKGxheWVy
LmdldCgpLCBsYXllci0+bGF5ZXJUeXBlKCkpOworICAgIHJldHVybiBXVEZNb3ZlKGxheWVyKTsK
K30KKworUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tOjpQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVD
dXN0b20oTGF5ZXJUeXBlIGxheWVyVHlwZSwgUGxhdGZvcm1MYXllciAqIGN1c3RvbUxheWVyLCBQ
bGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250
ZXh0KQorICAgIDogUGxhdGZvcm1DQUxheWVyUmVtb3RlKGxheWVyVHlwZSwgb3duZXIsIGNvbnRl
eHQpCit7CisgICAgc3dpdGNoIChjb250ZXh0LmxheWVySG9zdGluZ01vZGUoKSkgeworICAgIGNh
c2UgTGF5ZXJIb3N0aW5nTW9kZTo6SW5Qcm9jZXNzOgorICAgICAgICBtX2xheWVySG9zdGluZ0Nv
bnRleHQgPSBMYXllckhvc3RpbmdDb250ZXh0OjpjcmVhdGVGb3JQb3J0KFdlYlByb2Nlc3M6OnNp
bmdsZXRvbigpLmNvbXBvc2l0aW5nUmVuZGVyU2VydmVyUG9ydCgpKTsKKyAgICAgICAgYnJlYWs7
CisjaWYgSEFWRShPVVRfT0ZfUFJPQ0VTU19MQVlFUl9IT1NUSU5HKQorICAgIGNhc2UgTGF5ZXJI
b3N0aW5nTW9kZTo6T3V0T2ZQcm9jZXNzOgorICAgICAgICBtX2xheWVySG9zdGluZ0NvbnRleHQg
PSBMYXllckhvc3RpbmdDb250ZXh0OjpjcmVhdGVGb3JFeHRlcm5hbEhvc3RpbmdQcm9jZXNzKCk7
CisjaWYgUExBVEZPUk0oSU9TKQorICAgICAgICBpZiAobGF5ZXJUeXBlID09IExheWVyVHlwZUFW
UGxheWVyTGF5ZXIpIHsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlRmFjdG9yID0gY29udGV4dC5k
ZXZpY2VTY2FsZUZhY3RvcigpOworICAgICAgICAgICAgLy8gU2V0IGEgc2NhbGUgZmFjdG9yIGhl
cmUgdG8gbWFrZSBjb252ZXJ0UmVjdDp0b0xheWVyOm5pbCB0YWtlIHNjYWxlIGZhY3RvciBpbnRv
IGFjY291bnQuIDxyZGFyOi8vcHJvYmxlbS8xODMxNjU0Mj4uCisgICAgICAgICAgICAvLyBUaGlz
IHNjYWxlIGZhY3RvciBpcyBpbnZlcnRlZCBpbiB0aGUgaG9zdGluZyBwcm9jZXNzLgorICAgICAg
ICAgICAgW2N1c3RvbUxheWVyIHNldFRyYW5zZm9ybTpDQVRyYW5zZm9ybTNETWFrZVNjYWxlKHNj
YWxlRmFjdG9yLCBzY2FsZUZhY3RvciwgMSldOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAg
YnJlYWs7CisjZW5kaWYKKyAgICB9CisKKyAgICBtX2xheWVySG9zdGluZ0NvbnRleHQtPnNldFJv
b3RMYXllcihjdXN0b21MYXllcik7CisgICAgW2N1c3RvbUxheWVyIHNldFZhbHVlOltOU1ZhbHVl
IHZhbHVlV2l0aFBvaW50ZXI6dGhpc10gZm9yS2V5OnBsYXRmb3JtQ0FMYXllclBvaW50ZXJdOwor
CisgICAgbV9wbGF0Zm9ybUxheWVyID0gY3VzdG9tTGF5ZXI7CisgICAgW2N1c3RvbUxheWVyIHdl
Yl9kaXNhYmxlQWxsQWN0aW9uc107CisKKyAgICBtX3Byb3ZpZGVzQ29udGVudHMgPSBsYXllclR5
cGUgPT0gTGF5ZXJUeXBlQ29udGVudHNQcm92aWRlZExheWVyOworCisgICAgcHJvcGVydGllcygp
LnBvc2l0aW9uID0gRmxvYXRQb2ludDNEKGN1c3RvbUxheWVyLnBvc2l0aW9uLngsIGN1c3RvbUxh
eWVyLnBvc2l0aW9uLnksIGN1c3RvbUxheWVyLnpQb3NpdGlvbik7CisgICAgcHJvcGVydGllcygp
LmFuY2hvclBvaW50ID0gRmxvYXRQb2ludDNEKGN1c3RvbUxheWVyLmFuY2hvclBvaW50LngsIGN1
c3RvbUxheWVyLmFuY2hvclBvaW50LnksIGN1c3RvbUxheWVyLmFuY2hvclBvaW50Wik7CisgICAg
cHJvcGVydGllcygpLmJvdW5kcyA9IGN1c3RvbUxheWVyLmJvdW5kczsKKyAgICBwcm9wZXJ0aWVz
KCkuY29udGVudHNSZWN0ID0gY3VzdG9tTGF5ZXIuY29udGVudHNSZWN0OworfQorCitQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVDdXN0b206On5QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20oKQorewor
ICAgIFttX3BsYXRmb3JtTGF5ZXIgc2V0VmFsdWU6bmlsIGZvcktleTpwbGF0Zm9ybUNBTGF5ZXJQ
b2ludGVyXTsKK30KKwordWludDMyX3QgUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tOjpob3N0
aW5nQ29udGV4dElEKCkKK3sKKyAgICByZXR1cm4gbV9sYXllckhvc3RpbmdDb250ZXh0LT5jb250
ZXh0SUQoKTsKK30KKworUmVmPFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcj4gUGxhdGZvcm1DQUxh
eWVyUmVtb3RlQ3VzdG9tOjpjbG9uZShQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyKSBjb25z
dAoreworICAgIFJldGFpblB0cjxDQUxheWVyICo+IGNsb25lZExheWVyOworICAgIGJvb2wgY29w
eUNvbnRlbnRzID0gdHJ1ZTsKKworICAgIGlmIChsYXllclR5cGUoKSA9PSBMYXllclR5cGVBVlBs
YXllckxheWVyKSB7CisgICAgICAgIAorICAgICAgICBpZiAoW3BsYXRmb3JtTGF5ZXIoKSBpc0tp
bmRPZkNsYXNzOmdldEFWUGxheWVyTGF5ZXJDbGFzcygpXSkgeworICAgICAgICAgICAgY2xvbmVk
TGF5ZXIgPSBhZG9wdE5TKFthbGxvY0FWUGxheWVyTGF5ZXJJbnN0YW5jZSgpIGluaXRdKTsKKwor
ICAgICAgICAgICAgQVZQbGF5ZXJMYXllciogZGVzdGluYXRpb25QbGF5ZXJMYXllciA9IHN0YXRp
Y19jYXN0PEFWUGxheWVyTGF5ZXIgKj4oY2xvbmVkTGF5ZXIuZ2V0KCkpOworICAgICAgICAgICAg
QVZQbGF5ZXJMYXllciogc291cmNlUGxheWVyTGF5ZXIgPSBzdGF0aWNfY2FzdDxBVlBsYXllckxh
eWVyICo+KHBsYXRmb3JtTGF5ZXIoKSk7CisgICAgICAgICAgICBkaXNwYXRjaF9hc3luYyhkaXNw
YXRjaF9nZXRfbWFpbl9xdWV1ZSgpLCBeeworICAgICAgICAgICAgICAgIFtkZXN0aW5hdGlvblBs
YXllckxheWVyIHNldFBsYXllcjpbc291cmNlUGxheWVyTGF5ZXIgcGxheWVyXV07CisgICAgICAg
ICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE9uIGlPUywgdGhlIEFW
UGxheWVyTGF5ZXIgaXMgaW5zaWRlIGEgV2ViVmlkZW9Db250YWluZXJMYXllci4gVGhpcyBjb2Rl
IG5lZWRzIHRvIHNoYXJlIGxvZ2ljIHdpdGggTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9u
T2JqQzo6Y3JlYXRlQVZQbGF5ZXJMYXllcigpLgorICAgICAgICAgICAgY2xvbmVkTGF5ZXIgPSBh
ZG9wdE5TKFtbQ0FMYXllciBhbGxvY10gaW5pdF0pOworICAgICAgICB9CisKKyAgICAgICAgY29w
eUNvbnRlbnRzID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChsYXllclR5cGUoKSA9PSBMYXllclR5
cGVDb250ZW50c1Byb3ZpZGVkTGF5ZXIpIHsKKyAgICAgICAgY2xvbmVkTGF5ZXIgPSBhZG9wdE5T
KFtbQ0FMYXllciBhbGxvY10gaW5pdF0pOworICAgICAgICAvLyBGSVhNRTogY3VycmVudGx5IGNv
cHlpbmcgV2ViR0wgY29udGVudHMgYnJlYWtzIHRoZSBvcmlnaW5hbCBsYXllci4KKyAgICAgICAg
Y29weUNvbnRlbnRzID0gZmFsc2U7CisgICAgfQorCisgICAgYXV0byBjbG9uZSA9IGFkb3B0UmVm
KCpuZXcgUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKGxheWVyVHlwZSgpLCBjbG9uZWRMYXll
ci5nZXQoKSwgb3duZXIsICpjb250ZXh0KCkpKTsKKyAgICBjb250ZXh0KCktPmxheWVyV2FzQ3Jl
YXRlZChjbG9uZS5nZXQoKSwgY2xvbmUtPmxheWVyVHlwZSgpKTsKKworICAgIHVwZGF0ZUNsb25l
ZExheWVyUHJvcGVydGllcyhjbG9uZS5nZXQoKSwgY29weUNvbnRlbnRzKTsKKworICAgIGNsb25l
LT5zZXRDbG9uZWRMYXllcih0aGlzKTsKKyAgICByZXR1cm4gV1RGTW92ZShjbG9uZSk7Cit9CisK
K0NGVHlwZVJlZiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b206OmNvbnRlbnRzKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gW21fcGxhdGZvcm1MYXllciBjb250ZW50c107Cit9CisKK3ZvaWQgUGxh
dGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tOjpzZXRDb250ZW50cyhDRlR5cGVSZWYgY29udGVudHMp
Cit7CisgICAgW21fcGxhdGZvcm1MYXllciBzZXRDb250ZW50czooaWQpY29udGVudHNdOworfQor
Cit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0
KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAobV9wcm92aWRlc0NvbnRlbnRzKQor
ICAgICAgICBbbV9wbGF0Zm9ybUxheWVyIHNldE5lZWRzRGlzcGxheUluUmVjdDpyZWN0XTsKKyAg
ICBlbHNlCisgICAgICAgIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TmVlZHNEaXNwbGF5SW5S
ZWN0KHJlY3QpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6c2V0TmVl
ZHNEaXNwbGF5KCkKK3sKKyAgICBpZiAobV9wcm92aWRlc0NvbnRlbnRzKQorICAgICAgICBbbV9w
bGF0Zm9ybUxheWVyIHNldE5lZWRzRGlzcGxheV07CisgICAgZWxzZQorICAgICAgICBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6OnNldE5lZWRzRGlzcGxheSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBX
ZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90
ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuY3BwIGIvU291cmNl
L1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXll
clJlbW90ZVRpbGVkQmFja2luZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZmVjMzBjMmQyMTZlN2E0OWIyYzJm
ZjEzZWU2OWYwOWVhNzg1YTI4MQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxl
ZEJhY2tpbmcuY3BwCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEz
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2ltcG9ydCAiUGxhdGZv
cm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nLmgiCisKKyNpbXBvcnQgIlJlbW90ZUxheWVyVHJl
ZUNvbnRleHQuaCIKKyNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NMYXllckNBLmg+CisjaW1wb3J0
IDxXZWJDb3JlL1BsYXRmb3JtQ0FMYXllckNvY29hLmg+CisjaW1wb3J0IDx3dGYvUmV0YWluUHRy
Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKwor
UGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVU
aWxlZEJhY2tpbmcoTGF5ZXJUeXBlIGxheWVyVHlwZSwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBv
d25lciwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCkKKyAgICA6IFBsYXRmb3JtQ0FM
YXllclJlbW90ZShsYXllclR5cGUsIG93bmVyLCBjb250ZXh0KQorICAgICwgbV90aWxlQ29udHJv
bGxlcihzdGQ6Om1ha2VfdW5pcXVlPFRpbGVDb250cm9sbGVyPih0aGlzKSkKK3sKK30KKworUGxh
dGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjp+UGxhdGZvcm1DQUxheWVyUmVtb3RlVGls
ZWRCYWNraW5nKCkKK3sKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tp
bmc6OnNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmIGRpcnR5UmVjdCkKK3sK
KyAgICBtX3RpbGVDb250cm9sbGVyLT5zZXROZWVkc0Rpc3BsYXlJblJlY3QoZW5jbG9zaW5nSW50
UmVjdChkaXJ0eVJlY3QpKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJh
Y2tpbmc6OnNldE5lZWRzRGlzcGxheSgpCit7CisgICAgbV90aWxlQ29udHJvbGxlci0+c2V0TmVl
ZHNEaXNwbGF5KCk7Cit9CisKK2NvbnN0IFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckxpc3QqIFBs
YXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6Y3VzdG9tU3VibGF5ZXJzKCkgY29uc3QK
K3sKKyAgICBtX2N1c3RvbVN1YmxheWVycyA9IG1fdGlsZUNvbnRyb2xsZXItPmNvbnRhaW5lckxh
eWVycygpOworICAgIHJldHVybiAmbV9jdXN0b21TdWJsYXllcnM7Cit9CisKK3ZvaWQgUGxhdGZv
cm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRCb3VuZHMoY29uc3QgV2ViQ29yZTo6Rmxv
YXRSZWN0JiBib3VuZHMpCit7CisgICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCb3VuZHMo
Ym91bmRzKTsKKyAgICBtX3RpbGVDb250cm9sbGVyLT50aWxlQ2FjaGVMYXllckJvdW5kc0NoYW5n
ZWQoKTsKK30KKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OmlzT3Bh
cXVlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90aWxlQ29udHJvbGxlci0+dGlsZXNBcmVPcGFx
dWUoKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldE9w
YXF1ZShib29sIG9wYXF1ZSkKK3sKKyAgICBtX3RpbGVDb250cm9sbGVyLT5zZXRUaWxlc09wYXF1
ZShvcGFxdWUpOworfQorCitib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6
YWNjZWxlcmF0ZXNEcmF3aW5nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90aWxlQ29udHJvbGxl
ci0+YWNjZWxlcmF0ZXNEcmF3aW5nKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
VGlsZWRCYWNraW5nOjpzZXRBY2NlbGVyYXRlc0RyYXdpbmcoYm9vbCBhY2NlbGVyYXRlc0RyYXdp
bmcpCit7CisgICAgbV90aWxlQ29udHJvbGxlci0+c2V0QWNjZWxlcmF0ZXNEcmF3aW5nKGFjY2Vs
ZXJhdGVzRHJhd2luZyk7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNr
aW5nOjp3YW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
dGlsZUNvbnRyb2xsZXItPndhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKCk7Cit9CisKK3ZvaWQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRXYW50c0RlZXBDb2xvckJhY2tp
bmdTdG9yZShib29sIHdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKQoreworICAgIG1fdGlsZUNv
bnRyb2xsZXItPnNldFdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKHdhbnRzRGVlcENvbG9yQmFj
a2luZ1N0b3JlKTsKK30KKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6
OnN1cHBvcnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRleHQoKSBjb25zdAoreworICAgIHJldHVybiBt
X3RpbGVDb250cm9sbGVyLT5zdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KCk7Cit9CisK
K3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRTdXBwb3J0c1N1YnBp
eGVsQW50aWFsaWFzZWRUZXh0KGJvb2wgc3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dCkK
K3sKKyAgICBtX3RpbGVDb250cm9sbGVyLT5zZXRTdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRU
ZXh0KHN1cHBvcnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRleHQpOworfQorCitmbG9hdCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OmNvbnRlbnRzU2NhbGUoKSBjb25zdAoreworICAg
IHJldHVybiBtX3RpbGVDb250cm9sbGVyLT5jb250ZW50c1NjYWxlKCk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRDb250ZW50c1NjYWxlKGZsb2F0IHNj
YWxlKQoreworICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldENvbnRlbnRzU2NhbGUoc2NhbGUpOwor
fQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6c2V0Qm9yZGVyV2lk
dGgoZmxvYXQgYm9yZGVyV2lkdGgpCit7CisgICAgbV90aWxlQ29udHJvbGxlci0+c2V0VGlsZURl
YnVnQm9yZGVyV2lkdGgoYm9yZGVyV2lkdGggLyAyKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldEJvcmRlckNvbG9yKGNvbnN0IFdlYkNvcmU6OkNvbG9y
JiBjb2xvcikKK3sKKyAgICBtX3RpbGVDb250cm9sbGVyLT5zZXRUaWxlRGVidWdCb3JkZXJDb2xv
cihjb2xvcik7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXll
clJlbW90ZVRpbGVkQmFja2luZy5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2Uv
UmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjBkZGZjZTg1MmQ1MTI3MDNkMzRmNDM1MmEzOWY0NWEzZTVkMTVhNTkKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRy
ZWUvUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nLmgKQEAgLTAsMCArMSw3NSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUGxh
dGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nX2gKKyNkZWZpbmUgUGxhdGZvcm1DQUxheWVy
UmVtb3RlVGlsZWRCYWNraW5nX2gKKworI2luY2x1ZGUgIlBsYXRmb3JtQ0FMYXllclJlbW90ZS5o
IgorI2luY2x1ZGUgPFdlYkNvcmUvVGlsZUNvbnRyb2xsZXIuaD4KKworbmFtZXNwYWNlIFdlYktp
dCB7CisKK2NsYXNzIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZyBmaW5hbCA6IHB1
YmxpYyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUgeworICAgIGZyaWVuZCBjbGFzcyBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU7CitwdWJsaWM6CisgICAgdmlydHVhbCB+UGxhdGZvcm1DQUxheWVyUmVtb3Rl
VGlsZWRCYWNraW5nKCk7CisKK3ByaXZhdGU6CisgICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGls
ZWRCYWNraW5nKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlLCBXZWJDb3JlOjpQ
bGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0Jik7CisK
KyAgICBXZWJDb3JlOjpUaWxlZEJhY2tpbmcqIHRpbGVkQmFja2luZygpIG92ZXJyaWRlIHsgcmV0
dXJuIG1fdGlsZUNvbnRyb2xsZXIuZ2V0KCk7IH0KKworICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5
SW5SZWN0KGNvbnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYgZGlydHlSZWN0KSBvdmVycmlkZTsKKyAg
ICB2b2lkIHNldE5lZWRzRGlzcGxheSgpIG92ZXJyaWRlOworCisgICAgY29uc3QgV2ViQ29yZTo6
UGxhdGZvcm1DQUxheWVyTGlzdCogY3VzdG9tU3VibGF5ZXJzKCkgY29uc3Qgb3ZlcnJpZGU7CisK
KyAgICB2b2lkIHNldEJvdW5kcyhjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmKSBvdmVycmlkZTsK
KyAgICAKKyAgICBib29sIGlzT3BhcXVlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRP
cGFxdWUoYm9vbCkgb3ZlcnJpZGU7CisgICAgCisgICAgYm9vbCBhY2NlbGVyYXRlc0RyYXdpbmco
KSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldEFjY2VsZXJhdGVzRHJhd2luZyhib29sKSBv
dmVycmlkZTsKKworICAgIGJvb2wgd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUoKSBjb25zdCBv
dmVycmlkZTsKKyAgICB2b2lkIHNldFdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKGJvb2wpIG92
ZXJyaWRlOworCisgICAgYm9vbCBzdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KCkgY29u
c3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRTdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0
KGJvb2wpIG92ZXJyaWRlOworCisgICAgZmxvYXQgY29udGVudHNTY2FsZSgpIGNvbnN0IG92ZXJy
aWRlOworICAgIHZvaWQgc2V0Q29udGVudHNTY2FsZShmbG9hdCkgb3ZlcnJpZGU7CisgICAgCisg
ICAgdm9pZCBzZXRCb3JkZXJXaWR0aChmbG9hdCkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRCb3Jk
ZXJDb2xvcihjb25zdCBXZWJDb3JlOjpDb2xvciYpIG92ZXJyaWRlOworCisgICAgc3RkOjp1bmlx
dWVfcHRyPFdlYkNvcmU6OlRpbGVDb250cm9sbGVyPiBtX3RpbGVDb250cm9sbGVyOworICAgIG11
dGFibGUgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyTGlzdCBtX2N1c3RvbVN1YmxheWVyczsKK307
CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8gUGxhdGZvcm1DQUxheWVyUmVt
b3RlVGlsZWRCYWNraW5nX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9X
ZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVDb250ZXh0LmggYi9Tb3VyY2Uv
V2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJUcmVl
Q29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjI1NTQ4ZWExYzk0NTAzYWU5YTBiMDVkMzYyYjQ3MWIxZDAw
YTBjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFn
ZS9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5oCkBAIC0wLDAgKzEsOTkg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJlbW90ZUxheWVyVHJlZUNvbnRleHRfaAorI2RlZmlu
ZSBSZW1vdGVMYXllclRyZWVDb250ZXh0X2gKKworI2luY2x1ZGUgIkxheWVyVHJlZUNvbnRleHQu
aCIKKyNpbmNsdWRlICJSZW1vdGVMYXllckJhY2tpbmdTdG9yZUNvbGxlY3Rpb24uaCIKKyNpbmNs
dWRlICJSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbi5oIgorI2luY2x1ZGUgPFdlYkNvcmUvR3Jh
cGhpY3NMYXllckZhY3RvcnkuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0xheWVyUG9vbC5oPgorI2lu
Y2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1DQUxheWVyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5o
PgorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgUGxhdGZvcm1DQUxheWVyUmVtb3RlOwor
Y2xhc3MgV2ViUGFnZTsKKworLy8gRklYTUU6IFRoaXMgY2xhc3MgZG9lc24ndCBkbyBtdWNoIG5v
dy4gUm9sbCBpbnRvIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhPworY2xhc3MgUmVtb3RlTGF5
ZXJUcmVlQ29udGV4dCA6IHB1YmxpYyBXZWJDb3JlOjpHcmFwaGljc0xheWVyRmFjdG9yeSB7Citw
dWJsaWM6CisgICAgZXhwbGljaXQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dChXZWJQYWdlJik7Cisg
ICAgflJlbW90ZUxheWVyVHJlZUNvbnRleHQoKTsKKworICAgIHZvaWQgbGF5ZXJXYXNDcmVhdGVk
KFBsYXRmb3JtQ0FMYXllclJlbW90ZSYsIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJU
eXBlKTsKKyAgICB2b2lkIGxheWVyV2lsbEJlRGVzdHJveWVkKFBsYXRmb3JtQ0FMYXllclJlbW90
ZSYpOworCisgICAgdm9pZCBiYWNraW5nU3RvcmVXYXNDcmVhdGVkKFJlbW90ZUxheWVyQmFja2lu
Z1N0b3JlJik7CisgICAgdm9pZCBiYWNraW5nU3RvcmVXaWxsQmVEZXN0cm95ZWQoUmVtb3RlTGF5
ZXJCYWNraW5nU3RvcmUmKTsKKyAgICBib29sIGJhY2tpbmdTdG9yZVdpbGxCZURpc3BsYXllZChS
ZW1vdGVMYXllckJhY2tpbmdTdG9yZSYpOworCisgICAgV2ViQ29yZTo6TGF5ZXJQb29sJiBsYXll
clBvb2woKSB7IHJldHVybiBtX2xheWVyUG9vbDsgfQorCisgICAgZmxvYXQgZGV2aWNlU2NhbGVG
YWN0b3IoKSBjb25zdDsKKworICAgIExheWVySG9zdGluZ01vZGUgbGF5ZXJIb3N0aW5nTW9kZSgp
IGNvbnN0OworCisgICAgdm9pZCBidWlsZFRyYW5zYWN0aW9uKFJlbW90ZUxheWVyVHJlZVRyYW5z
YWN0aW9uJiwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyJiByb290TGF5ZXIpOworCisgICAgdm9p
ZCBsYXllclByb3BlcnR5Q2hhbmdlZFdoaWxlQnVpbGRpbmdUcmFuc2FjdGlvbihQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGUmKTsKKworICAgIC8vIEZyb20gdGhlIFVJIHByb2Nlc3MKKyAgICB2b2lkIGFu
aW1hdGlvbkRpZFN0YXJ0KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCwg
Y29uc3QgU3RyaW5nJiBrZXksIGRvdWJsZSBzdGFydFRpbWUpOworICAgIHZvaWQgYW5pbWF0aW9u
RGlkRW5kKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCwgY29uc3QgU3Ry
aW5nJiBrZXkpOworCisgICAgdm9pZCB3aWxsU3RhcnRBbmltYXRpb25PbkxheWVyKFBsYXRmb3Jt
Q0FMYXllclJlbW90ZSYpOworCisgICAgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmVDb2xsZWN0aW9u
JiBiYWNraW5nU3RvcmVDb2xsZWN0aW9uKCkgeyByZXR1cm4gbV9iYWNraW5nU3RvcmVDb2xsZWN0
aW9uOyB9CisgICAgCisgICAgdm9pZCBzZXROZXh0Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50KGJv
b2wgbmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludCkgeyBtX25leHRGbHVzaElzRm9ySW1tZWRp
YXRlUGFpbnQgPSBuZXh0Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50OyB9CisgICAgYm9vbCBuZXh0
Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50KCkgY29uc3QgeyByZXR1cm4gbV9uZXh0Rmx1c2hJc0Zv
ckltbWVkaWF0ZVBhaW50OyB9CisKK3ByaXZhdGU6CisgICAgLy8gV2ViQ29yZTo6R3JhcGhpY3NM
YXllckZhY3RvcnkKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6R3JhcGhpY3NMYXllcj4g
Y3JlYXRlR3JhcGhpY3NMYXllcihXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpUeXBlLCBXZWJDb3Jl
OjpHcmFwaGljc0xheWVyQ2xpZW50Jikgb3ZlcnJpZGU7CisKKyAgICBXZWJQYWdlJiBtX3dlYlBh
Z2U7CisKKyAgICBIYXNoTWFwPFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJ
RCwgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkxheWVyQ3JlYXRpb25Qcm9wZXJ0aWVzPiBt
X2NyZWF0ZWRMYXllcnM7CisgICAgVmVjdG9yPFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlBsYXRm
b3JtTGF5ZXJJRD4gbV9kZXN0cm95ZWRMYXllcnM7CisKKyAgICBIYXNoTWFwPFdlYkNvcmU6Okdy
YXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCwgUGxhdGZvcm1DQUxheWVyUmVtb3RlKj4gbV9s
aXZlTGF5ZXJzOworICAgIEhhc2hNYXA8V2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6UGxhdGZvcm1M
YXllcklELCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUqPiBtX2xheWVyc1dpdGhBbmltYXRpb25zOwor
CisgICAgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmVDb2xsZWN0aW9uIG1fYmFja2luZ1N0b3JlQ29s
bGVjdGlvbjsKKyAgICAKKyAgICBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbiogbV9jdXJyZW50
VHJhbnNhY3Rpb247CisKKyAgICBXZWJDb3JlOjpMYXllclBvb2wgbV9sYXllclBvb2w7CisgICAg
CisgICAgYm9vbCBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQgeyBmYWxzZSB9OworfTsK
KworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKKyNlbmRpZiAvLyBSZW1vdGVMYXllclRyZWVDb250
ZXh0X2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90
ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVDb250ZXh0Lm1tIGIvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZUNvbnRleHQubW0K
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uOTBjNDg2YjU4MmIwZDE1ODcwNTZhNDhkMTgxMmRiMzlmN2I1MmIwMgotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxh
eWVyVHJlZS9SZW1vdGVMYXllclRyZWVDb250ZXh0Lm1tCkBAIC0wLDAgKzEsMTYyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEyIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2ltcG9ydCAiY29uZmlnLmgiCisjaW1wb3J0ICJSZW1vdGVMYXllclRyZWVDb250
ZXh0LmgiCisKKyNpbXBvcnQgIkdlbmVyaWNDYWxsYmFjay5oIgorI2ltcG9ydCAiR3JhcGhpY3NM
YXllckNBUmVtb3RlLmgiCisjaW1wb3J0ICJQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaCIKKyNpbXBv
cnQgIlJlbW90ZUxheWVyQmFja2luZ1N0b3JlQ29sbGVjdGlvbi5oIgorI2ltcG9ydCAiUmVtb3Rl
TGF5ZXJUcmVlVHJhbnNhY3Rpb24uaCIKKyNpbXBvcnQgIldlYlBhZ2UuaCIKKyNpbXBvcnQgPFdl
YkNvcmUvRnJhbWVWaWV3Lmg+CisjaW1wb3J0IDxXZWJDb3JlL01haW5GcmFtZS5oPgorI2ltcG9y
dCA8V2ViQ29yZS9QYWdlLmg+CisjaW1wb3J0IDx3dGYvU2V0Rm9yU2NvcGUuaD4KKyNpbXBvcnQg
PHd0Zi9TeXN0ZW1UcmFjaW5nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1l
c3BhY2UgV2ViS2l0IHsKKworUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6UmVtb3RlTGF5ZXJUcmVl
Q29udGV4dChXZWJQYWdlJiB3ZWJQYWdlKQorICAgIDogbV93ZWJQYWdlKHdlYlBhZ2UpCisgICAg
LCBtX2N1cnJlbnRUcmFuc2FjdGlvbihudWxscHRyKQoreworfQorCitSZW1vdGVMYXllclRyZWVD
b250ZXh0Ojp+UmVtb3RlTGF5ZXJUcmVlQ29udGV4dCgpCit7CisgICAgZm9yIChhdXRvJiBsYXll
ciA6IG1fbGl2ZUxheWVycy52YWx1ZXMoKSkKKyAgICAgICAgbGF5ZXItPmNsZWFyQ29udGV4dCgp
OworfQorCitmbG9hdCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpkZXZpY2VTY2FsZUZhY3Rvcigp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fd2ViUGFnZS5kZXZpY2VTY2FsZUZhY3RvcigpOworfQor
CitMYXllckhvc3RpbmdNb2RlIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmxheWVySG9zdGluZ01v
ZGUoKSBjb25zdAoreworICAgIHJldHVybiBtX3dlYlBhZ2UubGF5ZXJIb3N0aW5nTW9kZSgpOwor
fQorCit2b2lkIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmxheWVyV2FzQ3JlYXRlZChQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGUmIGxheWVyLCBQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSB0eXBlKQor
eworICAgIEdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCBsYXllcklEID0gbGF5ZXIubGF5
ZXJJRCgpOworCisgICAgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkxheWVyQ3JlYXRpb25Q
cm9wZXJ0aWVzIGNyZWF0aW9uUHJvcGVydGllczsKKyAgICBjcmVhdGlvblByb3BlcnRpZXMubGF5
ZXJJRCA9IGxheWVySUQ7CisgICAgY3JlYXRpb25Qcm9wZXJ0aWVzLnR5cGUgPSB0eXBlOworCisg
ICAgaWYgKGxheWVyLmlzUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKCkpIHsKKyAgICAgICAg
Y3JlYXRpb25Qcm9wZXJ0aWVzLmhvc3RpbmdDb250ZXh0SUQgPSBsYXllci5ob3N0aW5nQ29udGV4
dElEKCk7CisgICAgICAgIGNyZWF0aW9uUHJvcGVydGllcy5ob3N0aW5nRGV2aWNlU2NhbGVGYWN0
b3IgPSBkZXZpY2VTY2FsZUZhY3RvcigpOworICAgIH0KKworICAgIG1fY3JlYXRlZExheWVycy5h
ZGQobGF5ZXJJRCwgV1RGTW92ZShjcmVhdGlvblByb3BlcnRpZXMpKTsKKyAgICBtX2xpdmVMYXll
cnMuYWRkKGxheWVySUQsICZsYXllcik7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4
dDo6bGF5ZXJXaWxsQmVEZXN0cm95ZWQoUGxhdGZvcm1DQUxheWVyUmVtb3RlJiBsYXllcikKK3sK
KyAgICBBU1NFUlQobGF5ZXIubGF5ZXJJRCgpKTsKKyAgICBHcmFwaGljc0xheWVyOjpQbGF0Zm9y
bUxheWVySUQgbGF5ZXJJRCA9IGxheWVyLmxheWVySUQoKTsKKworICAgIG1fY3JlYXRlZExheWVy
cy5yZW1vdmUobGF5ZXJJRCk7CisgICAgbV9saXZlTGF5ZXJzLnJlbW92ZShsYXllcklEKTsKKwor
ICAgIEFTU0VSVCghbV9kZXN0cm95ZWRMYXllcnMuY29udGFpbnMobGF5ZXJJRCkpOworICAgIG1f
ZGVzdHJveWVkTGF5ZXJzLmFwcGVuZChsYXllcklEKTsKKyAgICAKKyAgICBtX2xheWVyc1dpdGhB
bmltYXRpb25zLnJlbW92ZShsYXllcklEKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVDb250
ZXh0OjpiYWNraW5nU3RvcmVXYXNDcmVhdGVkKFJlbW90ZUxheWVyQmFja2luZ1N0b3JlJiBiYWNr
aW5nU3RvcmUpCit7CisgICAgbV9iYWNraW5nU3RvcmVDb2xsZWN0aW9uLmJhY2tpbmdTdG9yZVdh
c0NyZWF0ZWQoYmFja2luZ1N0b3JlKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVDb250ZXh0
OjpiYWNraW5nU3RvcmVXaWxsQmVEZXN0cm95ZWQoUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUmIGJh
Y2tpbmdTdG9yZSkKK3sKKyAgICBtX2JhY2tpbmdTdG9yZUNvbGxlY3Rpb24uYmFja2luZ1N0b3Jl
V2lsbEJlRGVzdHJveWVkKGJhY2tpbmdTdG9yZSk7Cit9CisKK2Jvb2wgUmVtb3RlTGF5ZXJUcmVl
Q29udGV4dDo6YmFja2luZ1N0b3JlV2lsbEJlRGlzcGxheWVkKFJlbW90ZUxheWVyQmFja2luZ1N0
b3JlJiBiYWNraW5nU3RvcmUpCit7CisgICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ29sbGVjdGlv
bi5iYWNraW5nU3RvcmVXaWxsQmVEaXNwbGF5ZWQoYmFja2luZ1N0b3JlKTsKK30KKworc3RkOjp1
bmlxdWVfcHRyPEdyYXBoaWNzTGF5ZXI+IFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmNyZWF0ZUdy
YXBoaWNzTGF5ZXIoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6VHlwZSBsYXllclR5cGUsIEdyYXBo
aWNzTGF5ZXJDbGllbnQmIGNsaWVudCkKK3sKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxH
cmFwaGljc0xheWVyQ0FSZW1vdGU+KGxheWVyVHlwZSwgY2xpZW50LCAqdGhpcyk7Cit9CisKK3Zv
aWQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6YnVpbGRUcmFuc2FjdGlvbihSZW1vdGVMYXllclRy
ZWVUcmFuc2FjdGlvbiYgdHJhbnNhY3Rpb24sIFBsYXRmb3JtQ0FMYXllciYgcm9vdExheWVyKQor
eworICAgIFRyYWNlU2NvcGUgdHJhY2luZ1Njb3BlKEJ1aWxkVHJhbnNhY3Rpb25TdGFydCwgQnVp
bGRUcmFuc2FjdGlvbkVuZCk7CisKKyAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmIHJvb3RMYXll
clJlbW90ZSA9IGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4ocm9vdExheWVyKTsKKyAg
ICB0cmFuc2FjdGlvbi5zZXRSb290TGF5ZXJJRChyb290TGF5ZXJSZW1vdGUubGF5ZXJJRCgpKTsK
KworICAgIG1fY3VycmVudFRyYW5zYWN0aW9uID0gJnRyYW5zYWN0aW9uOworICAgIHJvb3RMYXll
clJlbW90ZS5yZWN1cnNpdmVCdWlsZFRyYW5zYWN0aW9uKCp0aGlzLCB0cmFuc2FjdGlvbik7Cisg
ICAgbV9jdXJyZW50VHJhbnNhY3Rpb24gPSBudWxscHRyOworCisgICAgVmVjdG9yPFJlbW90ZUxh
eWVyVHJlZVRyYW5zYWN0aW9uOjpMYXllckNyZWF0aW9uUHJvcGVydGllcz4gY3JlYXRlZExheWVy
UHJvcGVydGllczsKKyAgICBjb3B5VmFsdWVzVG9WZWN0b3IobV9jcmVhdGVkTGF5ZXJzLCBjcmVh
dGVkTGF5ZXJQcm9wZXJ0aWVzKTsKKyAgICB0cmFuc2FjdGlvbi5zZXRDcmVhdGVkTGF5ZXJzKFdU
Rk1vdmUoY3JlYXRlZExheWVyUHJvcGVydGllcykpOworICAgIHRyYW5zYWN0aW9uLnNldERlc3Ry
b3llZExheWVySURzKFdURk1vdmUobV9kZXN0cm95ZWRMYXllcnMpKTsKKyAgICAKKyAgICBtX2Ny
ZWF0ZWRMYXllcnMuY2xlYXIoKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVDb250ZXh0Ojps
YXllclByb3BlcnR5Q2hhbmdlZFdoaWxlQnVpbGRpbmdUcmFuc2FjdGlvbihQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGUmIGxheWVyKQoreworICAgIGlmIChtX2N1cnJlbnRUcmFuc2FjdGlvbikKKyAgICAg
ICAgbV9jdXJyZW50VHJhbnNhY3Rpb24tPmxheWVyUHJvcGVydGllc0NoYW5nZWQobGF5ZXIpOwor
fQorCit2b2lkIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OndpbGxTdGFydEFuaW1hdGlvbk9uTGF5
ZXIoUGxhdGZvcm1DQUxheWVyUmVtb3RlJiBsYXllcikKK3sKKyAgICBtX2xheWVyc1dpdGhBbmlt
YXRpb25zLmFkZChsYXllci5sYXllcklEKCksICZsYXllcik7Cit9CisKK3ZvaWQgUmVtb3RlTGF5
ZXJUcmVlQ29udGV4dDo6YW5pbWF0aW9uRGlkU3RhcnQoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6
UGxhdGZvcm1MYXllcklEIGxheWVySUQsIGNvbnN0IFN0cmluZyYga2V5LCBkb3VibGUgc3RhcnRU
aW1lKQoreworICAgIGF1dG8gaXQgPSBtX2xheWVyc1dpdGhBbmltYXRpb25zLmZpbmQobGF5ZXJJ
RCk7CisgICAgaWYgKGl0ICE9IG1fbGF5ZXJzV2l0aEFuaW1hdGlvbnMuZW5kKCkpCisgICAgICAg
IGl0LT52YWx1ZS0+YW5pbWF0aW9uU3RhcnRlZChrZXksIHN0YXJ0VGltZSk7Cit9CisKK3ZvaWQg
UmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6YW5pbWF0aW9uRGlkRW5kKFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCBsYXllcklELCBjb25zdCBTdHJpbmcmIGtleSkKK3sKKyAg
ICBhdXRvIGl0ID0gbV9sYXllcnNXaXRoQW5pbWF0aW9ucy5maW5kKGxheWVySUQpOworICAgIGlm
IChpdCAhPSBtX2xheWVyc1dpdGhBbmltYXRpb25zLmVuZCgpKQorICAgICAgICBpdC0+dmFsdWUt
PmFuaW1hdGlvbkVuZGVkKGtleSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1Jl
bW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5oIGIvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZy
ZXNoTW9uaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjMyYjdmNWFhMTdhMzA2MzhjMmJkMGIwODE0OGNjZmQw
N2Q4NjhkYjAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2Vi
UGFnZS9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9y
LmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lmIFVTRShSRVFVRVNUX0FOSU1BVElPTl9GUkFN
RV9ESVNQTEFZX01PTklUT1IpCisKKyNpbmNsdWRlICJSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJl
YS5oIgorI2luY2x1ZGUgPFdlYkNvcmUvRGlzcGxheVJlZnJlc2hNb25pdG9yLmg+CisKK25hbWVz
cGFjZSBXZWJLaXQgeworCitjbGFzcyBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0
b3IgOiBwdWJsaWMgV2ViQ29yZTo6RGlzcGxheVJlZnJlc2hNb25pdG9yIHsKK3B1YmxpYzoKKyAg
ICBzdGF0aWMgUmVmPFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcj4gY3JlYXRl
KFdlYkNvcmU6OlBsYXRmb3JtRGlzcGxheUlEIGRpc3BsYXlJRCwgUmVtb3RlTGF5ZXJUcmVlRHJh
d2luZ0FyZWEmIGRyYXdpbmdBcmVhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpu
ZXcgUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yKGRpc3BsYXlJRCwgZHJhd2lu
Z0FyZWEpKTsKKyAgICB9CisgICAgCisgICAgdmlydHVhbCB+UmVtb3RlTGF5ZXJUcmVlRGlzcGxh
eVJlZnJlc2hNb25pdG9yKCk7CisKKyAgICBib29sIHJlcXVlc3RSZWZyZXNoQ2FsbGJhY2soKSBv
dmVycmlkZTsKKworICAgIHZvaWQgZGlkVXBkYXRlTGF5ZXJzKCk7CisKK3ByaXZhdGU6CisgICAg
ZXhwbGljaXQgUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yKFdlYkNvcmU6OlBs
YXRmb3JtRGlzcGxheUlELCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYSYpOworCisgICAgV2Vh
a1B0cjxSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYT4gbV9kcmF3aW5nQXJlYTsKK307CisKK30K
KworI2VuZGlmIC8vIFVTRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRV9ESVNQTEFZX01PTklUT1Ip
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXll
clRyZWUvUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yLm1tIGIvU291cmNlL1dl
YktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZURp
c3BsYXlSZWZyZXNoTW9uaXRvci5tbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44OTJkNjU3MTU1OThmNzc0YWJmOWUz
NDQ5MDc1NzE2M2NjNDQ1MDgyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZy
ZXNoTW9uaXRvci5tbQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbXBvcnQgImNvbmZpZy5oIgorI2ltcG9ydCAiUmVtb3Rl
TGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yLmgiCisKKyNpZiBVU0UoUkVRVUVTVF9BTklN
QVRJT05fRlJBTUVfRElTUExBWV9NT05JVE9SKQorCisjaW1wb3J0IDx3dGYvQ3VycmVudFRpbWUu
aD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitS
ZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3I6OlJlbW90ZUxheWVyVHJlZURpc3Bs
YXlSZWZyZXNoTW9uaXRvcihQbGF0Zm9ybURpc3BsYXlJRCBkaXNwbGF5SUQsIFJlbW90ZUxheWVy
VHJlZURyYXdpbmdBcmVhJiBkcmF3aW5nQXJlYSkKKyAgICA6IERpc3BsYXlSZWZyZXNoTW9uaXRv
cihkaXNwbGF5SUQpCisgICAgLCBtX2RyYXdpbmdBcmVhKGRyYXdpbmdBcmVhLmNyZWF0ZVdlYWtQ
dHIoKSkKK3sKK30KKworUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yOjp+UmVt
b3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yKCkKK3sKKyAgICBpZiAobV9kcmF3aW5n
QXJlYSkKKyAgICAgICAgbV9kcmF3aW5nQXJlYS0+d2lsbERlc3Ryb3lEaXNwbGF5UmVmcmVzaE1v
bml0b3IodGhpcyk7Cit9CisKK2Jvb2wgUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25p
dG9yOjpyZXF1ZXN0UmVmcmVzaENhbGxiYWNrKCkKK3sKKyAgICBpZiAoIW1fZHJhd2luZ0FyZWEg
fHwgIWlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghaXNTY2hl
ZHVsZWQoKSkKKyAgICAgICAgc3RhdGljX2Nhc3Q8RHJhd2luZ0FyZWEmPigqbV9kcmF3aW5nQXJl
YS5nZXQoKSkuc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKTsKKworICAgIHNldElzQWN0
aXZlKHRydWUpOworICAgIHNldElzU2NoZWR1bGVkKHRydWUpOworICAgIHJldHVybiB0cnVlOwor
fQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcjo6ZGlkVXBkYXRl
TGF5ZXJzKCkKK3sKKyAgICBzZXRJc1NjaGVkdWxlZChmYWxzZSk7CisKKyAgICBpZiAoIWlzUHJl
dmlvdXNGcmFtZURvbmUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2V0SXNQcmV2aW91c0Zy
YW1lRG9uZShmYWxzZSk7CisgICAgaGFuZGxlRGlzcGxheVJlZnJlc2hlZE5vdGlmaWNhdGlvbk9u
TWFpblRocmVhZCh0aGlzKTsKK30KKworfQorCisjZW5kaWYgLy8gVVNFKFJFUVVFU1RfQU5JTUFU
SU9OX0ZSQU1FX0RJU1BMQVlfTU9OSVRPUikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJl
YS5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1Jl
bW90ZUxheWVyVHJlZURyYXdpbmdBcmVhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNDI3NWFlMzExNWE2ZDI1MTg0
YmMyYmRkZDgyZDA0YTU1YTk5OTdiZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVEcmF3aW5n
QXJlYS5oCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTQg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFT
IElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
CisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YK
KyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UK
KworI2luY2x1ZGUgIkNhbGxiYWNrSUQuaCIKKyNpbmNsdWRlICJEcmF3aW5nQXJlYS5oIgorI2lu
Y2x1ZGUgIkdyYXBoaWNzTGF5ZXJDQVJlbW90ZS5oIgorI2luY2x1ZGUgIlJlbW90ZUxheWVyVHJl
ZVRyYW5zYWN0aW9uLmgiCisjaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0xheWVyQ2xpZW50Lmg+
CisjaW5jbHVkZSA8V2ViQ29yZS9UaW1lci5oPgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRl
IDxkaXNwYXRjaC9kaXNwYXRjaC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVk
ZSA8d3RmL1dlYWtQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgUGxhdGZvcm1D
QUxheWVyOworfQorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgUmVtb3RlTGF5ZXJUcmVl
Q29udGV4dDsKK2NsYXNzIFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcjsKKwor
Y2xhc3MgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEgOiBwdWJsaWMgRHJhd2luZ0FyZWEsIHB1
YmxpYyBXZWJDb3JlOjpHcmFwaGljc0xheWVyQ2xpZW50IHsKKyAgICBmcmllbmQgY2xhc3MgUmVt
b3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yOworcHVibGljOgorICAgIFJlbW90ZUxh
eWVyVHJlZURyYXdpbmdBcmVhKFdlYlBhZ2UmLCBjb25zdCBXZWJQYWdlQ3JlYXRpb25QYXJhbWV0
ZXJzJik7CisgICAgdmlydHVhbCB+UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEoKTsKKworICAg
IHVpbnQ2NF90IG5leHRUcmFuc2FjdGlvbklEKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50VHJh
bnNhY3Rpb25JRCArIDE7IH0KKyAgICB1aW50NjRfdCBsYXN0Q29tbWl0dGVkVHJhbnNhY3Rpb25J
RCgpIGNvbnN0IHsgcmV0dXJuIG1fY3VycmVudFRyYW5zYWN0aW9uSUQ7IH0KKworICAgIFdlYWtQ
dHI8UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE+IGNyZWF0ZVdlYWtQdHIoKSB7IHJldHVybiBt
X3dlYWtQdHJGYWN0b3J5LmNyZWF0ZVdlYWtQdHIoKTsgfQorCitwcml2YXRlOgorICAgIC8vIERy
YXdpbmdBcmVhCisgICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKSBvdmVycmlkZTsKKyAgICB2b2lk
IHNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBXZWJDb3JlOjpJbnRSZWN0Jikgb3ZlcnJpZGU7
CisgICAgdm9pZCBzY3JvbGwoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgc2Nyb2xsUmVjdCwgY29u
c3QgV2ViQ29yZTo6SW50U2l6ZSYgc2Nyb2xsRGVsdGEpIG92ZXJyaWRlOworICAgIHZvaWQgdXBk
YXRlR2VvbWV0cnkoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYgdmlld1NpemUsIGNvbnN0IFdlYkNv
cmU6OkludFNpemUmIGxheWVyUG9zaXRpb24sIGJvb2wgZmx1c2hTeW5jaHJvbm91c2x5LCBjb25z
dCBXZWJDb3JlOjpNYWNoU2VuZFJpZ2h0JiBmZW5jZVBvcnQpIG92ZXJyaWRlOworCisgICAgV2Vi
Q29yZTo6R3JhcGhpY3NMYXllckZhY3RvcnkqIGdyYXBoaWNzTGF5ZXJGYWN0b3J5KCkgb3ZlcnJp
ZGU7CisgICAgdm9pZCBzZXRSb290Q29tcG9zaXRpbmdMYXllcihXZWJDb3JlOjpHcmFwaGljc0xh
eWVyKikgb3ZlcnJpZGU7CisgICAgdm9pZCBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgp
IG92ZXJyaWRlOworICAgIHZvaWQgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2hJbW1lZGlh
dGVseSgpIG92ZXJyaWRlOworICAgIHZvaWQgYXR0YWNoVmlld092ZXJsYXlHcmFwaGljc0xheWVy
KFdlYkNvcmU6OkZyYW1lKiwgV2ViQ29yZTo6R3JhcGhpY3NMYXllciopIG92ZXJyaWRlOworCisg
ICAgdm9pZCBhZGRUcmFuc2FjdGlvbkNhbGxiYWNrSUQoQ2FsbGJhY2tJRCkgb3ZlcnJpZGU7CisK
KyAgICBSZWZQdHI8V2ViQ29yZTo6RGlzcGxheVJlZnJlc2hNb25pdG9yPiBjcmVhdGVEaXNwbGF5
UmVmcmVzaE1vbml0b3IoV2ViQ29yZTo6UGxhdGZvcm1EaXNwbGF5SUQpIG92ZXJyaWRlOworICAg
IHZvaWQgd2lsbERlc3Ryb3lEaXNwbGF5UmVmcmVzaE1vbml0b3IoV2ViQ29yZTo6RGlzcGxheVJl
ZnJlc2hNb25pdG9yKik7CisKKyAgICBib29sIHNob3VsZFVzZVRpbGVkQmFja2luZ0ZvckZyYW1l
Vmlldyhjb25zdCBXZWJDb3JlOjpGcmFtZVZpZXcmKSBvdmVycmlkZTsKKworICAgIHZvaWQgdXBk
YXRlUHJlZmVyZW5jZXMoY29uc3QgV2ViUHJlZmVyZW5jZXNTdG9yZSYpIG92ZXJyaWRlOworCisg
ICAgYm9vbCBzdXBwb3J0c0FzeW5jU2Nyb2xsaW5nKCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsg
fQorCisgICAgdm9pZCBzZXRMYXllclRyZWVTdGF0ZUlzRnJvemVuKGJvb2wpIG92ZXJyaWRlOwor
CisgICAgdm9pZCBmb3JjZVJlcGFpbnQoKSBvdmVycmlkZTsKKyAgICBib29sIGZvcmNlUmVwYWlu
dEFzeW5jKENhbGxiYWNrSUQpIG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB2b2lk
IHNldFZpZXdFeHBvc2VkUmVjdChzdGQ6Om9wdGlvbmFsPFdlYkNvcmU6OkZsb2F0UmVjdD4pIG92
ZXJyaWRlOworICAgIHN0ZDo6b3B0aW9uYWw8V2ViQ29yZTo6RmxvYXRSZWN0PiB2aWV3RXhwb3Nl
ZFJlY3QoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX3Njcm9sbGVkVmlld0V4cG9zZWRSZWN0
OyB9CisKKyAgICB2b2lkIGFjY2VsZXJhdGVkQW5pbWF0aW9uRGlkU3RhcnQodWludDY0X3QgbGF5
ZXJJRCwgY29uc3QgU3RyaW5nJiBrZXksIGRvdWJsZSBzdGFydFRpbWUpIG92ZXJyaWRlOworICAg
IHZvaWQgYWNjZWxlcmF0ZWRBbmltYXRpb25EaWRFbmQodWludDY0X3QgbGF5ZXJJRCwgY29uc3Qg
U3RyaW5nJiBrZXkpIG92ZXJyaWRlOworCisjaWYgUExBVEZPUk0oSU9TKQorICAgIFdlYkNvcmU6
OkZsb2F0UmVjdCBleHBvc2VkQ29udGVudFJlY3QoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lk
IHNldEV4cG9zZWRDb250ZW50UmVjdChjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmKSBvdmVycmlk
ZTsKKyNlbmRpZgorCisgICAgdm9pZCBkaWRVcGRhdGUoKSBvdmVycmlkZTsKKworI2lmIFBMQVRG
T1JNKElPUykKKyAgICB2b2lkIHNldERldmljZVNjYWxlRmFjdG9yKGZsb2F0KSBvdmVycmlkZTsK
KyNlbmRpZgorCisgICAgdm9pZCBtYWluRnJhbWVDb250ZW50U2l6ZUNoYW5nZWQoY29uc3QgV2Vi
Q29yZTo6SW50U2l6ZSYpIG92ZXJyaWRlOworCisgICAgdm9pZCBhY3Rpdml0eVN0YXRlRGlkQ2hh
bmdlKFdlYkNvcmU6OkFjdGl2aXR5U3RhdGU6OkZsYWdzIGNoYW5nZWQsIGJvb2wgd2FudHNEaWRV
cGRhdGVBY3Rpdml0eVN0YXRlLCBjb25zdCBWZWN0b3I8Q2FsbGJhY2tJRD4mIGNhbGxiYWNrSURz
KSBvdmVycmlkZTsKKworICAgIGJvb2wgYWRqdXN0TGF5ZXJGbHVzaFRocm90dGxpbmcoV2ViQ29y
ZTo6TGF5ZXJGbHVzaFRocm90dGxlU3RhdGU6OkZsYWdzKSBvdmVycmlkZTsKKworICAgIGJvb2wg
ZGlzcGF0Y2hEaWRSZWFjaExheW91dE1pbGVzdG9uZShXZWJDb3JlOjpMYXlvdXRNaWxlc3RvbmVz
KSBvdmVycmlkZTsKKworICAgIHZvaWQgdXBkYXRlU2Nyb2xsZWRFeHBvc2VkUmVjdCgpOworICAg
IHZvaWQgdXBkYXRlUm9vdExheWVycygpOworCisgICAgdm9pZCBmbHVzaExheWVycygpOworCisg
ICAgV2ViQ29yZTo6VGlsZWRCYWNraW5nKiBtYWluRnJhbWVUaWxlZEJhY2tpbmcoKSBjb25zdDsK
KworICAgIHVpbnQ2NF90IHRha2VOZXh0VHJhbnNhY3Rpb25JRCgpIHsgcmV0dXJuICsrbV9jdXJy
ZW50VHJhbnNhY3Rpb25JRDsgfQorCisgICAgYm9vbCBtYXJrTGF5ZXJzVm9sYXRpbGVJbW1lZGlh
dGVseUlmUG9zc2libGUoKSBvdmVycmlkZTsKKworICAgIGNsYXNzIEJhY2tpbmdTdG9yZUZsdXNo
ZXIgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8QmFja2luZ1N0b3JlRmx1c2hlcj4gewor
ICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIFJlZjxCYWNraW5nU3RvcmVGbHVzaGVyPiBjcmVh
dGUoSVBDOjpDb25uZWN0aW9uKiwgc3RkOjp1bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4sIFZlY3Rv
cjxSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPj4pOworCisgICAgICAgIHZvaWQgZmx1c2goKTsKKyAg
ICAgICAgYm9vbCBoYXNGbHVzaGVkKCkgY29uc3QgeyByZXR1cm4gbV9oYXNGbHVzaGVkOyB9CisK
KyAgICBwcml2YXRlOgorICAgICAgICBCYWNraW5nU3RvcmVGbHVzaGVyKElQQzo6Q29ubmVjdGlv
biosIHN0ZDo6dW5pcXVlX3B0cjxJUEM6OkVuY29kZXI+LCBWZWN0b3I8UmV0YWluUHRyPENHQ29u
dGV4dFJlZj4+KTsKKworICAgICAgICBSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiBtX2Nvbm5lY3Rp
b247CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUEM6OkVuY29kZXI+IG1fY29tbWl0RW5jb2Rl
cjsKKyAgICAgICAgVmVjdG9yPFJldGFpblB0cjxDR0NvbnRleHRSZWY+PiBtX2NvbnRleHRzVG9G
bHVzaDsKKworICAgICAgICBzdGQ6OmF0b21pYzxib29sPiBtX2hhc0ZsdXNoZWQ7CisgICAgfTsK
KworICAgIHN0ZDo6dW5pcXVlX3B0cjxSZW1vdGVMYXllclRyZWVDb250ZXh0PiBtX3JlbW90ZUxh
eWVyVHJlZUNvbnRleHQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXI+IG1fcm9vdExheWVyOworCisgICAgV2ViQ29yZTo6SW50U2l6ZSBtX3ZpZXdTaXplOworCisg
ICAgc3RkOjpvcHRpb25hbDxXZWJDb3JlOjpGbG9hdFJlY3Q+IG1fdmlld0V4cG9zZWRSZWN0Owor
ICAgIHN0ZDo6b3B0aW9uYWw8V2ViQ29yZTo6RmxvYXRSZWN0PiBtX3Njcm9sbGVkVmlld0V4cG9z
ZWRSZWN0OworCisgICAgV2ViQ29yZTo6VGltZXIgbV9sYXllckZsdXNoVGltZXI7CisgICAgYm9v
bCBtX2lzRmx1c2hpbmdTdXNwZW5kZWQgeyBmYWxzZSB9OworICAgIGJvb2wgbV9oYXNEZWZlcnJl
ZEZsdXNoIHsgZmFsc2UgfTsKKyAgICBib29sIG1faXNUaHJvdHRsaW5nTGF5ZXJGbHVzaGVzIHsg
ZmFsc2UgfTsKKyAgICBib29sIG1faXNMYXllckZsdXNoVGhyb3R0bGluZ1RlbXBvcmFyaWx5RGlz
YWJsZWRGb3JJbnRlcmFjdGlvbiB7IGZhbHNlIH07CisgICAgYm9vbCBtX2lzSW5pdGlhbFRocm90
dGxlZExheWVyRmx1c2ggeyBmYWxzZSB9OworCisgICAgYm9vbCBtX3dhaXRpbmdGb3JCYWNraW5n
U3RvcmVTd2FwIHsgZmFsc2UgfTsKKyAgICBib29sIG1faGFkRmx1c2hEZWZlcnJlZFdoaWxlV2Fp
dGluZ0ZvckJhY2tpbmdTdG9yZVN3YXAgeyBmYWxzZSB9OworICAgIGJvb2wgbV9uZXh0Rmx1c2hJ
c0ZvckltbWVkaWF0ZVBhaW50IHsgZmFsc2UgfTsKKworICAgIGRpc3BhdGNoX3F1ZXVlX3QgbV9j
b21taXRRdWV1ZTsKKyAgICBSZWZQdHI8QmFja2luZ1N0b3JlRmx1c2hlcj4gbV9wZW5kaW5nQmFj
a2luZ1N0b3JlRmx1c2hlcjsKKworICAgIEhhc2hTZXQ8UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJl
ZnJlc2hNb25pdG9yKj4gbV9kaXNwbGF5UmVmcmVzaE1vbml0b3JzOworICAgIEhhc2hTZXQ8UmVt
b3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yKj4qIG1fZGlzcGxheVJlZnJlc2hNb25p
dG9yc1RvTm90aWZ5IHsgbnVsbHB0ciB9OworCisgICAgdWludDY0X3QgbV9jdXJyZW50VHJhbnNh
Y3Rpb25JRCB7IDAgfTsKKyAgICBWZWN0b3I8UmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlRy
YW5zYWN0aW9uQ2FsbGJhY2tJRD4gbV9wZW5kaW5nQ2FsbGJhY2tJRHM7CisKKyAgICBXZWJDb3Jl
OjpMYXlvdXRNaWxlc3RvbmVzIG1fcGVuZGluZ05ld2x5UmVhY2hlZExheW91dE1pbGVzdG9uZXMg
eyAwIH07CisKKyAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBtX2NvbnRlbnRMYXllciB7IG51
bGxwdHIgfTsKKyAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBtX3ZpZXdPdmVybGF5Um9vdExh
eWVyIHsgbnVsbHB0ciB9OworICAgIAorICAgIFdlYWtQdHJGYWN0b3J5PFJlbW90ZUxheWVyVHJl
ZURyYXdpbmdBcmVhPiBtX3dlYWtQdHJGYWN0b3J5OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2Vi
S2l0CisKK1NQRUNJQUxJWkVfVFlQRV9UUkFJVFNfRFJBV0lOR19BUkVBKFJlbW90ZUxheWVyVHJl
ZURyYXdpbmdBcmVhLCBEcmF3aW5nQXJlYVR5cGVSZW1vdGVMYXllclRyZWUpCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWEubW0gYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFn
ZS9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEubW0KbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uZjE0NmZhMGYwYjg2NjVjOWQyNDA2MDhkZWQ3MWVjYjgzNTYzYTE2MwotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9S
ZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5tbQpAQCAtMCwwICsxLDUxNCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMi0yMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2ltcG9ydCAiY29uZmlnLmgiCisjaW1wb3J0ICJSZW1vdGVMYXllclRyZWVEcmF3
aW5nQXJlYS5oIgorCisjaW1wb3J0ICJEcmF3aW5nQXJlYVByb3h5TWVzc2FnZXMuaCIKKyNpbXBv
cnQgIkdyYXBoaWNzTGF5ZXJDQVJlbW90ZS5oIgorI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVyUmVt
b3RlLmgiCisjaW1wb3J0ICJSZW1vdGVMYXllckJhY2tpbmdTdG9yZUNvbGxlY3Rpb24uaCIKKyNp
bXBvcnQgIlJlbW90ZUxheWVyVHJlZUNvbnRleHQuaCIKKyNpbXBvcnQgIlJlbW90ZUxheWVyVHJl
ZURpc3BsYXlSZWZyZXNoTW9uaXRvci5oIgorI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlRHJhd2lu
Z0FyZWFQcm94eU1lc3NhZ2VzLmgiCisjaW1wb3J0ICJSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRv
ci5oIgorI2ltcG9ydCAiUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JUcmFuc2FjdGlvbi5oIgor
I2ltcG9ydCAiV2ViUGFnZS5oIgorI2ltcG9ydCAiV2ViUHJvY2Vzcy5oIgorI2ltcG9ydCA8UXVh
cnR6Q29yZS9RdWFydHpDb3JlLmg+CisjaW1wb3J0IDxXZWJDb3JlL0RlYnVnUGFnZU92ZXJsYXlz
Lmg+CisjaW1wb3J0IDxXZWJDb3JlL0ZyYW1lLmg+CisjaW1wb3J0IDxXZWJDb3JlL0ZyYW1lVmll
dy5oPgorI2ltcG9ydCA8V2ViQ29yZS9JbnNwZWN0b3JDb250cm9sbGVyLmg+CisjaW1wb3J0IDxX
ZWJDb3JlL01haW5GcmFtZS5oPgorI2ltcG9ydCA8V2ViQ29yZS9QYWdlT3ZlcmxheUNvbnRyb2xs
ZXIuaD4KKyNpbXBvcnQgPFdlYkNvcmUvUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmg+CisjaW1wb3J0
IDxXZWJDb3JlL1JlbmRlclZpZXcuaD4KKyNpbXBvcnQgPFdlYkNvcmUvU2V0dGluZ3MuaD4KKyNp
bXBvcnQgPFdlYkNvcmUvVGlsZWRCYWNraW5nLmg+CisjaW1wb3J0IDxwYWwvc3BpL2NvY29hL1F1
YXJ0ekNvcmVTUEkuaD4KKyNpbXBvcnQgPHd0Zi9TeXN0ZW1UcmFjaW5nLmg+CisKK3VzaW5nIG5h
bWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworUmVtb3RlTGF5ZXJUcmVl
RHJhd2luZ0FyZWE6OlJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhKFdlYlBhZ2UmIHdlYlBhZ2Us
IGNvbnN0IFdlYlBhZ2VDcmVhdGlvblBhcmFtZXRlcnMmKQorICAgIDogRHJhd2luZ0FyZWEoRHJh
d2luZ0FyZWFUeXBlUmVtb3RlTGF5ZXJUcmVlLCB3ZWJQYWdlKQorICAgICwgbV9yZW1vdGVMYXll
clRyZWVDb250ZXh0KHN0ZDo6bWFrZV91bmlxdWU8UmVtb3RlTGF5ZXJUcmVlQ29udGV4dD4od2Vi
UGFnZSkpCisgICAgLCBtX3Jvb3RMYXllcihHcmFwaGljc0xheWVyOjpjcmVhdGUoZ3JhcGhpY3NM
YXllckZhY3RvcnkoKSwgKnRoaXMpKQorICAgICwgbV9sYXllckZsdXNoVGltZXIoKnRoaXMsICZS
ZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6Zmx1c2hMYXllcnMpCisgICAgLCBtX3dlYWtQdHJG
YWN0b3J5KHRoaXMpCit7CisgICAgd2ViUGFnZS5jb3JlUGFnZSgpLT5zZXR0aW5ncygpLnNldEZv
cmNlQ29tcG9zaXRpbmdNb2RlKHRydWUpOworI2lmIFBMQVRGT1JNKElPUykKKyAgICB3ZWJQYWdl
LmNvcmVQYWdlKCktPnNldHRpbmdzKCkuc2V0RGVsZWdhdGVzUGFnZVNjYWxpbmcodHJ1ZSk7Cisj
ZW5kaWYKKyAgICBtX3Jvb3RMYXllci0+c2V0TmFtZSgiZHJhd2luZyBhcmVhIHJvb3QiKTsKKwor
ICAgIG1fY29tbWl0UXVldWUgPSBkaXNwYXRjaF9xdWV1ZV9jcmVhdGUoImNvbS5hcHBsZS5XZWJL
aXQuV2ViQ29udGVudC5SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5Db21taXRRdWV1ZSIsIG51
bGxwdHIpOworCisgICAgLy8gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgd2UgZ2V0IGEgdW5pcXVl
IERpc3BsYXlSZWZyZXNoTW9uaXRvciBwZXItRHJhd2luZ0FyZWEgKG5lY2Vzc2FyeSBiZWNhdXNl
IERpc3BsYXlSZWZyZXNoTW9uaXRvcgorICAgIC8vIGlzIGRyaXZlbiBieSB0aGlzIGNsYXNzKSwg
Z2l2ZSBlYWNoIHBhZ2UgYSB1bmlxdWUgRGlzcGxheUlEIGRlcml2ZWQgZnJvbSBXZWJQYWdlJ3Mg
dW5pcXVlIElELgorICAgIC8vIEZJWE1FOiBXaGlsZSB1c2luZyB0aGUgaGlnaCBlbmQgb2YgdGhl
IHJhbmdlIG9mIERpc3BsYXlJRHMgbWFrZXMgYSBjb2xsaXNpb24gd2l0aCByZWFsLCBub24tUmVt
b3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEKKyAgICAvLyBEaXNwbGF5SURzIGxlc3MgbGlrZWx5LCBp
dCBpcyBub3QgZW50aXJlbHkgc2FmZSB0byBoYXZlIGEgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0Fy
ZWEgYW5kIFRpbGVkQ29yZUFuaW1hdGlvbkRyYXdpbmdBcmVhCisgICAgLy8gY29lZXhpc3QgaW4g
dGhlIHNhbWUgcHJvY2Vzcy4KKyAgICB3ZWJQYWdlLndpbmRvd1NjcmVlbkRpZENoYW5nZShzdGQ6
Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkgLSB3ZWJQYWdlLnBhZ2VJRCgpKTsKK30K
KworUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6On5SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJl
YSgpCit7CisgICAgZGlzcGF0Y2hfcmVsZWFzZShtX2NvbW1pdFF1ZXVlKTsKK30KKwordm9pZCBS
ZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKK30KKwordm9p
ZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0
IEludFJlY3QmKQoreworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzY3Jv
bGwoY29uc3QgSW50UmVjdCYgc2Nyb2xsUmVjdCwgY29uc3QgSW50U2l6ZSYgc2Nyb2xsRGVsdGEp
Cit7Cit9CisKK0dyYXBoaWNzTGF5ZXJGYWN0b3J5KiBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJl
YTo6Z3JhcGhpY3NMYXllckZhY3RvcnkoKQoreworICAgIHJldHVybiBtX3JlbW90ZUxheWVyVHJl
ZUNvbnRleHQuZ2V0KCk7Cit9CisKK1JlZlB0cjxEaXNwbGF5UmVmcmVzaE1vbml0b3I+IFJlbW90
ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpjcmVhdGVEaXNwbGF5UmVmcmVzaE1vbml0b3IoUGxhdGZv
cm1EaXNwbGF5SUQgZGlzcGxheUlEKQoreworICAgIGF1dG8gbW9uaXRvciA9IFJlbW90ZUxheWVy
VHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcjo6Y3JlYXRlKGRpc3BsYXlJRCwgKnRoaXMpOworICAg
IG1fZGlzcGxheVJlZnJlc2hNb25pdG9ycy5hZGQobW9uaXRvci5wdHIoKSk7CisgICAgcmV0dXJu
IFdURk1vdmUobW9uaXRvcik7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6
OndpbGxEZXN0cm95RGlzcGxheVJlZnJlc2hNb25pdG9yKERpc3BsYXlSZWZyZXNoTW9uaXRvciog
bW9uaXRvcikKK3sKKyAgICBhdXRvIHJlbW90ZU1vbml0b3IgPSBzdGF0aWNfY2FzdDxSZW1vdGVM
YXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IqPihtb25pdG9yKTsKKyAgICBtX2Rpc3BsYXlS
ZWZyZXNoTW9uaXRvcnMucmVtb3ZlKHJlbW90ZU1vbml0b3IpOworCisgICAgaWYgKG1fZGlzcGxh
eVJlZnJlc2hNb25pdG9yc1RvTm90aWZ5KQorICAgICAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRv
cnNUb05vdGlmeS0+cmVtb3ZlKHJlbW90ZU1vbml0b3IpOworfQorCit2b2lkIFJlbW90ZUxheWVy
VHJlZURyYXdpbmdBcmVhOjp1cGRhdGVSb290TGF5ZXJzKCkKK3sKKyAgICBWZWN0b3I8R3JhcGhp
Y3NMYXllcio+IGNoaWxkcmVuOworICAgIGlmIChtX2NvbnRlbnRMYXllcikgeworICAgICAgICBj
aGlsZHJlbi5hcHBlbmQobV9jb250ZW50TGF5ZXIpOworICAgICAgICBpZiAobV92aWV3T3Zlcmxh
eVJvb3RMYXllcikKKyAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZChtX3ZpZXdPdmVybGF5Um9v
dExheWVyKTsKKyAgICB9CisKKyAgICBtX3Jvb3RMYXllci0+c2V0Q2hpbGRyZW4oY2hpbGRyZW4p
OworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphdHRhY2hWaWV3T3Zlcmxh
eUdyYXBoaWNzTGF5ZXIoRnJhbWUqIGZyYW1lLCBHcmFwaGljc0xheWVyKiB2aWV3T3ZlcmxheVJv
b3RMYXllcikKK3sKKyAgICBpZiAoIWZyYW1lLT5pc01haW5GcmFtZSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBtX3ZpZXdPdmVybGF5Um9vdExheWVyID0gdmlld092ZXJsYXlSb290TGF5ZXI7
CisgICAgdXBkYXRlUm9vdExheWVycygpOworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdp
bmdBcmVhOjpzZXRSb290Q29tcG9zaXRpbmdMYXllcihHcmFwaGljc0xheWVyKiByb290TGF5ZXIp
Cit7CisgICAgbV9jb250ZW50TGF5ZXIgPSByb290TGF5ZXI7CisgICAgdXBkYXRlUm9vdExheWVy
cygpOworICAgIHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllckZsdXNoKCk7Cit9CisKK3ZvaWQgUmVt
b3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnVwZGF0ZUdlb21ldHJ5KGNvbnN0IEludFNpemUmIHZp
ZXdTaXplLCBjb25zdCBJbnRTaXplJiBsYXllclBvc2l0aW9uLCBib29sIGZsdXNoU3luY2hyb25v
dXNseSwgY29uc3QgV2ViQ29yZTo6TWFjaFNlbmRSaWdodCYpCit7CisgICAgbV92aWV3U2l6ZSA9
IHZpZXdTaXplOworICAgIG1fd2ViUGFnZS5zZXRTaXplKHZpZXdTaXplKTsKKworICAgIHNjaGVk
dWxlQ29tcG9zaXRpbmdMYXllckZsdXNoKCk7CisKKyAgICBtX3dlYlBhZ2Uuc2VuZChNZXNzYWdl
czo6RHJhd2luZ0FyZWFQcm94eTo6RGlkVXBkYXRlR2VvbWV0cnkoKSk7Cit9CisKK2Jvb2wgUmVt
b3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnNob3VsZFVzZVRpbGVkQmFja2luZ0ZvckZyYW1lVmll
dyhjb25zdCBGcmFtZVZpZXcmIGZyYW1lVmlldykKK3sKKyAgICByZXR1cm4gZnJhbWVWaWV3LmZy
YW1lKCkuaXNNYWluRnJhbWUoKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJl
YTo6dXBkYXRlUHJlZmVyZW5jZXMoY29uc3QgV2ViUHJlZmVyZW5jZXNTdG9yZSYpCit7CisgICAg
U2V0dGluZ3MmIHNldHRpbmdzID0gbV93ZWJQYWdlLmNvcmVQYWdlKCktPnNldHRpbmdzKCk7CisK
KyAgICAvLyBGaXhlZCBwb3NpdGlvbiBlbGVtZW50cyBuZWVkIHRvIGJlIGNvbXBvc2l0ZWQgYW5k
IGNyZWF0ZSBzdGFja2luZyBjb250ZXh0cworICAgIC8vIGluIG9yZGVyIHRvIGJlIHNjcm9sbGVk
IGJ5IHRoZSBTY3JvbGxpbmdDb29yZGluYXRvci4KKyAgICBzZXR0aW5ncy5zZXRBY2NlbGVyYXRl
ZENvbXBvc2l0aW5nRm9yRml4ZWRQb3NpdGlvbkVuYWJsZWQodHJ1ZSk7CisKKyAgICBtX3Jvb3RM
YXllci0+c2V0U2hvd0RlYnVnQm9yZGVyKHNldHRpbmdzLnNob3dEZWJ1Z0JvcmRlcnMoKSk7CisK
KyAgICBpZiAoTWFpbkZyYW1lKiBtYWluRnJhbWUgPSBtX3dlYlBhZ2UubWFpbkZyYW1lKCkpCisg
ICAgICAgIERlYnVnUGFnZU92ZXJsYXlzOjpzZXR0aW5nc0NoYW5nZWQoKm1haW5GcmFtZSk7Cit9
CisKKyNpZiBQTEFURk9STShJT1MpCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpz
ZXREZXZpY2VTY2FsZUZhY3RvcihmbG9hdCBkZXZpY2VTY2FsZUZhY3RvcikKK3sKKyAgICBtX3dl
YlBhZ2Uuc2V0RGV2aWNlU2NhbGVGYWN0b3IoZGV2aWNlU2NhbGVGYWN0b3IpOworfQorI2VuZGlm
CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnNldExheWVyVHJlZVN0YXRlSXNG
cm96ZW4oYm9vbCBpc0Zyb3plbikKK3sKKyAgICBpZiAobV9pc0ZsdXNoaW5nU3VzcGVuZGVkID09
IGlzRnJvemVuKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2lzRmx1c2hpbmdTdXNwZW5kZWQg
PSBpc0Zyb3plbjsKKworICAgIGlmICghbV9pc0ZsdXNoaW5nU3VzcGVuZGVkICYmIG1faGFzRGVm
ZXJyZWRGbHVzaCkgeworICAgICAgICBtX2hhc0RlZmVycmVkRmx1c2ggPSBmYWxzZTsKKyAgICAg
ICAgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVt
b3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmZvcmNlUmVwYWludCgpCit7CisgICAgaWYgKG1faXNG
bHVzaGluZ1N1c3BlbmRlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChGcmFtZSogZnJh
bWUgPSAmbV93ZWJQYWdlLmNvcmVQYWdlKCktPm1haW5GcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBm
cmFtZS0+dHJlZSgpLnRyYXZlcnNlTmV4dCgpKSB7CisgICAgICAgIEZyYW1lVmlldyogZnJhbWVW
aWV3ID0gZnJhbWUtPnZpZXcoKTsKKyAgICAgICAgaWYgKCFmcmFtZVZpZXcgfHwgIWZyYW1lVmll
dy0+dGlsZWRCYWNraW5nKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmcmFt
ZVZpZXctPnRpbGVkQmFja2luZygpLT5mb3JjZVJlcGFpbnQoKTsKKyAgICB9CisKKyAgICBmbHVz
aExheWVycygpOworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphY2NlbGVy
YXRlZEFuaW1hdGlvbkRpZFN0YXJ0KHVpbnQ2NF90IGxheWVySUQsIGNvbnN0IFN0cmluZyYga2V5
LCBkb3VibGUgc3RhcnRUaW1lKQoreworICAgIG1fcmVtb3RlTGF5ZXJUcmVlQ29udGV4dC0+YW5p
bWF0aW9uRGlkU3RhcnQobGF5ZXJJRCwga2V5LCBzdGFydFRpbWUpOworfQorCit2b2lkIFJlbW90
ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphY2NlbGVyYXRlZEFuaW1hdGlvbkRpZEVuZCh1aW50NjRf
dCBsYXllcklELCBjb25zdCBTdHJpbmcmIGtleSkKK3sKKyAgICBtX3JlbW90ZUxheWVyVHJlZUNv
bnRleHQtPmFuaW1hdGlvbkRpZEVuZChsYXllcklELCBrZXkpOworfQorCit2b2lkIFJlbW90ZUxh
eWVyVHJlZURyYXdpbmdBcmVhOjpzZXRWaWV3RXhwb3NlZFJlY3Qoc3RkOjpvcHRpb25hbDxXZWJD
b3JlOjpGbG9hdFJlY3Q+IHZpZXdFeHBvc2VkUmVjdCkKK3sKKyAgICBtX3ZpZXdFeHBvc2VkUmVj
dCA9IHZpZXdFeHBvc2VkUmVjdDsKKyAgICB1cGRhdGVTY3JvbGxlZEV4cG9zZWRSZWN0KCk7Cit9
CisKKyNpZiBQTEFURk9STShJT1MpCitXZWJDb3JlOjpGbG9hdFJlY3QgUmVtb3RlTGF5ZXJUcmVl
RHJhd2luZ0FyZWE6OmV4cG9zZWRDb250ZW50UmVjdCgpIGNvbnN0Cit7CisgICAgRnJhbWVWaWV3
KiBmcmFtZVZpZXcgPSBtX3dlYlBhZ2UubWFpbkZyYW1lVmlldygpOworICAgIGlmICghZnJhbWVW
aWV3KQorICAgICAgICByZXR1cm4gRmxvYXRSZWN0KCk7CisKKyAgICByZXR1cm4gZnJhbWVWaWV3
LT5leHBvc2VkQ29udGVudFJlY3QoKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5n
QXJlYTo6c2V0RXhwb3NlZENvbnRlbnRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgZXhwb3NlZENvbnRl
bnRSZWN0KQoreworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gbV93ZWJQYWdlLm1haW5GcmFt
ZVZpZXcoKTsKKyAgICBpZiAoIWZyYW1lVmlldykKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChm
cmFtZVZpZXctPmV4cG9zZWRDb250ZW50UmVjdCgpID09IGV4cG9zZWRDb250ZW50UmVjdCkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgZnJhbWVWaWV3LT5zZXRFeHBvc2VkQ29udGVudFJlY3QoZXhw
b3NlZENvbnRlbnRSZWN0KTsKKyAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOwor
fQorI2VuZGlmCisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnVwZGF0ZVNjcm9s
bGVkRXhwb3NlZFJlY3QoKQoreworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gbV93ZWJQYWdl
Lm1haW5GcmFtZVZpZXcoKTsKKyAgICBpZiAoIWZyYW1lVmlldykKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV9zY3JvbGxlZFZpZXdFeHBvc2VkUmVjdCA9IG1fdmlld0V4cG9zZWRSZWN0OworCisj
aWYgIVBMQVRGT1JNKElPUykKKyAgICBpZiAobV92aWV3RXhwb3NlZFJlY3QpIHsKKyAgICAgICAg
U2Nyb2xsT2Zmc2V0IHNjcm9sbE9mZnNldCA9IGZyYW1lVmlldy0+c2Nyb2xsT2Zmc2V0RnJvbVBv
c2l0aW9uKGZyYW1lVmlldy0+c2Nyb2xsUG9zaXRpb24oKSk7CisgICAgICAgIG1fc2Nyb2xsZWRW
aWV3RXhwb3NlZFJlY3QudmFsdWUoKS5tb3ZlQnkoc2Nyb2xsT2Zmc2V0KTsKKyAgICB9CisjZW5k
aWYKKworICAgIGZyYW1lVmlldy0+c2V0Vmlld0V4cG9zZWRSZWN0KG1fc2Nyb2xsZWRWaWV3RXhw
b3NlZFJlY3QpOworfQorCitUaWxlZEJhY2tpbmcqIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVh
OjptYWluRnJhbWVUaWxlZEJhY2tpbmcoKSBjb25zdAoreworICAgIEZyYW1lVmlldyogZnJhbWVW
aWV3ID0gbV93ZWJQYWdlLm1haW5GcmFtZVZpZXcoKTsKKyAgICByZXR1cm4gZnJhbWVWaWV3ID8g
ZnJhbWVWaWV3LT50aWxlZEJhY2tpbmcoKSA6IG51bGxwdHI7Cit9CisKK3ZvaWQgUmVtb3RlTGF5
ZXJUcmVlRHJhd2luZ0FyZWE6OnNjaGVkdWxlQ29tcG9zaXRpbmdMYXllckZsdXNoSW1tZWRpYXRl
bHkoKQoreworICAgIG1fbGF5ZXJGbHVzaFRpbWVyLnN0YXJ0T25lU2hvdCgwX3MpOworfQorCit2
b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJG
bHVzaCgpCit7CisgICAgaWYgKG1faXNGbHVzaGluZ1N1c3BlbmRlZCkgeworICAgICAgICBtX2lz
TGF5ZXJGbHVzaFRocm90dGxpbmdUZW1wb3JhcmlseURpc2FibGVkRm9ySW50ZXJhY3Rpb24gPSBm
YWxzZTsKKyAgICAgICAgbV9oYXNEZWZlcnJlZEZsdXNoID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKyAgICBpZiAobV9pc0xheWVyRmx1c2hUaHJvdHRsaW5nVGVtcG9yYXJpbHlEaXNh
YmxlZEZvckludGVyYWN0aW9uKSB7CisgICAgICAgIG1faXNMYXllckZsdXNoVGhyb3R0bGluZ1Rl
bXBvcmFyaWx5RGlzYWJsZWRGb3JJbnRlcmFjdGlvbiA9IGZhbHNlOworICAgICAgICBzY2hlZHVs
ZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaEltbWVkaWF0ZWx5KCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBpZiAobV9sYXllckZsdXNoVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgY29uc3QgU2Vjb25kcyBpbml0aWFsRmx1c2hEZWxheSA9IDUwMF9tczsKKyAg
ICBjb25zdCBTZWNvbmRzIGZsdXNoRGVsYXkgPSAxNTAwX21zOworICAgIFNlY29uZHMgdGhyb3R0
bGVEZWxheSA9IG1faXNUaHJvdHRsaW5nTGF5ZXJGbHVzaGVzID8gKG1faXNJbml0aWFsVGhyb3R0
bGVkTGF5ZXJGbHVzaCA/IGluaXRpYWxGbHVzaERlbGF5IDogZmx1c2hEZWxheSkgOiAwX3M7Cisg
ICAgbV9pc0luaXRpYWxUaHJvdHRsZWRMYXllckZsdXNoID0gZmFsc2U7CisKKyAgICBtX2xheWVy
Rmx1c2hUaW1lci5zdGFydE9uZVNob3QodGhyb3R0bGVEZWxheSk7Cit9CisKK2Jvb2wgUmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmFkanVzdExheWVyRmx1c2hUaHJvdHRsaW5nKFdlYkNvcmU6
OkxheWVyRmx1c2hUaHJvdHRsZVN0YXRlOjpGbGFncyBmbGFncykKK3sKKyAgICBpZiAoZmxhZ3Mg
JiBXZWJDb3JlOjpMYXllckZsdXNoVGhyb3R0bGVTdGF0ZTo6VXNlcklzSW50ZXJhY3RpbmcpCisg
ICAgICAgIG1faXNMYXllckZsdXNoVGhyb3R0bGluZ1RlbXBvcmFyaWx5RGlzYWJsZWRGb3JJbnRl
cmFjdGlvbiA9IHRydWU7CisKKyAgICBib29sIHdhc1Rocm90dGxpbmdMYXllckZsdXNoZXMgPSBt
X2lzVGhyb3R0bGluZ0xheWVyRmx1c2hlczsKKyAgICBtX2lzVGhyb3R0bGluZ0xheWVyRmx1c2hl
cyA9IGZsYWdzICYgV2ViQ29yZTo6TGF5ZXJGbHVzaFRocm90dGxlU3RhdGU6OkVuYWJsZWQ7CisK
KyAgICBpZiAoIXdhc1Rocm90dGxpbmdMYXllckZsdXNoZXMgJiYgbV9pc1Rocm90dGxpbmdMYXll
ckZsdXNoZXMpCisgICAgICAgIG1faXNJbml0aWFsVGhyb3R0bGVkTGF5ZXJGbHVzaCA9IHRydWU7
CisKKyAgICAvLyBSZS1zY2hlZHVsZSB0aGUgZmx1c2ggaWYgd2Ugc3RvcHBlZCB0aHJvdHRsaW5n
LgorICAgIGlmICh3YXNUaHJvdHRsaW5nTGF5ZXJGbHVzaGVzICYmICFtX2lzVGhyb3R0bGluZ0xh
eWVyRmx1c2hlcyAmJiBtX2xheWVyRmx1c2hUaW1lci5pc0FjdGl2ZSgpKSB7CisgICAgICAgIG1f
bGF5ZXJGbHVzaFRpbWVyLnN0b3AoKTsKKyAgICAgICAgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVy
Rmx1c2goKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJU
cmVlRHJhd2luZ0FyZWE6OmZsdXNoTGF5ZXJzKCkKK3sKKyAgICBpZiAoIW1fcm9vdExheWVyKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9pc0ZsdXNoaW5nU3VzcGVuZGVkKSB7CisgICAg
ICAgIG1faGFzRGVmZXJyZWRGbHVzaCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBpZiAobV93YWl0aW5nRm9yQmFja2luZ1N0b3JlU3dhcCkgeworICAgICAgICBtX2hhZEZs
dXNoRGVmZXJyZWRXaGlsZVdhaXRpbmdGb3JCYWNraW5nU3RvcmVTd2FwID0gdHJ1ZTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIFJFTEVBU0VfQVNTRVJUKCFtX3BlbmRpbmdCYWNraW5n
U3RvcmVGbHVzaGVyIHx8IG1fcGVuZGluZ0JhY2tpbmdTdG9yZUZsdXNoZXItPmhhc0ZsdXNoZWQo
KSk7CisKKyAgICBSZW1vdGVMYXllckJhY2tpbmdTdG9yZUNvbGxlY3Rpb24mIGJhY2tpbmdTdG9y
ZUNvbGxlY3Rpb24gPSBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQtPmJhY2tpbmdTdG9yZUNvbGxl
Y3Rpb24oKTsKKyAgICBiYWNraW5nU3RvcmVDb2xsZWN0aW9uLndpbGxGbHVzaExheWVycygpOwor
CisgICAgbV93ZWJQYWdlLmxheW91dElmTmVlZGVkKCk7CisKKyAgICBGbG9hdFJlY3QgdmlzaWJs
ZVJlY3QoRmxvYXRQb2ludCgpLCBtX3ZpZXdTaXplKTsKKyAgICBpZiAobV9zY3JvbGxlZFZpZXdF
eHBvc2VkUmVjdCkKKyAgICAgICAgdmlzaWJsZVJlY3QuaW50ZXJzZWN0KG1fc2Nyb2xsZWRWaWV3
RXhwb3NlZFJlY3QudmFsdWUoKSk7CisKKyAgICBSZWZQdHI8V2ViUGFnZT4gcmV0YWluZWRQYWdl
ID0gJm1fd2ViUGFnZTsKKyAgICBbQ0FUcmFuc2FjdGlvbiBhZGRDb21taXRIYW5kbGVyOltyZXRh
aW5lZFBhZ2VdIHsKKyAgICAgICAgaWYgKFBhZ2UqIGNvcmVQYWdlID0gcmV0YWluZWRQYWdlLT5j
b3JlUGFnZSgpKSB7CisgICAgICAgICAgICBpZiAoRnJhbWUqIGNvcmVGcmFtZSA9IHJldGFpbmVk
UGFnZS0+bWFpbkZyYW1lKCkpCisgICAgICAgICAgICAgICAgY29yZVBhZ2UtPmluc3BlY3RvckNv
bnRyb2xsZXIoKS5kaWRDb21wb3NpdGUoKmNvcmVGcmFtZSk7CisgICAgICAgIH0KKyAgICB9IGZv
clBoYXNlOmtDQVRyYW5zYWN0aW9uUGhhc2VQb3N0Q29tbWl0XTsKKworICAgIG1fd2ViUGFnZS5t
YWluRnJhbWVWaWV3KCktPmZsdXNoQ29tcG9zaXRpbmdTdGF0ZUluY2x1ZGluZ1N1YmZyYW1lcygp
OworCisgICAgLy8gQmVjYXVzZSBvdXIgdmlldy1yZWxhdGl2ZSBvdmVybGF5IHJvb3QgbGF5ZXIg
aXMgbm90IGF0dGFjaGVkIHRvIHRoZSBGcmFtZVZpZXcncyBHcmFwaGljc0xheWVyIHRyZWUsIHdl
IG5lZWQgdG8gZmx1c2ggaXQgbWFudWFsbHkuCisgICAgaWYgKG1fdmlld092ZXJsYXlSb290TGF5
ZXIpCisgICAgICAgIG1fdmlld092ZXJsYXlSb290TGF5ZXItPmZsdXNoQ29tcG9zaXRpbmdTdGF0
ZSh2aXNpYmxlUmVjdCk7CisKKyAgICBtX3Jvb3RMYXllci0+Zmx1c2hDb21wb3NpdGluZ1N0YXRl
Rm9yVGhpc0xheWVyT25seSgpOworCisgICAgLy8gRklYTUU6IE1pbmltaXplIHRoZXNlIHRyYW5z
YWN0aW9ucyBpZiBub3RoaW5nIGNoYW5nZWQuCisgICAgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rp
b24gbGF5ZXJUcmFuc2FjdGlvbjsKKyAgICBsYXllclRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9u
SUQodGFrZU5leHRUcmFuc2FjdGlvbklEKCkpOworICAgIGxheWVyVHJhbnNhY3Rpb24uc2V0Q2Fs
bGJhY2tJRHMoV1RGTW92ZShtX3BlbmRpbmdDYWxsYmFja0lEcykpOworICAgIG1fcmVtb3RlTGF5
ZXJUcmVlQ29udGV4dC0+c2V0TmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludChtX25leHRGbHVz
aElzRm9ySW1tZWRpYXRlUGFpbnQpOworICAgIG1fcmVtb3RlTGF5ZXJUcmVlQ29udGV4dC0+YnVp
bGRUcmFuc2FjdGlvbihsYXllclRyYW5zYWN0aW9uLCAqZG93bmNhc3Q8R3JhcGhpY3NMYXllckNB
UmVtb3RlPigqbV9yb290TGF5ZXIpLnBsYXRmb3JtQ0FMYXllcigpKTsKKyAgICBtX3JlbW90ZUxh
eWVyVHJlZUNvbnRleHQtPnNldE5leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQoZmFsc2UpOwor
ICAgIGJhY2tpbmdTdG9yZUNvbGxlY3Rpb24ud2lsbENvbW1pdExheWVyVHJlZShsYXllclRyYW5z
YWN0aW9uKTsKKyAgICBtX3dlYlBhZ2Uud2lsbENvbW1pdExheWVyVHJlZShsYXllclRyYW5zYWN0
aW9uKTsKKworICAgIGxheWVyVHJhbnNhY3Rpb24uc2V0TmV3bHlSZWFjaGVkTGF5b3V0TWlsZXN0
b25lcyhtX3BlbmRpbmdOZXdseVJlYWNoZWRMYXlvdXRNaWxlc3RvbmVzKTsKKyAgICBtX3BlbmRp
bmdOZXdseVJlYWNoZWRMYXlvdXRNaWxlc3RvbmVzID0gMDsKKworICAgIFJlbW90ZVNjcm9sbGlu
Z0Nvb3JkaW5hdG9yVHJhbnNhY3Rpb24gc2Nyb2xsaW5nVHJhbnNhY3Rpb247CisjaWYgRU5BQkxF
KEFTWU5DX1NDUk9MTElORykKKyAgICBpZiAobV93ZWJQYWdlLnNjcm9sbGluZ0Nvb3JkaW5hdG9y
KCkpCisgICAgICAgIGRvd25jYXN0PFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yPigqbV93ZWJQ
YWdlLnNjcm9sbGluZ0Nvb3JkaW5hdG9yKCkpLmJ1aWxkVHJhbnNhY3Rpb24oc2Nyb2xsaW5nVHJh
bnNhY3Rpb24pOworI2VuZGlmCisKKyAgICBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQg
PSBmYWxzZTsKKyAgICBtX3dhaXRpbmdGb3JCYWNraW5nU3RvcmVTd2FwID0gdHJ1ZTsKKworICAg
IG1fd2ViUGFnZS5zZW5kKE1lc3NhZ2VzOjpSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYVByb3h5
OjpXaWxsQ29tbWl0TGF5ZXJUcmVlKGxheWVyVHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JRCgpKSk7
CisKKyAgICBNZXNzYWdlczo6UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWFQcm94eTo6Q29tbWl0
TGF5ZXJUcmVlIG1lc3NhZ2UobGF5ZXJUcmFuc2FjdGlvbiwgc2Nyb2xsaW5nVHJhbnNhY3Rpb24p
OworICAgIGF1dG8gY29tbWl0RW5jb2RlciA9IHN0ZDo6bWFrZV91bmlxdWU8SVBDOjpFbmNvZGVy
PihNZXNzYWdlczo6UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWFQcm94eTo6Q29tbWl0TGF5ZXJU
cmVlOjpyZWNlaXZlck5hbWUoKSwgTWVzc2FnZXM6OlJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVh
UHJveHk6OkNvbW1pdExheWVyVHJlZTo6bmFtZSgpLCBtX3dlYlBhZ2UucGFnZUlEKCkpOworICAg
IGNvbW1pdEVuY29kZXItPmVuY29kZShtZXNzYWdlLmFyZ3VtZW50cygpKTsKKworICAgIC8vIEZJ
WE1FOiBNb3ZlIGFsbCBiYWNraW5nIHN0b3JlIGZsdXNoaW5nIG1hbmFnZW1lbnQgdG8gUmVtb3Rl
TGF5ZXJCYWNraW5nU3RvcmVDb2xsZWN0aW9uLgorICAgIGJvb2wgaGFkQW55Q2hhbmdlZEJhY2tp
bmdTdG9yZSA9IGZhbHNlOworICAgIFZlY3RvcjxSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPj4gY29u
dGV4dHNUb0ZsdXNoOworICAgIGZvciAoYXV0byYgbGF5ZXIgOiBsYXllclRyYW5zYWN0aW9uLmNo
YW5nZWRMYXllcnMoKSkgeworICAgICAgICBpZiAobGF5ZXItPnByb3BlcnRpZXMoKS5jaGFuZ2Vk
UHJvcGVydGllcyAmIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpMYXllckNoYW5nZXM6OkJh
Y2tpbmdTdG9yZUNoYW5nZWQpIHsKKyAgICAgICAgICAgIGhhZEFueUNoYW5nZWRCYWNraW5nU3Rv
cmUgPSB0cnVlOworICAgICAgICAgICAgaWYgKGxheWVyLT5wcm9wZXJ0aWVzKCkuYmFja2luZ1N0
b3JlKSB7CisgICAgICAgICAgICAgICAgaWYgKGF1dG8gY29udGV4dFBlbmRpbmdGbHVzaCA9IGxh
eWVyLT5wcm9wZXJ0aWVzKCkuYmFja2luZ1N0b3JlLT50YWtlRnJvbnRDb250ZXh0UGVuZGluZ0Zs
dXNoKCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHRzVG9GbHVzaC5hcHBlbmQoY29udGV4
dFBlbmRpbmdGbHVzaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsYXll
ci0+ZGlkQ29tbWl0KCk7CisgICAgfQorCisgICAgYmFja2luZ1N0b3JlQ29sbGVjdGlvbi5kaWRG
bHVzaExheWVycygpOworCisgICAgaWYgKGhhZEFueUNoYW5nZWRCYWNraW5nU3RvcmUpCisgICAg
ICAgIGJhY2tpbmdTdG9yZUNvbGxlY3Rpb24uc2NoZWR1bGVWb2xhdGlsaXR5VGltZXIoKTsKKwor
ICAgIFJlZlB0cjxCYWNraW5nU3RvcmVGbHVzaGVyPiBiYWNraW5nU3RvcmVGbHVzaGVyID0gQmFj
a2luZ1N0b3JlRmx1c2hlcjo6Y3JlYXRlKFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFBy
b2Nlc3NDb25uZWN0aW9uKCksIFdURk1vdmUoY29tbWl0RW5jb2RlciksIFdURk1vdmUoY29udGV4
dHNUb0ZsdXNoKSk7CisgICAgbV9wZW5kaW5nQmFja2luZ1N0b3JlRmx1c2hlciA9IGJhY2tpbmdT
dG9yZUZsdXNoZXI7CisKKyAgICB1aW50NjRfdCBwYWdlSUQgPSBtX3dlYlBhZ2UucGFnZUlEKCk7
CisgICAgZGlzcGF0Y2hfYXN5bmMobV9jb21taXRRdWV1ZSwgW2JhY2tpbmdTdG9yZUZsdXNoZXIs
IHBhZ2VJRF0geworICAgICAgICBiYWNraW5nU3RvcmVGbHVzaGVyLT5mbHVzaCgpOworCisgICAg
ICAgIE1vbm90b25pY1RpbWUgdGltZXN0YW1wID0gTW9ub3RvbmljVGltZTo6bm93KCk7CisgICAg
ICAgIGRpc3BhdGNoX2FzeW5jKGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIFtwYWdlSUQsIHRp
bWVzdGFtcF0geworICAgICAgICAgICAgaWYgKFdlYlBhZ2UqIHdlYlBhZ2UgPSBXZWJQcm9jZXNz
OjpzaW5nbGV0b24oKS53ZWJQYWdlKHBhZ2VJRCkpCisgICAgICAgICAgICAgICAgd2ViUGFnZS0+
ZGlkRmx1c2hMYXllclRyZWVBdFRpbWUodGltZXN0YW1wKTsKKyAgICAgICAgfSk7CisgICAgfSk7
Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmRpZFVwZGF0ZSgpCit7Cisg
ICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHVzZSBhIGNvdW50ZWQgcmVwbGFjZW1lbnQgZm9yIHNl
dExheWVyVHJlZVN0YXRlSXNGcm96ZW4sIGJ1dAorICAgIC8vIHRoZSBjYWxsZXJzIG9mIHRoYXQg
ZnVuY3Rpb24gYXJlIG5vdCBzdHJpY3RseSBwYWlyZWQuCisKKyAgICBtX3dhaXRpbmdGb3JCYWNr
aW5nU3RvcmVTd2FwID0gZmFsc2U7CisKKyAgICBpZiAobV9oYWRGbHVzaERlZmVycmVkV2hpbGVX
YWl0aW5nRm9yQmFja2luZ1N0b3JlU3dhcCkgeworICAgICAgICBzY2hlZHVsZUNvbXBvc2l0aW5n
TGF5ZXJGbHVzaCgpOworICAgICAgICBtX2hhZEZsdXNoRGVmZXJyZWRXaGlsZVdhaXRpbmdGb3JC
YWNraW5nU3RvcmVTd2FwID0gZmFsc2U7CisgICAgfQorCisgICAgLy8gVGhpcyBlbXB0eSB0cmFu
c2FjdGlvbiBzZXJ2ZXMgdG8gdHJpZ2dlciBDQSdzIGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBJT1N1
cmZhY2VzLiBTZWUgPHJkYXI6Ly9wcm9ibGVtLzE2MTEwNjg3PgorICAgIFtDQVRyYW5zYWN0aW9u
IGJlZ2luXTsKKyAgICBbQ0FUcmFuc2FjdGlvbiBjb21taXRdOworCisgICAgSGFzaFNldDxSZW1v
dGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IqPiBtb25pdG9yc1RvTm90aWZ5ID0gbV9k
aXNwbGF5UmVmcmVzaE1vbml0b3JzOworICAgIEFTU0VSVCghbV9kaXNwbGF5UmVmcmVzaE1vbml0
b3JzVG9Ob3RpZnkpOworICAgIG1fZGlzcGxheVJlZnJlc2hNb25pdG9yc1RvTm90aWZ5ID0gJm1v
bml0b3JzVG9Ob3RpZnk7CisgICAgd2hpbGUgKCFtb25pdG9yc1RvTm90aWZ5LmlzRW1wdHkoKSkK
KyAgICAgICAgbW9uaXRvcnNUb05vdGlmeS50YWtlQW55KCktPmRpZFVwZGF0ZUxheWVycygpOwor
ICAgIG1fZGlzcGxheVJlZnJlc2hNb25pdG9yc1RvTm90aWZ5ID0gbnVsbHB0cjsKK30KKwordm9p
ZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6bWFpbkZyYW1lQ29udGVudFNpemVDaGFuZ2Vk
KGNvbnN0IEludFNpemUmIGNvbnRlbnRzU2l6ZSkKK3sKKyAgICBtX3Jvb3RMYXllci0+c2V0U2l6
ZShjb250ZW50c1NpemUpOworfQorCitib29sIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpt
YXJrTGF5ZXJzVm9sYXRpbGVJbW1lZGlhdGVseUlmUG9zc2libGUoKQoreworICAgIHJldHVybiBt
X3JlbW90ZUxheWVyVHJlZUNvbnRleHQtPmJhY2tpbmdTdG9yZUNvbGxlY3Rpb24oKS5tYXJrQWxs
QmFja2luZ1N0b3JlVm9sYXRpbGVJbW1lZGlhdGVseUlmUG9zc2libGUoKTsKK30KKworUmVmPFJl
bW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpCYWNraW5nU3RvcmVGbHVzaGVyPiBSZW1vdGVMYXll
clRyZWVEcmF3aW5nQXJlYTo6QmFja2luZ1N0b3JlRmx1c2hlcjo6Y3JlYXRlKElQQzo6Q29ubmVj
dGlvbiogY29ubmVjdGlvbiwgc3RkOjp1bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4gZW5jb2Rlciwg
VmVjdG9yPFJldGFpblB0cjxDR0NvbnRleHRSZWY+PiBjb250ZXh0c1RvRmx1c2gpCit7CisgICAg
cmV0dXJuIGFkb3B0UmVmKCpuZXcgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OkJhY2tpbmdT
dG9yZUZsdXNoZXIoY29ubmVjdGlvbiwgV1RGTW92ZShlbmNvZGVyKSwgV1RGTW92ZShjb250ZXh0
c1RvRmx1c2gpKSk7Cit9CisKK1JlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpCYWNraW5nU3Rv
cmVGbHVzaGVyOjpCYWNraW5nU3RvcmVGbHVzaGVyKElQQzo6Q29ubmVjdGlvbiogY29ubmVjdGlv
biwgc3RkOjp1bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4gZW5jb2RlciwgVmVjdG9yPFJldGFpblB0
cjxDR0NvbnRleHRSZWY+PiBjb250ZXh0c1RvRmx1c2gpCisgICAgOiBtX2Nvbm5lY3Rpb24oY29u
bmVjdGlvbikKKyAgICAsIG1fY29tbWl0RW5jb2RlcihXVEZNb3ZlKGVuY29kZXIpKQorICAgICwg
bV9jb250ZXh0c1RvRmx1c2goV1RGTW92ZShjb250ZXh0c1RvRmx1c2gpKQorICAgICwgbV9oYXNG
bHVzaGVkKGZhbHNlKQoreworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpC
YWNraW5nU3RvcmVGbHVzaGVyOjpmbHVzaCgpCit7CisgICAgQVNTRVJUKCFtX2hhc0ZsdXNoZWQp
OworCisgICAgVHJhY2VTY29wZSB0cmFjaW5nU2NvcGUoQmFja2luZ1N0b3JlRmx1c2hTdGFydCwg
QmFja2luZ1N0b3JlRmx1c2hFbmQpOworICAgIAorICAgIGZvciAoYXV0byYgY29udGV4dCA6IG1f
Y29udGV4dHNUb0ZsdXNoKQorICAgICAgICBDR0NvbnRleHRGbHVzaChjb250ZXh0LmdldCgpKTsK
KyAgICBtX2hhc0ZsdXNoZWQgPSB0cnVlOworCisgICAgbV9jb25uZWN0aW9uLT5zZW5kTWVzc2Fn
ZShXVEZNb3ZlKG1fY29tbWl0RW5jb2RlciksIHsgfSk7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJU
cmVlRHJhd2luZ0FyZWE6OmFjdGl2aXR5U3RhdGVEaWRDaGFuZ2UoQWN0aXZpdHlTdGF0ZTo6Rmxh
Z3MsIGJvb2wgd2FudHNEaWRVcGRhdGVBY3Rpdml0eVN0YXRlLCBjb25zdCBWZWN0b3I8Q2FsbGJh
Y2tJRD4mKQoreworICAgIC8vIEZJWE1FOiBTaG91bGQgd2Ugc3VzcGVuZCBwYWludGluZyB3aGls
ZSBub3QgdmlzaWJsZSwgbGlrZSBUaWxlZENvcmVBbmltYXRpb25EcmF3aW5nQXJlYT8gUHJvYmFi
bHkuCisKKyAgICBpZiAod2FudHNEaWRVcGRhdGVBY3Rpdml0eVN0YXRlKSB7CisgICAgICAgIG1f
bmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludCA9IHRydWU7CisgICAgICAgIHNjaGVkdWxlQ29t
cG9zaXRpbmdMYXllckZsdXNoSW1tZWRpYXRlbHkoKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmFkZFRyYW5zYWN0aW9uQ2FsbGJhY2tJRChDYWxsYmFja0lE
IGNhbGxiYWNrSUQpCit7CisgICAgLy8gQXNzdW1lIHRoYXQgaWYgc29tZW9uZSBpcyBsaXN0ZW5p
bmcgZm9yIHRoaXMgdHJhbnNhY3Rpb24ncyBjb21wbGV0aW9uLCB0aGF0IHRoZXkgd2FudCBpdCB0
bworICAgIC8vIGJlIGEgImNvbXBsZXRlIiBwYWludCAoaW5jbHVkaW5nIGltYWdlcyB0aGF0IHdv
dWxkIG5vcm1hbGx5IGJlIGFzeW5jaHJvbm91c2x5IGRlY29kaW5nKS4KKyAgICBtX25leHRGbHVz
aElzRm9ySW1tZWRpYXRlUGFpbnQgPSB0cnVlOworCisgICAgbV9wZW5kaW5nQ2FsbGJhY2tJRHMu
YXBwZW5kKHN0YXRpY19jYXN0PFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpUcmFuc2FjdGlv
bkNhbGxiYWNrSUQ+KGNhbGxiYWNrSUQpKTsKKyAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJG
bHVzaCgpOworfQorCitib29sIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpkaXNwYXRjaERp
ZFJlYWNoTGF5b3V0TWlsZXN0b25lKFdlYkNvcmU6OkxheW91dE1pbGVzdG9uZXMgbGF5b3V0TWls
ZXN0b25lcykKK3sKKyAgICBtX3BlbmRpbmdOZXdseVJlYWNoZWRMYXlvdXRNaWxlc3RvbmVzIHw9
IGxheW91dE1pbGVzdG9uZXM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gbmFtZXNwYWNl
IFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVt
b3RlTGF5ZXJUcmVlL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmggYi9Tb3VyY2UvV2ViS2l0
L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUmVtb3RlU2Nyb2xsaW5nQ29vcmRp
bmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5jZjVkY2VkM2I0Yzc0MmJiMDkzNmNmM2U4ZTNiZWM0M2QyZDIw
MTcxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2Uv
UmVtb3RlTGF5ZXJUcmVlL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmgKQEAgLTAsMCArMSw4
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4K
KyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRv
cl9oCisjZGVmaW5lIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yX2gKKworI2lmIEVOQUJMRShB
U1lOQ19TQ1JPTExJTkcpCisKKyNpbmNsdWRlICJNZXNzYWdlUmVjZWl2ZXIuaCIKKyNpbmNsdWRl
IDxXZWJDb3JlL0FzeW5jU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaD4KKyNpbmNsdWRlIDxXZWJDb3Jl
L1Njcm9sbFR5cGVzLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TY3JvbGxpbmdDb25zdHJhaW50cy5o
PgorI2luY2x1ZGUgPFdlYkNvcmUvVGltZXIuaD4KKworbmFtZXNwYWNlIElQQyB7CitjbGFzcyBE
ZWNvZGVyOworY2xhc3MgRW5jb2RlcjsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNz
IFdlYlBhZ2U7CitjbGFzcyBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvclRyYW5zYWN0aW9uOwor
CitjbGFzcyBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvciA6IHB1YmxpYyBXZWJDb3JlOjpBc3lu
Y1Njcm9sbGluZ0Nvb3JkaW5hdG9yLCBwdWJsaWMgSVBDOjpNZXNzYWdlUmVjZWl2ZXIgeworcHVi
bGljOgorICAgIHN0YXRpYyBSZWY8UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I+IGNyZWF0ZShX
ZWJQYWdlKiBwYWdlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgUmVtb3Rl
U2Nyb2xsaW5nQ29vcmRpbmF0b3IocGFnZSkpOworICAgIH0KKworICAgIHZvaWQgYnVpbGRUcmFu
c2FjdGlvbihSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvclRyYW5zYWN0aW9uJik7CisKK3ByaXZh
dGU6CisgICAgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IoV2ViUGFnZSopOworICAgIHZpcnR1
YWwgflJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yKCk7CisKKyAgICBib29sIGlzUmVtb3RlU2Ny
b2xsaW5nQ29vcmRpbmF0b3IoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgICAg
CisgICAgLy8gU2Nyb2xsaW5nQ29vcmRpbmF0b3IKKyAgICBib29sIGNvb3JkaW5hdGVzU2Nyb2xs
aW5nRm9yRnJhbWVWaWV3KGNvbnN0IFdlYkNvcmU6OkZyYW1lVmlldyYpIGNvbnN0IG92ZXJyaWRl
OworICAgIHZvaWQgc2NoZWR1bGVUcmVlU3RhdGVDb21taXQoKSBvdmVycmlkZTsKKworICAgIGJv
b2wgaXNSdWJiZXJCYW5kSW5Qcm9ncmVzcygpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0
U2Nyb2xsUGlubmluZ0JlaGF2aW9yKFdlYkNvcmU6OlNjcm9sbFBpbm5pbmdCZWhhdmlvcikgb3Zl
cnJpZGU7CisgICAgYm9vbCBpc1Njcm9sbFNuYXBJblByb2dyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7
CisKKyAgICAvLyBJUEM6Ok1lc3NhZ2VSZWNlaXZlcgorICAgIHZvaWQgZGlkUmVjZWl2ZU1lc3Nh
Z2UoSVBDOjpDb25uZWN0aW9uJiwgSVBDOjpEZWNvZGVyJikgb3ZlcnJpZGU7CisgICAgCisgICAg
Ly8gUmVzcG9uZCB0byBVSSBwcm9jZXNzIGNoYW5nZXMuCisgICAgdm9pZCBzY3JvbGxQb3NpdGlv
bkNoYW5nZWRGb3JOb2RlKFdlYkNvcmU6OlNjcm9sbGluZ05vZGVJRCwgY29uc3QgV2ViQ29yZTo6
RmxvYXRQb2ludCYgc2Nyb2xsUG9zaXRpb24sIGJvb2wgc3luY0xheWVyUG9zaXRpb24pOworICAg
IHZvaWQgY3VycmVudFNuYXBQb2ludEluZGljZXNDaGFuZ2VkRm9yTm9kZShXZWJDb3JlOjpTY3Jv
bGxpbmdOb2RlSUQsIHVuc2lnbmVkIGhvcml6b250YWwsIHVuc2lnbmVkIHZlcnRpY2FsKTsKKwor
ICAgIFdlYlBhZ2UqIG1fd2ViUGFnZTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCitT
UEVDSUFMSVpFX1RZUEVfVFJBSVRTX1NDUk9MTElOR19DT09SRElOQVRPUihXZWJLaXQ6OlJlbW90
ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLCBpc1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yKCkpOwor
CisjZW5kaWYgLy8gRU5BQkxFKEFTWU5DX1NDUk9MTElORykKKworI2VuZGlmIC8vIFJlbW90ZVNj
cm9sbGluZ0Nvb3JkaW5hdG9yX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNz
YWdlcy5pbiBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJl
ZS9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdlcy5pbgpuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yYzA5
OGExMDk3MDIzNjdjMzgzMzcxZTg4ZTVhNzYxZDQ1ZTE5OWFkCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZVNj
cm9sbGluZ0Nvb3JkaW5hdG9yLm1lc3NhZ2VzLmluCkBAIC0wLDAgKzEsMzAgQEAKKyMgQ29weXJp
Z2h0IChDKSAyMDE0LTIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorIyAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisj
CisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyMgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUgorIyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorIyBP
UiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWYgRU5BQkxFKEFTWU5DX1ND
Uk9MTElORykKKworbWVzc2FnZXMgLT4gUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IgeworICAg
IFNjcm9sbFBvc2l0aW9uQ2hhbmdlZEZvck5vZGUodWludDY0X3Qgbm9kZUlELCBXZWJDb3JlOjpG
bG9hdFBvaW50IHNjcm9sbFBvc2l0aW9uLCBib29sIHN5bmNMYXllclBvc2l0aW9uKTsKKyAgICBD
dXJyZW50U25hcFBvaW50SW5kaWNlc0NoYW5nZWRGb3JOb2RlKHVpbnQ2NF90IG5vZGVJRCwgdW5z
aWduZWQgaG9yaXpvbnRhbCwgdW5zaWduZWQgdmVydGljYWwpOworfQorCisjZW5kaWYgLy8gRU5B
QkxFKEFTWU5DX1NDUk9MTElORykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tbSBi
L1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVT
Y3JvbGxpbmdDb29yZGluYXRvci5tbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44ODY0MTUyNWU1MmI5NzlkZTQwM2E2
ZTZhNzEwMmNkM2EyNWQzMjUyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9y
Lm1tCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
CisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisg
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW1wb3J0ICJjb25maWcu
aCIKKyNpbXBvcnQgIlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmgiCisKKyNpZiBFTkFCTEUo
QVNZTkNfU0NST0xMSU5HKQorCisjaW1wb3J0ICJBcmd1bWVudENvZGVycy5oIgorI2ltcG9ydCAi
R3JhcGhpY3NMYXllckNBUmVtb3RlLmgiCisjaW1wb3J0ICJSZW1vdGVMYXllclRyZWVEcmF3aW5n
QXJlYS5oIgorI2ltcG9ydCAiUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JNZXNzYWdlcy5oIgor
I2ltcG9ydCAiUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JUcmFuc2FjdGlvbi5oIgorI2ltcG9y
dCAiV2ViQ29yZUFyZ3VtZW50Q29kZXJzLmgiCisjaW1wb3J0ICJXZWJQYWdlLmgiCisjaW1wb3J0
ICJXZWJQcm9jZXNzLmgiCisjaW1wb3J0IDxXZWJDb3JlL0dyYXBoaWNzTGF5ZXIuaD4KKyNpbXBv
cnQgPFdlYkNvcmUvRnJhbWVWaWV3Lmg+CisjaW1wb3J0IDxXZWJDb3JlL0ZyYW1lLmg+CisjaW1w
b3J0IDxXZWJDb3JlL1JlbmRlckxheWVyQ29tcG9zaXRvci5oPgorI2ltcG9ydCA8V2ViQ29yZS9S
ZW5kZXJWaWV3Lmg+CisjaW1wb3J0IDxXZWJDb3JlL1Njcm9sbGluZ1RyZWVGaXhlZE5vZGUuaD4K
KyNpbXBvcnQgPFdlYkNvcmUvU2Nyb2xsaW5nVHJlZVN0aWNreU5vZGUuaD4KKwordXNpbmcgbmFt
ZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitSZW1vdGVTY3JvbGxpbmdD
b29yZGluYXRvcjo6UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IoV2ViUGFnZSogcGFnZSkKKyAg
ICA6IEFzeW5jU2Nyb2xsaW5nQ29vcmRpbmF0b3IocGFnZS0+Y29yZVBhZ2UoKSkKKyAgICAsIG1f
d2ViUGFnZShwYWdlKQoreworICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLmFkZE1lc3NhZ2VS
ZWNlaXZlcihNZXNzYWdlczo6UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I6Om1lc3NhZ2VSZWNl
aXZlck5hbWUoKSwgbV93ZWJQYWdlLT5wYWdlSUQoKSwgKnRoaXMpOworfQorCitSZW1vdGVTY3Jv
bGxpbmdDb29yZGluYXRvcjo6flJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yKCkKK3sKKyAgICBX
ZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5yZW1vdmVNZXNzYWdlUmVjZWl2ZXIoTWVzc2FnZXM6OlJl
bW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yOjptZXNzYWdlUmVjZWl2ZXJOYW1lKCksIG1fd2ViUGFn
ZS0+cGFnZUlEKCkpOworfQorCit2b2lkIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yOjpzY2hl
ZHVsZVRyZWVTdGF0ZUNvbW1pdCgpCit7CisgICAgbV93ZWJQYWdlLT5kcmF3aW5nQXJlYSgpLT5z
Y2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOworfQorCitib29sIFJlbW90ZVNjcm9sbGlu
Z0Nvb3JkaW5hdG9yOjpjb29yZGluYXRlc1Njcm9sbGluZ0ZvckZyYW1lVmlldyhjb25zdCBGcmFt
ZVZpZXcmIGZyYW1lVmlldykgY29uc3QKK3sKKyAgICBSZW5kZXJWaWV3KiByZW5kZXJWaWV3ID0g
ZnJhbWVWaWV3LnJlbmRlclZpZXcoKTsKKyAgICByZXR1cm4gcmVuZGVyVmlldyAmJiByZW5kZXJW
aWV3LT51c2VzQ29tcG9zaXRpbmcoKTsKK30KKworYm9vbCBSZW1vdGVTY3JvbGxpbmdDb29yZGlu
YXRvcjo6aXNSdWJiZXJCYW5kSW5Qcm9ncmVzcygpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IG5l
ZWQgdG8gbWFpbnRhaW4gc3RhdGUgaW4gdGhlIHdlYiBwcm9jZXNzPworICAgIHJldHVybiBmYWxz
ZTsKK30KKworYm9vbCBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcjo6aXNTY3JvbGxTbmFwSW5Q
cm9ncmVzcygpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IG5lZWQgdG8gbWFpbnRhaW4gc3RhdGUg
aW4gdGhlIHdlYiBwcm9jZXNzPworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW1vdGVT
Y3JvbGxpbmdDb29yZGluYXRvcjo6c2V0U2Nyb2xsUGlubmluZ0JlaGF2aW9yKFNjcm9sbFBpbm5p
bmdCZWhhdmlvcikKK3sKKyAgICAvLyBGSVhNRTogc2VuZCB0byB0aGUgVUkgcHJvY2Vzcy4KK30K
Kwordm9pZCBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcjo6YnVpbGRUcmFuc2FjdGlvbihSZW1v
dGVTY3JvbGxpbmdDb29yZGluYXRvclRyYW5zYWN0aW9uJiB0cmFuc2FjdGlvbikKK3sKKyAgICB3
aWxsQ29tbWl0VHJlZSgpOworICAgIHRyYW5zYWN0aW9uLnNldFN0YXRlVHJlZVRvRW5jb2RlKHNj
cm9sbGluZ1N0YXRlVHJlZSgpLT5jb21taXQoTGF5ZXJSZXByZXNlbnRhdGlvbjo6UGxhdGZvcm1M
YXllcklEUmVwcmVzZW50YXRpb24pKTsKK30KKworLy8gTm90aWZpY2F0aW9uIGZyb20gdGhlIFVJ
IHByb2Nlc3MgdGhhdCB3ZSBzY3JvbGxlZC4KK3ZvaWQgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0
b3I6OnNjcm9sbFBvc2l0aW9uQ2hhbmdlZEZvck5vZGUoU2Nyb2xsaW5nTm9kZUlEIG5vZGVJRCwg
Y29uc3QgRmxvYXRQb2ludCYgc2Nyb2xsUG9zaXRpb24sIGJvb2wgc3luY0xheWVyUG9zaXRpb24p
Cit7CisgICAgc2NoZWR1bGVVcGRhdGVTY3JvbGxQb3NpdGlvbkFmdGVyQXN5bmNTY3JvbGwobm9k
ZUlELCBzY3JvbGxQb3NpdGlvbiwgc3RkOjpudWxsb3B0LCBmYWxzZSAvKiBGSVhNRSAqLywgc3lu
Y0xheWVyUG9zaXRpb24gPyBTY3JvbGxpbmdMYXllclBvc2l0aW9uQWN0aW9uOjpTeW5jIDogU2Ny
b2xsaW5nTGF5ZXJQb3NpdGlvbkFjdGlvbjo6U2V0KTsKK30KKwordm9pZCBSZW1vdGVTY3JvbGxp
bmdDb29yZGluYXRvcjo6Y3VycmVudFNuYXBQb2ludEluZGljZXNDaGFuZ2VkRm9yTm9kZShTY3Jv
bGxpbmdOb2RlSUQgbm9kZUlELCB1bnNpZ25lZCBob3Jpem9udGFsLCB1bnNpZ25lZCB2ZXJ0aWNh
bCkKK3sKKyAgICBzZXRBY3RpdmVTY3JvbGxTbmFwSW5kaWNlcyhub2RlSUQsIGhvcml6b250YWws
IHZlcnRpY2FsKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKKyNlbmRpZiAvLyBFTkFC
TEUoQVNZTkNfU0NST0xMSU5HKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNz
L1dlYlBhZ2UvbWFjL0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dl
YlByb2Nlc3MvV2ViUGFnZS9tYWMvR3JhcGhpY3NMYXllckNBUmVtb3RlLmNwcApkZWxldGVkIGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmNDJlOTQ3MzBmMTYzODNmOWI1YTczMmU4Mjk2Y2I1YzFh
MjVmMC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3Vy
Y2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvR3JhcGhpY3NMYXllckNBUmVtb3RlLmNw
cAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQot
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiR3Jh
cGhpY3NMYXllckNBUmVtb3RlLmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90
ZS5oIgotI2luY2x1ZGUgIlBsYXRmb3JtQ0FMYXllclJlbW90ZS5oIgotI2luY2x1ZGUgPFdlYkNv
cmUvUGxhdGZvcm1TY3JlZW4uaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci0KLW5hbWVz
cGFjZSBXZWJLaXQgewotCi1HcmFwaGljc0xheWVyQ0FSZW1vdGU6On5HcmFwaGljc0xheWVyQ0FS
ZW1vdGUoKQotewotfQotCi1ib29sIEdyYXBoaWNzTGF5ZXJDQVJlbW90ZTo6ZmlsdGVyc0NhbkJl
Q29tcG9zaXRlZChjb25zdCBGaWx0ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKQotewotICAgIHJldHVy
biBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmZpbHRlcnNDYW5CZUNvbXBvc2l0ZWQoZmlsdGVycyk7
Ci19Ci0KLVJlZjxQbGF0Zm9ybUNBTGF5ZXI+IEdyYXBoaWNzTGF5ZXJDQVJlbW90ZTo6Y3JlYXRl
UGxhdGZvcm1DQUxheWVyKFBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlIGxheWVyVHlwZSwgUGxh
dGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikKLXsKLSAgICBhdXRvIHJlc3VsdCA9IFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6Y3JlYXRlKGxheWVyVHlwZSwgb3duZXIsIG1fY29udGV4dCk7Ci0KLSAg
ICBpZiAocmVzdWx0LT5jYW5IYXZlQmFja2luZ1N0b3JlKCkpCi0gICAgICAgIHJlc3VsdC0+c2V0
V2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUoc2NyZWVuU3VwcG9ydHNFeHRlbmRlZENvbG9yKCkp
OwotCi0gICAgcmV0dXJuIFdURk1vdmUocmVzdWx0KTsKLX0KLQotUmVmPFBsYXRmb3JtQ0FMYXll
cj4gR3JhcGhpY3NMYXllckNBUmVtb3RlOjpjcmVhdGVQbGF0Zm9ybUNBTGF5ZXIoUGxhdGZvcm1M
YXllciogcGxhdGZvcm1MYXllciwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikKLXsKLSAg
ICByZXR1cm4gUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjcmVhdGUocGxhdGZvcm1MYXllciwgb3du
ZXIsIG1fY29udGV4dCk7Ci19Ci0KLVJlZjxQbGF0Zm9ybUNBQW5pbWF0aW9uPiBHcmFwaGljc0xh
eWVyQ0FSZW1vdGU6OmNyZWF0ZVBsYXRmb3JtQ0FBbmltYXRpb24oUGxhdGZvcm1DQUFuaW1hdGlv
bjo6QW5pbWF0aW9uVHlwZSB0eXBlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgpCi17Ci0gICAgcmV0
dXJuIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNyZWF0ZSh0eXBlLCBrZXlQYXRoKTsKLX0K
LQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlBy
b2Nlc3MvV2ViUGFnZS9tYWMvR3JhcGhpY3NMYXllckNBUmVtb3RlLmggYi9Tb3VyY2UvV2ViS2l0
L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvR3JhcGhpY3NMYXllckNBUmVtb3RlLmgKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTkyNTdhNjlhYjJhZWZkMWVhODZkMGM4YmM1NmM4NTY3
OGE3NmIuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291
cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5o
CisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAx
MyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
Ci0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0g
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8V2ViQ29yZS9H
cmFwaGljc0xheWVyQ0EuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtTGF5ZXIuaD4KLQot
bmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ7Ci0KLWNs
YXNzIEdyYXBoaWNzTGF5ZXJDQVJlbW90ZSBmaW5hbCA6IHB1YmxpYyBXZWJDb3JlOjpHcmFwaGlj
c0xheWVyQ0EgewotcHVibGljOgotICAgIEdyYXBoaWNzTGF5ZXJDQVJlbW90ZShUeXBlIGxheWVy
VHlwZSwgV2ViQ29yZTo6R3JhcGhpY3NMYXllckNsaWVudCYgY2xpZW50LCBSZW1vdGVMYXllclRy
ZWVDb250ZXh0JiBjb250ZXh0KQotICAgICAgICA6IEdyYXBoaWNzTGF5ZXJDQShsYXllclR5cGUs
IGNsaWVudCkKLSAgICAgICAgLCBtX2NvbnRleHQoY29udGV4dCkKLSAgICB7Ci0gICAgfQotCi0g
ICAgdmlydHVhbCB+R3JhcGhpY3NMYXllckNBUmVtb3RlKCk7Ci0KLSAgICBib29sIGZpbHRlcnND
YW5CZUNvbXBvc2l0ZWQoY29uc3QgV2ViQ29yZTo6RmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycykg
b3ZlcnJpZGU7Ci0KLXByaXZhdGU6Ci0gICAgYm9vbCBpc0dyYXBoaWNzTGF5ZXJDQVJlbW90ZSgp
IGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLQotICAgIFJlZjxXZWJDb3JlOjpQbGF0
Zm9ybUNBTGF5ZXI+IGNyZWF0ZVBsYXRmb3JtQ0FMYXllcihXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5
ZXI6OkxheWVyVHlwZSwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikgb3Zl
cnJpZGU7Ci0gICAgUmVmPFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcj4gY3JlYXRlUGxhdGZvcm1D
QUxheWVyKFBsYXRmb3JtTGF5ZXIqLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93
bmVyKSBvdmVycmlkZTsKLSAgICBSZWY8V2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbj4gY3Jl
YXRlUGxhdGZvcm1DQUFuaW1hdGlvbihXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uOjpBbmlt
YXRpb25UeXBlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgpIG92ZXJyaWRlOwotCi0gICAgLy8gUGxh
dGZvcm1DQUxheWVyUmVtb3RlIGNhbid0IGN1cnJlbnRseSBwcm94eSBkaXJlY3RseSBjb21wb3Np
dGVkIGltYWdlIGNvbnRlbnRzLCBzbyBvcHQgb3V0IG9mIHRoaXMgb3B0aW1pemF0aW9uLgotICAg
IGJvb2wgc2hvdWxkRGlyZWN0bHlDb21wb3NpdGVJbWFnZShXZWJDb3JlOjpJbWFnZSopIGNvbnN0
IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgCi0gICAgUmVtb3RlTGF5ZXJUcmVlQ29u
dGV4dCYgbV9jb250ZXh0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0KLVNQRUNJQUxJ
WkVfVFlQRV9UUkFJVFNfR1JBUEhJQ1NMQVlFUihXZWJLaXQ6OkdyYXBoaWNzTGF5ZXJDQVJlbW90
ZSwgaXNHcmFwaGljc0xheWVyQ0FSZW1vdGUoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLmggYi9Tb3Vy
Y2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90
ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmQ2OGRlODUyNDFhMzJlNTgyMWQ4
ZTdmM2JjZDBkZTczNWE4NzlmLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNB
QW5pbWF0aW9uUmVtb3RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoKLSAq
IENvcHlyaWdodCAoQykgMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAot
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgUGxhdGZvcm1D
QUFuaW1hdGlvblJlbW90ZV9oCi0jZGVmaW5lIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGVfaAot
Ci0jaW5jbHVkZSA8V2ViQ29yZS9QbGF0Zm9ybUNBQW5pbWF0aW9uLmg+Ci0jaW5jbHVkZSA8d3Rm
L0hhc2hNYXAuaD4KLSNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgotCi1uYW1lc3BhY2UgSVBDIHsK
LWNsYXNzIEVuY29kZXI7Ci1jbGFzcyBEZWNvZGVyOwotfTsKLQotbmFtZXNwYWNlIFdURiB7Ci1j
bGFzcyBUZXh0U3RyZWFtOwotfTsKLQotT0JKQ19DTEFTUyBDQUxheWVyOwotCi1uYW1lc3BhY2Ug
V2ViS2l0IHsKLQotY2xhc3MgUmVtb3RlTGF5ZXJUcmVlSG9zdDsKLQotY2xhc3MgUGxhdGZvcm1D
QUFuaW1hdGlvblJlbW90ZSBmaW5hbCA6IHB1YmxpYyBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0
aW9uIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUmVmPFBsYXRmb3JtQ0FBbmltYXRpb24+IGNyZWF0
ZShBbmltYXRpb25UeXBlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgpOwotCi0gICAgdmlydHVhbCB+
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZSgpIHsgfQotCi0gICAgYm9vbCBpc1BsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBS
ZWY8UGxhdGZvcm1DQUFuaW1hdGlvbj4gY29weSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgU3Ry
aW5nIGtleVBhdGgoKSBjb25zdCBvdmVycmlkZTsKLQotICAgIENGVGltZUludGVydmFsIGJlZ2lu
VGltZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0QmVnaW5UaW1lKENGVGltZUludGVy
dmFsKSBvdmVycmlkZTsKLQotICAgIENGVGltZUludGVydmFsIGR1cmF0aW9uKCkgY29uc3Qgb3Zl
cnJpZGU7Ci0gICAgdm9pZCBzZXREdXJhdGlvbihDRlRpbWVJbnRlcnZhbCkgb3ZlcnJpZGU7Ci0K
LSAgICBmbG9hdCBzcGVlZCgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0U3BlZWQoZmxv
YXQpIG92ZXJyaWRlOwotCi0gICAgQ0ZUaW1lSW50ZXJ2YWwgdGltZU9mZnNldCgpIGNvbnN0IG92
ZXJyaWRlOwotICAgIHZvaWQgc2V0VGltZU9mZnNldChDRlRpbWVJbnRlcnZhbCkgb3ZlcnJpZGU7
Ci0KLSAgICBmbG9hdCByZXBlYXRDb3VudCgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0
UmVwZWF0Q291bnQoZmxvYXQpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBhdXRvcmV2ZXJzZXMoKSBj
b25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldEF1dG9yZXZlcnNlcyhib29sKSBvdmVycmlkZTsK
LQotICAgIEZpbGxNb2RlVHlwZSBmaWxsTW9kZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQg
c2V0RmlsbE1vZGUoRmlsbE1vZGVUeXBlKSBvdmVycmlkZTsKLQotICAgIHZvaWQgc2V0VGltaW5n
RnVuY3Rpb24oY29uc3QgV2ViQ29yZTo6VGltaW5nRnVuY3Rpb24qLCBib29sIHJldmVyc2UgPSBm
YWxzZSkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBjb3B5VGltaW5nRnVuY3Rpb25Gcm9tKGNvbnN0IFdl
YkNvcmU6OlBsYXRmb3JtQ0FBbmltYXRpb24mKSBvdmVycmlkZTsKLQotICAgIGJvb2wgaXNSZW1v
dmVkT25Db21wbGV0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRSZW1vdmVkT25D
b21wbGV0aW9uKGJvb2wpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBpc0FkZGl0aXZlKCkgY29uc3Qg
b3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRBZGRpdGl2ZShib29sKSBvdmVycmlkZTsKLQotICAgIFZh
bHVlRnVuY3Rpb25UeXBlIHZhbHVlRnVuY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lk
IHNldFZhbHVlRnVuY3Rpb24oVmFsdWVGdW5jdGlvblR5cGUpIG92ZXJyaWRlOwotCi0gICAgLy8g
QmFzaWMtYW5pbWF0aW9uIHByb3BlcnRpZXMuCi0gICAgdm9pZCBzZXRGcm9tVmFsdWUoZmxvYXQp
IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0RnJvbVZhbHVlKGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9y
bWF0aW9uTWF0cml4Jikgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRGcm9tVmFsdWUoY29uc3QgV2Vi
Q29yZTo6RmxvYXRQb2ludDNEJikgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRGcm9tVmFsdWUoY29u
c3QgV2ViQ29yZTo6Q29sb3ImKSBvdmVycmlkZTsKLSAgICB2b2lkIHNldEZyb21WYWx1ZShjb25z
dCBXZWJDb3JlOjpGaWx0ZXJPcGVyYXRpb24qLCBpbnQgaW50ZXJuYWxGaWx0ZXJQcm9wZXJ0eUlu
ZGV4KSBvdmVycmlkZTsKLSAgICB2b2lkIGNvcHlGcm9tVmFsdWVGcm9tKGNvbnN0IFdlYkNvcmU6
OlBsYXRmb3JtQ0FBbmltYXRpb24mKSBvdmVycmlkZTsKLQotICAgIHZvaWQgc2V0VG9WYWx1ZShm
bG9hdCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRUb1ZhbHVlKGNvbnN0IFdlYkNvcmU6OlRyYW5z
Zm9ybWF0aW9uTWF0cml4Jikgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRUb1ZhbHVlKGNvbnN0IFdl
YkNvcmU6OkZsb2F0UG9pbnQzRCYpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0VG9WYWx1ZShjb25z
dCBXZWJDb3JlOjpDb2xvciYpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0VG9WYWx1ZShjb25zdCBX
ZWJDb3JlOjpGaWx0ZXJPcGVyYXRpb24qLCBpbnQgaW50ZXJuYWxGaWx0ZXJQcm9wZXJ0eUluZGV4
KSBvdmVycmlkZTsKLSAgICB2b2lkIGNvcHlUb1ZhbHVlRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0
Zm9ybUNBQW5pbWF0aW9uJikgb3ZlcnJpZGU7Ci0KLSAgICAvLyBLZXlmcmFtZS1hbmltYXRpb24g
cHJvcGVydGllcy4KLSAgICB2b2lkIHNldFZhbHVlcyhjb25zdCBWZWN0b3I8ZmxvYXQ+Jikgb3Zl
cnJpZGU7Ci0gICAgdm9pZCBzZXRWYWx1ZXMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OlRyYW5zZm9y
bWF0aW9uTWF0cml4PiYpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0VmFsdWVzKGNvbnN0IFZlY3Rv
cjxXZWJDb3JlOjpGbG9hdFBvaW50M0Q+Jikgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRWYWx1ZXMo
Y29uc3QgVmVjdG9yPFdlYkNvcmU6OkNvbG9yPiYpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0VmFs
dWVzKGNvbnN0IFZlY3RvcjxSZWZQdHI8V2ViQ29yZTo6RmlsdGVyT3BlcmF0aW9uPj4mLCBpbnQg
aW50ZXJuYWxGaWx0ZXJQcm9wZXJ0eUluZGV4KSBvdmVycmlkZTsKLSAgICB2b2lkIGNvcHlWYWx1
ZXNGcm9tKGNvbnN0IFdlYkNvcmU6OlBsYXRmb3JtQ0FBbmltYXRpb24mKSBvdmVycmlkZTsKLQot
ICAgIHZvaWQgc2V0S2V5VGltZXMoY29uc3QgVmVjdG9yPGZsb2F0PiYpIG92ZXJyaWRlOwotICAg
IHZvaWQgY29weUtleVRpbWVzRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9u
Jikgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldFRpbWluZ0Z1bmN0aW9ucyhjb25zdCBWZWN0b3I8
Y29uc3QgV2ViQ29yZTo6VGltaW5nRnVuY3Rpb24qPiYsIGJvb2wgcmV2ZXJzZSA9IGZhbHNlKSBv
dmVycmlkZTsKLSAgICB2b2lkIGNvcHlUaW1pbmdGdW5jdGlvbnNGcm9tKGNvbnN0IFdlYkNvcmU6
OlBsYXRmb3JtQ0FBbmltYXRpb24mKSBvdmVycmlkZTsKLQotICAgIEFuaW1hdGlvblR5cGUgYW5p
bWF0aW9uVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvcGVydGllcy5hbmltYXRpb25UeXBlOyB9
Ci0gICAgdm9pZCBzZXRIYXNFeHBsaWNpdEJlZ2luVGltZShib29sIGhhc0V4cGxpY2l0QmVnaW5U
aW1lKSB7IG1fcHJvcGVydGllcy5oYXNFeHBsaWNpdEJlZ2luVGltZSA9IGhhc0V4cGxpY2l0QmVn
aW5UaW1lOyB9Ci0gICAgYm9vbCBoYXNFeHBsaWNpdEJlZ2luVGltZSgpIGNvbnN0IHsgcmV0dXJu
IG1fcHJvcGVydGllcy5oYXNFeHBsaWNpdEJlZ2luVGltZTsgfQotCi0gICAgdm9pZCBkaWRTdGFy
dChDRlRpbWVJbnRlcnZhbCBiZWdpblRpbWUpIHsgbV9wcm9wZXJ0aWVzLmJlZ2luVGltZSA9IGJl
Z2luVGltZTsgfQotCi0gICAgY2xhc3MgS2V5ZnJhbWVWYWx1ZSB7Ci0gICAgcHVibGljOgotICAg
ICAgICBlbnVtIEtleWZyYW1lVHlwZSB7Ci0gICAgICAgICAgICBOdW1iZXJLZXlUeXBlLAotICAg
ICAgICAgICAgQ29sb3JLZXlUeXBlLAotICAgICAgICAgICAgUG9pbnRLZXlUeXBlLAotICAgICAg
ICAgICAgVHJhbnNmb3JtS2V5VHlwZSwKLSAgICAgICAgICAgIEZpbHRlcktleVR5cGUsCi0gICAg
ICAgIH07Ci0KLSAgICAgICAgfktleWZyYW1lVmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgIH0K
LQotICAgICAgICBLZXlmcmFtZVZhbHVlKGZsb2F0IHZhbHVlID0gMCkKLSAgICAgICAgICAgIDog
a2V5VHlwZShOdW1iZXJLZXlUeXBlKQotICAgICAgICAgICAgLCBudW1iZXIodmFsdWUpCi0gICAg
ICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIEtleWZyYW1lVmFsdWUoV2ViQ29yZTo6Q29sb3Ig
dmFsdWUpCi0gICAgICAgICAgICA6IGtleVR5cGUoQ29sb3JLZXlUeXBlKQotICAgICAgICAgICAg
LCBjb2xvcih2YWx1ZSkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgS2V5ZnJhbWVW
YWx1ZShjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50M0QmIHZhbHVlKQotICAgICAgICAgICAgOiBr
ZXlUeXBlKFBvaW50S2V5VHlwZSkKLSAgICAgICAgICAgICwgcG9pbnQodmFsdWUpCi0gICAgICAg
IHsKLSAgICAgICAgfQotCi0gICAgICAgIEtleWZyYW1lVmFsdWUoY29uc3QgV2ViQ29yZTo6VHJh
bnNmb3JtYXRpb25NYXRyaXgmIHZhbHVlKQotICAgICAgICAgICAgOiBrZXlUeXBlKFRyYW5zZm9y
bUtleVR5cGUpCi0gICAgICAgICAgICAsIHRyYW5zZm9ybSh2YWx1ZSkKLSAgICAgICAgewotICAg
ICAgICB9Ci0KLSAgICAgICAgS2V5ZnJhbWVWYWx1ZShSZWZQdHI8V2ViQ29yZTo6RmlsdGVyT3Bl
cmF0aW9uPiYmIHZhbHVlKQotICAgICAgICAgICAgOiBrZXlUeXBlKEZpbHRlcktleVR5cGUpCi0g
ICAgICAgICAgICAsIGZpbHRlcihXVEZNb3ZlKHZhbHVlKSkKLSAgICAgICAgewotICAgICAgICB9
Ci0KLSAgICAgICAgS2V5ZnJhbWVWYWx1ZShjb25zdCBLZXlmcmFtZVZhbHVlJiBvdGhlcikKLSAg
ICAgICAgewotICAgICAgICAgICAgKnRoaXMgPSBvdGhlcjsKLSAgICAgICAgfQotCi0gICAgICAg
IEtleWZyYW1lVmFsdWUmIG9wZXJhdG9yPShjb25zdCBLZXlmcmFtZVZhbHVlJiBvdGhlcikKLSAg
ICAgICAgewotICAgICAgICAgICAga2V5VHlwZSA9IG90aGVyLmtleVR5cGU7Ci0gICAgICAgICAg
ICBzd2l0Y2ggKGtleVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTnVtYmVyS2V5VHlwZToKLSAg
ICAgICAgICAgICAgICBudW1iZXIgPSBvdGhlci5udW1iZXI7Ci0gICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICBjYXNlIENvbG9yS2V5VHlwZToKLSAgICAgICAgICAgICAgICBjb2xv
ciA9IG90aGVyLmNvbG9yOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2Fz
ZSBQb2ludEtleVR5cGU6Ci0gICAgICAgICAgICAgICAgcG9pbnQgPSBvdGhlci5wb2ludDsKLSAg
ICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVHJhbnNmb3JtS2V5VHlwZToK
LSAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBvdGhlci50cmFuc2Zvcm07Ci0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZpbHRlcktleVR5cGU6Ci0gICAgICAgICAg
ICAgICAgZmlsdGVyID0gb3RoZXIuZmlsdGVyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLQotICAg
ICAgICBLZXlmcmFtZVR5cGUga2V5ZnJhbWVUeXBlKCkgY29uc3QgeyByZXR1cm4ga2V5VHlwZTsg
fQotCi0gICAgICAgIGZsb2F0IG51bWJlclZhbHVlKCkgY29uc3QKLSAgICAgICAgewotICAgICAg
ICAgICAgQVNTRVJUKGtleVR5cGUgPT0gTnVtYmVyS2V5VHlwZSk7Ci0gICAgICAgICAgICByZXR1
cm4gbnVtYmVyOwotICAgICAgICB9Ci0KLSAgICAgICAgV2ViQ29yZTo6Q29sb3IgY29sb3JWYWx1
ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChrZXlUeXBlID09IENvbG9y
S2V5VHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAg
ICBjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50M0QmIHBvaW50VmFsdWUoKSBjb25zdAotICAgICAg
ICB7Ci0gICAgICAgICAgICBBU1NFUlQoa2V5VHlwZSA9PSBQb2ludEtleVR5cGUpOwotICAgICAg
ICAgICAgcmV0dXJuIHBvaW50OwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgV2ViQ29yZTo6
VHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybVZhbHVlKCkgY29uc3QKLSAgICAgICAgewot
ICAgICAgICAgICAgQVNTRVJUKGtleVR5cGUgPT0gVHJhbnNmb3JtS2V5VHlwZSk7Ci0gICAgICAg
ICAgICByZXR1cm4gdHJhbnNmb3JtOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgV2ViQ29y
ZTo6RmlsdGVyT3BlcmF0aW9uKiBmaWx0ZXJWYWx1ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAg
ICAgICAgIEFTU0VSVChrZXlUeXBlID09IEZpbHRlcktleVR5cGUpOwotICAgICAgICAgICAgcmV0
dXJuIGZpbHRlci5nZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZW5jb2RlKElQQzo6
RW5jb2RlciYpIGNvbnN0OwotICAgICAgICBzdGF0aWMgYm9vbCBkZWNvZGUoSVBDOjpEZWNvZGVy
JiwgS2V5ZnJhbWVWYWx1ZSYpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgS2V5ZnJhbWVUeXBl
IGtleVR5cGU7Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgIGZsb2F0IG51bWJlcjsKLSAg
ICAgICAgICAgIFdlYkNvcmU6OkNvbG9yIGNvbG9yOwotICAgICAgICAgICAgV2ViQ29yZTo6Rmxv
YXRQb2ludDNEIHBvaW50OwotICAgICAgICAgICAgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRy
aXggdHJhbnNmb3JtOwotICAgICAgICB9OwotICAgICAgICBSZWZQdHI8V2ViQ29yZTo6RmlsdGVy
T3BlcmF0aW9uPiBmaWx0ZXI7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBQcm9wZXJ0aWVzIHsKLSAg
ICAgICAgUHJvcGVydGllcygpCi0gICAgICAgICAgICA6IGFuaW1hdGlvblR5cGUoQmFzaWMpCi0g
ICAgICAgICAgICAsIGJlZ2luVGltZSgwKQotICAgICAgICAgICAgLCBkdXJhdGlvbigwKQotICAg
ICAgICAgICAgLCB0aW1lT2Zmc2V0KDApCi0gICAgICAgICAgICAsIHJlcGVhdENvdW50KDEpCi0g
ICAgICAgICAgICAsIHNwZWVkKDEpCi0gICAgICAgICAgICAsIGZpbGxNb2RlKE5vRmlsbE1vZGUp
Ci0gICAgICAgICAgICAsIHZhbHVlRnVuY3Rpb24oTm9WYWx1ZUZ1bmN0aW9uKQotICAgICAgICAg
ICAgLCBhdXRvUmV2ZXJzZXMoZmFsc2UpCi0gICAgICAgICAgICAsIHJlbW92ZWRPbkNvbXBsZXRp
b24odHJ1ZSkKLSAgICAgICAgICAgICwgYWRkaXRpdmUoZmFsc2UpCi0gICAgICAgICAgICAsIHJl
dmVyc2VUaW1pbmdGdW5jdGlvbnMoZmFsc2UpCi0gICAgICAgICAgICAsIGhhc0V4cGxpY2l0QmVn
aW5UaW1lKGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGVuY29k
ZShJUEM6OkVuY29kZXImKSBjb25zdDsKLSAgICAgICAgc3RhdGljIGJvb2wgZGVjb2RlKElQQzo6
RGVjb2RlciYsIFByb3BlcnRpZXMmKTsKLQotICAgICAgICBTdHJpbmcga2V5UGF0aDsKLSAgICAg
ICAgUGxhdGZvcm1DQUFuaW1hdGlvbjo6QW5pbWF0aW9uVHlwZSBhbmltYXRpb25UeXBlOwotCi0g
ICAgICAgIGRvdWJsZSBiZWdpblRpbWU7Ci0gICAgICAgIGRvdWJsZSBkdXJhdGlvbjsKLSAgICAg
ICAgZG91YmxlIHRpbWVPZmZzZXQ7Ci0gICAgICAgIGZsb2F0IHJlcGVhdENvdW50OwotICAgICAg
ICBmbG9hdCBzcGVlZDsKLQotICAgICAgICBQbGF0Zm9ybUNBQW5pbWF0aW9uOjpGaWxsTW9kZVR5
cGUgZmlsbE1vZGU7Ci0gICAgICAgIFBsYXRmb3JtQ0FBbmltYXRpb246OlZhbHVlRnVuY3Rpb25U
eXBlIHZhbHVlRnVuY3Rpb247Ci0KLSAgICAgICAgYm9vbCBhdXRvUmV2ZXJzZXM7Ci0gICAgICAg
IGJvb2wgcmVtb3ZlZE9uQ29tcGxldGlvbjsKLSAgICAgICAgYm9vbCBhZGRpdGl2ZTsKLSAgICAg
ICAgYm9vbCByZXZlcnNlVGltaW5nRnVuY3Rpb25zOwotICAgICAgICBib29sIGhhc0V4cGxpY2l0
QmVnaW5UaW1lOwotCi0gICAgICAgIC8vIEZvciBiYXNpYyBhbmltYXRpb25zLCB0aGVzZSB2ZWN0
b3JzIGhhdmUgdHdvIGVudHJpZXMuIEZvciBrZXlmcmFtZSBhbmltYXRpb25zLCB0d28gb3IgbW9y
ZS4KLSAgICAgICAgLy8gdGltaW5nRnVuY3Rpb25zIGhhcyBuLTEgZW50cmllcy4KLSAgICAgICAg
VmVjdG9yPEtleWZyYW1lVmFsdWU+IGtleVZhbHVlczsKLSAgICAgICAgVmVjdG9yPGZsb2F0PiBr
ZXlUaW1lczsKLSAgICAgICAgVmVjdG9yPFJlZlB0cjxXZWJDb3JlOjpUaW1pbmdGdW5jdGlvbj4+
IHRpbWluZ0Z1bmN0aW9uczsKLSAgICB9OwotCi0gICAgY29uc3QgUHJvcGVydGllcyYgcHJvcGVy
dGllcygpIGNvbnN0IHsgcmV0dXJuIG1fcHJvcGVydGllczsgfQotCi0gICAgdHlwZWRlZiBWZWN0
b3I8c3RkOjpwYWlyPFN0cmluZywgUHJvcGVydGllcz4+IEFuaW1hdGlvbnNMaXN0OwotICAgIHN0
YXRpYyB2b2lkIHVwZGF0ZUxheWVyQW5pbWF0aW9ucyhDQUxheWVyICosIFJlbW90ZUxheWVyVHJl
ZUhvc3QqLCBjb25zdCBBbmltYXRpb25zTGlzdCYgYW5pbWF0aW9uc1RvQWRkLCBjb25zdCBIYXNo
U2V0PFN0cmluZz4mIGFuaW1hdGlvbnNUb1JlbW92ZSk7Ci0KLXByaXZhdGU6Ci0gICAgUGxhdGZv
cm1DQUFuaW1hdGlvblJlbW90ZShBbmltYXRpb25UeXBlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgp
OwotCi0gICAgUHJvcGVydGllcyBtX3Byb3BlcnRpZXM7Ci19OwotCi1XVEY6OlRleHRTdHJlYW0m
IG9wZXJhdG9yPDwoV1RGOjpUZXh0U3RyZWFtJiwgY29uc3QgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6S2V5ZnJhbWVWYWx1ZSYpOwotV1RGOjpUZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFdURjo6
VGV4dFN0cmVhbSYsIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXMm
KTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfQ0FB
TklNQVRJT04oV2ViS2l0OjpQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLCBpc1BsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGUoKSkKLQotI2VuZGlmIC8vIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGVf
aApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGUubW0gYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFn
ZS9tYWMvUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5tbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDZlMjczYzNhNzE5ZTY5MTAwZDE1ZjVhMzFhMWEyZDQ1ZmY2ZmY0Mi4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dl
YlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5tbQorKysgL2Rl
di9udWxsCkBAIC0xLDkzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAot
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
Ci0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2ltcG9ydCAiUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZS5oIgotCi0jaW1wb3J0ICJBcmd1bWVudENvZGVycy5oIgotI2ltcG9ydCAi
UmVtb3RlTGF5ZXJUcmVlSG9zdC5oIgotI2ltcG9ydCAiV2ViQ29yZUFyZ3VtZW50Q29kZXJzLmgi
Ci0jaW1wb3J0IDxRdWFydHpDb3JlL1F1YXJ0ekNvcmUuaD4KLSNpbXBvcnQgPFdlYkNvcmUvR3Jh
cGhpY3NMYXllci5oPgotI2ltcG9ydCA8V2ViQ29yZS9QbGF0Zm9ybUNBQW5pbWF0aW9uQ29jb2Eu
aD4KLSNpbXBvcnQgPFdlYkNvcmUvUGxhdGZvcm1DQUZpbHRlcnMuaD4KLSNpbXBvcnQgPFdlYkNv
cmUvVGltaW5nRnVuY3Rpb24uaD4KLSNpbXBvcnQgPHBhbC9zcGkvY29jb2EvUXVhcnR6Q29yZVNQ
SS5oPgotI2ltcG9ydCA8d3RmL0Jsb2NrT2JqQ0V4Y2VwdGlvbnMuaD4KLSNpbXBvcnQgPHd0Zi9D
dXJyZW50VGltZS5oPgotI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgotI2ltcG9ydCA8d3RmL3Rl
eHQvVGV4dFN0cmVhbS5oPgotCi11c2luZyBuYW1lc3BhY2UgV1RGOwotdXNpbmcgbmFtZXNwYWNl
IFdlYkNvcmU7Ci0KLXN0YXRpYyBkb3VibGUgbWVkaWFUaW1lVG9DdXJyZW50VGltZShDRlRpbWVJ
bnRlcnZhbCB0KQotewotICAgIHJldHVybiBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKSAr
IHQgLSBDQUN1cnJlbnRNZWRpYVRpbWUoKTsKLX0KLQotc3RhdGljIE5TU3RyaW5nICogY29uc3Qg
V0tFeHBsaWNpdEJlZ2luVGltZUZsYWcgPSBAIldLUGxhdGZvcm1DQUFuaW1hdGlvbkV4cGxpY2l0
QmVnaW5UaW1lRmxhZyI7Ci0KLUBpbnRlcmZhY2UgV0tBbmltYXRpb25EZWxlZ2F0ZSA6IE5TT2Jq
ZWN0IDxDQUFuaW1hdGlvbkRlbGVnYXRlPiB7Ci0gICAgR3JhcGhpY3NMYXllcjo6UGxhdGZvcm1M
YXllcklEIF9sYXllcklEOwotICAgIFdlYktpdDo6UmVtb3RlTGF5ZXJUcmVlSG9zdCogX2xheWVy
VHJlZUhvc3Q7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aExheWVySUQ6KEdyYXBoaWNz
TGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRClsYXllcklEIGxheWVyVHJlZUhvc3Q6KFdlYktpdDo6UmVt
b3RlTGF5ZXJUcmVlSG9zdCopbGF5ZXJUcmVlSG9zdDsKLS0gKHZvaWQpaW52YWxpZGF0ZTsKLUBl
bmQKLQotQGltcGxlbWVudGF0aW9uIFdLQW5pbWF0aW9uRGVsZWdhdGUKLQotLSAoaW5zdGFuY2V0
eXBlKWluaXRXaXRoTGF5ZXJJRDooR3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklEKWxheWVy
SUQgbGF5ZXJUcmVlSG9zdDooV2ViS2l0OjpSZW1vdGVMYXllclRyZWVIb3N0KilsYXllclRyZWVI
b3N0Ci17Ci0gICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSkgewotICAgICAgICBfbGF5ZXJJ
RCA9IGxheWVySUQ7Ci0gICAgICAgIF9sYXllclRyZWVIb3N0ID0gbGF5ZXJUcmVlSG9zdDsKLSAg
ICB9Ci0gICAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKHZvaWQpaW52YWxpZGF0ZQotewotICAgIF9s
YXllclRyZWVIb3N0ID0gbnVsbHB0cjsKLX0KLQotLSAodm9pZClhbmltYXRpb25EaWRTdGFydDoo
Q0FBbmltYXRpb24gKilhbmltYXRpb24KLXsKLSAgICBpZiAoIV9sYXllclRyZWVIb3N0KQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBib29sIGhhc0V4cGxpY2l0QmVnaW5UaW1lID0gW1thbmltYXRp
b24gdmFsdWVGb3JLZXk6V0tFeHBsaWNpdEJlZ2luVGltZUZsYWddIGJvb2xWYWx1ZV07Ci0gICAg
Q0ZUaW1lSW50ZXJ2YWwgc3RhcnRUaW1lOwotCi0gICAgaWYgKGhhc0V4cGxpY2l0QmVnaW5UaW1l
KSB7Ci0gICAgICAgIC8vIFdlIGRvbid0IGtub3cgd2hhdCB0aW1lIENBIHVzZWQgdG8gY29tbWl0
IHRoZSBhbmltYXRpb24sIHNvIGp1c3QgdXNlIHRoZSBjdXJyZW50IHRpbWUKLSAgICAgICAgLy8g
KGV2ZW4gdGhvdWdoIHRoaXMgd2lsbCBiZSBzbGlnaHRseSBvZmYpLgotICAgICAgICBzdGFydFRp
bWUgPSBtZWRpYVRpbWVUb0N1cnJlbnRUaW1lKENBQ3VycmVudE1lZGlhVGltZSgpKTsKLSAgICB9
IGVsc2UKLSAgICAgICAgc3RhcnRUaW1lID0gbWVkaWFUaW1lVG9DdXJyZW50VGltZShbYW5pbWF0
aW9uIGJlZ2luVGltZV0pOwotCi0gICAgX2xheWVyVHJlZUhvc3QtPmFuaW1hdGlvbkRpZFN0YXJ0
KF9sYXllcklELCBhbmltYXRpb24sIHN0YXJ0VGltZSk7Ci19Ci0KLS0gKHZvaWQpYW5pbWF0aW9u
RGlkU3RvcDooQ0FBbmltYXRpb24gKilhbmltYXRpb24gZmluaXNoZWQ6KEJPT0wpZmluaXNoZWQK
LXsKLSAgICBpZiAoIV9sYXllclRyZWVIb3N0KQotICAgICAgICByZXR1cm47Ci0KLSAgICBfbGF5
ZXJUcmVlSG9zdC0+YW5pbWF0aW9uRGlkRW5kKF9sYXllcklELCBhbmltYXRpb24pOwotfQotCi1A
ZW5kCi0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU6OktleWZyYW1lVmFsdWU6OmVuY29kZShJUEM6OkVuY29kZXImIGVuY29kZXIpIGNvbnN0Ci17
Ci0gICAgZW5jb2Rlci5lbmNvZGVFbnVtKGtleVR5cGUpOwotCi0gICAgc3dpdGNoIChrZXlUeXBl
KSB7Ci0gICAgY2FzZSBOdW1iZXJLZXlUeXBlOgotICAgICAgICBlbmNvZGVyIDw8IG51bWJlcjsK
LSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb2xvcktleVR5cGU6Ci0gICAgICAgIGVuY29kZXIg
PDwgY29sb3I7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUG9pbnRLZXlUeXBlOgotICAgICAg
ICBlbmNvZGVyIDw8IHBvaW50OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFRyYW5zZm9ybUtl
eVR5cGU6Ci0gICAgICAgIGVuY29kZXIgPDwgdHJhbnNmb3JtOwotICAgICAgICBicmVhazsKLSAg
ICBjYXNlIEZpbHRlcktleVR5cGU6Ci0gICAgICAgIGVuY29kZXIgPDwgKmZpbHRlci5nZXQoKTsK
LSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1ib29sIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU6OktleWZyYW1lVmFsdWU6OmRlY29kZShJUEM6OkRlY29kZXImIGRlY29kZXIsIFBsYXRmb3Jt
Q0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWUmIHZhbHVlKQotewotICAgIGlmICghZGVj
b2Rlci5kZWNvZGVFbnVtKHZhbHVlLmtleVR5cGUpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBzd2l0Y2ggKHZhbHVlLmtleVR5cGUpIHsKLSAgICBjYXNlIE51bWJlcktleVR5cGU6Ci0g
ICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUodmFsdWUubnVtYmVyKSkKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb2xvcktleVR5cGU6Ci0gICAg
ICAgIGlmICghZGVjb2Rlci5kZWNvZGUodmFsdWUuY29sb3IpKQotICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBvaW50S2V5VHlwZToKLSAgICAgICAg
aWYgKCFkZWNvZGVyLmRlY29kZSh2YWx1ZS5wb2ludCkpCi0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVHJhbnNmb3JtS2V5VHlwZToKLSAgICAgICAg
aWYgKCFkZWNvZGVyLmRlY29kZSh2YWx1ZS50cmFuc2Zvcm0pKQotICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZpbHRlcktleVR5cGU6Ci0gICAgICAg
IGlmICghZGVjb2RlRmlsdGVyT3BlcmF0aW9uKGRlY29kZXIsIHZhbHVlLmZpbHRlcikpCi0gICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVy
biB0cnVlOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXM6
OmVuY29kZShJUEM6OkVuY29kZXImIGVuY29kZXIpIGNvbnN0Ci17Ci0gICAgZW5jb2RlciA8PCBr
ZXlQYXRoOwotICAgIGVuY29kZXIuZW5jb2RlRW51bShhbmltYXRpb25UeXBlKTsKLQotICAgIGVu
Y29kZXIgPDwgYmVnaW5UaW1lOwotICAgIGVuY29kZXIgPDwgZHVyYXRpb247Ci0gICAgZW5jb2Rl
ciA8PCB0aW1lT2Zmc2V0OwotICAgIGVuY29kZXIgPDwgcmVwZWF0Q291bnQ7Ci0gICAgZW5jb2Rl
ciA8PCBzcGVlZDsKLQotICAgIGVuY29kZXIuZW5jb2RlRW51bShmaWxsTW9kZSk7Ci0gICAgZW5j
b2Rlci5lbmNvZGVFbnVtKHZhbHVlRnVuY3Rpb24pOwotCi0gICAgZW5jb2RlciA8PCBhdXRvUmV2
ZXJzZXM7Ci0gICAgZW5jb2RlciA8PCByZW1vdmVkT25Db21wbGV0aW9uOwotICAgIGVuY29kZXIg
PDwgYWRkaXRpdmU7Ci0gICAgZW5jb2RlciA8PCByZXZlcnNlVGltaW5nRnVuY3Rpb25zOwotICAg
IGVuY29kZXIgPDwgaGFzRXhwbGljaXRCZWdpblRpbWU7Ci0gICAgCi0gICAgZW5jb2RlciA8PCBr
ZXlWYWx1ZXM7Ci0gICAgZW5jb2RlciA8PCBrZXlUaW1lczsKLSAgICAKLSAgICBlbmNvZGVyIDw8
IHN0YXRpY19jYXN0PHVpbnQ2NF90Pih0aW1pbmdGdW5jdGlvbnMuc2l6ZSgpKTsKLSAgICBmb3Ig
KGNvbnN0IGF1dG8mIHRpbWluZ0Z1bmN0aW9uIDogdGltaW5nRnVuY3Rpb25zKSB7Ci0gICAgICAg
IHN3aXRjaCAodGltaW5nRnVuY3Rpb24tPnR5cGUoKSkgewotICAgICAgICBjYXNlIFRpbWluZ0Z1
bmN0aW9uOjpMaW5lYXJGdW5jdGlvbjoKLSAgICAgICAgICAgIGVuY29kZXIgPDwgKnN0YXRpY19j
YXN0PExpbmVhclRpbWluZ0Z1bmN0aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgY2FzZSBUaW1pbmdGdW5jdGlvbjo6
Q3ViaWNCZXppZXJGdW5jdGlvbjoKLSAgICAgICAgICAgIGVuY29kZXIgPDwgKnN0YXRpY19jYXN0
PEN1YmljQmV6aWVyVGltaW5nRnVuY3Rpb24qPih0aW1pbmdGdW5jdGlvbi5nZXQoKSk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgICAgIGNhc2UgVGltaW5nRnVuY3Rpb246OlN0
ZXBzRnVuY3Rpb246Ci0gICAgICAgICAgICBlbmNvZGVyIDw8ICpzdGF0aWNfY2FzdDxTdGVwc1Rp
bWluZ0Z1bmN0aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpOwotICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgY2FzZSBUaW1pbmdGdW5jdGlvbjo6U3ByaW5nRnVuY3Rpb246Ci0gICAgICAg
ICAgICBlbmNvZGVyIDw8ICpzdGF0aWNfY2FzdDxTcHJpbmdUaW1pbmdGdW5jdGlvbio+KHRpbWlu
Z0Z1bmN0aW9uLmdldCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQot
fQotCi1ib29sIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXM6OmRlY29kZShJ
UEM6OkRlY29kZXImIGRlY29kZXIsIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRp
ZXMmIHByb3BlcnRpZXMpCi17Ci0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmtl
eVBhdGgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIWRlY29kZXIuZGVjb2Rl
RW51bShwcm9wZXJ0aWVzLmFuaW1hdGlvblR5cGUpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMuYmVnaW5UaW1lKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmR1cmF0
aW9uKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShw
cm9wZXJ0aWVzLnRpbWVPZmZzZXQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAo
IWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMucmVwZWF0Q291bnQpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMuc3BlZWQpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIWRlY29kZXIuZGVjb2RlRW51bShwcm9wZXJ0
aWVzLmZpbGxNb2RlKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVy
LmRlY29kZUVudW0ocHJvcGVydGllcy52YWx1ZUZ1bmN0aW9uKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmF1dG9SZXZlcnNlcykp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghZGVjb2Rlci5kZWNvZGUocHJvcGVy
dGllcy5yZW1vdmVkT25Db21wbGV0aW9uKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
aWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmFkZGl0aXZlKSkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLnJldmVyc2VUaW1p
bmdGdW5jdGlvbnMpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIWRlY29kZXIu
ZGVjb2RlKHByb3BlcnRpZXMuaGFzRXhwbGljaXRCZWdpblRpbWUpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMua2V5VmFsdWVzKSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0
aWVzLmtleVRpbWVzKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgdWludDY0X3QgbnVt
VGltaW5nRnVuY3Rpb25zOwotICAgIGlmICghZGVjb2Rlci5kZWNvZGUobnVtVGltaW5nRnVuY3Rp
b25zKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGlmIChudW1UaW1pbmdGdW5j
dGlvbnMpIHsKLSAgICAgICAgcHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMucmVzZXJ2ZUluaXRp
YWxDYXBhY2l0eShudW1UaW1pbmdGdW5jdGlvbnMpOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgbnVtVGltaW5nRnVuY3Rpb25zOyArK2kpIHsKLSAgICAgICAgCi0gICAgICAgICAg
ICBUaW1pbmdGdW5jdGlvbjo6VGltaW5nRnVuY3Rpb25UeXBlIHR5cGU7Ci0gICAgICAgICAgICBp
ZiAoIWRlY29kZXIuZGVjb2RlRW51bSh0eXBlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICAgICAgICAgIFJlZlB0cjxUaW1pbmdGdW5jdGlvbj4gdGltaW5nRnVuY3Rpb247
Ci0gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVGltaW5nRnVu
Y3Rpb246OkxpbmVhckZ1bmN0aW9uOgotICAgICAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9uID0g
TGluZWFyVGltaW5nRnVuY3Rpb246OmNyZWF0ZSgpOwotICAgICAgICAgICAgICAgIGlmICghZGVj
b2Rlci5kZWNvZGUoKnN0YXRpY19jYXN0PExpbmVhclRpbWluZ0Z1bmN0aW9uKj4odGltaW5nRnVu
Y3Rpb24uZ2V0KCkpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBUaW1p
bmdGdW5jdGlvbjo6Q3ViaWNCZXppZXJGdW5jdGlvbjoKLSAgICAgICAgICAgICAgICB0aW1pbmdG
dW5jdGlvbiA9IEN1YmljQmV6aWVyVGltaW5nRnVuY3Rpb246OmNyZWF0ZSgpOwotICAgICAgICAg
ICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUoKnN0YXRpY19jYXN0PEN1YmljQmV6aWVyVGltaW5n
RnVuY3Rpb24qPih0aW1pbmdGdW5jdGlvbi5nZXQoKSkpKQotICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIGNhc2UgVGltaW5nRnVuY3Rpb246OlN0ZXBzRnVuY3Rpb246Ci0gICAgICAgICAgICAg
ICAgdGltaW5nRnVuY3Rpb24gPSBTdGVwc1RpbWluZ0Z1bmN0aW9uOjpjcmVhdGUoKTsKLSAgICAg
ICAgICAgICAgICBpZiAoIWRlY29kZXIuZGVjb2RlKCpzdGF0aWNfY2FzdDxTdGVwc1RpbWluZ0Z1
bmN0aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFRp
bWluZ0Z1bmN0aW9uOjpTcHJpbmdGdW5jdGlvbjoKLSAgICAgICAgICAgICAgICB0aW1pbmdGdW5j
dGlvbiA9IFNwcmluZ1RpbWluZ0Z1bmN0aW9uOjpjcmVhdGUoKTsKLSAgICAgICAgICAgICAgICBp
ZiAoIWRlY29kZXIuZGVjb2RlKCpzdGF0aWNfY2FzdDxTcHJpbmdUaW1pbmdGdW5jdGlvbio+KHRp
bWluZ0Z1bmN0aW9uLmdldCgpKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAg
ICAgICAgICAgcHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMudW5jaGVja2VkQXBwZW5kKFdURk1v
dmUodGltaW5nRnVuY3Rpb24pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVl
OwotfQotICAgIAotUmVmPFBsYXRmb3JtQ0FBbmltYXRpb24+IFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OmNyZWF0ZShQbGF0Zm9ybUNBQW5pbWF0aW9uOjpBbmltYXRpb25UeXBlIHR5cGUsIGNv
bnN0IFN0cmluZyYga2V5UGF0aCkKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBQbGF0Zm9y
bUNBQW5pbWF0aW9uUmVtb3RlKHR5cGUsIGtleVBhdGgpKTsKLX0KLQotUmVmPFBsYXRmb3JtQ0FB
bmltYXRpb24+IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNvcHkoKSBjb25zdAotewotICAg
IGF1dG8gYW5pbWF0aW9uID0gY3JlYXRlKGFuaW1hdGlvblR5cGUoKSwga2V5UGF0aCgpKTsKLSAg
ICAKLSAgICBhbmltYXRpb24tPnNldEJlZ2luVGltZShiZWdpblRpbWUoKSk7Ci0gICAgYW5pbWF0
aW9uLT5zZXREdXJhdGlvbihkdXJhdGlvbigpKTsKLSAgICBhbmltYXRpb24tPnNldFNwZWVkKHNw
ZWVkKCkpOwotICAgIGFuaW1hdGlvbi0+c2V0VGltZU9mZnNldCh0aW1lT2Zmc2V0KCkpOwotICAg
IGFuaW1hdGlvbi0+c2V0UmVwZWF0Q291bnQocmVwZWF0Q291bnQoKSk7Ci0gICAgYW5pbWF0aW9u
LT5zZXRBdXRvcmV2ZXJzZXMoYXV0b3JldmVyc2VzKCkpOwotICAgIGFuaW1hdGlvbi0+c2V0Rmls
bE1vZGUoZmlsbE1vZGUoKSk7Ci0gICAgYW5pbWF0aW9uLT5zZXRSZW1vdmVkT25Db21wbGV0aW9u
KGlzUmVtb3ZlZE9uQ29tcGxldGlvbigpKTsKLSAgICBhbmltYXRpb24tPnNldEFkZGl0aXZlKGlz
QWRkaXRpdmUoKSk7Ci0gICAgYW5pbWF0aW9uLT5jb3B5VGltaW5nRnVuY3Rpb25Gcm9tKCp0aGlz
KTsKLSAgICBhbmltYXRpb24tPnNldFZhbHVlRnVuY3Rpb24odmFsdWVGdW5jdGlvbigpKTsKLQot
ICAgIGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KGFuaW1hdGlvbi5nZXQoKSku
c2V0SGFzRXhwbGljaXRCZWdpblRpbWUoaGFzRXhwbGljaXRCZWdpblRpbWUoKSk7Ci0gICAgCi0g
ICAgLy8gQ29weSB0aGUgc3BlY2lmaWMgQmFzaWMgb3IgS2V5ZnJhbWUgdmFsdWVzLgotICAgIGlm
IChhbmltYXRpb25UeXBlKCkgPT0gS2V5ZnJhbWUpIHsKLSAgICAgICAgYW5pbWF0aW9uLT5jb3B5
VmFsdWVzRnJvbSgqdGhpcyk7Ci0gICAgICAgIGFuaW1hdGlvbi0+Y29weUtleVRpbWVzRnJvbSgq
dGhpcyk7Ci0gICAgICAgIGFuaW1hdGlvbi0+Y29weVRpbWluZ0Z1bmN0aW9uc0Zyb20oKnRoaXMp
OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFuaW1hdGlvbi0+Y29weUZyb21WYWx1ZUZyb20oKnRo
aXMpOwotICAgICAgICBhbmltYXRpb24tPmNvcHlUb1ZhbHVlRnJvbSgqdGhpcyk7Ci0gICAgfQot
ICAgIAotICAgIHJldHVybiBhbmltYXRpb247Ci19Ci0KLVBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU6OlBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUoQW5pbWF0aW9uVHlwZSB0eXBlLCBjb25zdCBT
dHJpbmcmIGtleVBhdGgpCi0gICAgOiBQbGF0Zm9ybUNBQW5pbWF0aW9uKHR5cGUpCi17Ci0gICAg
bV9wcm9wZXJ0aWVzLmtleVBhdGggPSBrZXlQYXRoOwotICAgIG1fcHJvcGVydGllcy5hbmltYXRp
b25UeXBlID0gdHlwZTsKLX0KLQotU3RyaW5nIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6Omtl
eVBhdGgoKSBjb25zdAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMua2V5UGF0aDsKLX0KLQot
Q0ZUaW1lSW50ZXJ2YWwgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6YmVnaW5UaW1lKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmJlZ2luVGltZTsKLX0KLQotdm9pZCBQbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRCZWdpblRpbWUoQ0ZUaW1lSW50ZXJ2YWwgdmFsdWUp
Ci17Ci0gICAgbV9wcm9wZXJ0aWVzLmJlZ2luVGltZSA9IHZhbHVlOwotICAgIAotICAgIC8vIEFs
c28gc2V0IGEgZmxhZyB0byB0ZWxsIHVzIGlmIHdlJ3ZlIHBhc3NlZCBpbiBhIDAgdmFsdWUuIAot
ICAgIC8vIFRoZSBmbGFnIGlzIG5lZWRlZCBiZWNhdXNlIGxhdGVyIGJlZ2luVGltZSB3aWxsIGdl
dCBjaGFuZ2VkCi0gICAgLy8gdG8gdGhlIHRpbWUgYXQgd2hpY2ggaXQgZmlyZWQgYW5kIHdlIG5l
ZWQgdG8ga25vdyB3aGV0aGVyCi0gICAgLy8gb3Igbm90IGl0IHdhcyAwIHRvIGJlZ2luIHdpdGgu
Ci0gICAgaWYgKHZhbHVlKQotICAgICAgICBtX3Byb3BlcnRpZXMuaGFzRXhwbGljaXRCZWdpblRp
bWUgPSB2YWx1ZTsKLX0KLQotQ0ZUaW1lSW50ZXJ2YWwgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90
ZTo6ZHVyYXRpb24oKSBjb25zdAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMuZHVyYXRpb247
Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0RHVyYXRpb24oQ0ZUaW1l
SW50ZXJ2YWwgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLmR1cmF0aW9uID0gdmFsdWU7Ci19
Ci0KLWZsb2F0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNwZWVkKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gbV9wcm9wZXJ0aWVzLnNwZWVkOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGU6OnNldFNwZWVkKGZsb2F0IHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5zcGVl
ZCA9IHZhbHVlOwotfQotCi1DRlRpbWVJbnRlcnZhbCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3Rl
Ojp0aW1lT2Zmc2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnRpbWVPZmZz
ZXQ7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VGltZU9mZnNldChD
RlRpbWVJbnRlcnZhbCB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMudGltZU9mZnNldCA9IHZh
bHVlOwotfQotCi1mbG9hdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpyZXBlYXRDb3VudCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5yZXBlYXRDb3VudDsKLX0KLQotdm9p
ZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRSZXBlYXRDb3VudChmbG9hdCB2YWx1ZSkK
LXsKLSAgICBtX3Byb3BlcnRpZXMucmVwZWF0Q291bnQgPSB2YWx1ZTsKLX0KLQotYm9vbCBQbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjphdXRvcmV2ZXJzZXMoKSBjb25zdAotewotICAgIHJldHVy
biBtX3Byb3BlcnRpZXMuYXV0b1JldmVyc2VzOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGU6OnNldEF1dG9yZXZlcnNlcyhib29sIHZhbHVlKQotewotICAgIG1fcHJvcGVydGll
cy5hdXRvUmV2ZXJzZXMgPSB2YWx1ZTsKLX0KLQotUGxhdGZvcm1DQUFuaW1hdGlvbjo6RmlsbE1v
ZGVUeXBlIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmZpbGxNb2RlKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gbV9wcm9wZXJ0aWVzLmZpbGxNb2RlOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmlt
YXRpb25SZW1vdGU6OnNldEZpbGxNb2RlKEZpbGxNb2RlVHlwZSB2YWx1ZSkKLXsKLSAgICBtX3By
b3BlcnRpZXMuZmlsbE1vZGUgPSB2YWx1ZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlOjpzZXRUaW1pbmdGdW5jdGlvbihjb25zdCBUaW1pbmdGdW5jdGlvbiogdmFsdWUsIGJv
b2wgcmV2ZXJzZSkKLXsKLSAgICBWZWN0b3I8UmVmUHRyPFRpbWluZ0Z1bmN0aW9uPj4gdGltaW5n
RnVuY3Rpb25zOwotICAgIHRpbWluZ0Z1bmN0aW9ucy5hcHBlbmQodmFsdWUtPmNsb25lKCkpOwot
Ci0gICAgbV9wcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucyA9IFdURk1vdmUodGltaW5nRnVuY3Rp
b25zKTsKLSAgICBtX3Byb3BlcnRpZXMucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyA9IHJldmVyc2U7
Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6Y29weVRpbWluZ0Z1bmN0aW9u
RnJvbShjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uJiB2YWx1ZSkKLXsKLSAgICBjb3B5VGltaW5n
RnVuY3Rpb25zRnJvbSh2YWx1ZSk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90
ZTo6aXNSZW1vdmVkT25Db21wbGV0aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0
aWVzLnJlbW92ZWRPbkNvbXBsZXRpb247Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6c2V0UmVtb3ZlZE9uQ29tcGxldGlvbihib29sIHZhbHVlKQotewotICAgIG1fcHJvcGVy
dGllcy5yZW1vdmVkT25Db21wbGV0aW9uID0gdmFsdWU7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZTo6aXNBZGRpdGl2ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVy
dGllcy5hZGRpdGl2ZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRB
ZGRpdGl2ZShib29sIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5hZGRpdGl2ZSA9IHZhbHVl
OwotfQotCi1QbGF0Zm9ybUNBQW5pbWF0aW9uOjpWYWx1ZUZ1bmN0aW9uVHlwZSBQbGF0Zm9ybUNB
QW5pbWF0aW9uUmVtb3RlOjp2YWx1ZUZ1bmN0aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9w
cm9wZXJ0aWVzLnZhbHVlRnVuY3Rpb247Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6c2V0VmFsdWVGdW5jdGlvbihWYWx1ZUZ1bmN0aW9uVHlwZSB2YWx1ZSkKLXsKLSAgICBt
X3Byb3BlcnRpZXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlOwotfQotCi12b2lkIFBsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGU6OnNldEZyb21WYWx1ZShmbG9hdCB2YWx1ZSkKLXsKLSAgICBpZiAoYW5p
bWF0aW9uVHlwZSgpICE9IEJhc2ljKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRp
ZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzBdID0g
S2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90
ZTo6c2V0RnJvbVZhbHVlKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB2YWx1ZSkKLXsKLSAg
ICBpZiAoYW5pbWF0aW9uVHlwZSgpICE9IEJhc2ljKQotICAgICAgICByZXR1cm47Ci0KLSAgICBt
X3Byb3BlcnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFs
dWVzWzBdID0gS2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1h
dGlvblJlbW90ZTo6c2V0RnJvbVZhbHVlKGNvbnN0IEZsb2F0UG9pbnQzRCYgdmFsdWUpCi17Ci0g
ICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
bV9wcm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZh
bHVlc1swXSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmlt
YXRpb25SZW1vdGU6OnNldEZyb21WYWx1ZShjb25zdCBDb2xvciYgdmFsdWUpCi17Ci0gICAgaWYg
KGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9w
ZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1sw
XSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OnNldEZyb21WYWx1ZShjb25zdCBGaWx0ZXJPcGVyYXRpb24qIG9wZXJhdGlvbiwgaW50
IGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCkKLXsKLSAgICBpZiAoYW5pbWF0aW9uVHlwZSgp
ICE9IEJhc2ljKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVz
LnJlc2l6ZSgyKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzBdID0gS2V5ZnJhbWVWYWx1
ZShvcGVyYXRpb24tPmNsb25lKCkpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU6OmNvcHlGcm9tVmFsdWVGcm9tKGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb24mIHZhbHVlKQot
ewotICAgIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUmIG90aGVyID0gZG93bmNhc3Q8
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4odmFsdWUpOwotCi0gICAgaWYgKG90aGVyLm1fcHJv
cGVydGllcy5rZXlWYWx1ZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAg
bV9wcm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZh
bHVlc1swXSA9IG90aGVyLm1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMF07Ci19Ci0KLXZvaWQgUGxh
dGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VG9WYWx1ZShmbG9hdCB2YWx1ZSkKLXsKLSAgICBp
ZiAoYW5pbWF0aW9uVHlwZSgpICE9IEJhc2ljKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3By
b3BlcnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVz
WzFdID0gS2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlv
blJlbW90ZTo6c2V0VG9WYWx1ZShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdmFsdWUpCi17
Ci0gICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtl
eVZhbHVlc1sxXSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGU6OnNldFRvVmFsdWUoY29uc3QgRmxvYXRQb2ludDNEJiB2YWx1ZSkKLXsK
LSAgICBpZiAoYW5pbWF0aW9uVHlwZSgpICE9IEJhc2ljKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5
VmFsdWVzWzFdID0gS2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZTo6c2V0VG9WYWx1ZShjb25zdCBDb2xvciYgdmFsdWUpCi17Ci0gICAgaWYg
KGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9w
ZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1sx
XSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OnNldFRvVmFsdWUoY29uc3QgRmlsdGVyT3BlcmF0aW9uKiBvcGVyYXRpb24sIGludCBp
bnRlcm5hbEZpbHRlclByb3BlcnR5SW5kZXgpCi17Ci0gICAgaWYgKGFuaW1hdGlvblR5cGUoKSAh
PSBCYXNpYykKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIFVOVVNFRF9QQVJBTShpbnRlcm5h
bEZpbHRlclByb3BlcnR5SW5kZXgpOwotICAgIEFTU0VSVChvcGVyYXRpb24pOwotICAgIG1fcHJv
cGVydGllcy5rZXlWYWx1ZXMucmVzaXplKDIpOwotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXNb
MV0gPSBLZXlmcmFtZVZhbHVlKG9wZXJhdGlvbi0+Y2xvbmUoKSk7Ci19Ci0KLXZvaWQgUGxhdGZv
cm1DQUFuaW1hdGlvblJlbW90ZTo6Y29weVRvVmFsdWVGcm9tKGNvbnN0IFBsYXRmb3JtQ0FBbmlt
YXRpb24mIHZhbHVlKQotewotICAgIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUmIG90
aGVyID0gZG93bmNhc3Q8UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4odmFsdWUpOwotCi0gICAg
aWYgKG90aGVyLm1fcHJvcGVydGllcy5rZXlWYWx1ZXMuc2l6ZSgpIDwgMikKLSAgICAgICAgcmV0
dXJuOwotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMucmVzaXplKDIpOwotICAgIG1fcHJvcGVy
dGllcy5rZXlWYWx1ZXNbMV0gPSBvdGhlci5tX3Byb3BlcnRpZXMua2V5VmFsdWVzWzFdOwotfQot
Ci0vLyBLZXlmcmFtZS1hbmltYXRpb24gcHJvcGVydGllcy4KLXZvaWQgUGxhdGZvcm1DQUFuaW1h
dGlvblJlbW90ZTo6c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxmbG9hdD4mIHZhbHVlcykKLXsKLSAg
ICBpZiAoYW5pbWF0aW9uVHlwZSgpICE9IEtleWZyYW1lKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBWZWN0b3I8S2V5ZnJhbWVWYWx1ZT4ga2V5ZnJhbWVzOwotICAgIGtleWZyYW1lcy5yZXNlcnZl
SW5pdGlhbENhcGFjaXR5KHZhbHVlcy5zaXplKCkpOwotICAgIAotICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgdmFsdWVzLnNpemUoKTsgKytpKQotICAgICAgICBrZXlmcmFtZXMudW5jaGVja2Vk
QXBwZW5kKEtleWZyYW1lVmFsdWUodmFsdWVzW2ldKSk7Ci0gICAgCi0gICAgbV9wcm9wZXJ0aWVz
LmtleVZhbHVlcyA9IFdURk1vdmUoa2V5ZnJhbWVzKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5p
bWF0aW9uUmVtb3RlOjpzZXRWYWx1ZXMoY29uc3QgVmVjdG9yPFRyYW5zZm9ybWF0aW9uTWF0cml4
PiYgdmFsdWVzKQotewotICAgIGlmIChhbmltYXRpb25UeXBlKCkgIT0gS2V5ZnJhbWUpCi0gICAg
ICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgVmVjdG9yPEtleWZyYW1lVmFsdWU+IGtleWZyYW1l
czsKLSAgICBrZXlmcmFtZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eSh2YWx1ZXMuc2l6ZSgpKTsK
LSAgICAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7ICsraSkKLSAg
ICAgICAga2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlmcmFtZVZhbHVlKHZhbHVlc1tpXSkp
OwotICAgIAotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMgPSBXVEZNb3ZlKGtleWZyYW1lcyk7
Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VmFsdWVzKGNvbnN0IFZl
Y3RvcjxGbG9hdFBvaW50M0Q+JiB2YWx1ZXMpCi17Ci0gICAgaWYgKGFuaW1hdGlvblR5cGUoKSAh
PSBLZXlmcmFtZSkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBWZWN0b3I8S2V5ZnJh
bWVWYWx1ZT4ga2V5ZnJhbWVzOwotICAgIGtleWZyYW1lcy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5
KHZhbHVlcy5zaXplKCkpOwotICAgIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWVz
LnNpemUoKTsgKytpKQotICAgICAgICBrZXlmcmFtZXMudW5jaGVja2VkQXBwZW5kKEtleWZyYW1l
VmFsdWUodmFsdWVzW2ldKSk7Ci0gICAgCi0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcyA9IFdU
Rk1vdmUoa2V5ZnJhbWVzKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpz
ZXRWYWx1ZXMoY29uc3QgVmVjdG9yPENvbG9yPiYgdmFsdWVzKQotewotICAgIGlmIChhbmltYXRp
b25UeXBlKCkgIT0gS2V5ZnJhbWUpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgVmVj
dG9yPEtleWZyYW1lVmFsdWU+IGtleWZyYW1lczsKLSAgICBrZXlmcmFtZXMucmVzZXJ2ZUluaXRp
YWxDYXBhY2l0eSh2YWx1ZXMuc2l6ZSgpKTsKLSAgICAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IHZhbHVlcy5zaXplKCk7ICsraSkKLSAgICAgICAga2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVu
ZChLZXlmcmFtZVZhbHVlKHZhbHVlc1tpXSkpOwotICAgIAotICAgIG1fcHJvcGVydGllcy5rZXlW
YWx1ZXMgPSBXVEZNb3ZlKGtleWZyYW1lcyk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlv
blJlbW90ZTo6c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPj4m
IHZhbHVlcywgaW50IGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCkKLXsKLSAgICBVTlVTRURf
UEFSQU0oaW50ZXJuYWxGaWx0ZXJQcm9wZXJ0eUluZGV4KTsKLSAgICAKLSAgICBpZiAoYW5pbWF0
aW9uVHlwZSgpICE9IEtleWZyYW1lKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIFZl
Y3RvcjxLZXlmcmFtZVZhbHVlPiBrZXlmcmFtZXM7Ci0gICAga2V5ZnJhbWVzLnJlc2VydmVJbml0
aWFsQ2FwYWNpdHkodmFsdWVzLnNpemUoKSk7Ci0gICAgCi0gICAgZm9yIChhdXRvJiB2YWx1ZSA6
IHZhbHVlcykKLSAgICAgICAga2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlmcmFtZVZhbHVl
IHsgdmFsdWUuY29weVJlZigpIH0pOwotICAgIAotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMg
PSBXVEZNb3ZlKGtleWZyYW1lcyk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90
ZTo6Y29weVZhbHVlc0Zyb20oY29uc3QgUGxhdGZvcm1DQUFuaW1hdGlvbiYgdmFsdWUpCi17Ci0g
ICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcyA9IGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU+KHZhbHVlKS5tX3Byb3BlcnRpZXMua2V5VmFsdWVzOwotfQotCi12b2lkIFBsYXRmb3Jt
Q0FBbmltYXRpb25SZW1vdGU6OnNldEtleVRpbWVzKGNvbnN0IFZlY3RvcjxmbG9hdD4mIGtleVRp
bWVzKQotewotICAgIG1fcHJvcGVydGllcy5rZXlUaW1lcyA9IGtleVRpbWVzOwotfQotCi12b2lk
IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNvcHlLZXlUaW1lc0Zyb20oY29uc3QgUGxhdGZv
cm1DQUFuaW1hdGlvbiYgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVRpbWVzID0gZG93
bmNhc3Q8UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4odmFsdWUpLm1fcHJvcGVydGllcy5rZXlU
aW1lczsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRUaW1pbmdGdW5j
dGlvbnMoY29uc3QgVmVjdG9yPGNvbnN0IFRpbWluZ0Z1bmN0aW9uKj4mIHZhbHVlcywgYm9vbCBy
ZXZlcnNlKQotewotICAgIFZlY3RvcjxSZWZQdHI8V2ViQ29yZTo6VGltaW5nRnVuY3Rpb24+PiB0
aW1pbmdGdW5jdGlvbnM7Ci0gICAgdGltaW5nRnVuY3Rpb25zLnJlc2VydmVJbml0aWFsQ2FwYWNp
dHkodmFsdWVzLnNpemUoKSk7Ci0gICAgCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1
ZXMuc2l6ZSgpOyArK2kpCi0gICAgICAgIHRpbWluZ0Z1bmN0aW9ucy51bmNoZWNrZWRBcHBlbmQo
dmFsdWVzW2ldLT5jbG9uZSgpKTsKLSAgICAKLSAgICBtX3Byb3BlcnRpZXMudGltaW5nRnVuY3Rp
b25zID0gV1RGTW92ZSh0aW1pbmdGdW5jdGlvbnMpOwotICAgIG1fcHJvcGVydGllcy5yZXZlcnNl
VGltaW5nRnVuY3Rpb25zID0gcmV2ZXJzZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlOjpjb3B5VGltaW5nRnVuY3Rpb25zRnJvbShjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9u
JiB2YWx1ZSkKLXsKLSAgICBjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlJiBvdGhlciA9
IGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KHZhbHVlKTsKLQotICAgIG1fcHJv
cGVydGllcy50aW1pbmdGdW5jdGlvbnMgPSBvdGhlci5tX3Byb3BlcnRpZXMudGltaW5nRnVuY3Rp
b25zOwotICAgIG1fcHJvcGVydGllcy5yZXZlcnNlVGltaW5nRnVuY3Rpb25zID0gb3RoZXIubV9w
cm9wZXJ0aWVzLnJldmVyc2VUaW1pbmdGdW5jdGlvbnM7Ci19Ci0KLXN0YXRpYyBOU09iamVjdCog
YW5pbWF0aW9uVmFsdWVGcm9tS2V5ZnJhbWVWYWx1ZShjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlOjpLZXlmcmFtZVZhbHVlJiBrZXlmcmFtZVZhbHVlKQotewotICAgIHN3aXRjaCAoa2V5
ZnJhbWVWYWx1ZS5rZXlmcmFtZVR5cGUoKSkgewotICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlv
blJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6TnVtYmVyS2V5VHlwZToKLSAgICAgICAgcmV0dXJuIEAo
a2V5ZnJhbWVWYWx1ZS5udW1iZXJWYWx1ZSgpKTsKLSAgICAgICAgICAgIAotICAgIGNhc2UgUGxh
dGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6Q29sb3JLZXlUeXBlOiB7Ci0g
ICAgICAgIENvbG9yIGNvbG9yID0ga2V5ZnJhbWVWYWx1ZS5jb2xvclZhbHVlKCk7Ci0gICAgICAg
IHJldHVybiBAWyBAKGNvbG9yLnJlZCgpKSwgQChjb2xvci5ncmVlbigpKSwgQChjb2xvci5ibHVl
KCkpLCBAKGNvbG9yLmFscGhhKCkpIF07Ci0gICAgfQotCi0gICAgY2FzZSBQbGF0Zm9ybUNBQW5p
bWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVlOjpQb2ludEtleVR5cGU6IHsKLSAgICAgICAgRmxv
YXRQb2ludDNEIHBvaW50ID0ga2V5ZnJhbWVWYWx1ZS5wb2ludFZhbHVlKCk7Ci0gICAgICAgIHJl
dHVybiBAWyBAKHBvaW50LngoKSksIEAocG9pbnQueSgpKSwgQChwb2ludC56KCkpIF07Ci0gICAg
fQotICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6VHJh
bnNmb3JtS2V5VHlwZToKLSAgICAgICAgcmV0dXJuIFtOU1ZhbHVlIHZhbHVlV2l0aENBVHJhbnNm
b3JtM0Q6a2V5ZnJhbWVWYWx1ZS50cmFuc2Zvcm1WYWx1ZSgpXTsKLSAgICAgICAgICAgIAotICAg
IGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6RmlsdGVyS2V5
VHlwZToKLSAgICAgICAgcmV0dXJuIFBsYXRmb3JtQ0FGaWx0ZXJzOjpmaWx0ZXJWYWx1ZUZvck9w
ZXJhdGlvbihrZXlmcmFtZVZhbHVlLmZpbHRlclZhbHVlKCksIDAgLyogdW51c2VkICovKS5hdXRv
cmVsZWFzZSgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYWRkQW5pbWF0aW9uVG9MYXllcihD
QUxheWVyICpsYXllciwgUmVtb3RlTGF5ZXJUcmVlSG9zdCogbGF5ZXJUcmVlSG9zdCwgY29uc3Qg
U3RyaW5nJiBrZXksIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXMm
IHByb3BlcnRpZXMpCi17Ci0gICAgUmV0YWluUHRyPENBUHJvcGVydHlBbmltYXRpb24+IGNhQW5p
bWF0aW9uOwotICAgIHN3aXRjaCAocHJvcGVydGllcy5hbmltYXRpb25UeXBlKSB7Ci0gICAgY2Fz
ZSBQbGF0Zm9ybUNBQW5pbWF0aW9uOjpCYXNpYzogewotICAgICAgICBSZXRhaW5QdHI8Q0FCYXNp
Y0FuaW1hdGlvbj4gYmFzaWNBbmltYXRpb247Ci0gICAgICAgIGJhc2ljQW5pbWF0aW9uID0gW0NB
QmFzaWNBbmltYXRpb24gYW5pbWF0aW9uV2l0aEtleVBhdGg6cHJvcGVydGllcy5rZXlQYXRoXTsK
LSAgICAgICAgCi0gICAgICAgIGlmIChwcm9wZXJ0aWVzLmtleVZhbHVlcy5zaXplKCkgPiAxKSB7
Ci0gICAgICAgICAgICBbYmFzaWNBbmltYXRpb24gc2V0RnJvbVZhbHVlOmFuaW1hdGlvblZhbHVl
RnJvbUtleWZyYW1lVmFsdWUocHJvcGVydGllcy5rZXlWYWx1ZXNbMF0pXTsKLSAgICAgICAgICAg
IFtiYXNpY0FuaW1hdGlvbiBzZXRUb1ZhbHVlOmFuaW1hdGlvblZhbHVlRnJvbUtleWZyYW1lVmFs
dWUocHJvcGVydGllcy5rZXlWYWx1ZXNbMV0pXTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAg
ICAgaWYgKHByb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zLnNpemUoKSkKLSAgICAgICAgICAgIFti
YXNpY0FuaW1hdGlvbiBzZXRUaW1pbmdGdW5jdGlvbjp0b0NBTWVkaWFUaW1pbmdGdW5jdGlvbihw
cm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9uc1swXS5nZXQoKSwgcHJvcGVydGllcy5yZXZlcnNlVGlt
aW5nRnVuY3Rpb25zKV07Ci0gICAgICAgIAotICAgICAgICBjYUFuaW1hdGlvbiA9IGJhc2ljQW5p
bWF0aW9uOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBQbGF0Zm9ybUNBQW5pbWF0
aW9uOjpLZXlmcmFtZTogewotICAgICAgICBSZXRhaW5QdHI8Q0FLZXlmcmFtZUFuaW1hdGlvbj4g
a2V5ZnJhbWVBbmltYXRpb247Ci0gICAgICAgIGtleWZyYW1lQW5pbWF0aW9uID0gW0NBS2V5ZnJh
bWVBbmltYXRpb24gYW5pbWF0aW9uV2l0aEtleVBhdGg6cHJvcGVydGllcy5rZXlQYXRoXTsKLQot
ICAgICAgICBpZiAocHJvcGVydGllcy5rZXlWYWx1ZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBS
ZXRhaW5QdHI8TlNNdXRhYmxlQXJyYXk+IGtleWZyYW1lcyA9IGFkb3B0TlMoW1tOU011dGFibGVB
cnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpwcm9wZXJ0aWVzLmtleVZhbHVlcy5zaXplKCld
KTsKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdmFsdWUgOiBwcm9wZXJ0aWVzLmtleVZh
bHVlcykKLSAgICAgICAgICAgICAgICBba2V5ZnJhbWVzIGFkZE9iamVjdDphbmltYXRpb25WYWx1
ZUZyb21LZXlmcmFtZVZhbHVlKHZhbHVlKV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFtr
ZXlmcmFtZUFuaW1hdGlvbiBzZXRWYWx1ZXM6a2V5ZnJhbWVzLmdldCgpXTsKLSAgICAgICAgfQot
Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzLmtleVRpbWVzLnNpemUoKSkgewotICAgICAgICAgICAg
UmV0YWluUHRyPE5TTXV0YWJsZUFycmF5PiBrZXlUaW1lcyA9IGFkb3B0TlMoW1tOU011dGFibGVB
cnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpwcm9wZXJ0aWVzLmtleVRpbWVzLnNpemUoKV0p
OwotICAgICAgICAgICAgZm9yIChhdXRvIGtleVRpbWUgOiBwcm9wZXJ0aWVzLmtleVRpbWVzKQot
ICAgICAgICAgICAgICAgIFtrZXlUaW1lcyBhZGRPYmplY3Q6QChrZXlUaW1lKV07Ci0gICAgICAg
ICAgICAKLSAgICAgICAgICAgIFtrZXlmcmFtZUFuaW1hdGlvbiBzZXRLZXlUaW1lczprZXlUaW1l
cy5nZXQoKV07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvcGVydGllcy50aW1pbmdGdW5j
dGlvbnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBSZXRhaW5QdHI8TlNNdXRhYmxlQXJyYXk+IHRp
bWluZ0Z1bmN0aW9ucyA9IGFkb3B0TlMoW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhD
YXBhY2l0eTpwcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucy5zaXplKCldKTsKLSAgICAgICAgICAg
IGZvciAoY29uc3QgYXV0byYgdGltaW5nRnVuY3Rpb24gOiBwcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0
aW9ucykKLSAgICAgICAgICAgICAgICBbdGltaW5nRnVuY3Rpb25zIGFkZE9iamVjdDp0b0NBTWVk
aWFUaW1pbmdGdW5jdGlvbih0aW1pbmdGdW5jdGlvbi5nZXQoKSwgcHJvcGVydGllcy5yZXZlcnNl
VGltaW5nRnVuY3Rpb25zKV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFtrZXlmcmFtZUFu
aW1hdGlvbiBzZXRUaW1pbmdGdW5jdGlvbnM6dGltaW5nRnVuY3Rpb25zLmdldCgpXTsKLSAgICAg
ICAgfQotICAgICAgICAKLSAgICAgICAgY2FBbmltYXRpb24gPSBrZXlmcmFtZUFuaW1hdGlvbjsK
LSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvbjo6U3By
aW5nOiB7Ci0gICAgICAgIFJldGFpblB0cjxDQVNwcmluZ0FuaW1hdGlvbj4gc3ByaW5nQW5pbWF0
aW9uOwotICAgICAgICBzcHJpbmdBbmltYXRpb24gPSBbQ0FTcHJpbmdBbmltYXRpb24gYW5pbWF0
aW9uV2l0aEtleVBhdGg6cHJvcGVydGllcy5rZXlQYXRoXTsKLSAgICAgICAgCi0gICAgICAgIGlm
IChwcm9wZXJ0aWVzLmtleVZhbHVlcy5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICBbc3ByaW5n
QW5pbWF0aW9uIHNldEZyb21WYWx1ZTphbmltYXRpb25WYWx1ZUZyb21LZXlmcmFtZVZhbHVlKHBy
b3BlcnRpZXMua2V5VmFsdWVzWzBdKV07Ci0gICAgICAgICAgICBbc3ByaW5nQW5pbWF0aW9uIHNl
dFRvVmFsdWU6YW5pbWF0aW9uVmFsdWVGcm9tS2V5ZnJhbWVWYWx1ZShwcm9wZXJ0aWVzLmtleVZh
bHVlc1sxXSldOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocHJvcGVydGllcy50
aW1pbmdGdW5jdGlvbnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBhdXRvJiB0aW1pbmdGdW5jdGlv
biA9IHByb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zWzBdOwotICAgICAgICAgICAgaWYgKHRpbWlu
Z0Z1bmN0aW9uLT5pc1NwcmluZ1RpbWluZ0Z1bmN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBh
dXRvJiBmdW5jdGlvbiA9ICpzdGF0aWNfY2FzdDxjb25zdCBTcHJpbmdUaW1pbmdGdW5jdGlvbio+
KHRpbWluZ0Z1bmN0aW9uLmdldCgpKTsKLSAgICAgICAgICAgICAgICBbc3ByaW5nQW5pbWF0aW9u
IHNldE1hc3M6ZnVuY3Rpb24ubWFzcygpXTsKLSAgICAgICAgICAgICAgICBbc3ByaW5nQW5pbWF0
aW9uIHNldFN0aWZmbmVzczpmdW5jdGlvbi5zdGlmZm5lc3MoKV07Ci0gICAgICAgICAgICAgICAg
W3NwcmluZ0FuaW1hdGlvbiBzZXREYW1waW5nOmZ1bmN0aW9uLmRhbXBpbmcoKV07Ci0gICAgICAg
ICAgICAgICAgW3NwcmluZ0FuaW1hdGlvbiBzZXRJbml0aWFsVmVsb2NpdHk6ZnVuY3Rpb24uaW5p
dGlhbFZlbG9jaXR5KCldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhQW5p
bWF0aW9uID0gc3ByaW5nQW5pbWF0aW9uOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgfQot
ICAgIAotICAgIFtjYUFuaW1hdGlvbiBzZXRCZWdpblRpbWU6cHJvcGVydGllcy5iZWdpblRpbWVd
OwotICAgIFtjYUFuaW1hdGlvbiBzZXREdXJhdGlvbjpwcm9wZXJ0aWVzLmR1cmF0aW9uXTsKLSAg
ICBbY2FBbmltYXRpb24gc2V0VGltZU9mZnNldDpwcm9wZXJ0aWVzLnRpbWVPZmZzZXRdOwotICAg
IFtjYUFuaW1hdGlvbiBzZXRSZXBlYXRDb3VudDpwcm9wZXJ0aWVzLnJlcGVhdENvdW50XTsKLSAg
ICBbY2FBbmltYXRpb24gc2V0U3BlZWQ6cHJvcGVydGllcy5zcGVlZF07Ci0gICAgW2NhQW5pbWF0
aW9uIHNldEF1dG9yZXZlcnNlczpwcm9wZXJ0aWVzLmF1dG9SZXZlcnNlc107Ci0gICAgW2NhQW5p
bWF0aW9uIHNldFJlbW92ZWRPbkNvbXBsZXRpb246cHJvcGVydGllcy5yZW1vdmVkT25Db21wbGV0
aW9uXTsKLSAgICBbY2FBbmltYXRpb24gc2V0QWRkaXRpdmU6cHJvcGVydGllcy5hZGRpdGl2ZV07
Ci0gICAgCi0gICAgaWYgKHByb3BlcnRpZXMuZmlsbE1vZGUgIT0gUGxhdGZvcm1DQUFuaW1hdGlv
bjo6Tm9GaWxsTW9kZSkKLSAgICAgICAgW2NhQW5pbWF0aW9uIHNldEZpbGxNb2RlOnRvQ0FGaWxs
TW9kZVR5cGUocHJvcGVydGllcy5maWxsTW9kZSldOwotCi0gICAgaWYgKHByb3BlcnRpZXMudmFs
dWVGdW5jdGlvbiAhPSBQbGF0Zm9ybUNBQW5pbWF0aW9uOjpOb1ZhbHVlRnVuY3Rpb24pCi0gICAg
ICAgIFtjYUFuaW1hdGlvbiBzZXRWYWx1ZUZ1bmN0aW9uOltDQVZhbHVlRnVuY3Rpb24gZnVuY3Rp
b25XaXRoTmFtZTp0b0NBVmFsdWVGdW5jdGlvblR5cGUocHJvcGVydGllcy52YWx1ZUZ1bmN0aW9u
KV1dOwotICAgIAotICAgIGlmIChwcm9wZXJ0aWVzLmhhc0V4cGxpY2l0QmVnaW5UaW1lKQotICAg
ICAgICBbY2FBbmltYXRpb24gc2V0VmFsdWU6QFlFUyBmb3JLZXk6V0tFeHBsaWNpdEJlZ2luVGlt
ZUZsYWddOwotICAgIAotICAgIGlmIChsYXllclRyZWVIb3N0KSB7Ci0gICAgICAgIEdyYXBoaWNz
TGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCBsYXllcklEID0gUmVtb3RlTGF5ZXJUcmVlSG9zdDo6bGF5
ZXJJRChsYXllcik7Ci0gICAgCi0gICAgICAgIFJldGFpblB0cjxXS0FuaW1hdGlvbkRlbGVnYXRl
PiYgZGVsZWdhdGUgPSBsYXllclRyZWVIb3N0LT5hbmltYXRpb25EZWxlZ2F0ZXMoKS5hZGQobGF5
ZXJJRCwgbnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOwotICAgICAgICBpZiAoIWRlbGVnYXRlKQot
ICAgICAgICAgICAgZGVsZWdhdGUgPSBhZG9wdE5TKFtbV0tBbmltYXRpb25EZWxlZ2F0ZSBhbGxv
Y10gaW5pdFdpdGhMYXllcklEOmxheWVySUQgbGF5ZXJUcmVlSG9zdDpsYXllclRyZWVIb3N0XSk7
Ci0KLSAgICAgICAgW2NhQW5pbWF0aW9uIHNldERlbGVnYXRlOmRlbGVnYXRlLmdldCgpXTsKLSAg
ICB9Ci0gICAgCi0gICAgW2xheWVyIGFkZEFuaW1hdGlvbjpjYUFuaW1hdGlvbi5nZXQoKSBmb3JL
ZXk6a2V5XTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjp1cGRhdGVMYXll
ckFuaW1hdGlvbnMoQ0FMYXllciAqbGF5ZXIsIFJlbW90ZUxheWVyVHJlZUhvc3QqIGxheWVyVHJl
ZUhvc3QsIGNvbnN0IEFuaW1hdGlvbnNMaXN0JiBhbmltYXRpb25zVG9BZGQsIGNvbnN0IEhhc2hT
ZXQ8U3RyaW5nPiYgYW5pbWF0aW9uc1RvUmVtb3ZlKQotewotICAgIEJFR0lOX0JMT0NLX09CSkNf
RVhDRVBUSU9OUzsKLQotICAgIGZvciAoY29uc3QgYXV0byYgdmFsdWUgOiBhbmltYXRpb25zVG9S
ZW1vdmUpCi0gICAgICAgIFtsYXllciByZW1vdmVBbmltYXRpb25Gb3JLZXk6dmFsdWVdOwotCi0g
ICAgZm9yIChjb25zdCBhdXRvJiBrZXlBbmltYXRpb25QYWlyIDogYW5pbWF0aW9uc1RvQWRkKQot
ICAgICAgICBhZGRBbmltYXRpb25Ub0xheWVyKGxheWVyLCBsYXllclRyZWVIb3N0LCBrZXlBbmlt
YXRpb25QYWlyLmZpcnN0LCBrZXlBbmltYXRpb25QYWlyLnNlY29uZCk7Ci0KLSAgICBFTkRfQkxP
Q0tfT0JKQ19FWENFUFRJT05TOwotfQotCi1UZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFRleHRTdHJl
YW0mdHMsIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWUmIHZh
bHVlKQotewotICAgIHN3aXRjaCAodmFsdWUua2V5ZnJhbWVUeXBlKCkpIHsKLSAgICBjYXNlIFBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6Ok51bWJlcktleVR5cGU6Ci0g
ICAgICAgIHRzIDw8ICJudW1iZXI9IiA8PCB2YWx1ZS5udW1iZXJWYWx1ZSgpOwotICAgICAgICBi
cmVhazsKLSAgICBjYXNlIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6
OkNvbG9yS2V5VHlwZToKLSAgICAgICAgdHMgPDwgImNvbG9yPSI7Ci0gICAgICAgIHRzIDw8IHZh
bHVlLmNvbG9yVmFsdWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQbGF0Zm9ybUNBQW5p
bWF0aW9uUmVtb3RlOjpLZXlmcmFtZVZhbHVlOjpQb2ludEtleVR5cGU6Ci0gICAgICAgIHRzIDw8
ICJwb2ludD0iOwotICAgICAgICB0cyA8PCB2YWx1ZS5wb2ludFZhbHVlKCk7Ci0gICAgICAgIGJy
ZWFrOwotICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6
VHJhbnNmb3JtS2V5VHlwZToKLSAgICAgICAgdHMgPDwgInRyYW5zZm9ybT0iOwotICAgICAgICB0
cyA8PCB2YWx1ZS50cmFuc2Zvcm1WYWx1ZSgpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6OkZpbHRlcktleVR5cGU6Ci0g
ICAgICAgIHRzIDw8ICJmaWx0ZXI9IjsKLSAgICAgICAgaWYgKHZhbHVlLmZpbHRlclZhbHVlKCkp
Ci0gICAgICAgICAgICB0cyA8PCAqdmFsdWUuZmlsdGVyVmFsdWUoKTsKLSAgICAgICAgZWxzZQot
ICAgICAgICAgICAgdHMgPDwgIm51bGwiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0
dXJuIHRzOwotfQotCi1UZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFRleHRTdHJlYW0mIHRzLCBjb25z
dCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpQcm9wZXJ0aWVzJiBhbmltYXRpb24pCi17Ci0g
ICAgdHMgPDwgInR5cGU9IjsKLSAgICB0cyA8PCBhbmltYXRpb24uYW5pbWF0aW9uVHlwZTsKLSAg
ICB0cyA8PCAiIGtleVBhdGg9IjsKLSAgICB0cyA8PCBhbmltYXRpb24ua2V5UGF0aDsKLQotICAg
IGlmIChhbmltYXRpb24uYmVnaW5UaW1lKQotICAgICAgICB0cy5kdW1wUHJvcGVydHkoImJlZ2lu
VGltZSIsIGFuaW1hdGlvbi5iZWdpblRpbWUpOwotCi0gICAgaWYgKGFuaW1hdGlvbi5kdXJhdGlv
bikKLSAgICAgICAgdHMuZHVtcFByb3BlcnR5KCJkdXJhdGlvbiIsIGFuaW1hdGlvbi5kdXJhdGlv
bik7Ci0KLSAgICBpZiAoYW5pbWF0aW9uLnRpbWVPZmZzZXQpCi0gICAgICAgIHRzLmR1bXBQcm9w
ZXJ0eSgidGltZU9mZnNldCIsIGFuaW1hdGlvbi50aW1lT2Zmc2V0KTsKLQotICAgIHRzLmR1bXBQ
cm9wZXJ0eSgicmVwZWF0Q291bnQiLCBhbmltYXRpb24ucmVwZWF0Q291bnQpOwotCi0gICAgaWYg
KGFuaW1hdGlvbi5zcGVlZCAhPSAxKQotICAgICAgICB0cy5kdW1wUHJvcGVydHkoInNwZWVkIiwg
YW5pbWF0aW9uLnNwZWVkKTsKLQotICAgIHRzLmR1bXBQcm9wZXJ0eSgiZmlsbE1vZGUiLCBhbmlt
YXRpb24uZmlsbE1vZGUpOwotICAgIHRzLmR1bXBQcm9wZXJ0eSgidmFsdWVGdW5jdGlvbiIsIGFu
aW1hdGlvbi52YWx1ZUZ1bmN0aW9uKTsKLQotICAgIGlmIChhbmltYXRpb24uYXV0b1JldmVyc2Vz
KQotICAgICAgICB0cy5kdW1wUHJvcGVydHkoImF1dG9SZXZlcnNlcyIsIGFuaW1hdGlvbi5hdXRv
UmV2ZXJzZXMpOwotCi0gICAgaWYgKCFhbmltYXRpb24ucmVtb3ZlZE9uQ29tcGxldGlvbikKLSAg
ICAgICAgdHMuZHVtcFByb3BlcnR5KCJyZW1vdmVkT25Db21wbGV0aW9uIiwgYW5pbWF0aW9uLnJl
bW92ZWRPbkNvbXBsZXRpb24pOwotCi0gICAgaWYgKGFuaW1hdGlvbi5hZGRpdGl2ZSkKLSAgICAg
ICAgdHMuZHVtcFByb3BlcnR5KCJhZGRpdGl2ZSIsIGFuaW1hdGlvbi5hZGRpdGl2ZSk7Ci0KLSAg
ICBpZiAoYW5pbWF0aW9uLnJldmVyc2VUaW1pbmdGdW5jdGlvbnMpCi0gICAgICAgIHRzLmR1bXBQ
cm9wZXJ0eSgicmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyIsIGFuaW1hdGlvbi5yZXZlcnNlVGltaW5n
RnVuY3Rpb25zKTsKLQotICAgIGlmIChhbmltYXRpb24uaGFzRXhwbGljaXRCZWdpblRpbWUpCi0g
ICAgICAgIHRzLmR1bXBQcm9wZXJ0eSgiaGFzRXhwbGljaXRCZWdpblRpbWUiLCBhbmltYXRpb24u
aGFzRXhwbGljaXRCZWdpblRpbWUpOwotCi0gICAgdHMgPDwgIlxuIjsKLSAgICB0cy5pbmNyZWFz
ZUluZGVudCgpOwotICAgIHRzLndyaXRlSW5kZW50KCk7Ci0gICAgdHMgPDwgIigiIDw8ICJrZXlm
cmFtZXMiOwotICAgIHRzLmluY3JlYXNlSW5kZW50KCk7Ci0KLSAgICBzaXplX3QgbWF4RnJhbWVz
ID0gc3RkOjptYXgoYW5pbWF0aW9uLmtleVZhbHVlcy5zaXplKCksIGFuaW1hdGlvbi5rZXlUaW1l
cy5zaXplKCkpOwotICAgIG1heEZyYW1lcyA9IHN0ZDo6bWF4KG1heEZyYW1lcywgYW5pbWF0aW9u
LnRpbWluZ0Z1bmN0aW9ucy5zaXplKCkpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBt
YXhGcmFtZXM7ICsraSkgewotICAgICAgICB0cyA8PCAiXG4iOwotICAgICAgICB0cy53cml0ZUlu
ZGVudCgpOwotICAgICAgICB0cyA8PCAiKGtleWZyYW1lICIgPDwgdW5zaWduZWQoaSk7Ci0gICAg
ICAgIGlmIChpIDwgYW5pbWF0aW9uLmtleVRpbWVzLnNpemUoKSkKLSAgICAgICAgICAgIHRzLmR1
bXBQcm9wZXJ0eSgidGltZSIsIGFuaW1hdGlvbi5rZXlUaW1lc1tpXSk7Ci0KLSAgICAgICAgaWYg
KGkgPCBhbmltYXRpb24udGltaW5nRnVuY3Rpb25zLnNpemUoKSAmJiBhbmltYXRpb24udGltaW5n
RnVuY3Rpb25zW2ldKQotICAgICAgICAgICAgdHMuZHVtcFByb3BlcnR5PGNvbnN0IFRpbWluZ0Z1
bmN0aW9uJj4oInRpbWluZyBmdW5jdGlvbiIsICphbmltYXRpb24udGltaW5nRnVuY3Rpb25zW2ld
KTsKLQotICAgICAgICBpZiAoaSA8IGFuaW1hdGlvbi5rZXlWYWx1ZXMuc2l6ZSgpKQotICAgICAg
ICAgICAgdHMuZHVtcFByb3BlcnR5KCJ2YWx1ZSIsIGFuaW1hdGlvbi5rZXlWYWx1ZXNbaV0pOwot
Ci0gICAgICAgIHRzIDw8ICIpIjsKLSAgICB9Ci0KLSAgICB0cy5kZWNyZWFzZUluZGVudCgpOwot
ICAgIHRzLmRlY3JlYXNlSW5kZW50KCk7Ci0KLSAgICByZXR1cm4gdHM7Ci19Ci0KLX0gLy8gbmFt
ZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBh
Z2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nl
c3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlLmNwcApkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMGQxNGVlZDgxMTc3MGZmZDA0OTUxZTkyYjAxMjEzNTY2YzVlMGJkZi4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlLmNwcAorKysg
L2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2ltcG9ydCAiUGxhdGZvcm1D
QUxheWVyUmVtb3RlLmgiCi0KLSNpbXBvcnQgIlBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5o
IgotI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nLmgiCi0jaW1wb3J0
ICJSZW1vdGVMYXllckJhY2tpbmdTdG9yZS5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlQ29u
dGV4dC5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlUHJvcGVydHlBcHBsaWVyLmgiCi0jaW1w
b3J0IDxXZWJDb3JlL0FuaW1hdGlvblV0aWxpdGllcy5oPgotI2ltcG9ydCA8V2ViQ29yZS9HcmFw
aGljc0NvbnRleHQuaD4KLSNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NMYXllckNBLmg+Ci0jaW1w
b3J0IDxXZWJDb3JlL0xlbmd0aEZ1bmN0aW9ucy5oPgotI2ltcG9ydCA8V2ViQ29yZS9QbGF0Zm9y
bUNBRmlsdGVycy5oPgotI2ltcG9ydCA8V2ViQ29yZS9QbGF0Zm9ybUNBTGF5ZXJDb2NvYS5oPgot
I2ltcG9ydCA8V2ViQ29yZS9UaWxlZEJhY2tpbmcuaD4KLSNpbXBvcnQgPHd0Zi9DdXJyZW50VGlt
ZS5oPgotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0K
LVJlZjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y3JlYXRl
KExheWVyVHlwZSBsYXllclR5cGUsIFBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIsIFJlbW90
ZUxheWVyVHJlZUNvbnRleHQmIGNvbnRleHQpCi17Ci0gICAgUmVmUHRyPFBsYXRmb3JtQ0FMYXll
clJlbW90ZT4gbGF5ZXI7Ci0KLSAgICBpZiAobGF5ZXJUeXBlID09IExheWVyVHlwZVRpbGVkQmFj
a2luZ0xheWVyIHx8ICBsYXllclR5cGUgPT0gTGF5ZXJUeXBlUGFnZVRpbGVkQmFja2luZ0xheWVy
KQotICAgICAgICBsYXllciA9IGFkb3B0UmVmKG5ldyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxl
ZEJhY2tpbmcobGF5ZXJUeXBlLCBvd25lciwgY29udGV4dCkpOwotICAgIGVsc2UKLSAgICAgICAg
bGF5ZXIgPSBhZG9wdFJlZihuZXcgUGxhdGZvcm1DQUxheWVyUmVtb3RlKGxheWVyVHlwZSwgb3du
ZXIsIGNvbnRleHQpKTsKLQotICAgIGNvbnRleHQubGF5ZXJXYXNDcmVhdGVkKCpsYXllciwgbGF5
ZXJUeXBlKTsKLQotICAgIHJldHVybiBsYXllci5yZWxlYXNlTm9uTnVsbCgpOwotfQotCi1SZWY8
UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNyZWF0ZShQbGF0
Zm9ybUxheWVyICpwbGF0Zm9ybUxheWVyLCBQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBS
ZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250ZXh0KQotewotICAgIHJldHVybiBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGVDdXN0b206OmNyZWF0ZShwbGF0Zm9ybUxheWVyLCBvd25lciwgY29udGV4dCk7
Ci19Ci0KLVJlZjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
Y3JlYXRlKGNvbnN0IFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgb3RoZXIsIFdlYkNvcmU6OlBsYXRm
b3JtQ0FMYXllckNsaWVudCogb3duZXIsIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmIGNvbnRleHQp
Ci17Ci0gICAgYXV0byBsYXllciA9IGFkb3B0UmVmKCpuZXcgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
KG90aGVyLCBvd25lciwgY29udGV4dCkpOwotCi0gICAgY29udGV4dC5sYXllcldhc0NyZWF0ZWQo
bGF5ZXIuZ2V0KCksIG90aGVyLmxheWVyVHlwZSgpKTsKLQotICAgIHJldHVybiBsYXllcjsKLX0K
LQotUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUoTGF5ZXJUeXBl
IGxheWVyVHlwZSwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3RlTGF5ZXJUcmVl
Q29udGV4dCYgY29udGV4dCkKLSAgICA6IFBsYXRmb3JtQ0FMYXllcihsYXllclR5cGUsIG93bmVy
KQotICAgICwgbV9jb250ZXh0KCZjb250ZXh0KQotewotICAgIGlmIChvd25lciAmJiBsYXllclR5
cGUgIT0gTGF5ZXJUeXBlQ29udGVudHNQcm92aWRlZExheWVyICYmIGxheWVyVHlwZSAhPSBMYXll
clR5cGVUcmFuc2Zvcm1MYXllcikgewotICAgICAgICBtX3Byb3BlcnRpZXMuY29udGVudHNTY2Fs
ZSA9IG93bmVyLT5wbGF0Zm9ybUNBTGF5ZXJEZXZpY2VTY2FsZUZhY3RvcigpOwotICAgICAgICBt
X3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0
aW9uOjpDb250ZW50c1NjYWxlQ2hhbmdlZCk7Ci0gICAgfQotfQotCi1QbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGU6OlBsYXRmb3JtQ0FMYXllclJlbW90ZShjb25zdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUm
IG90aGVyLCBQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250
ZXh0JiBjb250ZXh0KQotICAgIDogUGxhdGZvcm1DQUxheWVyKG90aGVyLmxheWVyVHlwZSgpLCBv
d25lcikKLSAgICAsIG1fYWNjZWxlcmF0ZXNEcmF3aW5nKG90aGVyLmFjY2VsZXJhdGVzRHJhd2lu
ZygpKQotICAgICwgbV9jb250ZXh0KCZjb250ZXh0KQotewotfQotCi1SZWY8UGxhdGZvcm1DQUxh
eWVyPiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNsb25lKFBsYXRmb3JtQ0FMYXllckNsaWVudCog
b3duZXIpIGNvbnN0Ci17Ci0gICAgYXV0byBjbG9uZSA9IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
Y3JlYXRlKCp0aGlzLCBvd25lciwgKm1fY29udGV4dCk7Ci0KLSAgICB1cGRhdGVDbG9uZWRMYXll
clByb3BlcnRpZXMoY2xvbmUpOwotCi0gICAgY2xvbmUtPnNldENsb25lZExheWVyKHRoaXMpOwot
ICAgIHJldHVybiBXVEZNb3ZlKGNsb25lKTsKLX0KLQotUGxhdGZvcm1DQUxheWVyUmVtb3RlOjp+
UGxhdGZvcm1DQUxheWVyUmVtb3RlKCkKLXsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGxheWVyIDog
bV9jaGlsZHJlbikKLSAgICAgICAgZG93bmNhc3Q8UGxhdGZvcm1DQUxheWVyUmVtb3RlPigqbGF5
ZXIpLm1fc3VwZXJsYXllciA9IG51bGxwdHI7Ci0KLSAgICBpZiAobV9jb250ZXh0KQotICAgICAg
ICBtX2NvbnRleHQtPmxheWVyV2lsbEJlRGVzdHJveWVkKCp0aGlzKTsKLX0KLQotdm9pZCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6OnVwZGF0ZUNsb25lZExheWVyUHJvcGVydGllcyhQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGUmIGNsb25lLCBib29sIGNvcHlDb250ZW50cykgY29uc3QKLXsKLSAgICBjbG9u
ZS5zZXRQb3NpdGlvbihwb3NpdGlvbigpKTsKLSAgICBjbG9uZS5zZXRCb3VuZHMoYm91bmRzKCkp
OwotICAgIGNsb25lLnNldEFuY2hvclBvaW50KGFuY2hvclBvaW50KCkpOwotCi0gICAgaWYgKG1f
cHJvcGVydGllcy50cmFuc2Zvcm0pCi0gICAgICAgIGNsb25lLnNldFRyYW5zZm9ybSgqbV9wcm9w
ZXJ0aWVzLnRyYW5zZm9ybSk7Ci0KLSAgICBpZiAobV9wcm9wZXJ0aWVzLnN1YmxheWVyVHJhbnNm
b3JtKQotICAgICAgICBjbG9uZS5zZXRTdWJsYXllclRyYW5zZm9ybSgqbV9wcm9wZXJ0aWVzLnN1
YmxheWVyVHJhbnNmb3JtKTsKLQotICAgIGlmIChjb3B5Q29udGVudHMpCi0gICAgICAgIGNsb25l
LnNldENvbnRlbnRzKGNvbnRlbnRzKCkpOwotCi0gICAgY2xvbmUuc2V0TWFza3NUb0JvdW5kcyht
YXNrc1RvQm91bmRzKCkpOwotICAgIGNsb25lLnNldERvdWJsZVNpZGVkKGlzRG91YmxlU2lkZWQo
KSk7Ci0gICAgY2xvbmUuc2V0T3BhcXVlKGlzT3BhcXVlKCkpOwotICAgIGNsb25lLnNldEJhY2tn
cm91bmRDb2xvcihiYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgY2xvbmUuc2V0Q29udGVudHNTY2Fs
ZShjb250ZW50c1NjYWxlKCkpOwotICAgIGNsb25lLnNldENvcm5lclJhZGl1cyhjb3JuZXJSYWRp
dXMoKSk7Ci0KLSAgICBpZiAoIW1fcHJvcGVydGllcy5zaGFwZVBhdGguaXNOdWxsKCkpCi0gICAg
ICAgIGNsb25lLnNldFNoYXBlUGF0aChtX3Byb3BlcnRpZXMuc2hhcGVQYXRoKTsKLQotICAgIGlm
IChtX3Byb3BlcnRpZXMuc2hhcGVSb3VuZGVkUmVjdCkKLSAgICAgICAgY2xvbmUuc2V0U2hhcGVS
b3VuZGVkUmVjdCgqbV9wcm9wZXJ0aWVzLnNoYXBlUm91bmRlZFJlY3QpOwotCi0gICAgaWYgKG1f
cHJvcGVydGllcy5maWx0ZXJzKQotICAgICAgICBjbG9uZS5jb3B5RmlsdGVyc0Zyb20oKnRoaXMp
OwotCi0gICAgY2xvbmUudXBkYXRlQ3VzdG9tQXBwZWFyYW5jZShjdXN0b21BcHBlYXJhbmNlKCkp
OwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVjdXJzaXZlQnVpbGRUcmFuc2Fj
dGlvbihSZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250ZXh0LCBSZW1vdGVMYXllclRyZWVUcmFu
c2FjdGlvbiYgdHJhbnNhY3Rpb24pCi17Ci0gICAgQVNTRVJUKCFtX3Byb3BlcnRpZXMuYmFja2lu
Z1N0b3JlIHx8IG93bmVyKCkpOwotICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9O
KCZjb250ZXh0ID09IG1fY29udGV4dCk7Ci0gICAgCi0gICAgaWYgKG1fcHJvcGVydGllcy5iYWNr
aW5nU3RvcmUgJiYgKCFvd25lcigpIHx8ICFvd25lcigpLT5wbGF0Zm9ybUNBTGF5ZXJEcmF3c0Nv
bnRlbnQoKSkpIHsKLSAgICAgICAgbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZSA9IG51bGxwdHI7
Ci0gICAgICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJU
cmVlVHJhbnNhY3Rpb246OkJhY2tpbmdTdG9yZUNoYW5nZWQpOwotICAgIH0KLQotICAgIGlmICht
X3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlICYmIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmVBdHRh
Y2hlZCAmJiBtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlLT5kaXNwbGF5KCkpCi0gICAgICAgIG1f
cHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rp
b246OkJhY2tpbmdTdG9yZUNoYW5nZWQpOwotCi0gICAgaWYgKG1fcHJvcGVydGllcy5jaGFuZ2Vk
UHJvcGVydGllcyAhPSBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Tm9DaGFuZ2UpIHsKLSAg
ICAgICAgaWYgKG1fcHJvcGVydGllcy5jaGFuZ2VkUHJvcGVydGllcyAmIFJlbW90ZUxheWVyVHJl
ZVRyYW5zYWN0aW9uOjpDaGlsZHJlbkNoYW5nZWQpIHsKLSAgICAgICAgICAgIG1fcHJvcGVydGll
cy5jaGlsZHJlbi5yZXNpemUobV9jaGlsZHJlbi5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgKytpKQotICAgICAgICAgICAgICAg
IG1fcHJvcGVydGllcy5jaGlsZHJlbltpXSA9IG1fY2hpbGRyZW5baV0tPmxheWVySUQoKTsKLSAg
ICAgICAgfQotCi0gICAgICAgIGlmIChpc1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbSgpKSB7
Ci0gICAgICAgICAgICBSZW1vdGVMYXllclRyZWVQcm9wZXJ0eUFwcGxpZXI6OmFwcGx5UHJvcGVy
dGllcyhwbGF0Zm9ybUxheWVyKCksIG51bGxwdHIsIG1fcHJvcGVydGllcywgUmVtb3RlTGF5ZXJU
cmVlUHJvcGVydHlBcHBsaWVyOjpSZWxhdGVkTGF5ZXJNYXAoKSwgUmVtb3RlTGF5ZXJCYWNraW5n
U3RvcmU6OkxheWVyQ29udGVudHNUeXBlOjpDQU1hY2hQb3J0KTsKLSAgICAgICAgICAgIGRpZENv
bW1pdCgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJhbnNh
Y3Rpb24ubGF5ZXJQcm9wZXJ0aWVzQ2hhbmdlZCgqdGhpcyk7Ci0gICAgfQotCi0gICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFBsYXRm
b3JtQ0FMYXllclJlbW90ZSYgY2hpbGQgPSBkb3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+
KCptX2NoaWxkcmVuW2ldKTsKLSAgICAgICAgQVNTRVJUKGNoaWxkLnN1cGVybGF5ZXIoKSA9PSB0
aGlzKTsKLSAgICAgICAgY2hpbGQucmVjdXJzaXZlQnVpbGRUcmFuc2FjdGlvbihjb250ZXh0LCB0
cmFuc2FjdGlvbik7Ci0gICAgfQotCi0gICAgaWYgKG1fbWFza0xheWVyKQotICAgICAgICBtX21h
c2tMYXllci0+cmVjdXJzaXZlQnVpbGRUcmFuc2FjdGlvbihjb250ZXh0LCB0cmFuc2FjdGlvbik7
Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpkaWRDb21taXQoKQotewotICAgIG1f
cHJvcGVydGllcy5hZGRlZEFuaW1hdGlvbnMuY2xlYXIoKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5
UGF0aHNPZkFuaW1hdGlvbnNUb1JlbW92ZS5jbGVhcigpOwotICAgIG1fcHJvcGVydGllcy5yZXNl
dENoYW5nZWRQcm9wZXJ0aWVzKCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpl
bnN1cmVCYWNraW5nU3RvcmUoKQotewotICAgIEFTU0VSVChvd25lcigpKTsKLSAgICAKLSAgICBp
ZiAoIW1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUpCi0gICAgICAgIG1fcHJvcGVydGllcy5iYWNr
aW5nU3RvcmUgPSBzdGQ6Om1ha2VfdW5pcXVlPFJlbW90ZUxheWVyQmFja2luZ1N0b3JlPih0aGlz
KTsKLQotICAgIHVwZGF0ZUJhY2tpbmdTdG9yZSgpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6dXBkYXRlQmFja2luZ1N0b3JlKCkKLXsKLSAgICBpZiAoIW1fcHJvcGVydGllcy5i
YWNraW5nU3RvcmUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVydGllcy5iYWNraW5n
U3RvcmUtPmVuc3VyZUJhY2tpbmdTdG9yZShtX3Byb3BlcnRpZXMuYm91bmRzLnNpemUoKSwgbV9w
cm9wZXJ0aWVzLmNvbnRlbnRzU2NhbGUsIG1fYWNjZWxlcmF0ZXNEcmF3aW5nLCBtX3dhbnRzRGVl
cENvbG9yQmFja2luZ1N0b3JlLCBtX3Byb3BlcnRpZXMub3BhcXVlKTsKLX0KLQotdm9pZCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3Qm
IHJlY3QpCi17Ci0gICAgZW5zdXJlQmFja2luZ1N0b3JlKCk7Ci0KLSAgICAvLyBGSVhNRTogTmVl
ZCB0byBtYXAgdGhpcyB0aHJvdWdoIGNvbnRlbnRzUmVjdC9ldGMuCi0gICAgbV9wcm9wZXJ0aWVz
LmJhY2tpbmdTdG9yZS0+c2V0TmVlZHNEaXNwbGF5KGVuY2xvc2luZ0ludFJlY3QocmVjdCkpOwot
fQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TmVlZHNEaXNwbGF5KCkKLXsKLSAg
ICBlbnN1cmVCYWNraW5nU3RvcmUoKTsKLQotICAgIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUt
PnNldE5lZWRzRGlzcGxheSgpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y29w
eUNvbnRlbnRzRnJvbUxheWVyKFBsYXRmb3JtQ0FMYXllciogbGF5ZXIpCi17Ci0gICAgQVNTRVJU
KG1fcHJvcGVydGllcy5jbG9uZWRMYXllcklEID09IGxheWVyLT5sYXllcklEKCkpOwotICAgIAot
ICAgIGlmICghbV9wcm9wZXJ0aWVzLmNoYW5nZWRQcm9wZXJ0aWVzKQotICAgICAgICBtX2NvbnRl
eHQtPmxheWVyUHJvcGVydHlDaGFuZ2VkV2hpbGVCdWlsZGluZ1RyYW5zYWN0aW9uKCp0aGlzKTsK
LQotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVl
VHJhbnNhY3Rpb246OkNsb25lZENvbnRlbnRzQ2hhbmdlZCk7Ci19Ci0KLVBsYXRmb3JtQ0FMYXll
ciogUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzdXBlcmxheWVyKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gbV9zdXBlcmxheWVyOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVtb3Zl
RnJvbVN1cGVybGF5ZXIoKQotewotICAgIGlmICghbV9zdXBlcmxheWVyKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBtX3N1cGVybGF5ZXItPnJlbW92ZVN1YmxheWVyKHRoaXMpOwotfQotCi12b2lk
IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVtb3ZlU3VibGF5ZXIoUGxhdGZvcm1DQUxheWVyUmVt
b3RlKiBsYXllcikKLXsKLSAgICBzaXplX3QgY2hpbGRJbmRleCA9IG1fY2hpbGRyZW4uZmluZChs
YXllcik7Ci0gICAgaWYgKGNoaWxkSW5kZXggIT0gbm90Rm91bmQpCi0gICAgICAgIG1fY2hpbGRy
ZW4ucmVtb3ZlKGNoaWxkSW5kZXgpOwotICAgIGxheWVyLT5tX3N1cGVybGF5ZXIgPSBudWxscHRy
OwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVl
VHJhbnNhY3Rpb246OkNoaWxkcmVuQ2hhbmdlZCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjpzZXRTdWJsYXllcnMoY29uc3QgUGxhdGZvcm1DQUxheWVyTGlzdCYgbGlzdCkKLXsK
LSAgICByZW1vdmVBbGxTdWJsYXllcnMoKTsKLSAgICBtX2NoaWxkcmVuID0gbGlzdDsKLQotICAg
IGZvciAoY29uc3QgYXV0byYgbGF5ZXIgOiBsaXN0KSB7Ci0gICAgICAgIGxheWVyLT5yZW1vdmVG
cm9tU3VwZXJsYXllcigpOwotICAgICAgICBkb3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+
KCpsYXllcikubV9zdXBlcmxheWVyID0gdGhpczsKLSAgICB9Ci0KLSAgICBtX3Byb3BlcnRpZXMu
bm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDaGlsZHJl
bkNoYW5nZWQpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVtb3ZlQWxsU3Vi
bGF5ZXJzKCkKLXsKLSAgICBQbGF0Zm9ybUNBTGF5ZXJMaXN0IGxheWVyc1RvUmVtb3ZlID0gbV9j
aGlsZHJlbjsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGxheWVyIDogbGF5ZXJzVG9SZW1vdmUpCi0g
ICAgICAgIGxheWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOwotICAgIEFTU0VSVChtX2NoaWxk
cmVuLmlzRW1wdHkoKSk7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChS
ZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q2hpbGRyZW5DaGFuZ2VkKTsKLX0KLQotdm9pZCBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmFwcGVuZFN1YmxheWVyKFBsYXRmb3JtQ0FMYXllciYgbGF5
ZXIpCi17Ci0gICAgUmVmPFBsYXRmb3JtQ0FMYXllcj4gbGF5ZXJQcm90ZWN0b3IobGF5ZXIpOwot
Ci0gICAgbGF5ZXIucmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKLSAgICBtX2NoaWxkcmVuLmFwcGVu
ZCgmbGF5ZXIpOwotICAgIGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4obGF5ZXIpLm1f
c3VwZXJsYXllciA9IHRoaXM7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdl
ZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q2hpbGRyZW5DaGFuZ2VkKTsKLX0KLQotdm9p
ZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6Omluc2VydFN1YmxheWVyKFBsYXRmb3JtQ0FMYXllciYg
bGF5ZXIsIHNpemVfdCBpbmRleCkKLXsKLSAgICBSZWY8UGxhdGZvcm1DQUxheWVyPiBsYXllclBy
b3RlY3RvcihsYXllcik7Ci0KLSAgICBsYXllci5yZW1vdmVGcm9tU3VwZXJsYXllcigpOwotICAg
IG1fY2hpbGRyZW4uaW5zZXJ0KGluZGV4LCAmbGF5ZXIpOwotICAgIGRvd25jYXN0PFBsYXRmb3Jt
Q0FMYXllclJlbW90ZT4obGF5ZXIpLm1fc3VwZXJsYXllciA9IHRoaXM7Ci0gICAgbV9wcm9wZXJ0
aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q2hp
bGRyZW5DaGFuZ2VkKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnJlcGxhY2VT
dWJsYXllcihQbGF0Zm9ybUNBTGF5ZXImIHJlZmVyZW5jZSwgUGxhdGZvcm1DQUxheWVyJiBsYXll
cikKLXsKLSAgICBBU1NFUlQocmVmZXJlbmNlLnN1cGVybGF5ZXIoKSA9PSB0aGlzKTsKLSAgICBS
ZWY8UGxhdGZvcm1DQUxheWVyPiBsYXllclByb3RlY3RvcihsYXllcik7Ci0KLSAgICBsYXllci5y
ZW1vdmVGcm9tU3VwZXJsYXllcigpOwotICAgIHNpemVfdCByZWZlcmVuY2VJbmRleCA9IG1fY2hp
bGRyZW4uZmluZCgmcmVmZXJlbmNlKTsKLSAgICBpZiAocmVmZXJlbmNlSW5kZXggIT0gbm90Rm91
bmQpIHsKLSAgICAgICAgbV9jaGlsZHJlbltyZWZlcmVuY2VJbmRleF0tPnJlbW92ZUZyb21TdXBl
cmxheWVyKCk7Ci0gICAgICAgIG1fY2hpbGRyZW4uaW5zZXJ0KHJlZmVyZW5jZUluZGV4LCAmbGF5
ZXIpOwotICAgICAgICBkb3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+KGxheWVyKS5tX3N1
cGVybGF5ZXIgPSB0aGlzOwotICAgIH0KLQotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGll
c0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNoaWxkcmVuQ2hhbmdlZCk7Ci19
Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjphZG9wdFN1YmxheWVycyhQbGF0Zm9ybUNB
TGF5ZXImIHNvdXJjZSkKLXsKLSAgICBQbGF0Zm9ybUNBTGF5ZXJMaXN0IGxheWVyc1RvTW92ZSA9
IGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4oc291cmNlKS5tX2NoaWxkcmVuOwotCi0g
ICAgaWYgKGNvbnN0IFBsYXRmb3JtQ0FMYXllckxpc3QqIGN1c3RvbUxheWVycyA9IHNvdXJjZS5j
dXN0b21TdWJsYXllcnMoKSkgewotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGxheWVyIDogKmN1
c3RvbUxheWVycykgewotICAgICAgICAgICAgc2l6ZV90IGxheWVySW5kZXggPSBsYXllcnNUb01v
dmUuZmluZChsYXllcik7Ci0gICAgICAgICAgICBpZiAobGF5ZXJJbmRleCAhPSBub3RGb3VuZCkK
LSAgICAgICAgICAgICAgICBsYXllcnNUb01vdmUucmVtb3ZlKGxheWVySW5kZXgpOwotICAgICAg
ICB9Ci0gICAgfQotCi0gICAgc2V0U3VibGF5ZXJzKGxheWVyc1RvTW92ZSk7Ci19Ci0KLXZvaWQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjphZGRBbmltYXRpb25Gb3JLZXkoY29uc3QgU3RyaW5nJiBr
ZXksIFBsYXRmb3JtQ0FBbmltYXRpb24mIGFuaW1hdGlvbikKLXsKLSAgICBhdXRvIGFkZFJlc3Vs
dCA9IG1fYW5pbWF0aW9ucy5zZXQoa2V5LCAmYW5pbWF0aW9uKTsKLSAgICBpZiAoYWRkUmVzdWx0
LmlzTmV3RW50cnkpCi0gICAgICAgIG1fcHJvcGVydGllcy5hZGRlZEFuaW1hdGlvbnMuYXBwZW5k
KHN0ZDo6cGFpcjxTdHJpbmcsIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXM+
KGtleSwgZG93bmNhc3Q8UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4oYW5pbWF0aW9uKS5wcm9w
ZXJ0aWVzKCkpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgZm9yIChhdXRvJiBrZXlBbmltYXRpb25Q
YWlyIDogbV9wcm9wZXJ0aWVzLmFkZGVkQW5pbWF0aW9ucykgewotICAgICAgICAgICAgaWYgKGtl
eUFuaW1hdGlvblBhaXIuZmlyc3QgPT0ga2V5KSB7Ci0gICAgICAgICAgICAgICAga2V5QW5pbWF0
aW9uUGFpci5zZWNvbmQgPSBkb3duY2FzdDxQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlPihhbmlt
YXRpb24pLnByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRp
ZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpBbmltYXRpb25zQ2hhbmdlZCk7
Ci0KLSAgICBpZiAobV9jb250ZXh0KQotICAgICAgICBtX2NvbnRleHQtPndpbGxTdGFydEFuaW1h
dGlvbk9uTGF5ZXIoKnRoaXMpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVt
b3ZlQW5pbWF0aW9uRm9yS2V5KGNvbnN0IFN0cmluZyYga2V5KQotewotICAgIGlmIChtX2FuaW1h
dGlvbnMucmVtb3ZlKGtleSkpIHsKLSAgICAgICAgbV9wcm9wZXJ0aWVzLmFkZGVkQW5pbWF0aW9u
cy5yZW1vdmVGaXJzdE1hdGNoaW5nKFsma2V5XShhdXRvJiBwYWlyKSB7Ci0gICAgICAgICAgICBy
ZXR1cm4gcGFpci5maXJzdCA9PSBrZXk7Ci0gICAgICAgIH0pOwotICAgIH0KLSAgICBtX3Byb3Bl
cnRpZXMua2V5UGF0aHNPZkFuaW1hdGlvbnNUb1JlbW92ZS5hZGQoa2V5KTsKLSAgICBtX3Byb3Bl
cnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpB
bmltYXRpb25zQ2hhbmdlZCk7Ci19Ci0KLVJlZlB0cjxQbGF0Zm9ybUNBQW5pbWF0aW9uPiBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6OmFuaW1hdGlvbkZvcktleShjb25zdCBTdHJpbmcmIGtleSkKLXsK
LSAgICByZXR1cm4gbV9hbmltYXRpb25zLmdldChrZXkpOwotfQotCi1zdGF0aWMgaW5saW5lIGJv
b2wgaXNFcXVpdmFsZW50TGF5ZXIoY29uc3QgUGxhdGZvcm1DQUxheWVyKiBsYXllciwgR3JhcGhp
Y3NMYXllcjo6UGxhdGZvcm1MYXllcklEIGxheWVySUQpCi17Ci0gICAgR3JhcGhpY3NMYXllcjo6
UGxhdGZvcm1MYXllcklEIG5ld0xheWVySUQgPSBsYXllciA/IGxheWVyLT5sYXllcklEKCkgOiAw
OwotICAgIHJldHVybiBsYXllcklEID09IG5ld0xheWVySUQ7Ci19Ci0KLXZvaWQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjphbmltYXRpb25TdGFydGVkKGNvbnN0IFN0cmluZyYga2V5LCBDRlRpbWVJ
bnRlcnZhbCBiZWdpblRpbWUpCi17Ci0gICAgYXV0byBpdCA9IG1fYW5pbWF0aW9ucy5maW5kKGtl
eSk7Ci0gICAgaWYgKGl0ICE9IG1fYW5pbWF0aW9ucy5lbmQoKSkKLSAgICAgICAgZG93bmNhc3Q8
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4oKml0LT52YWx1ZSkuZGlkU3RhcnQoYmVnaW5UaW1l
KTsKLSAgICAKLSAgICBpZiAobV9vd25lcikKLSAgICAgICAgbV9vd25lci0+cGxhdGZvcm1DQUxh
eWVyQW5pbWF0aW9uU3RhcnRlZChrZXksIGJlZ2luVGltZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjphbmltYXRpb25FbmRlZChjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICBp
ZiAobV9vd25lcikKLSAgICAgICAgbV9vd25lci0+cGxhdGZvcm1DQUxheWVyQW5pbWF0aW9uRW5k
ZWQoa2V5KTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldE1hc2soUGxhdGZv
cm1DQUxheWVyKiBsYXllcikKLXsKLSAgICBpZiAoaXNFcXVpdmFsZW50TGF5ZXIobGF5ZXIsIG1f
cHJvcGVydGllcy5tYXNrTGF5ZXJJRCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBpZiAo
bGF5ZXIpIHsKLSAgICAgICAgbV9tYXNrTGF5ZXIgPSBkb3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGU+KGxheWVyKTsKLSAgICAgICAgbV9wcm9wZXJ0aWVzLm1hc2tMYXllcklEID0gbV9tYXNr
TGF5ZXItPmxheWVySUQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX21hc2tMYXllciA9IG51
bGxwdHI7Ci0gICAgICAgIG1fcHJvcGVydGllcy5tYXNrTGF5ZXJJRCA9IDA7Ci0gICAgfQotCi0g
ICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFu
c2FjdGlvbjo6TWFza0xheWVyQ2hhbmdlZCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjpzZXRDbG9uZWRMYXllcihjb25zdCBQbGF0Zm9ybUNBTGF5ZXIqIGxheWVyKQotewotICAg
IGlmIChpc0VxdWl2YWxlbnRMYXllcihsYXllciwgbV9wcm9wZXJ0aWVzLmNsb25lZExheWVySUQp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobGF5ZXIpCi0gICAgICAgIG1fcHJvcGVydGll
cy5jbG9uZWRMYXllcklEID0gbGF5ZXItPmxheWVySUQoKTsKLSAgICBlbHNlCi0gICAgICAgIG1f
cHJvcGVydGllcy5jbG9uZWRMYXllcklEID0gMDsKLQotICAgIG1fcHJvcGVydGllcy5ub3RlUHJv
cGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNsb25lZENvbnRlbnRz
Q2hhbmdlZCk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjppc09wYXF1ZSgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5vcGFxdWU7Ci19Ci0KLXZvaWQgUGxhdGZv
cm1DQUxheWVyUmVtb3RlOjpzZXRPcGFxdWUoYm9vbCB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRp
ZXMub3BhcXVlID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdl
ZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6T3BhcXVlQ2hhbmdlZCk7Ci0KLSAgICB1cGRh
dGVCYWNraW5nU3RvcmUoKTsKLX0KLQotRmxvYXRSZWN0IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
Ym91bmRzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmJvdW5kczsKLX0KLQot
dm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEJvdW5kcyhjb25zdCBGbG9hdFJlY3QmIHZh
bHVlKQotewotICAgIGlmICh2YWx1ZSA9PSBtX3Byb3BlcnRpZXMuYm91bmRzKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMuYm91bmRzID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0
aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Qm91
bmRzQ2hhbmdlZCk7Ci0gICAgCi0gICAgaWYgKHJlcXVpcmVzQ3VzdG9tQXBwZWFyYW5jZVVwZGF0
ZU9uQm91bmRzQ2hhbmdlKCkpCi0gICAgICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0No
YW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkN1c3RvbUFwcGVhcmFuY2VDaGFuZ2Vk
KTsKLQotICAgIHVwZGF0ZUJhY2tpbmdTdG9yZSgpOwotfQotCi1GbG9hdFBvaW50M0QgUGxhdGZv
cm1DQUxheWVyUmVtb3RlOjpwb3NpdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVy
dGllcy5wb3NpdGlvbjsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFBvc2l0
aW9uKGNvbnN0IEZsb2F0UG9pbnQzRCYgdmFsdWUpCi17Ci0gICAgLy8gV2UgY2FuJ3QgZWFybHkg
cmV0dXJuIGhlcmUgaWYgdGhlIHBvc2l0aW9uIGhhcyBub3QgY2hhbmdlZCwgc2luY2UgR3JhcGhp
Y3NMYXllckNBOjpzeW5jUG9zaXRpb24oKSBtYXkgaGF2ZSBjaGFuZ2VkCi0gICAgLy8gdGhlIEdy
YXBoaWNzTGF5ZXIgcG9zaXRpb24gKHdoaWNoIGRvZXNuJ3QgZm9yY2UgYSBnZW9tZXRyeSB1cGRh
dGUpIGJ1dCB3ZSB3YW50IGEgc3Vic2VxdWVudCBHcmFwaGljc0xheWVyQ0E6OnNldFBvc2l0aW9u
KCkKLSAgICAvLyB0byBwdXNoIGEgbmV3IHBvc2l0aW9uIHRvIHRoZSBVSSBwcm9jZXNzLCBldmVu
IHRob3VnaCBvdXIgbV9wcm9wZXJ0aWVzLnBvc2l0aW9uIGhhc24ndCBjaGFuZ2VkLgotICAgIG1f
cHJvcGVydGllcy5wb3NpdGlvbiA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVy
dGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlBvc2l0aW9uQ2hhbmdlZCk7
Ci19Ci0KLUZsb2F0UG9pbnQzRCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmFuY2hvclBvaW50KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmFuY2hvclBvaW50OwotfQotCi12b2lk
IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0QW5jaG9yUG9pbnQoY29uc3QgRmxvYXRQb2ludDNE
JiB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUgPT0gbV9wcm9wZXJ0aWVzLmFuY2hvclBvaW50KQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMuYW5jaG9yUG9pbnQgPSB2YWx1ZTsK
LSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRy
YW5zYWN0aW9uOjpBbmNob3JQb2ludENoYW5nZWQpOwotfQotCi1UcmFuc2Zvcm1hdGlvbk1hdHJp
eCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnRyYW5zZm9ybSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1fcHJvcGVydGllcy50cmFuc2Zvcm0gPyAqbV9wcm9wZXJ0aWVzLnRyYW5zZm9ybSA6IFRyYW5z
Zm9ybWF0aW9uTWF0cml4KCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRU
cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHZhbHVlKQotewotICAgIG1fcHJv
cGVydGllcy50cmFuc2Zvcm0gPSBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zZm9ybWF0aW9uTWF0cml4
Pih2YWx1ZSk7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVM
YXllclRyZWVUcmFuc2FjdGlvbjo6VHJhbnNmb3JtQ2hhbmdlZCk7Ci19Ci0KLVRyYW5zZm9ybWF0
aW9uTWF0cml4IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c3VibGF5ZXJUcmFuc2Zvcm0oKSBjb25z
dAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMuc3VibGF5ZXJUcmFuc2Zvcm0gPyAqbV9wcm9w
ZXJ0aWVzLnN1YmxheWVyVHJhbnNmb3JtIDogVHJhbnNmb3JtYXRpb25NYXRyaXgoKTsKLX0KLQot
dm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFN1YmxheWVyVHJhbnNmb3JtKGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMuc3VibGF5ZXJU
cmFuc2Zvcm0gPSBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zZm9ybWF0aW9uTWF0cml4Pih2YWx1ZSk7
Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6U3VibGF5ZXJUcmFuc2Zvcm1DaGFuZ2VkKTsKLX0KLQotYm9vbCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6OmlzSGlkZGVuKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0
aWVzLmhpZGRlbjsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEhpZGRlbihi
b29sIHZhbHVlKQotewotICAgIGlmIChtX3Byb3BlcnRpZXMuaGlkZGVuID09IHZhbHVlKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMuaGlkZGVuID0gdmFsdWU7Ci0gICAgbV9w
cm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlv
bjo6SGlkZGVuQ2hhbmdlZCk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjb250
ZW50c0hpZGRlbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5jb250ZW50c0hp
ZGRlbjsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldENvbnRlbnRzSGlkZGVu
KGJvb2wgdmFsdWUpCi17Ci0gICAgaWYgKG1fcHJvcGVydGllcy5jb250ZW50c0hpZGRlbiA9PSB2
YWx1ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVzLmNvbnRlbnRzSGlkZGVu
ID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVM
YXllclRyZWVUcmFuc2FjdGlvbjo6Q29udGVudHNIaWRkZW5DaGFuZ2VkKTsKLX0KLQotYm9vbCBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnVzZXJJbnRlcmFjdGlvbkVuYWJsZWQoKSBjb25zdAotewot
ICAgIHJldHVybiBtX3Byb3BlcnRpZXMudXNlckludGVyYWN0aW9uRW5hYmxlZDsKLX0KLQotdm9p
ZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFVzZXJJbnRlcmFjdGlvbkVuYWJsZWQoYm9vbCB2
YWx1ZSkKLXsKLSAgICBpZiAobV9wcm9wZXJ0aWVzLnVzZXJJbnRlcmFjdGlvbkVuYWJsZWQgPT0g
dmFsdWUpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX3Byb3BlcnRpZXMudXNlckludGVy
YWN0aW9uRW5hYmxlZCA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0No
YW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlVzZXJJbnRlcmFjdGlvbkVuYWJsZWRD
aGFuZ2VkKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEJhY2tpbmdTdG9y
ZUF0dGFjaGVkKGJvb2wgdmFsdWUpCi17Ci0gICAgaWYgKG1fcHJvcGVydGllcy5iYWNraW5nU3Rv
cmVBdHRhY2hlZCA9PSB2YWx1ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVz
LmJhY2tpbmdTdG9yZUF0dGFjaGVkID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9w
ZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6QmFja2luZ1N0b3JlQXR0
YWNobWVudENoYW5nZWQpOwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6YmFja2lu
Z1N0b3JlQXR0YWNoZWQoKSBjb25zdAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMuYmFja2lu
Z1N0b3JlQXR0YWNoZWQ7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRHZW9t
ZXRyeUZsaXBwZWQoYm9vbCB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMuZ2VvbWV0cnlGbGlw
cGVkID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1v
dGVMYXllclRyZWVUcmFuc2FjdGlvbjo6R2VvbWV0cnlGbGlwcGVkQ2hhbmdlZCk7Ci19Ci0KLWJv
b2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpnZW9tZXRyeUZsaXBwZWQoKSBjb25zdAotewotICAg
IHJldHVybiBtX3Byb3BlcnRpZXMuZ2VvbWV0cnlGbGlwcGVkOwotfQotCi1ib29sIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6aXNEb3VibGVTaWRlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJv
cGVydGllcy5kb3VibGVTaWRlZDsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNl
dERvdWJsZVNpZGVkKGJvb2wgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLmRvdWJsZVNpZGVk
ID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVM
YXllclRyZWVUcmFuc2FjdGlvbjo6RG91YmxlU2lkZWRDaGFuZ2VkKTsKLX0KLQotYm9vbCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6Om1hc2tzVG9Cb3VuZHMoKSBjb25zdAotewotICAgIHJldHVybiBt
X3Byb3BlcnRpZXMubWFza3NUb0JvdW5kczsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6OnNldE1hc2tzVG9Cb3VuZHMoYm9vbCB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUgPT0gbV9w
cm9wZXJ0aWVzLm1hc2tzVG9Cb3VuZHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVy
dGllcy5tYXNrc1RvQm91bmRzID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0
aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6TWFza3NUb0JvdW5kc0NoYW5n
ZWQpOwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6YWNjZWxlcmF0ZXNEcmF3aW5n
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hY2NlbGVyYXRlc0RyYXdpbmc7Ci19Ci0KLXZvaWQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRBY2NlbGVyYXRlc0RyYXdpbmcoYm9vbCBhY2NlbGVy
YXRlc0RyYXdpbmcpCi17Ci0gICAgbV9hY2NlbGVyYXRlc0RyYXdpbmcgPSBhY2NlbGVyYXRlc0Ry
YXdpbmc7Ci0gICAgdXBkYXRlQmFja2luZ1N0b3JlKCk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjp3YW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZSgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIG1fd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmU7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjpzZXRXYW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZShib29sIHdhbnRzRGVlcENv
bG9yQmFja2luZ1N0b3JlKQotewotICAgIG1fd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUgPSB3
YW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZTsKLSAgICB1cGRhdGVCYWNraW5nU3RvcmUoKTsKLX0K
LQotYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnN1cHBvcnRzU3VicGl4ZWxBbnRpYWxpYXNl
ZFRleHQoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU6OnNldFN1cHBvcnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRleHQoYm9vbCkKLXsK
LX0KLQotQ0ZUeXBlUmVmIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y29udGVudHMoKSBjb25zdAot
ewotICAgIHJldHVybiBudWxscHRyOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
c2V0Q29udGVudHMoQ0ZUeXBlUmVmIHZhbHVlKQotewotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6c2V0Q29udGVudHNSZWN0KGNvbnN0IEZsb2F0UmVjdCYgdmFsdWUpCi17Ci0gICAg
bV9wcm9wZXJ0aWVzLmNvbnRlbnRzUmVjdCA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3Rl
UHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNvbnRlbnRzUmVj
dENoYW5nZWQpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TWluaWZpY2F0
aW9uRmlsdGVyKEZpbHRlclR5cGUgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLm1pbmlmaWNh
dGlvbkZpbHRlciA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5n
ZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246Ok1pbmlmaWNhdGlvbkZpbHRlckNoYW5nZWQp
OwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TWFnbmlmaWNhdGlvbkZpbHRl
cihGaWx0ZXJUeXBlIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5tYWduaWZpY2F0aW9uRmls
dGVyID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1v
dGVMYXllclRyZWVUcmFuc2FjdGlvbjo6TWFnbmlmaWNhdGlvbkZpbHRlckNoYW5nZWQpOwotfQot
Ci1Db2xvciBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmJhY2tncm91bmRDb2xvcigpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5iYWNrZ3JvdW5kQ29sb3I7Ci19Ci0KLXZvaWQgUGxh
dGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImIHZhbHVl
KQotewotICAgIG1fcHJvcGVydGllcy5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTsKLSAgICBtX3By
b3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9u
OjpCYWNrZ3JvdW5kQ29sb3JDaGFuZ2VkKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6OnNldEJvcmRlcldpZHRoKGZsb2F0IHZhbHVlKQotewotICAgIGlmICh2YWx1ZSA9PSBtX3By
b3BlcnRpZXMuYm9yZGVyV2lkdGgpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVydGll
cy5ib3JkZXJXaWR0aCA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0No
YW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkJvcmRlcldpZHRoQ2hhbmdlZCk7Ci19
Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCb3JkZXJDb2xvcihjb25zdCBDb2xv
ciYgdmFsdWUpCi17Ci0gICAgaWYgKHZhbHVlID09IG1fcHJvcGVydGllcy5ib3JkZXJDb2xvcikK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVzLmJvcmRlckNvbG9yID0gdmFsdWU7
Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6Qm9yZGVyQ29sb3JDaGFuZ2VkKTsKLX0KLQotZmxvYXQgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjpvcGFjaXR5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLm9w
YWNpdHk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRPcGFjaXR5KGZsb2F0
IHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5vcGFjaXR5ID0gdmFsdWU7Ci0gICAgbV9wcm9w
ZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6
T3BhY2l0eUNoYW5nZWQpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0Rmls
dGVycyhjb25zdCBGaWx0ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKQotewotICAgIG1fcHJvcGVydGll
cy5maWx0ZXJzID0gc3RkOjptYWtlX3VuaXF1ZTxGaWx0ZXJPcGVyYXRpb25zPihmaWx0ZXJzKTsK
LSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRy
YW5zYWN0aW9uOjpGaWx0ZXJzQ2hhbmdlZCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjpjb3B5RmlsdGVyc0Zyb20oY29uc3QgUGxhdGZvcm1DQUxheWVyJiBzb3VyY2VMYXllcikK
LXsKLSAgICBpZiAoY29uc3QgRmlsdGVyT3BlcmF0aW9ucyogZmlsdGVycyA9IGRvd25jYXN0PFBs
YXRmb3JtQ0FMYXllclJlbW90ZT4oc291cmNlTGF5ZXIpLm1fcHJvcGVydGllcy5maWx0ZXJzLmdl
dCgpKQotICAgICAgICBzZXRGaWx0ZXJzKCpmaWx0ZXJzKTsKLSAgICBlbHNlIGlmIChtX3Byb3Bl
cnRpZXMuZmlsdGVycykKLSAgICAgICAgbV9wcm9wZXJ0aWVzLmZpbHRlcnMgPSBudWxscHRyOwot
Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6RmlsdGVyc0NoYW5nZWQpOwotfQotCi0jaWYgRU5BQkxFKENTU19DT01QT1NJ
VElORykKLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCbGVuZE1vZGUoQmxlbmRNb2Rl
IGJsZW5kTW9kZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMuYmxlbmRNb2RlID0gYmxlbmRNb2RlOwot
ICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJh
bnNhY3Rpb246OkJsZW5kTW9kZUNoYW5nZWQpOwotfQotI2VuZGlmCi0KLWJvb2wgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjpmaWx0ZXJzQ2FuQmVDb21wb3NpdGVkKGNvbnN0IEZpbHRlck9wZXJhdGlv
bnMmIGZpbHRlcnMpCi17Ci0gICAgcmV0dXJuIFBsYXRmb3JtQ0FMYXllckNvY29hOjpmaWx0ZXJz
Q2FuQmVDb21wb3NpdGVkKGZpbHRlcnMpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90
ZTo6c2V0TmFtZShjb25zdCBTdHJpbmcmIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5uYW1l
ID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVM
YXllclRyZWVUcmFuc2FjdGlvbjo6TmFtZUNoYW5nZWQpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FM
YXllclJlbW90ZTo6c2V0U3BlZWQoZmxvYXQgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLnNw
ZWVkID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1v
dGVMYXllclRyZWVUcmFuc2FjdGlvbjo6U3BlZWRDaGFuZ2VkKTsKLX0KLQotdm9pZCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6OnNldFRpbWVPZmZzZXQoQ0ZUaW1lSW50ZXJ2YWwgdmFsdWUpCi17Ci0g
ICAgbV9wcm9wZXJ0aWVzLnRpbWVPZmZzZXQgPSB2YWx1ZTsKLSAgICBtX3Byb3BlcnRpZXMubm90
ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpUaW1lT2Zmc2V0
Q2hhbmdlZCk7Ci19Ci0KLWZsb2F0IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y29udGVudHNTY2Fs
ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5jb250ZW50c1NjYWxlOwotfQot
Ci12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0Q29udGVudHNTY2FsZShmbG9hdCB2YWx1
ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMuY29udGVudHNTY2FsZSA9IHZhbHVlOwotICAgIG1fcHJv
cGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246
OkNvbnRlbnRzU2NhbGVDaGFuZ2VkKTsKLQotICAgIHVwZGF0ZUJhY2tpbmdTdG9yZSgpOwotfQot
Ci1mbG9hdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNvcm5lclJhZGl1cygpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIG1fcHJvcGVydGllcy5jb3JuZXJSYWRpdXM7Ci19Ci0KLXZvaWQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjpzZXRDb3JuZXJSYWRpdXMoZmxvYXQgdmFsdWUpCi17Ci0gICAgaWYgKG1f
cHJvcGVydGllcy5jb3JuZXJSYWRpdXMgPT0gdmFsdWUpCi0gICAgICAgIHJldHVybjsKLQotICAg
IG1fcHJvcGVydGllcy5jb3JuZXJSYWRpdXMgPSB2YWx1ZTsKLSAgICBtX3Byb3BlcnRpZXMubm90
ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDb3JuZXJSYWRp
dXNDaGFuZ2VkKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEVkZ2VBbnRp
YWxpYXNpbmdNYXNrKHVuc2lnbmVkIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5lZGdlQW50
aWFsaWFzaW5nTWFzayA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0No
YW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkVkZ2VBbnRpYWxpYXNpbmdNYXNrQ2hh
bmdlZCk7Ci19Ci0KLUZsb2F0Um91bmRlZFJlY3QgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzaGFw
ZVJvdW5kZWRSZWN0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnNoYXBlUm91
bmRlZFJlY3QgPyAqbV9wcm9wZXJ0aWVzLnNoYXBlUm91bmRlZFJlY3QgOiBGbG9hdFJvdW5kZWRS
ZWN0KEZsb2F0UmVjdCgpKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFNo
YXBlUm91bmRlZFJlY3QoY29uc3QgRmxvYXRSb3VuZGVkUmVjdCYgcm91bmRlZFJlY3QpCi17Ci0g
ICAgaWYgKG1fcHJvcGVydGllcy5zaGFwZVJvdW5kZWRSZWN0ICYmICptX3Byb3BlcnRpZXMuc2hh
cGVSb3VuZGVkUmVjdCA9PSByb3VuZGVkUmVjdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9w
cm9wZXJ0aWVzLnNoYXBlUm91bmRlZFJlY3QgPSBzdGQ6Om1ha2VfdW5pcXVlPEZsb2F0Um91bmRl
ZFJlY3Q+KHJvdW5kZWRSZWN0KTsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFu
Z2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpTaGFwZVJvdW5kZWRSZWN0Q2hhbmdlZCk7
Ci19Ci0KLVBhdGggUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzaGFwZVBhdGgoKSBjb25zdAotewot
ICAgIEFTU0VSVChtX2xheWVyVHlwZSA9PSBMYXllclR5cGVTaGFwZUxheWVyKTsKLSAgICByZXR1
cm4gbV9wcm9wZXJ0aWVzLnNoYXBlUGF0aDsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6OnNldFNoYXBlUGF0aChjb25zdCBQYXRoJiBwYXRoKQotewotICAgIEFTU0VSVChtX2xheWVy
VHlwZSA9PSBMYXllclR5cGVTaGFwZUxheWVyKTsKLSAgICBtX3Byb3BlcnRpZXMuc2hhcGVQYXRo
ID0gcGF0aDsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxh
eWVyVHJlZVRyYW5zYWN0aW9uOjpTaGFwZVBhdGhDaGFuZ2VkKTsKLX0KLQotV2luZFJ1bGUgUGxh
dGZvcm1DQUxheWVyUmVtb3RlOjpzaGFwZVdpbmRSdWxlKCkgY29uc3QKLXsKLSAgICBBU1NFUlQo
bV9sYXllclR5cGUgPT0gTGF5ZXJUeXBlU2hhcGVMYXllcik7Ci0gICAgcmV0dXJuIG1fcHJvcGVy
dGllcy53aW5kUnVsZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFNoYXBl
V2luZFJ1bGUoV2luZFJ1bGUgd2luZFJ1bGUpCi17Ci0gICAgQVNTRVJUKG1fbGF5ZXJUeXBlID09
IExheWVyVHlwZVNoYXBlTGF5ZXIpOwotICAgIG1fcHJvcGVydGllcy53aW5kUnVsZSA9IHdpbmRS
dWxlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJU
cmVlVHJhbnNhY3Rpb246OldpbmRSdWxlQ2hhbmdlZCk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjpyZXF1aXJlc0N1c3RvbUFwcGVhcmFuY2VVcGRhdGVPbkJvdW5kc0NoYW5nZSgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5jdXN0b21BcHBlYXJhbmNlID09IEdy
YXBoaWNzTGF5ZXI6OlNjcm9sbGluZ1NoYWRvdzsKLX0KLQotR3JhcGhpY3NMYXllcjo6Q3VzdG9t
QXBwZWFyYW5jZSBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmN1c3RvbUFwcGVhcmFuY2UoKSBjb25z
dAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMuY3VzdG9tQXBwZWFyYW5jZTsKLX0KLQotdm9p
ZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnVwZGF0ZUN1c3RvbUFwcGVhcmFuY2UoR3JhcGhpY3NM
YXllcjo6Q3VzdG9tQXBwZWFyYW5jZSBjdXN0b21BcHBlYXJhbmNlKQotewotICAgIG1fcHJvcGVy
dGllcy5jdXN0b21BcHBlYXJhbmNlID0gY3VzdG9tQXBwZWFyYW5jZTsKLSAgICBtX3Byb3BlcnRp
ZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDdXN0
b21BcHBlYXJhbmNlQ2hhbmdlZCk7Ci19Ci0KLVJlZjxQbGF0Zm9ybUNBTGF5ZXI+IFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6Y3JlYXRlQ29tcGF0aWJsZUxheWVyKFBsYXRmb3JtQ0FMYXllcjo6TGF5
ZXJUeXBlIGxheWVyVHlwZSwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBjbGllbnQpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y3JlYXRlKGxheWVyVHlwZSwgY2xp
ZW50LCAqbV9jb250ZXh0KTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmVudW1l
cmF0ZVJlY3RzQmVpbmdEcmF3bihDR0NvbnRleHRSZWYgY29udGV4dCwgdm9pZCAoXmJsb2NrKShD
R1JlY3QpKQotewotICAgIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUtPmVudW1lcmF0ZVJlY3Rz
QmVpbmdEcmF3bihjb250ZXh0LCBibG9jayk7Ci19Ci0KLXVpbnQzMl90IFBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6aG9zdGluZ0NvbnRleHRJRCgpCi17Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6YmFj
a2luZ1N0b3JlQnl0ZXNQZXJQaXhlbCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3Byb3BlcnRpZXMu
YmFja2luZ1N0b3JlKQotICAgICAgICByZXR1cm4gNDsKLQotICAgIHJldHVybiBtX3Byb3BlcnRp
ZXMuYmFja2luZ1N0b3JlLT5ieXRlc1BlclBpeGVsKCk7Ci19Ci0KLUxheWVyUG9vbCYgUGxhdGZv
cm1DQUxheWVyUmVtb3RlOjpsYXllclBvb2woKQotewotICAgIHJldHVybiBtX2NvbnRleHQtPmxh
eWVyUG9vbCgpOwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaCBi
L1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1v
dGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2MzVlZjkxZjMxOWM3MjdkZWNj
MjJjYjFhODhmYzA3NjgwMDgwZC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1D
QUxheWVyUmVtb3RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
Ci0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5j
bHVkZSAiUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24uaCIKLSNpbmNsdWRlIDxXZWJDb3JlL1Bs
YXRmb3JtQ0FMYXllci5oPgotI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1MYXllci5oPgotCi1u
YW1lc3BhY2UgV2ViQ29yZSB7Ci1jbGFzcyBMYXllclBvb2w7Ci19Ci0KLW5hbWVzcGFjZSBXZWJL
aXQgewotCi1jbGFzcyBSZW1vdGVMYXllclRyZWVDb250ZXh0OwotCi1jbGFzcyBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGUgOiBwdWJsaWMgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyIHsKLXB1YmxpYzoK
LSAgICBzdGF0aWMgUmVmPFBsYXRmb3JtQ0FMYXllclJlbW90ZT4gY3JlYXRlKFdlYkNvcmU6OlBs
YXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQq
LCBSZW1vdGVMYXllclRyZWVDb250ZXh0Jik7Ci0gICAgc3RhdGljIFJlZjxQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGU+IGNyZWF0ZShQbGF0Zm9ybUxheWVyICosIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXll
ckNsaWVudCosIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmKTsKLSAgICBzdGF0aWMgUmVmPFBsYXRm
b3JtQ0FMYXllclJlbW90ZT4gY3JlYXRlKGNvbnN0IFBsYXRmb3JtQ0FMYXllclJlbW90ZSYsIFdl
YkNvcmU6OlBsYXRmb3JtQ0FMYXllckNsaWVudCosIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmKTsK
LQotICAgIHZpcnR1YWwgflBsYXRmb3JtQ0FMYXllclJlbW90ZSgpOwotCi0gICAgUGxhdGZvcm1M
YXllciogcGxhdGZvcm1MYXllcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG51bGxwdHI7IH0K
LQotICAgIHZvaWQgcmVjdXJzaXZlQnVpbGRUcmFuc2FjdGlvbihSZW1vdGVMYXllclRyZWVDb250
ZXh0JiwgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24mKTsKLQotICAgIHZvaWQgc2V0TmVlZHNE
aXNwbGF5SW5SZWN0KGNvbnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYgZGlydHlSZWN0KSBvdmVycmlk
ZTsKLSAgICB2b2lkIHNldE5lZWRzRGlzcGxheSgpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBjb3B5
Q29udGVudHNGcm9tTGF5ZXIoUGxhdGZvcm1DQUxheWVyKikgb3ZlcnJpZGU7Ci0KLSAgICBXZWJD
b3JlOjpQbGF0Zm9ybUNBTGF5ZXIqIHN1cGVybGF5ZXIoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2
b2lkIHJlbW92ZUZyb21TdXBlcmxheWVyKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRTdWJsYXll
cnMoY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyTGlzdCYpIG92ZXJyaWRlOwotICAgIHZv
aWQgcmVtb3ZlQWxsU3VibGF5ZXJzKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBhcHBlbmRTdWJsYXll
cihXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXImKSBvdmVycmlkZTsKLSAgICB2b2lkIGluc2VydFN1
YmxheWVyKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllciYsIHNpemVfdCBpbmRleCkgb3ZlcnJpZGU7
Ci0gICAgdm9pZCByZXBsYWNlU3VibGF5ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyJiByZWZl
cmVuY2UsIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllciYpIG92ZXJyaWRlOwotICAgIGNvbnN0IFdl
YkNvcmU6OlBsYXRmb3JtQ0FMYXllckxpc3QqIGN1c3RvbVN1YmxheWVycygpIGNvbnN0IG92ZXJy
aWRlIHsgcmV0dXJuIG51bGxwdHI7IH0KLSAgICB2b2lkIGFkb3B0U3VibGF5ZXJzKFdlYkNvcmU6
OlBsYXRmb3JtQ0FMYXllciYgc291cmNlKSBvdmVycmlkZTsKLQotICAgIHZvaWQgYWRkQW5pbWF0
aW9uRm9yS2V5KGNvbnN0IFN0cmluZyYga2V5LCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9u
Jikgb3ZlcnJpZGU7Ci0gICAgdm9pZCByZW1vdmVBbmltYXRpb25Gb3JLZXkoY29uc3QgU3RyaW5n
JiBrZXkpIG92ZXJyaWRlOwotICAgIFJlZlB0cjxXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9u
PiBhbmltYXRpb25Gb3JLZXkoY29uc3QgU3RyaW5nJiBrZXkpIG92ZXJyaWRlOwotICAgIHZvaWQg
YW5pbWF0aW9uU3RhcnRlZChjb25zdCBTdHJpbmcmIGtleSwgQ0ZUaW1lSW50ZXJ2YWwgYmVnaW5U
aW1lKSBvdmVycmlkZTsKLSAgICB2b2lkIGFuaW1hdGlvbkVuZGVkKGNvbnN0IFN0cmluZyYga2V5
KSBvdmVycmlkZTsKLQotICAgIHZvaWQgc2V0TWFzayhXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXIq
KSBvdmVycmlkZTsKLQotICAgIGJvb2wgaXNPcGFxdWUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2
b2lkIHNldE9wYXF1ZShib29sKSBvdmVycmlkZTsKLQotICAgIFdlYkNvcmU6OkZsb2F0UmVjdCBi
b3VuZHMoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldEJvdW5kcyhjb25zdCBXZWJDb3Jl
OjpGbG9hdFJlY3QmKSBvdmVycmlkZTsKLQotICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQzRCBwb3Np
dGlvbigpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0UG9zaXRpb24oY29uc3QgV2ViQ29y
ZTo6RmxvYXRQb2ludDNEJikgb3ZlcnJpZGU7Ci0KLSAgICBXZWJDb3JlOjpGbG9hdFBvaW50M0Qg
YW5jaG9yUG9pbnQoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldEFuY2hvclBvaW50KGNv
bnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQzRCYpIG92ZXJyaWRlOwotCi0gICAgV2ViQ29yZTo6VHJh
bnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBz
ZXRUcmFuc2Zvcm0oY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgmKSBvdmVycmlk
ZTsKLQotICAgIFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4IHN1YmxheWVyVHJhbnNmb3Jt
KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRTdWJsYXllclRyYW5zZm9ybShjb25zdCBX
ZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCYpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBpc0hp
ZGRlbigpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0SGlkZGVuKGJvb2wpIG92ZXJyaWRl
OwotCi0gICAgYm9vbCBjb250ZW50c0hpZGRlbigpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQg
c2V0Q29udGVudHNIaWRkZW4oYm9vbCkgb3ZlcnJpZGU7Ci0KLSAgICBib29sIHVzZXJJbnRlcmFj
dGlvbkVuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldFVzZXJJbnRlcmFjdGlv
bkVuYWJsZWQoYm9vbCkgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldEJhY2tpbmdTdG9yZUF0dGFj
aGVkKGJvb2wpIG92ZXJyaWRlOwotICAgIGJvb2wgYmFja2luZ1N0b3JlQXR0YWNoZWQoKSBjb25z
dCBvdmVycmlkZTsKLQotICAgIGJvb2wgZ2VvbWV0cnlGbGlwcGVkKCkgY29uc3Qgb3ZlcnJpZGU7
Ci0gICAgdm9pZCBzZXRHZW9tZXRyeUZsaXBwZWQoYm9vbCkgb3ZlcnJpZGU7Ci0KLSAgICBib29s
IGlzRG91YmxlU2lkZWQoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldERvdWJsZVNpZGVk
KGJvb2wpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBtYXNrc1RvQm91bmRzKCkgY29uc3Qgb3ZlcnJp
ZGU7Ci0gICAgdm9pZCBzZXRNYXNrc1RvQm91bmRzKGJvb2wpIG92ZXJyaWRlOwotCi0gICAgYm9v
bCBhY2NlbGVyYXRlc0RyYXdpbmcoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldEFjY2Vs
ZXJhdGVzRHJhd2luZyhib29sKSBvdmVycmlkZTsKLQotICAgIGJvb2wgd2FudHNEZWVwQ29sb3JC
YWNraW5nU3RvcmUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldFdhbnRzRGVlcENvbG9y
QmFja2luZ1N0b3JlKGJvb2wpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBzdXBwb3J0c1N1YnBpeGVs
QW50aWFsaWFzZWRUZXh0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRTdXBwb3J0c1N1
YnBpeGVsQW50aWFsaWFzZWRUZXh0KGJvb2wpIG92ZXJyaWRlOwotCi0gICAgQ0ZUeXBlUmVmIGNv
bnRlbnRzKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRDb250ZW50cyhDRlR5cGVSZWYp
IG92ZXJyaWRlOwotCi0gICAgdm9pZCBzZXRDb250ZW50c1JlY3QoY29uc3QgV2ViQ29yZTo6Rmxv
YXRSZWN0Jikgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldE1pbmlmaWNhdGlvbkZpbHRlcihXZWJD
b3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkZpbHRlclR5cGUpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0
TWFnbmlmaWNhdGlvbkZpbHRlcihXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkZpbHRlclR5cGUp
IG92ZXJyaWRlOwotCi0gICAgV2ViQ29yZTo6Q29sb3IgYmFja2dyb3VuZENvbG9yKCkgY29uc3Qg
b3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgV2ViQ29yZTo6Q29s
b3ImKSBvdmVycmlkZTsKLQotICAgIHZvaWQgc2V0Qm9yZGVyV2lkdGgoZmxvYXQpIG92ZXJyaWRl
OwotICAgIHZvaWQgc2V0Qm9yZGVyQ29sb3IoY29uc3QgV2ViQ29yZTo6Q29sb3ImKSBvdmVycmlk
ZTsKLQotICAgIGZsb2F0IG9wYWNpdHkoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldE9w
YWNpdHkoZmxvYXQpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBzZXRGaWx0ZXJzKGNvbnN0IFdlYkNv
cmU6OkZpbHRlck9wZXJhdGlvbnMmKSBvdmVycmlkZTsKLSAgICBzdGF0aWMgYm9vbCBmaWx0ZXJz
Q2FuQmVDb21wb3NpdGVkKGNvbnN0IFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbnMmKTsKLSAgICB2
b2lkIGNvcHlGaWx0ZXJzRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXImKSBvdmVy
cmlkZTsKLQotI2lmIEVOQUJMRShDU1NfQ09NUE9TSVRJTkcpCi0gICAgdm9pZCBzZXRCbGVuZE1v
ZGUoV2ViQ29yZTo6QmxlbmRNb2RlKSBvdmVycmlkZTsKLSNlbmRpZgotCi0gICAgdm9pZCBzZXRO
YW1lKGNvbnN0IFN0cmluZyYpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBzZXRTcGVlZChmbG9hdCkg
b3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldFRpbWVPZmZzZXQoQ0ZUaW1lSW50ZXJ2YWwpIG92ZXJy
aWRlOwotCi0gICAgZmxvYXQgY29udGVudHNTY2FsZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZv
aWQgc2V0Q29udGVudHNTY2FsZShmbG9hdCkgb3ZlcnJpZGU7Ci0KLSAgICBmbG9hdCBjb3JuZXJS
YWRpdXMoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldENvcm5lclJhZGl1cyhmbG9hdCkg
b3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldEVkZ2VBbnRpYWxpYXNpbmdNYXNrKHVuc2lnbmVkKSBv
dmVycmlkZTsKLQotICAgIC8vIEZJWE1FOiBIYXZpbmcgYm90aCBzaGFwZVJvdW5kZWRSZWN0IGFu
ZCBzaGFwZVBhdGggaXMgcmVkdW5kYW50LiBXZSBjb3VsZCB1c2Ugc2hhcGVQYXRoIGZvciBldmVy
eXRoaW5nLgotICAgIFdlYkNvcmU6OkZsb2F0Um91bmRlZFJlY3Qgc2hhcGVSb3VuZGVkUmVjdCgp
IGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0U2hhcGVSb3VuZGVkUmVjdChjb25zdCBXZWJD
b3JlOjpGbG9hdFJvdW5kZWRSZWN0Jikgb3ZlcnJpZGU7Ci0KLSAgICBXZWJDb3JlOjpQYXRoIHNo
YXBlUGF0aCgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0U2hhcGVQYXRoKGNvbnN0IFdl
YkNvcmU6OlBhdGgmKSBvdmVycmlkZTsKLQotICAgIFdlYkNvcmU6OldpbmRSdWxlIHNoYXBlV2lu
ZFJ1bGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldFNoYXBlV2luZFJ1bGUoV2ViQ29y
ZTo6V2luZFJ1bGUpIG92ZXJyaWRlOwotCi0gICAgV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6Q3Vz
dG9tQXBwZWFyYW5jZSBjdXN0b21BcHBlYXJhbmNlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9p
ZCB1cGRhdGVDdXN0b21BcHBlYXJhbmNlKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OkN1c3RvbUFw
cGVhcmFuY2UpIG92ZXJyaWRlOwotCi0gICAgV2ViQ29yZTo6VGlsZWRCYWNraW5nKiB0aWxlZEJh
Y2tpbmcoKSBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9Ci0KLSAgICBSZWY8V2ViQ29yZTo6
UGxhdGZvcm1DQUxheWVyPiBjbG9uZShXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93
bmVyKSBjb25zdCBvdmVycmlkZTsKLQotICAgIFJlZjxQbGF0Zm9ybUNBTGF5ZXI+IGNyZWF0ZUNv
bXBhdGlibGVMYXllcihXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSwgV2ViQ29y
ZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGVu
dW1lcmF0ZVJlY3RzQmVpbmdEcmF3bihDR0NvbnRleHRSZWYsIHZvaWQgKF5ibG9jaykoQ0dSZWN0
KSkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGhvc3RpbmdDb250ZXh0SUQoKTsK
LQotICAgIHVuc2lnbmVkIGJhY2tpbmdTdG9yZUJ5dGVzUGVyUGl4ZWwoKSBjb25zdCBvdmVycmlk
ZTsKLQotICAgIHZvaWQgc2V0Q2xvbmVkTGF5ZXIoY29uc3QgUGxhdGZvcm1DQUxheWVyKik7Ci0K
LSAgICBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6TGF5ZXJQcm9wZXJ0aWVzJiBwcm9wZXJ0
aWVzKCkgeyByZXR1cm4gbV9wcm9wZXJ0aWVzOyB9Ci0gICAgY29uc3QgUmVtb3RlTGF5ZXJUcmVl
VHJhbnNhY3Rpb246OkxheWVyUHJvcGVydGllcyYgcHJvcGVydGllcygpIGNvbnN0IHsgcmV0dXJu
IG1fcHJvcGVydGllczsgfQotCi0gICAgdm9pZCBkaWRDb21taXQoKTsKLQotICAgIHZvaWQgY2xl
YXJDb250ZXh0KCkgeyBtX2NvbnRleHQgPSBudWxscHRyOyB9Ci0gICAgUmVtb3RlTGF5ZXJUcmVl
Q29udGV4dCogY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGV4dDsgfQotCi1wcm90ZWN0
ZWQ6Ci0gICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcjo6
TGF5ZXJUeXBlLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVM
YXllclRyZWVDb250ZXh0JiBjb250ZXh0KTsKLSAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUoY29u
c3QgUGxhdGZvcm1DQUxheWVyUmVtb3RlJiwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50
KiwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYpOwotCi0gICAgdm9pZCB1cGRhdGVDbG9uZWRMYXll
clByb3BlcnRpZXMoUGxhdGZvcm1DQUxheWVyUmVtb3RlJiBjbG9uZSwgYm9vbCBjb3B5Q29udGVu
dHMgPSB0cnVlKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBib29sIGlzUGxhdGZvcm1DQUxheWVy
UmVtb3RlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZvaWQgZW5zdXJl
QmFja2luZ1N0b3JlKCk7Ci0gICAgdm9pZCB1cGRhdGVCYWNraW5nU3RvcmUoKTsKLSAgICB2b2lk
IHJlbW92ZVN1YmxheWVyKFBsYXRmb3JtQ0FMYXllclJlbW90ZSopOwotCi0gICAgYm9vbCByZXF1
aXJlc0N1c3RvbUFwcGVhcmFuY2VVcGRhdGVPbkJvdW5kc0NoYW5nZSgpIGNvbnN0OwotCi0gICAg
V2ViQ29yZTo6TGF5ZXJQb29sJiBsYXllclBvb2woKSBvdmVycmlkZTsKLQotICAgIFJlbW90ZUxh
eWVyVHJlZVRyYW5zYWN0aW9uOjpMYXllclByb3BlcnRpZXMgbV9wcm9wZXJ0aWVzOwotICAgIFdl
YkNvcmU6OlBsYXRmb3JtQ0FMYXllckxpc3QgbV9jaGlsZHJlbjsKLSAgICBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGUqIG1fc3VwZXJsYXllciB7IG51bGxwdHIgfTsKLSAgICBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGUqIG1fbWFza0xheWVyIHsgbnVsbHB0ciB9OwotICAgIEhhc2hNYXA8U3RyaW5nLCBSZWZQ
dHI8V2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbj4+IG1fYW5pbWF0aW9uczsKLQotICAgIGJv
b2wgbV9hY2NlbGVyYXRlc0RyYXdpbmcgeyBmYWxzZSB9OwotICAgIGJvb2wgbV93YW50c0RlZXBD
b2xvckJhY2tpbmdTdG9yZSB7IGZhbHNlIH07Ci0KLSAgICBSZW1vdGVMYXllclRyZWVDb250ZXh0
KiBtX2NvbnRleHQ7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKLQotU1BFQ0lBTElaRV9U
WVBFX1RSQUlUU19QTEFURk9STV9DQUxBWUVSKFdlYktpdDo6UGxhdGZvcm1DQUxheWVyUmVtb3Rl
LCBpc1BsYXRmb3JtQ0FMYXllclJlbW90ZSgpKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9X
ZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5oIGIvU291
cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1
c3RvbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQ2NGNmMGNmYjQwMWYwYjdj
ZTNmMTZiNGMwYWI0ZDA4ZDI2NjQxLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVDdXN0b20uaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgot
ICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKLSAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UK
LQotI2luY2x1ZGUgIlBsYXRmb3JtQ0FMYXllclJlbW90ZS5oIgotCi1uYW1lc3BhY2UgV2ViS2l0
IHsKLQotY2xhc3MgTGF5ZXJIb3N0aW5nQ29udGV4dDsKLQotLy8gUGxhdGZvcm1DQUxheWVyUmVt
b3RlQ3VzdG9tIGlzIHVzZWQgZm9yIENBTGF5ZXJzIHRoYXQgbGl2ZSBpbiB0aGUgd2ViIHByb2Nl
c3MgYW5kIGFyZSBob3N0ZWQgaW50byB0aGUgVUkgcHJvY2VzcyB2aWEgcmVtb3RlIGNvbnRleHQu
Ci1jbGFzcyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20gZmluYWwgOiBwdWJsaWMgUGxhdGZv
cm1DQUxheWVyUmVtb3RlIHsKLSAgICBmcmllbmQgY2xhc3MgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
OwotcHVibGljOgotICAgIHN0YXRpYyBSZWY8UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBjcmVhdGUo
UGxhdGZvcm1MYXllciAqLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqLCBSZW1vdGVM
YXllclRyZWVDb250ZXh0Jik7Ci0KLSAgICB2aXJ0dWFsIH5QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVD
dXN0b20oKTsKLQotICAgIFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdCBvdmVy
cmlkZSB7IHJldHVybiBtX3BsYXRmb3JtTGF5ZXIuZ2V0KCk7IH0KLQotICAgIHVpbnQzMl90IGhv
c3RpbmdDb250ZXh0SUQoKSBvdmVycmlkZTsKLQotICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5S
ZWN0KGNvbnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYgZGlydHlSZWN0KSBvdmVycmlkZTsKLSAgICB2
b2lkIHNldE5lZWRzRGlzcGxheSgpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZUN1c3RvbShXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSwg
UGxhdGZvcm1MYXllciAqLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBS
ZW1vdGVMYXllclRyZWVDb250ZXh0Jik7Ci0KLSAgICBSZWY8V2ViQ29yZTo6UGxhdGZvcm1DQUxh
eWVyPiBjbG9uZShXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyKSBjb25zdCBv
dmVycmlkZTsKLQotICAgIGJvb2wgaXNQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20oKSBjb25z
dCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBDRlR5cGVSZWYgY29udGVudHMoKSBj
b25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldENvbnRlbnRzKENGVHlwZVJlZikgb3ZlcnJpZGU7
Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8TGF5ZXJIb3N0aW5nQ29udGV4dD4gbV9sYXllckhvc3Rp
bmdDb250ZXh0OwotICAgIFJldGFpblB0cjxQbGF0Zm9ybUxheWVyPiBtX3BsYXRmb3JtTGF5ZXI7
Ci0gICAgYm9vbCBtX3Byb3ZpZGVzQ29udGVudHM7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBXZWJL
aXQKLQotU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19QTEFURk9STV9DQUxBWUVSKFdlYktpdDo6UGxh
dGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tLCBpc1BsYXRmb3JtQ0FMYXllclJlbW90ZSgpKQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FM
YXllclJlbW90ZUN1c3RvbS5tbSBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21h
Yy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20ubW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IGM2OWI5YjMxNWFjODNkYjZkNzg4YzhmMTM2MzIyZTg2Nzc2MmM2MDAuLjAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5tbQorKysgL2Rl
di9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAot
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
Ci0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2ltcG9ydCAiUGxhdGZvcm1DQUxh
eWVyUmVtb3RlQ3VzdG9tLmgiCi0KLSNpbXBvcnQgIkxheWVySG9zdGluZ0NvbnRleHQuaCIKLSNp
bXBvcnQgIlJlbW90ZUxheWVyVHJlZUNvbnRleHQuaCIKLSNpbXBvcnQgIlJlbW90ZUxheWVyVHJl
ZVByb3BlcnR5QXBwbGllci5oIgotI2ltcG9ydCAiV2ViUHJvY2Vzcy5oIgotI2ltcG9ydCA8QVZG
b3VuZGF0aW9uL0FWRm91bmRhdGlvbi5oPgotI2ltcG9ydCA8V2ViQ29yZS9HcmFwaGljc0xheWVy
Q0EuaD4KLSNpbXBvcnQgPFdlYkNvcmUvUGxhdGZvcm1DQUxheWVyQ29jb2EuaD4KLSNpbXBvcnQg
PFdlYkNvcmUvV2ViQ29yZUNBTGF5ZXJFeHRyYXMuaD4KLSNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIu
aD4KLSNpbXBvcnQgPHd0Zi9Tb2Z0TGlua2luZy5oPgotCi1TT0ZUX0xJTktfRlJBTUVXT1JLX09Q
VElPTkFMKEFWRm91bmRhdGlvbikKLVNPRlRfTElOS19DTEFTU19PUFRJT05BTChBVkZvdW5kYXRp
b24sIEFWUGxheWVyTGF5ZXIpCi0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotCi1uYW1lc3Bh
Y2UgV2ViS2l0IHsKLQotc3RhdGljIE5TU3RyaW5nICogY29uc3QgcGxhdGZvcm1DQUxheWVyUG9p
bnRlciA9IEAiV0tQbGF0Zm9ybUNBTGF5ZXIiOwotCi1SZWY8UGxhdGZvcm1DQUxheWVyUmVtb3Rl
PiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b206OmNyZWF0ZShQbGF0Zm9ybUxheWVyICpwbGF0
Zm9ybUxheWVyLCBQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVD
b250ZXh0JiBjb250ZXh0KQotewotICAgIGF1dG8gbGF5ZXIgPSBhZG9wdFJlZigqbmV3IFBsYXRm
b3JtQ0FMYXllclJlbW90ZUN1c3RvbShQbGF0Zm9ybUNBTGF5ZXJDb2NvYTo6bGF5ZXJUeXBlRm9y
UGxhdGZvcm1MYXllcihwbGF0Zm9ybUxheWVyKSwgcGxhdGZvcm1MYXllciwgb3duZXIsIGNvbnRl
eHQpKTsKLSAgICBjb250ZXh0LmxheWVyV2FzQ3JlYXRlZChsYXllci5nZXQoKSwgbGF5ZXItPmxh
eWVyVHlwZSgpKTsKLSAgICByZXR1cm4gV1RGTW92ZShsYXllcik7Ci19Ci0KLVBsYXRmb3JtQ0FM
YXllclJlbW90ZUN1c3RvbTo6UGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKExheWVyVHlwZSBs
YXllclR5cGUsIFBsYXRmb3JtTGF5ZXIgKiBjdXN0b21MYXllciwgUGxhdGZvcm1DQUxheWVyQ2xp
ZW50KiBvd25lciwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCkKLSAgICA6IFBsYXRm
b3JtQ0FMYXllclJlbW90ZShsYXllclR5cGUsIG93bmVyLCBjb250ZXh0KQotewotICAgIHN3aXRj
aCAoY29udGV4dC5sYXllckhvc3RpbmdNb2RlKCkpIHsKLSAgICBjYXNlIExheWVySG9zdGluZ01v
ZGU6OkluUHJvY2VzczoKLSAgICAgICAgbV9sYXllckhvc3RpbmdDb250ZXh0ID0gTGF5ZXJIb3N0
aW5nQ29udGV4dDo6Y3JlYXRlRm9yUG9ydChXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5jb21wb3Np
dGluZ1JlbmRlclNlcnZlclBvcnQoKSk7Ci0gICAgICAgIGJyZWFrOwotI2lmIEhBVkUoT1VUX09G
X1BST0NFU1NfTEFZRVJfSE9TVElORykKLSAgICBjYXNlIExheWVySG9zdGluZ01vZGU6Ok91dE9m
UHJvY2VzczoKLSAgICAgICAgbV9sYXllckhvc3RpbmdDb250ZXh0ID0gTGF5ZXJIb3N0aW5nQ29u
dGV4dDo6Y3JlYXRlRm9yRXh0ZXJuYWxIb3N0aW5nUHJvY2VzcygpOwotI2lmIFBMQVRGT1JNKElP
UykKLSAgICAgICAgaWYgKGxheWVyVHlwZSA9PSBMYXllclR5cGVBVlBsYXllckxheWVyKSB7Ci0g
ICAgICAgICAgICBmbG9hdCBzY2FsZUZhY3RvciA9IGNvbnRleHQuZGV2aWNlU2NhbGVGYWN0b3Io
KTsKLSAgICAgICAgICAgIC8vIFNldCBhIHNjYWxlIGZhY3RvciBoZXJlIHRvIG1ha2UgY29udmVy
dFJlY3Q6dG9MYXllcjpuaWwgdGFrZSBzY2FsZSBmYWN0b3IgaW50byBhY2NvdW50LiA8cmRhcjov
L3Byb2JsZW0vMTgzMTY1NDI+LgotICAgICAgICAgICAgLy8gVGhpcyBzY2FsZSBmYWN0b3IgaXMg
aW52ZXJ0ZWQgaW4gdGhlIGhvc3RpbmcgcHJvY2Vzcy4KLSAgICAgICAgICAgIFtjdXN0b21MYXll
ciBzZXRUcmFuc2Zvcm06Q0FUcmFuc2Zvcm0zRE1ha2VTY2FsZShzY2FsZUZhY3Rvciwgc2NhbGVG
YWN0b3IsIDEpXTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0g
ICAgfQotCi0gICAgbV9sYXllckhvc3RpbmdDb250ZXh0LT5zZXRSb290TGF5ZXIoY3VzdG9tTGF5
ZXIpOwotICAgIFtjdXN0b21MYXllciBzZXRWYWx1ZTpbTlNWYWx1ZSB2YWx1ZVdpdGhQb2ludGVy
OnRoaXNdIGZvcktleTpwbGF0Zm9ybUNBTGF5ZXJQb2ludGVyXTsKLQotICAgIG1fcGxhdGZvcm1M
YXllciA9IGN1c3RvbUxheWVyOwotICAgIFtjdXN0b21MYXllciB3ZWJfZGlzYWJsZUFsbEFjdGlv
bnNdOwotCi0gICAgbV9wcm92aWRlc0NvbnRlbnRzID0gbGF5ZXJUeXBlID09IExheWVyVHlwZUNv
bnRlbnRzUHJvdmlkZWRMYXllcjsKLQotICAgIHByb3BlcnRpZXMoKS5wb3NpdGlvbiA9IEZsb2F0
UG9pbnQzRChjdXN0b21MYXllci5wb3NpdGlvbi54LCBjdXN0b21MYXllci5wb3NpdGlvbi55LCBj
dXN0b21MYXllci56UG9zaXRpb24pOwotICAgIHByb3BlcnRpZXMoKS5hbmNob3JQb2ludCA9IEZs
b2F0UG9pbnQzRChjdXN0b21MYXllci5hbmNob3JQb2ludC54LCBjdXN0b21MYXllci5hbmNob3JQ
b2ludC55LCBjdXN0b21MYXllci5hbmNob3JQb2ludFopOwotICAgIHByb3BlcnRpZXMoKS5ib3Vu
ZHMgPSBjdXN0b21MYXllci5ib3VuZHM7Ci0gICAgcHJvcGVydGllcygpLmNvbnRlbnRzUmVjdCA9
IGN1c3RvbUxheWVyLmNvbnRlbnRzUmVjdDsKLX0KLQotUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3Vz
dG9tOjp+UGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKCkKLXsKLSAgICBbbV9wbGF0Zm9ybUxh
eWVyIHNldFZhbHVlOm5pbCBmb3JLZXk6cGxhdGZvcm1DQUxheWVyUG9pbnRlcl07Ci19Ci0KLXVp
bnQzMl90IFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6aG9zdGluZ0NvbnRleHRJRCgpCi17
Ci0gICAgcmV0dXJuIG1fbGF5ZXJIb3N0aW5nQ29udGV4dC0+Y29udGV4dElEKCk7Ci19Ci0KLVJl
ZjxXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI+IFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6
Y2xvbmUoUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikgY29uc3QKLXsKLSAgICBSZXRhaW5Q
dHI8Q0FMYXllciAqPiBjbG9uZWRMYXllcjsKLSAgICBib29sIGNvcHlDb250ZW50cyA9IHRydWU7
Ci0KLSAgICBpZiAobGF5ZXJUeXBlKCkgPT0gTGF5ZXJUeXBlQVZQbGF5ZXJMYXllcikgewotICAg
ICAgICAKLSAgICAgICAgaWYgKFtwbGF0Zm9ybUxheWVyKCkgaXNLaW5kT2ZDbGFzczpnZXRBVlBs
YXllckxheWVyQ2xhc3MoKV0pIHsKLSAgICAgICAgICAgIGNsb25lZExheWVyID0gYWRvcHROUyhb
YWxsb2NBVlBsYXllckxheWVySW5zdGFuY2UoKSBpbml0XSk7Ci0KLSAgICAgICAgICAgIEFWUGxh
eWVyTGF5ZXIqIGRlc3RpbmF0aW9uUGxheWVyTGF5ZXIgPSBzdGF0aWNfY2FzdDxBVlBsYXllckxh
eWVyICo+KGNsb25lZExheWVyLmdldCgpKTsKLSAgICAgICAgICAgIEFWUGxheWVyTGF5ZXIqIHNv
dXJjZVBsYXllckxheWVyID0gc3RhdGljX2Nhc3Q8QVZQbGF5ZXJMYXllciAqPihwbGF0Zm9ybUxh
eWVyKCkpOwotICAgICAgICAgICAgZGlzcGF0Y2hfYXN5bmMoZGlzcGF0Y2hfZ2V0X21haW5fcXVl
dWUoKSwgXnsKLSAgICAgICAgICAgICAgICBbZGVzdGluYXRpb25QbGF5ZXJMYXllciBzZXRQbGF5
ZXI6W3NvdXJjZVBsYXllckxheWVyIHBsYXllcl1dOwotICAgICAgICAgICAgfSk7Ci0gICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBPbiBpT1MsIHRoZSBBVlBsYXllckxheWVyIGlzIGlu
c2lkZSBhIFdlYlZpZGVvQ29udGFpbmVyTGF5ZXIuIFRoaXMgY29kZSBuZWVkcyB0byBzaGFyZSBs
b2dpYyB3aXRoIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbk9iakM6OmNyZWF0ZUFWUGxh
eWVyTGF5ZXIoKS4KLSAgICAgICAgICAgIGNsb25lZExheWVyID0gYWRvcHROUyhbW0NBTGF5ZXIg
YWxsb2NdIGluaXRdKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvcHlDb250ZW50cyA9IGZhbHNl
OwotICAgIH0gZWxzZSBpZiAobGF5ZXJUeXBlKCkgPT0gTGF5ZXJUeXBlQ29udGVudHNQcm92aWRl
ZExheWVyKSB7Ci0gICAgICAgIGNsb25lZExheWVyID0gYWRvcHROUyhbW0NBTGF5ZXIgYWxsb2Nd
IGluaXRdKTsKLSAgICAgICAgLy8gRklYTUU6IGN1cnJlbnRseSBjb3B5aW5nIFdlYkdMIGNvbnRl
bnRzIGJyZWFrcyB0aGUgb3JpZ2luYWwgbGF5ZXIuCi0gICAgICAgIGNvcHlDb250ZW50cyA9IGZh
bHNlOwotICAgIH0KLQotICAgIGF1dG8gY2xvbmUgPSBhZG9wdFJlZigqbmV3IFBsYXRmb3JtQ0FM
YXllclJlbW90ZUN1c3RvbShsYXllclR5cGUoKSwgY2xvbmVkTGF5ZXIuZ2V0KCksIG93bmVyLCAq
Y29udGV4dCgpKSk7Ci0gICAgY29udGV4dCgpLT5sYXllcldhc0NyZWF0ZWQoY2xvbmUuZ2V0KCks
IGNsb25lLT5sYXllclR5cGUoKSk7Ci0KLSAgICB1cGRhdGVDbG9uZWRMYXllclByb3BlcnRpZXMo
Y2xvbmUuZ2V0KCksIGNvcHlDb250ZW50cyk7Ci0KLSAgICBjbG9uZS0+c2V0Q2xvbmVkTGF5ZXIo
dGhpcyk7Ci0gICAgcmV0dXJuIFdURk1vdmUoY2xvbmUpOwotfQotCi1DRlR5cGVSZWYgUGxhdGZv
cm1DQUxheWVyUmVtb3RlQ3VzdG9tOjpjb250ZW50cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFtt
X3BsYXRmb3JtTGF5ZXIgY29udGVudHNdOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90
ZUN1c3RvbTo6c2V0Q29udGVudHMoQ0ZUeXBlUmVmIGNvbnRlbnRzKQotewotICAgIFttX3BsYXRm
b3JtTGF5ZXIgc2V0Q29udGVudHM6KGlkKWNvbnRlbnRzXTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGVDdXN0b206OnNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3Qm
IHJlY3QpCi17Ci0gICAgaWYgKG1fcHJvdmlkZXNDb250ZW50cykKLSAgICAgICAgW21fcGxhdGZv
cm1MYXllciBzZXROZWVkc0Rpc3BsYXlJblJlY3Q6cmVjdF07Ci0gICAgZWxzZQotICAgICAgICBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldE5lZWRzRGlzcGxheUluUmVjdChyZWN0KTsKLX0KLQot
dm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b206OnNldE5lZWRzRGlzcGxheSgpCi17Ci0g
ICAgaWYgKG1fcHJvdmlkZXNDb250ZW50cykKLSAgICAgICAgW21fcGxhdGZvcm1MYXllciBzZXRO
ZWVkc0Rpc3BsYXldOwotICAgIGVsc2UKLSAgICAgICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpz
ZXROZWVkc0Rpc3BsYXkoKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVt
b3RlVGlsZWRCYWNraW5nLmNwcCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21h
Yy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCBmZWMzMGMyZDIxNmU3YTQ5YjJjMmZmMTNlZTY5ZjA5ZWE3ODVhMjgxLi4w
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJL
aXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tp
bmcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW1wb3J0
ICJQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuaCIKLQotI2ltcG9ydCAiUmVtb3Rl
TGF5ZXJUcmVlQ29udGV4dC5oIgotI2ltcG9ydCA8V2ViQ29yZS9HcmFwaGljc0xheWVyQ0EuaD4K
LSNpbXBvcnQgPFdlYkNvcmUvUGxhdGZvcm1DQUxheWVyQ29jb2EuaD4KLSNpbXBvcnQgPHd0Zi9S
ZXRhaW5QdHIuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJL
aXQgewotCi1QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OlBsYXRmb3JtQ0FMYXll
clJlbW90ZVRpbGVkQmFja2luZyhMYXllclR5cGUgbGF5ZXJUeXBlLCBQbGF0Zm9ybUNBTGF5ZXJD
bGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250ZXh0KQotICAgIDogUGxh
dGZvcm1DQUxheWVyUmVtb3RlKGxheWVyVHlwZSwgb3duZXIsIGNvbnRleHQpCi0gICAgLCBtX3Rp
bGVDb250cm9sbGVyKHN0ZDo6bWFrZV91bmlxdWU8VGlsZUNvbnRyb2xsZXI+KHRoaXMpKQotewot
fQotCi1QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6On5QbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGVUaWxlZEJhY2tpbmcoKQotewotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRp
bGVkQmFja2luZzo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYgZGlydHlS
ZWN0KQotewotICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldE5lZWRzRGlzcGxheUluUmVjdChlbmNs
b3NpbmdJbnRSZWN0KGRpcnR5UmVjdCkpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90
ZVRpbGVkQmFja2luZzo6c2V0TmVlZHNEaXNwbGF5KCkKLXsKLSAgICBtX3RpbGVDb250cm9sbGVy
LT5zZXROZWVkc0Rpc3BsYXkoKTsKLX0KLQotY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVy
TGlzdCogUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpjdXN0b21TdWJsYXllcnMo
KSBjb25zdAotewotICAgIG1fY3VzdG9tU3VibGF5ZXJzID0gbV90aWxlQ29udHJvbGxlci0+Y29u
dGFpbmVyTGF5ZXJzKCk7Ci0gICAgcmV0dXJuICZtX2N1c3RvbVN1YmxheWVyczsKLX0KLQotdm9p
ZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldEJvdW5kcyhjb25zdCBXZWJD
b3JlOjpGbG9hdFJlY3QmIGJvdW5kcykKLXsKLSAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNl
dEJvdW5kcyhib3VuZHMpOwotICAgIG1fdGlsZUNvbnRyb2xsZXItPnRpbGVDYWNoZUxheWVyQm91
bmRzQ2hhbmdlZCgpOwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2lu
Zzo6aXNPcGFxdWUoKSBjb25zdAotewotICAgIHJldHVybiBtX3RpbGVDb250cm9sbGVyLT50aWxl
c0FyZU9wYXF1ZSgpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2lu
Zzo6c2V0T3BhcXVlKGJvb2wgb3BhcXVlKQotewotICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldFRp
bGVzT3BhcXVlKG9wYXF1ZSk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRC
YWNraW5nOjphY2NlbGVyYXRlc0RyYXdpbmcoKSBjb25zdAotewotICAgIHJldHVybiBtX3RpbGVD
b250cm9sbGVyLT5hY2NlbGVyYXRlc0RyYXdpbmcoKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldEFjY2VsZXJhdGVzRHJhd2luZyhib29sIGFjY2VsZXJh
dGVzRHJhd2luZykKLXsKLSAgICBtX3RpbGVDb250cm9sbGVyLT5zZXRBY2NlbGVyYXRlc0RyYXdp
bmcoYWNjZWxlcmF0ZXNEcmF3aW5nKTsKLX0KLQotYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVU
aWxlZEJhY2tpbmc6OndhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gbV90aWxlQ29udHJvbGxlci0+d2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUoKTsKLX0K
LQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldFdhbnRzRGVlcENv
bG9yQmFja2luZ1N0b3JlKGJvb2wgd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUpCi17Ci0gICAg
bV90aWxlQ29udHJvbGxlci0+c2V0V2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUod2FudHNEZWVw
Q29sb3JCYWNraW5nU3RvcmUpOwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVk
QmFja2luZzo6c3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dCgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1fdGlsZUNvbnRyb2xsZXItPnN1cHBvcnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRleHQo
KTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldFN1cHBv
cnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRleHQoYm9vbCBzdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFz
ZWRUZXh0KQotewotICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldFN1cHBvcnRzU3VicGl4ZWxBbnRp
YWxpYXNlZFRleHQoc3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dCk7Ci19Ci0KLWZsb2F0
IFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6Y29udGVudHNTY2FsZSgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fdGlsZUNvbnRyb2xsZXItPmNvbnRlbnRzU2NhbGUoKTsKLX0KLQot
dm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldENvbnRlbnRzU2NhbGUo
ZmxvYXQgc2NhbGUpCi17Ci0gICAgbV90aWxlQ29udHJvbGxlci0+c2V0Q29udGVudHNTY2FsZShz
Y2FsZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRC
b3JkZXJXaWR0aChmbG9hdCBib3JkZXJXaWR0aCkKLXsKLSAgICBtX3RpbGVDb250cm9sbGVyLT5z
ZXRUaWxlRGVidWdCb3JkZXJXaWR0aChib3JkZXJXaWR0aCAvIDIpOwotfQotCi12b2lkIFBsYXRm
b3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6c2V0Qm9yZGVyQ29sb3IoY29uc3QgV2ViQ29y
ZTo6Q29sb3ImIGNvbG9yKQotewotICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldFRpbGVEZWJ1Z0Jv
cmRlckNvbG9yKGNvbG9yKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVt
b3RlVGlsZWRCYWNraW5nLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMv
UGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDBkZGZjZTg1MmQ1MTI3MDNkMzRmNDM1MmEzOWY0NWEzZTVkMTVhNTkuLjAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9X
ZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5o
CisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAx
MyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
Ci0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0g
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRC
YWNraW5nX2gKLSNkZWZpbmUgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nX2gKLQot
I2luY2x1ZGUgIlBsYXRmb3JtQ0FMYXllclJlbW90ZS5oIgotI2luY2x1ZGUgPFdlYkNvcmUvVGls
ZUNvbnRyb2xsZXIuaD4KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFBsYXRmb3JtQ0FM
YXllclJlbW90ZVRpbGVkQmFja2luZyBmaW5hbCA6IHB1YmxpYyBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGUgewotICAgIGZyaWVuZCBjbGFzcyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU7Ci1wdWJsaWM6Ci0g
ICAgdmlydHVhbCB+UGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nKCk7Ci0KLXByaXZh
dGU6Ci0gICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nKFdlYkNvcmU6OlBsYXRm
b3JtQ0FMYXllcjo6TGF5ZXJUeXBlLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93
bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0Jik7Ci0KLSAgICBXZWJDb3JlOjpUaWxlZEJhY2tp
bmcqIHRpbGVkQmFja2luZygpIG92ZXJyaWRlIHsgcmV0dXJuIG1fdGlsZUNvbnRyb2xsZXIuZ2V0
KCk7IH0KLQotICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IFdlYkNvcmU6OkZs
b2F0UmVjdCYgZGlydHlSZWN0KSBvdmVycmlkZTsKLSAgICB2b2lkIHNldE5lZWRzRGlzcGxheSgp
IG92ZXJyaWRlOwotCi0gICAgY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyTGlzdCogY3Vz
dG9tU3VibGF5ZXJzKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldEJvdW5kcyhjb25z
dCBXZWJDb3JlOjpGbG9hdFJlY3QmKSBvdmVycmlkZTsKLSAgICAKLSAgICBib29sIGlzT3BhcXVl
KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRPcGFxdWUoYm9vbCkgb3ZlcnJpZGU7Ci0g
ICAgCi0gICAgYm9vbCBhY2NlbGVyYXRlc0RyYXdpbmcoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2
b2lkIHNldEFjY2VsZXJhdGVzRHJhd2luZyhib29sKSBvdmVycmlkZTsKLQotICAgIGJvb2wgd2Fu
dHNEZWVwQ29sb3JCYWNraW5nU3RvcmUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldFdh
bnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKGJvb2wpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBzdXBw
b3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBz
ZXRTdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KGJvb2wpIG92ZXJyaWRlOwotCi0gICAg
ZmxvYXQgY29udGVudHNTY2FsZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0Q29udGVu
dHNTY2FsZShmbG9hdCkgb3ZlcnJpZGU7Ci0gICAgCi0gICAgdm9pZCBzZXRCb3JkZXJXaWR0aChm
bG9hdCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRCb3JkZXJDb2xvcihjb25zdCBXZWJDb3JlOjpD
b2xvciYpIG92ZXJyaWRlOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlRpbGVDb250
cm9sbGVyPiBtX3RpbGVDb250cm9sbGVyOwotICAgIG11dGFibGUgV2ViQ29yZTo6UGxhdGZvcm1D
QUxheWVyTGlzdCBtX2N1c3RvbVN1YmxheWVyczsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktp
dAotCi0jZW5kaWYgLy8gUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nX2gKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXllclRy
ZWVDb250ZXh0LmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3Rl
TGF5ZXJUcmVlQ29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU0OGVh
MWM5NDUwM2FlOWEwYjA1ZDM2MmI0NzFiMWQwMGEwY2I4Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdl
L21hYy9SZW1vdGVMYXllclRyZWVDb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBSZW1vdGVMYXllclRyZWVDb250ZXh0X2gKLSNkZWZp
bmUgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dF9oCi0KLSNpbmNsdWRlICJMYXllclRyZWVDb250ZXh0
LmgiCi0jaW5jbHVkZSAiUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmVDb2xsZWN0aW9uLmgiCi0jaW5j
bHVkZSAiUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24uaCIKLSNpbmNsdWRlIDxXZWJDb3JlL0dy
YXBoaWNzTGF5ZXJGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9MYXllclBvb2wuaD4KLSNp
bmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtQ0FMYXllci5oPgotI2luY2x1ZGUgPHd0Zi9WZWN0b3Iu
aD4KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFBsYXRmb3JtQ0FMYXllclJlbW90ZTsK
LWNsYXNzIFdlYlBhZ2U7Ci0KLS8vIEZJWE1FOiBUaGlzIGNsYXNzIGRvZXNuJ3QgZG8gbXVjaCBu
b3cuIFJvbGwgaW50byBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYT8KLWNsYXNzIFJlbW90ZUxh
eWVyVHJlZUNvbnRleHQgOiBwdWJsaWMgV2ViQ29yZTo6R3JhcGhpY3NMYXllckZhY3Rvcnkgewot
cHVibGljOgotICAgIGV4cGxpY2l0IFJlbW90ZUxheWVyVHJlZUNvbnRleHQoV2ViUGFnZSYpOwot
ICAgIH5SZW1vdGVMYXllclRyZWVDb250ZXh0KCk7Ci0KLSAgICB2b2lkIGxheWVyV2FzQ3JlYXRl
ZChQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVy
VHlwZSk7Ci0gICAgdm9pZCBsYXllcldpbGxCZURlc3Ryb3llZChQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGUmKTsKLQotICAgIHZvaWQgYmFja2luZ1N0b3JlV2FzQ3JlYXRlZChSZW1vdGVMYXllckJhY2tp
bmdTdG9yZSYpOwotICAgIHZvaWQgYmFja2luZ1N0b3JlV2lsbEJlRGVzdHJveWVkKFJlbW90ZUxh
eWVyQmFja2luZ1N0b3JlJik7Ci0gICAgYm9vbCBiYWNraW5nU3RvcmVXaWxsQmVEaXNwbGF5ZWQo
UmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUmKTsKLQotICAgIFdlYkNvcmU6OkxheWVyUG9vbCYgbGF5
ZXJQb29sKCkgeyByZXR1cm4gbV9sYXllclBvb2w7IH0KLQotICAgIGZsb2F0IGRldmljZVNjYWxl
RmFjdG9yKCkgY29uc3Q7Ci0KLSAgICBMYXllckhvc3RpbmdNb2RlIGxheWVySG9zdGluZ01vZGUo
KSBjb25zdDsKLQotICAgIHZvaWQgYnVpbGRUcmFuc2FjdGlvbihSZW1vdGVMYXllclRyZWVUcmFu
c2FjdGlvbiYsIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllciYgcm9vdExheWVyKTsKLQotICAgIHZv
aWQgbGF5ZXJQcm9wZXJ0eUNoYW5nZWRXaGlsZUJ1aWxkaW5nVHJhbnNhY3Rpb24oUGxhdGZvcm1D
QUxheWVyUmVtb3RlJik7Ci0KLSAgICAvLyBGcm9tIHRoZSBVSSBwcm9jZXNzCi0gICAgdm9pZCBh
bmltYXRpb25EaWRTdGFydChXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQs
IGNvbnN0IFN0cmluZyYga2V5LCBkb3VibGUgc3RhcnRUaW1lKTsKLSAgICB2b2lkIGFuaW1hdGlv
bkRpZEVuZChXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQsIGNvbnN0IFN0
cmluZyYga2V5KTsKLQotICAgIHZvaWQgd2lsbFN0YXJ0QW5pbWF0aW9uT25MYXllcihQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGUmKTsKLQotICAgIFJlbW90ZUxheWVyQmFja2luZ1N0b3JlQ29sbGVjdGlv
biYgYmFja2luZ1N0b3JlQ29sbGVjdGlvbigpIHsgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ29sbGVj
dGlvbjsgfQotICAgIAotICAgIHZvaWQgc2V0TmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludChi
b29sIG5leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQpIHsgbV9uZXh0Rmx1c2hJc0ZvckltbWVk
aWF0ZVBhaW50ID0gbmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludDsgfQotICAgIGJvb2wgbmV4
dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludCgpIGNvbnN0IHsgcmV0dXJuIG1fbmV4dEZsdXNoSXNG
b3JJbW1lZGlhdGVQYWludDsgfQotCi1wcml2YXRlOgotICAgIC8vIFdlYkNvcmU6OkdyYXBoaWNz
TGF5ZXJGYWN0b3J5Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI+
IGNyZWF0ZUdyYXBoaWNzTGF5ZXIoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6VHlwZSwgV2ViQ29y
ZTo6R3JhcGhpY3NMYXllckNsaWVudCYpIG92ZXJyaWRlOwotCi0gICAgV2ViUGFnZSYgbV93ZWJQ
YWdlOwotCi0gICAgSGFzaE1hcDxXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVy
SUQsIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpMYXllckNyZWF0aW9uUHJvcGVydGllcz4g
bV9jcmVhdGVkTGF5ZXJzOwotICAgIFZlY3RvcjxXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0
Zm9ybUxheWVySUQ+IG1fZGVzdHJveWVkTGF5ZXJzOwotCi0gICAgSGFzaE1hcDxXZWJDb3JlOjpH
cmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQsIFBsYXRmb3JtQ0FMYXllclJlbW90ZSo+IG1f
bGl2ZUxheWVyczsKLSAgICBIYXNoTWFwPFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlBsYXRmb3Jt
TGF5ZXJJRCwgUGxhdGZvcm1DQUxheWVyUmVtb3RlKj4gbV9sYXllcnNXaXRoQW5pbWF0aW9uczsK
LQotICAgIFJlbW90ZUxheWVyQmFja2luZ1N0b3JlQ29sbGVjdGlvbiBtX2JhY2tpbmdTdG9yZUNv
bGxlY3Rpb247Ci0gICAgCi0gICAgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24qIG1fY3VycmVu
dFRyYW5zYWN0aW9uOwotCi0gICAgV2ViQ29yZTo6TGF5ZXJQb29sIG1fbGF5ZXJQb29sOwotICAg
IAotICAgIGJvb2wgbV9uZXh0Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50IHsgZmFsc2UgfTsKLX07
Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdAotCi0jZW5kaWYgLy8gUmVtb3RlTGF5ZXJUcmVlQ29u
dGV4dF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMv
UmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5tbSBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQ
YWdlL21hYy9SZW1vdGVMYXllclRyZWVDb250ZXh0Lm1tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCA5MGM0ODZiNTgyYjBkMTU4NzA1NmE0OGQxODEyZGIzOWY3YjUyYjAyLi4wMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2Vi
UHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXllclRyZWVDb250ZXh0Lm1tCisrKyAvZGV2L251
bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0g
KiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW1wb3J0ICJjb25maWcuaCIKLSNp
bXBvcnQgIlJlbW90ZUxheWVyVHJlZUNvbnRleHQuaCIKLQotI2ltcG9ydCAiR2VuZXJpY0NhbGxi
YWNrLmgiCi0jaW1wb3J0ICJHcmFwaGljc0xheWVyQ0FSZW1vdGUuaCIKLSNpbXBvcnQgIlBsYXRm
b3JtQ0FMYXllclJlbW90ZS5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmVDb2xs
ZWN0aW9uLmgiCi0jaW1wb3J0ICJSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbi5oIgotI2ltcG9y
dCAiV2ViUGFnZS5oIgotI2ltcG9ydCA8V2ViQ29yZS9GcmFtZVZpZXcuaD4KLSNpbXBvcnQgPFdl
YkNvcmUvTWFpbkZyYW1lLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL1BhZ2UuaD4KLSNpbXBvcnQgPHd0
Zi9TZXRGb3JTY29wZS5oPgotI2ltcG9ydCA8d3RmL1N5c3RlbVRyYWNpbmcuaD4KLQotdXNpbmcg
bmFtZXNwYWNlIFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1SZW1vdGVMYXllclRy
ZWVDb250ZXh0OjpSZW1vdGVMYXllclRyZWVDb250ZXh0KFdlYlBhZ2UmIHdlYlBhZ2UpCi0gICAg
OiBtX3dlYlBhZ2Uod2ViUGFnZSkKLSAgICAsIG1fY3VycmVudFRyYW5zYWN0aW9uKG51bGxwdHIp
Ci17Ci19Ci0KLVJlbW90ZUxheWVyVHJlZUNvbnRleHQ6On5SZW1vdGVMYXllclRyZWVDb250ZXh0
KCkKLXsKLSAgICBmb3IgKGF1dG8mIGxheWVyIDogbV9saXZlTGF5ZXJzLnZhbHVlcygpKQotICAg
ICAgICBsYXllci0+Y2xlYXJDb250ZXh0KCk7Ci19Ci0KLWZsb2F0IFJlbW90ZUxheWVyVHJlZUNv
bnRleHQ6OmRldmljZVNjYWxlRmFjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV93ZWJQYWdl
LmRldmljZVNjYWxlRmFjdG9yKCk7Ci19Ci0KLUxheWVySG9zdGluZ01vZGUgUmVtb3RlTGF5ZXJU
cmVlQ29udGV4dDo6bGF5ZXJIb3N0aW5nTW9kZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fd2Vi
UGFnZS5sYXllckhvc3RpbmdNb2RlKCk7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4
dDo6bGF5ZXJXYXNDcmVhdGVkKFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgbGF5ZXIsIFBsYXRmb3Jt
Q0FMYXllcjo6TGF5ZXJUeXBlIHR5cGUpCi17Ci0gICAgR3JhcGhpY3NMYXllcjo6UGxhdGZvcm1M
YXllcklEIGxheWVySUQgPSBsYXllci5sYXllcklEKCk7Ci0KLSAgICBSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6TGF5ZXJDcmVhdGlvblByb3BlcnRpZXMgY3JlYXRpb25Qcm9wZXJ0aWVzOwot
ICAgIGNyZWF0aW9uUHJvcGVydGllcy5sYXllcklEID0gbGF5ZXJJRDsKLSAgICBjcmVhdGlvblBy
b3BlcnRpZXMudHlwZSA9IHR5cGU7Ci0KLSAgICBpZiAobGF5ZXIuaXNQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGVDdXN0b20oKSkgewotICAgICAgICBjcmVhdGlvblByb3BlcnRpZXMuaG9zdGluZ0NvbnRl
eHRJRCA9IGxheWVyLmhvc3RpbmdDb250ZXh0SUQoKTsKLSAgICAgICAgY3JlYXRpb25Qcm9wZXJ0
aWVzLmhvc3RpbmdEZXZpY2VTY2FsZUZhY3RvciA9IGRldmljZVNjYWxlRmFjdG9yKCk7Ci0gICAg
fQotCi0gICAgbV9jcmVhdGVkTGF5ZXJzLmFkZChsYXllcklELCBXVEZNb3ZlKGNyZWF0aW9uUHJv
cGVydGllcykpOwotICAgIG1fbGl2ZUxheWVycy5hZGQobGF5ZXJJRCwgJmxheWVyKTsKLX0KLQot
dm9pZCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpsYXllcldpbGxCZURlc3Ryb3llZChQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGUmIGxheWVyKQotewotICAgIEFTU0VSVChsYXllci5sYXllcklEKCkpOwot
ICAgIEdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCBsYXllcklEID0gbGF5ZXIubGF5ZXJJ
RCgpOwotCi0gICAgbV9jcmVhdGVkTGF5ZXJzLnJlbW92ZShsYXllcklEKTsKLSAgICBtX2xpdmVM
YXllcnMucmVtb3ZlKGxheWVySUQpOwotCi0gICAgQVNTRVJUKCFtX2Rlc3Ryb3llZExheWVycy5j
b250YWlucyhsYXllcklEKSk7Ci0gICAgbV9kZXN0cm95ZWRMYXllcnMuYXBwZW5kKGxheWVySUQp
OwotICAgIAotICAgIG1fbGF5ZXJzV2l0aEFuaW1hdGlvbnMucmVtb3ZlKGxheWVySUQpOwotfQot
Ci12b2lkIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmJhY2tpbmdTdG9yZVdhc0NyZWF0ZWQoUmVt
b3RlTGF5ZXJCYWNraW5nU3RvcmUmIGJhY2tpbmdTdG9yZSkKLXsKLSAgICBtX2JhY2tpbmdTdG9y
ZUNvbGxlY3Rpb24uYmFja2luZ1N0b3JlV2FzQ3JlYXRlZChiYWNraW5nU3RvcmUpOwotfQotCi12
b2lkIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmJhY2tpbmdTdG9yZVdpbGxCZURlc3Ryb3llZChS
ZW1vdGVMYXllckJhY2tpbmdTdG9yZSYgYmFja2luZ1N0b3JlKQotewotICAgIG1fYmFja2luZ1N0
b3JlQ29sbGVjdGlvbi5iYWNraW5nU3RvcmVXaWxsQmVEZXN0cm95ZWQoYmFja2luZ1N0b3JlKTsK
LX0KLQotYm9vbCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpiYWNraW5nU3RvcmVXaWxsQmVEaXNw
bGF5ZWQoUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUmIGJhY2tpbmdTdG9yZSkKLXsKLSAgICByZXR1
cm4gbV9iYWNraW5nU3RvcmVDb2xsZWN0aW9uLmJhY2tpbmdTdG9yZVdpbGxCZURpc3BsYXllZChi
YWNraW5nU3RvcmUpOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8R3JhcGhpY3NMYXllcj4gUmVtb3Rl
TGF5ZXJUcmVlQ29udGV4dDo6Y3JlYXRlR3JhcGhpY3NMYXllcihXZWJDb3JlOjpHcmFwaGljc0xh
eWVyOjpUeXBlIGxheWVyVHlwZSwgR3JhcGhpY3NMYXllckNsaWVudCYgY2xpZW50KQotewotICAg
IHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEdyYXBoaWNzTGF5ZXJDQVJlbW90ZT4obGF5ZXJUeXBl
LCBjbGllbnQsICp0aGlzKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpidWls
ZFRyYW5zYWN0aW9uKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uJiB0cmFuc2FjdGlvbiwgUGxh
dGZvcm1DQUxheWVyJiByb290TGF5ZXIpCi17Ci0gICAgVHJhY2VTY29wZSB0cmFjaW5nU2NvcGUo
QnVpbGRUcmFuc2FjdGlvblN0YXJ0LCBCdWlsZFRyYW5zYWN0aW9uRW5kKTsKLQotICAgIFBsYXRm
b3JtQ0FMYXllclJlbW90ZSYgcm9vdExheWVyUmVtb3RlID0gZG93bmNhc3Q8UGxhdGZvcm1DQUxh
eWVyUmVtb3RlPihyb290TGF5ZXIpOwotICAgIHRyYW5zYWN0aW9uLnNldFJvb3RMYXllcklEKHJv
b3RMYXllclJlbW90ZS5sYXllcklEKCkpOwotCi0gICAgbV9jdXJyZW50VHJhbnNhY3Rpb24gPSAm
dHJhbnNhY3Rpb247Ci0gICAgcm9vdExheWVyUmVtb3RlLnJlY3Vyc2l2ZUJ1aWxkVHJhbnNhY3Rp
b24oKnRoaXMsIHRyYW5zYWN0aW9uKTsKLSAgICBtX2N1cnJlbnRUcmFuc2FjdGlvbiA9IG51bGxw
dHI7Ci0KLSAgICBWZWN0b3I8UmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkxheWVyQ3JlYXRp
b25Qcm9wZXJ0aWVzPiBjcmVhdGVkTGF5ZXJQcm9wZXJ0aWVzOwotICAgIGNvcHlWYWx1ZXNUb1Zl
Y3RvcihtX2NyZWF0ZWRMYXllcnMsIGNyZWF0ZWRMYXllclByb3BlcnRpZXMpOwotICAgIHRyYW5z
YWN0aW9uLnNldENyZWF0ZWRMYXllcnMoV1RGTW92ZShjcmVhdGVkTGF5ZXJQcm9wZXJ0aWVzKSk7
Ci0gICAgdHJhbnNhY3Rpb24uc2V0RGVzdHJveWVkTGF5ZXJJRHMoV1RGTW92ZShtX2Rlc3Ryb3ll
ZExheWVycykpOwotICAgIAotICAgIG1fY3JlYXRlZExheWVycy5jbGVhcigpOwotfQotCi12b2lk
IFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmxheWVyUHJvcGVydHlDaGFuZ2VkV2hpbGVCdWlsZGlu
Z1RyYW5zYWN0aW9uKFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgbGF5ZXIpCi17Ci0gICAgaWYgKG1f
Y3VycmVudFRyYW5zYWN0aW9uKQotICAgICAgICBtX2N1cnJlbnRUcmFuc2FjdGlvbi0+bGF5ZXJQ
cm9wZXJ0aWVzQ2hhbmdlZChsYXllcik7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4
dDo6d2lsbFN0YXJ0QW5pbWF0aW9uT25MYXllcihQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmIGxheWVy
KQotewotICAgIG1fbGF5ZXJzV2l0aEFuaW1hdGlvbnMuYWRkKGxheWVyLmxheWVySUQoKSwgJmxh
eWVyKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjphbmltYXRpb25EaWRTdGFy
dChXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQgbGF5ZXJJRCwgY29uc3Qg
U3RyaW5nJiBrZXksIGRvdWJsZSBzdGFydFRpbWUpCi17Ci0gICAgYXV0byBpdCA9IG1fbGF5ZXJz
V2l0aEFuaW1hdGlvbnMuZmluZChsYXllcklEKTsKLSAgICBpZiAoaXQgIT0gbV9sYXllcnNXaXRo
QW5pbWF0aW9ucy5lbmQoKSkKLSAgICAgICAgaXQtPnZhbHVlLT5hbmltYXRpb25TdGFydGVkKGtl
eSwgc3RhcnRUaW1lKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjphbmltYXRp
b25EaWRFbmQoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklEIGxheWVySUQs
IGNvbnN0IFN0cmluZyYga2V5KQotewotICAgIGF1dG8gaXQgPSBtX2xheWVyc1dpdGhBbmltYXRp
b25zLmZpbmQobGF5ZXJJRCk7Ci0gICAgaWYgKGl0ICE9IG1fbGF5ZXJzV2l0aEFuaW1hdGlvbnMu
ZW5kKCkpCi0gICAgICAgIGl0LT52YWx1ZS0+YW5pbWF0aW9uRW5kZWQoa2V5KTsKLX0KLQotfSAv
LyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3Mv
V2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEuaCBiL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5oCmRlbGV0
ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc1YWUzMTE1YTZkMjUxODRiYzJiZGRkODJkMDRh
NTVhOTk5N2JmLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBh
L1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXllclRyZWVEcmF3
aW5nQXJlYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMTItMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMg
Q09OVFJJQlVUT1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0g
KiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQot
ICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiQ2FsbGJhY2tJRC5oIgotI2luY2x1ZGUgIkRy
YXdpbmdBcmVhLmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NMYXllckNBUmVtb3RlLmgiCi0jaW5jbHVk
ZSAiUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24uaCIKLSNpbmNsdWRlIDxXZWJDb3JlL0dyYXBo
aWNzTGF5ZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1RpbWVyLmg+Ci0jaW5jbHVkZSA8
YXRvbWljPgotI2luY2x1ZGUgPGRpc3BhdGNoL2Rpc3BhdGNoLmg+Ci0jaW5jbHVkZSA8d3RmL0hh
c2hNYXAuaD4KLSNpbmNsdWRlIDx3dGYvV2Vha1B0ci5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7
Ci1jbGFzcyBQbGF0Zm9ybUNBTGF5ZXI7Ci19Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1jbGFz
cyBSZW1vdGVMYXllclRyZWVDb250ZXh0OwotY2xhc3MgUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJl
ZnJlc2hNb25pdG9yOwotCi1jbGFzcyBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYSA6IHB1Ymxp
YyBEcmF3aW5nQXJlYSwgcHVibGljIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDbGllbnQgewotICAg
IGZyaWVuZCBjbGFzcyBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3I7Ci1wdWJs
aWM6Ci0gICAgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEoV2ViUGFnZSYsIGNvbnN0IFdlYlBh
Z2VDcmVhdGlvblBhcmFtZXRlcnMmKTsKLSAgICB2aXJ0dWFsIH5SZW1vdGVMYXllclRyZWVEcmF3
aW5nQXJlYSgpOwotCi0gICAgdWludDY0X3QgbmV4dFRyYW5zYWN0aW9uSUQoKSBjb25zdCB7IHJl
dHVybiBtX2N1cnJlbnRUcmFuc2FjdGlvbklEICsgMTsgfQotICAgIHVpbnQ2NF90IGxhc3RDb21t
aXR0ZWRUcmFuc2FjdGlvbklEKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50VHJhbnNhY3Rpb25J
RDsgfQotCi0gICAgV2Vha1B0cjxSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYT4gY3JlYXRlV2Vh
a1B0cigpIHsgcmV0dXJuIG1fd2Vha1B0ckZhY3RvcnkuY3JlYXRlV2Vha1B0cigpOyB9Ci0KLXBy
aXZhdGU6Ci0gICAgLy8gRHJhd2luZ0FyZWEKLSAgICB2b2lkIHNldE5lZWRzRGlzcGxheSgpIG92
ZXJyaWRlOwotICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IFdlYkNvcmU6Oklu
dFJlY3QmKSBvdmVycmlkZTsKLSAgICB2b2lkIHNjcm9sbChjb25zdCBXZWJDb3JlOjpJbnRSZWN0
JiBzY3JvbGxSZWN0LCBjb25zdCBXZWJDb3JlOjpJbnRTaXplJiBzY3JvbGxEZWx0YSkgb3ZlcnJp
ZGU7Ci0gICAgdm9pZCB1cGRhdGVHZW9tZXRyeShjb25zdCBXZWJDb3JlOjpJbnRTaXplJiB2aWV3
U2l6ZSwgY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYgbGF5ZXJQb3NpdGlvbiwgYm9vbCBmbHVzaFN5
bmNocm9ub3VzbHksIGNvbnN0IFdlYkNvcmU6Ok1hY2hTZW5kUmlnaHQmIGZlbmNlUG9ydCkgb3Zl
cnJpZGU7Ci0KLSAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyRmFjdG9yeSogZ3JhcGhpY3NMYXll
ckZhY3RvcnkoKSBvdmVycmlkZTsKLSAgICB2b2lkIHNldFJvb3RDb21wb3NpdGluZ0xheWVyKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXIqKSBvdmVycmlkZTsKLSAgICB2b2lkIHNjaGVkdWxlQ29tcG9z
aXRpbmdMYXllckZsdXNoKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzY2hlZHVsZUNvbXBvc2l0aW5n
TGF5ZXJGbHVzaEltbWVkaWF0ZWx5KCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBhdHRhY2hWaWV3T3Zl
cmxheUdyYXBoaWNzTGF5ZXIoV2ViQ29yZTo6RnJhbWUqLCBXZWJDb3JlOjpHcmFwaGljc0xheWVy
Kikgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGFkZFRyYW5zYWN0aW9uQ2FsbGJhY2tJRChDYWxsYmFj
a0lEKSBvdmVycmlkZTsKLQotICAgIFJlZlB0cjxXZWJDb3JlOjpEaXNwbGF5UmVmcmVzaE1vbml0
b3I+IGNyZWF0ZURpc3BsYXlSZWZyZXNoTW9uaXRvcihXZWJDb3JlOjpQbGF0Zm9ybURpc3BsYXlJ
RCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCB3aWxsRGVzdHJveURpc3BsYXlSZWZyZXNoTW9uaXRvcihX
ZWJDb3JlOjpEaXNwbGF5UmVmcmVzaE1vbml0b3IqKTsKLQotICAgIGJvb2wgc2hvdWxkVXNlVGls
ZWRCYWNraW5nRm9yRnJhbWVWaWV3KGNvbnN0IFdlYkNvcmU6OkZyYW1lVmlldyYpIG92ZXJyaWRl
OwotCi0gICAgdm9pZCB1cGRhdGVQcmVmZXJlbmNlcyhjb25zdCBXZWJQcmVmZXJlbmNlc1N0b3Jl
Jikgb3ZlcnJpZGU7Ci0KLSAgICBib29sIHN1cHBvcnRzQXN5bmNTY3JvbGxpbmcoKSBvdmVycmlk
ZSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICB2b2lkIHNldExheWVyVHJlZVN0YXRlSXNGcm96ZW4o
Ym9vbCkgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGZvcmNlUmVwYWludCgpIG92ZXJyaWRlOwotICAg
IGJvb2wgZm9yY2VSZXBhaW50QXN5bmMoQ2FsbGJhY2tJRCkgb3ZlcnJpZGUgeyByZXR1cm4gZmFs
c2U7IH0KLQotICAgIHZvaWQgc2V0Vmlld0V4cG9zZWRSZWN0KHN0ZDo6b3B0aW9uYWw8V2ViQ29y
ZTo6RmxvYXRSZWN0Pikgb3ZlcnJpZGU7Ci0gICAgc3RkOjpvcHRpb25hbDxXZWJDb3JlOjpGbG9h
dFJlY3Q+IHZpZXdFeHBvc2VkUmVjdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fc2Nyb2xs
ZWRWaWV3RXhwb3NlZFJlY3Q7IH0KLQotICAgIHZvaWQgYWNjZWxlcmF0ZWRBbmltYXRpb25EaWRT
dGFydCh1aW50NjRfdCBsYXllcklELCBjb25zdCBTdHJpbmcmIGtleSwgZG91YmxlIHN0YXJ0VGlt
ZSkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBhY2NlbGVyYXRlZEFuaW1hdGlvbkRpZEVuZCh1aW50NjRf
dCBsYXllcklELCBjb25zdCBTdHJpbmcmIGtleSkgb3ZlcnJpZGU7Ci0KLSNpZiBQTEFURk9STShJ
T1MpCi0gICAgV2ViQ29yZTo6RmxvYXRSZWN0IGV4cG9zZWRDb250ZW50UmVjdCgpIGNvbnN0IG92
ZXJyaWRlOwotICAgIHZvaWQgc2V0RXhwb3NlZENvbnRlbnRSZWN0KGNvbnN0IFdlYkNvcmU6OkZs
b2F0UmVjdCYpIG92ZXJyaWRlOwotI2VuZGlmCi0KLSAgICB2b2lkIGRpZFVwZGF0ZSgpIG92ZXJy
aWRlOwotCi0jaWYgUExBVEZPUk0oSU9TKQotICAgIHZvaWQgc2V0RGV2aWNlU2NhbGVGYWN0b3Io
ZmxvYXQpIG92ZXJyaWRlOwotI2VuZGlmCi0KLSAgICB2b2lkIG1haW5GcmFtZUNvbnRlbnRTaXpl
Q2hhbmdlZChjb25zdCBXZWJDb3JlOjpJbnRTaXplJikgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGFj
dGl2aXR5U3RhdGVEaWRDaGFuZ2UoV2ViQ29yZTo6QWN0aXZpdHlTdGF0ZTo6RmxhZ3MgY2hhbmdl
ZCwgYm9vbCB3YW50c0RpZFVwZGF0ZUFjdGl2aXR5U3RhdGUsIGNvbnN0IFZlY3RvcjxDYWxsYmFj
a0lEPiYgY2FsbGJhY2tJRHMpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBhZGp1c3RMYXllckZsdXNo
VGhyb3R0bGluZyhXZWJDb3JlOjpMYXllckZsdXNoVGhyb3R0bGVTdGF0ZTo6RmxhZ3MpIG92ZXJy
aWRlOwotCi0gICAgYm9vbCBkaXNwYXRjaERpZFJlYWNoTGF5b3V0TWlsZXN0b25lKFdlYkNvcmU6
OkxheW91dE1pbGVzdG9uZXMpIG92ZXJyaWRlOwotCi0gICAgdm9pZCB1cGRhdGVTY3JvbGxlZEV4
cG9zZWRSZWN0KCk7Ci0gICAgdm9pZCB1cGRhdGVSb290TGF5ZXJzKCk7Ci0KLSAgICB2b2lkIGZs
dXNoTGF5ZXJzKCk7Ci0KLSAgICBXZWJDb3JlOjpUaWxlZEJhY2tpbmcqIG1haW5GcmFtZVRpbGVk
QmFja2luZygpIGNvbnN0OwotCi0gICAgdWludDY0X3QgdGFrZU5leHRUcmFuc2FjdGlvbklEKCkg
eyByZXR1cm4gKyttX2N1cnJlbnRUcmFuc2FjdGlvbklEOyB9Ci0KLSAgICBib29sIG1hcmtMYXll
cnNWb2xhdGlsZUltbWVkaWF0ZWx5SWZQb3NzaWJsZSgpIG92ZXJyaWRlOwotCi0gICAgY2xhc3Mg
QmFja2luZ1N0b3JlRmx1c2hlciA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxCYWNraW5n
U3RvcmVGbHVzaGVyPiB7Ci0gICAgcHVibGljOgotICAgICAgICBzdGF0aWMgUmVmPEJhY2tpbmdT
dG9yZUZsdXNoZXI+IGNyZWF0ZShJUEM6OkNvbm5lY3Rpb24qLCBzdGQ6OnVuaXF1ZV9wdHI8SVBD
OjpFbmNvZGVyPiwgVmVjdG9yPFJldGFpblB0cjxDR0NvbnRleHRSZWY+Pik7Ci0KLSAgICAgICAg
dm9pZCBmbHVzaCgpOwotICAgICAgICBib29sIGhhc0ZsdXNoZWQoKSBjb25zdCB7IHJldHVybiBt
X2hhc0ZsdXNoZWQ7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIEJhY2tpbmdTdG9yZUZsdXNo
ZXIoSVBDOjpDb25uZWN0aW9uKiwgc3RkOjp1bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4sIFZlY3Rv
cjxSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPj4pOwotCi0gICAgICAgIFJlZlB0cjxJUEM6OkNvbm5l
Y3Rpb24+IG1fY29ubmVjdGlvbjsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQQzo6RW5jb2Rl
cj4gbV9jb21taXRFbmNvZGVyOwotICAgICAgICBWZWN0b3I8UmV0YWluUHRyPENHQ29udGV4dFJl
Zj4+IG1fY29udGV4dHNUb0ZsdXNoOwotCi0gICAgICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1faGFz
Rmx1c2hlZDsKLSAgICB9OwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFJlbW90ZUxheWVyVHJlZUNv
bnRleHQ+IG1fcmVtb3RlTGF5ZXJUcmVlQ29udGV4dDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8V2Vi
Q29yZTo6R3JhcGhpY3NMYXllcj4gbV9yb290TGF5ZXI7Ci0KLSAgICBXZWJDb3JlOjpJbnRTaXpl
IG1fdmlld1NpemU7Ci0KLSAgICBzdGQ6Om9wdGlvbmFsPFdlYkNvcmU6OkZsb2F0UmVjdD4gbV92
aWV3RXhwb3NlZFJlY3Q7Ci0gICAgc3RkOjpvcHRpb25hbDxXZWJDb3JlOjpGbG9hdFJlY3Q+IG1f
c2Nyb2xsZWRWaWV3RXhwb3NlZFJlY3Q7Ci0KLSAgICBXZWJDb3JlOjpUaW1lciBtX2xheWVyRmx1
c2hUaW1lcjsKLSAgICBib29sIG1faXNGbHVzaGluZ1N1c3BlbmRlZCB7IGZhbHNlIH07Ci0gICAg
Ym9vbCBtX2hhc0RlZmVycmVkRmx1c2ggeyBmYWxzZSB9OwotICAgIGJvb2wgbV9pc1Rocm90dGxp
bmdMYXllckZsdXNoZXMgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9pc0xheWVyRmx1c2hUaHJvdHRs
aW5nVGVtcG9yYXJpbHlEaXNhYmxlZEZvckludGVyYWN0aW9uIHsgZmFsc2UgfTsKLSAgICBib29s
IG1faXNJbml0aWFsVGhyb3R0bGVkTGF5ZXJGbHVzaCB7IGZhbHNlIH07Ci0KLSAgICBib29sIG1f
d2FpdGluZ0ZvckJhY2tpbmdTdG9yZVN3YXAgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9oYWRGbHVz
aERlZmVycmVkV2hpbGVXYWl0aW5nRm9yQmFja2luZ1N0b3JlU3dhcCB7IGZhbHNlIH07Ci0gICAg
Ym9vbCBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQgeyBmYWxzZSB9OwotCi0gICAgZGlz
cGF0Y2hfcXVldWVfdCBtX2NvbW1pdFF1ZXVlOwotICAgIFJlZlB0cjxCYWNraW5nU3RvcmVGbHVz
aGVyPiBtX3BlbmRpbmdCYWNraW5nU3RvcmVGbHVzaGVyOwotCi0gICAgSGFzaFNldDxSZW1vdGVM
YXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IqPiBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnM7
Ci0gICAgSGFzaFNldDxSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IqPiogbV9k
aXNwbGF5UmVmcmVzaE1vbml0b3JzVG9Ob3RpZnkgeyBudWxscHRyIH07Ci0KLSAgICB1aW50NjRf
dCBtX2N1cnJlbnRUcmFuc2FjdGlvbklEIHsgMCB9OwotICAgIFZlY3RvcjxSZW1vdGVMYXllclRy
ZWVUcmFuc2FjdGlvbjo6VHJhbnNhY3Rpb25DYWxsYmFja0lEPiBtX3BlbmRpbmdDYWxsYmFja0lE
czsKLQotICAgIFdlYkNvcmU6OkxheW91dE1pbGVzdG9uZXMgbV9wZW5kaW5nTmV3bHlSZWFjaGVk
TGF5b3V0TWlsZXN0b25lcyB7IDAgfTsKLQotICAgIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXIqIG1f
Y29udGVudExheWVyIHsgbnVsbHB0ciB9OwotICAgIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXIqIG1f
dmlld092ZXJsYXlSb290TGF5ZXIgeyBudWxscHRyIH07Ci0gICAgCi0gICAgV2Vha1B0ckZhY3Rv
cnk8UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE+IG1fd2Vha1B0ckZhY3Rvcnk7Ci19OwotCi19
IC8vIG5hbWVzcGFjZSBXZWJLaXQKLQotU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19EUkFXSU5HX0FS
RUEoUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEsIERyYXdpbmdBcmVhVHlwZVJlbW90ZUxheWVy
VHJlZSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9S
ZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5tbSBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9X
ZWJQYWdlL21hYy9SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5tbQpkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggZjE0NmZhMGYwYjg2NjVjOWQyNDA2MDhkZWQ3MWVjYjgzNTYzYTE2My4u
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2Vi
S2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEubW0K
KysrIC9kZXYvbnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAx
Mi0yMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2ltcG9y
dCAiY29uZmlnLmgiCi0jaW1wb3J0ICJSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5oIgotCi0j
aW1wb3J0ICJEcmF3aW5nQXJlYVByb3h5TWVzc2FnZXMuaCIKLSNpbXBvcnQgIkdyYXBoaWNzTGF5
ZXJDQVJlbW90ZS5oIgotI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVyUmVtb3RlLmgiCi0jaW1wb3J0
ICJSZW1vdGVMYXllckJhY2tpbmdTdG9yZUNvbGxlY3Rpb24uaCIKLSNpbXBvcnQgIlJlbW90ZUxh
eWVyVHJlZUNvbnRleHQuaCIKLSNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNo
TW9uaXRvci5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWFQcm94eU1lc3Nh
Z2VzLmgiCi0jaW1wb3J0ICJSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5oIgotI2ltcG9ydCAi
UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JUcmFuc2FjdGlvbi5oIgotI2ltcG9ydCAiV2ViUGFn
ZS5oIgotI2ltcG9ydCAiV2ViUHJvY2Vzcy5oIgotI2ltcG9ydCA8UXVhcnR6Q29yZS9RdWFydHpD
b3JlLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL0RlYnVnUGFnZU92ZXJsYXlzLmg+Ci0jaW1wb3J0IDxX
ZWJDb3JlL0ZyYW1lLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL0ZyYW1lVmlldy5oPgotI2ltcG9ydCA8
V2ViQ29yZS9JbnNwZWN0b3JDb250cm9sbGVyLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL01haW5GcmFt
ZS5oPgotI2ltcG9ydCA8V2ViQ29yZS9QYWdlT3ZlcmxheUNvbnRyb2xsZXIuaD4KLSNpbXBvcnQg
PFdlYkNvcmUvUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL1JlbmRl
clZpZXcuaD4KLSNpbXBvcnQgPFdlYkNvcmUvU2V0dGluZ3MuaD4KLSNpbXBvcnQgPFdlYkNvcmUv
VGlsZWRCYWNraW5nLmg+Ci0jaW1wb3J0IDxwYWwvc3BpL2NvY29hL1F1YXJ0ekNvcmVTUEkuaD4K
LSNpbXBvcnQgPHd0Zi9TeXN0ZW1UcmFjaW5nLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OwotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OlJl
bW90ZUxheWVyVHJlZURyYXdpbmdBcmVhKFdlYlBhZ2UmIHdlYlBhZ2UsIGNvbnN0IFdlYlBhZ2VD
cmVhdGlvblBhcmFtZXRlcnMmKQotICAgIDogRHJhd2luZ0FyZWEoRHJhd2luZ0FyZWFUeXBlUmVt
b3RlTGF5ZXJUcmVlLCB3ZWJQYWdlKQotICAgICwgbV9yZW1vdGVMYXllclRyZWVDb250ZXh0KHN0
ZDo6bWFrZV91bmlxdWU8UmVtb3RlTGF5ZXJUcmVlQ29udGV4dD4od2ViUGFnZSkpCi0gICAgLCBt
X3Jvb3RMYXllcihHcmFwaGljc0xheWVyOjpjcmVhdGUoZ3JhcGhpY3NMYXllckZhY3RvcnkoKSwg
KnRoaXMpKQotICAgICwgbV9sYXllckZsdXNoVGltZXIoKnRoaXMsICZSZW1vdGVMYXllclRyZWVE
cmF3aW5nQXJlYTo6Zmx1c2hMYXllcnMpCi0gICAgLCBtX3dlYWtQdHJGYWN0b3J5KHRoaXMpCi17
Ci0gICAgd2ViUGFnZS5jb3JlUGFnZSgpLT5zZXR0aW5ncygpLnNldEZvcmNlQ29tcG9zaXRpbmdN
b2RlKHRydWUpOwotI2lmIFBMQVRGT1JNKElPUykKLSAgICB3ZWJQYWdlLmNvcmVQYWdlKCktPnNl
dHRpbmdzKCkuc2V0RGVsZWdhdGVzUGFnZVNjYWxpbmcodHJ1ZSk7Ci0jZW5kaWYKLSAgICBtX3Jv
b3RMYXllci0+c2V0TmFtZSgiZHJhd2luZyBhcmVhIHJvb3QiKTsKLQotICAgIG1fY29tbWl0UXVl
dWUgPSBkaXNwYXRjaF9xdWV1ZV9jcmVhdGUoImNvbS5hcHBsZS5XZWJLaXQuV2ViQ29udGVudC5S
ZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5Db21taXRRdWV1ZSIsIG51bGxwdHIpOwotCi0gICAg
Ly8gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgd2UgZ2V0IGEgdW5pcXVlIERpc3BsYXlSZWZyZXNo
TW9uaXRvciBwZXItRHJhd2luZ0FyZWEgKG5lY2Vzc2FyeSBiZWNhdXNlIERpc3BsYXlSZWZyZXNo
TW9uaXRvcgotICAgIC8vIGlzIGRyaXZlbiBieSB0aGlzIGNsYXNzKSwgZ2l2ZSBlYWNoIHBhZ2Ug
YSB1bmlxdWUgRGlzcGxheUlEIGRlcml2ZWQgZnJvbSBXZWJQYWdlJ3MgdW5pcXVlIElELgotICAg
IC8vIEZJWE1FOiBXaGlsZSB1c2luZyB0aGUgaGlnaCBlbmQgb2YgdGhlIHJhbmdlIG9mIERpc3Bs
YXlJRHMgbWFrZXMgYSBjb2xsaXNpb24gd2l0aCByZWFsLCBub24tUmVtb3RlTGF5ZXJUcmVlRHJh
d2luZ0FyZWEKLSAgICAvLyBEaXNwbGF5SURzIGxlc3MgbGlrZWx5LCBpdCBpcyBub3QgZW50aXJl
bHkgc2FmZSB0byBoYXZlIGEgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEgYW5kIFRpbGVkQ29y
ZUFuaW1hdGlvbkRyYXdpbmdBcmVhCi0gICAgLy8gY29lZXhpc3QgaW4gdGhlIHNhbWUgcHJvY2Vz
cy4KLSAgICB3ZWJQYWdlLndpbmRvd1NjcmVlbkRpZENoYW5nZShzdGQ6Om51bWVyaWNfbGltaXRz
PHVpbnQzMl90Pjo6bWF4KCkgLSB3ZWJQYWdlLnBhZ2VJRCgpKTsKLX0KLQotUmVtb3RlTGF5ZXJU
cmVlRHJhd2luZ0FyZWE6On5SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYSgpCi17Ci0gICAgZGlz
cGF0Y2hfcmVsZWFzZShtX2NvbW1pdFF1ZXVlKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVE
cmF3aW5nQXJlYTo6c2V0TmVlZHNEaXNwbGF5KCkKLXsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRy
ZWVEcmF3aW5nQXJlYTo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEludFJlY3QmKQotewot
fQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzY3JvbGwoY29uc3QgSW50UmVj
dCYgc2Nyb2xsUmVjdCwgY29uc3QgSW50U2l6ZSYgc2Nyb2xsRGVsdGEpCi17Ci19Ci0KLUdyYXBo
aWNzTGF5ZXJGYWN0b3J5KiBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6Z3JhcGhpY3NMYXll
ckZhY3RvcnkoKQotewotICAgIHJldHVybiBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQuZ2V0KCk7
Ci19Ci0KLVJlZlB0cjxEaXNwbGF5UmVmcmVzaE1vbml0b3I+IFJlbW90ZUxheWVyVHJlZURyYXdp
bmdBcmVhOjpjcmVhdGVEaXNwbGF5UmVmcmVzaE1vbml0b3IoUGxhdGZvcm1EaXNwbGF5SUQgZGlz
cGxheUlEKQotewotICAgIGF1dG8gbW9uaXRvciA9IFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZy
ZXNoTW9uaXRvcjo6Y3JlYXRlKGRpc3BsYXlJRCwgKnRoaXMpOwotICAgIG1fZGlzcGxheVJlZnJl
c2hNb25pdG9ycy5hZGQobW9uaXRvci5wdHIoKSk7Ci0gICAgcmV0dXJuIFdURk1vdmUobW9uaXRv
cik7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OndpbGxEZXN0cm95RGlz
cGxheVJlZnJlc2hNb25pdG9yKERpc3BsYXlSZWZyZXNoTW9uaXRvciogbW9uaXRvcikKLXsKLSAg
ICBhdXRvIHJlbW90ZU1vbml0b3IgPSBzdGF0aWNfY2FzdDxSZW1vdGVMYXllclRyZWVEaXNwbGF5
UmVmcmVzaE1vbml0b3IqPihtb25pdG9yKTsKLSAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnMu
cmVtb3ZlKHJlbW90ZU1vbml0b3IpOwotCi0gICAgaWYgKG1fZGlzcGxheVJlZnJlc2hNb25pdG9y
c1RvTm90aWZ5KQotICAgICAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnNUb05vdGlmeS0+cmVt
b3ZlKHJlbW90ZU1vbml0b3IpOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVh
Ojp1cGRhdGVSb290TGF5ZXJzKCkKLXsKLSAgICBWZWN0b3I8R3JhcGhpY3NMYXllcio+IGNoaWxk
cmVuOwotICAgIGlmIChtX2NvbnRlbnRMYXllcikgewotICAgICAgICBjaGlsZHJlbi5hcHBlbmQo
bV9jb250ZW50TGF5ZXIpOwotICAgICAgICBpZiAobV92aWV3T3ZlcmxheVJvb3RMYXllcikKLSAg
ICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZChtX3ZpZXdPdmVybGF5Um9vdExheWVyKTsKLSAgICB9
Ci0KLSAgICBtX3Jvb3RMYXllci0+c2V0Q2hpbGRyZW4oY2hpbGRyZW4pOwotfQotCi12b2lkIFJl
bW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphdHRhY2hWaWV3T3ZlcmxheUdyYXBoaWNzTGF5ZXIo
RnJhbWUqIGZyYW1lLCBHcmFwaGljc0xheWVyKiB2aWV3T3ZlcmxheVJvb3RMYXllcikKLXsKLSAg
ICBpZiAoIWZyYW1lLT5pc01haW5GcmFtZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Zp
ZXdPdmVybGF5Um9vdExheWVyID0gdmlld092ZXJsYXlSb290TGF5ZXI7Ci0gICAgdXBkYXRlUm9v
dExheWVycygpOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzZXRSb290
Q29tcG9zaXRpbmdMYXllcihHcmFwaGljc0xheWVyKiByb290TGF5ZXIpCi17Ci0gICAgbV9jb250
ZW50TGF5ZXIgPSByb290TGF5ZXI7Ci0gICAgdXBkYXRlUm9vdExheWVycygpOwotICAgIHNjaGVk
dWxlQ29tcG9zaXRpbmdMYXllckZsdXNoKCk7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJh
d2luZ0FyZWE6OnVwZGF0ZUdlb21ldHJ5KGNvbnN0IEludFNpemUmIHZpZXdTaXplLCBjb25zdCBJ
bnRTaXplJiBsYXllclBvc2l0aW9uLCBib29sIGZsdXNoU3luY2hyb25vdXNseSwgY29uc3QgV2Vi
Q29yZTo6TWFjaFNlbmRSaWdodCYpCi17Ci0gICAgbV92aWV3U2l6ZSA9IHZpZXdTaXplOwotICAg
IG1fd2ViUGFnZS5zZXRTaXplKHZpZXdTaXplKTsKLQotICAgIHNjaGVkdWxlQ29tcG9zaXRpbmdM
YXllckZsdXNoKCk7Ci0KLSAgICBtX3dlYlBhZ2Uuc2VuZChNZXNzYWdlczo6RHJhd2luZ0FyZWFQ
cm94eTo6RGlkVXBkYXRlR2VvbWV0cnkoKSk7Ci19Ci0KLWJvb2wgUmVtb3RlTGF5ZXJUcmVlRHJh
d2luZ0FyZWE6OnNob3VsZFVzZVRpbGVkQmFja2luZ0ZvckZyYW1lVmlldyhjb25zdCBGcmFtZVZp
ZXcmIGZyYW1lVmlldykKLXsKLSAgICByZXR1cm4gZnJhbWVWaWV3LmZyYW1lKCkuaXNNYWluRnJh
bWUoKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6dXBkYXRlUHJlZmVy
ZW5jZXMoY29uc3QgV2ViUHJlZmVyZW5jZXNTdG9yZSYpCi17Ci0gICAgU2V0dGluZ3MmIHNldHRp
bmdzID0gbV93ZWJQYWdlLmNvcmVQYWdlKCktPnNldHRpbmdzKCk7Ci0KLSAgICAvLyBGaXhlZCBw
b3NpdGlvbiBlbGVtZW50cyBuZWVkIHRvIGJlIGNvbXBvc2l0ZWQgYW5kIGNyZWF0ZSBzdGFja2lu
ZyBjb250ZXh0cwotICAgIC8vIGluIG9yZGVyIHRvIGJlIHNjcm9sbGVkIGJ5IHRoZSBTY3JvbGxp
bmdDb29yZGluYXRvci4KLSAgICBzZXR0aW5ncy5zZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5nRm9y
Rml4ZWRQb3NpdGlvbkVuYWJsZWQodHJ1ZSk7Ci0KLSAgICBtX3Jvb3RMYXllci0+c2V0U2hvd0Rl
YnVnQm9yZGVyKHNldHRpbmdzLnNob3dEZWJ1Z0JvcmRlcnMoKSk7Ci0KLSAgICBpZiAoTWFpbkZy
YW1lKiBtYWluRnJhbWUgPSBtX3dlYlBhZ2UubWFpbkZyYW1lKCkpCi0gICAgICAgIERlYnVnUGFn
ZU92ZXJsYXlzOjpzZXR0aW5nc0NoYW5nZWQoKm1haW5GcmFtZSk7Ci19Ci0KLSNpZiBQTEFURk9S
TShJT1MpCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzZXREZXZpY2VTY2FsZUZh
Y3RvcihmbG9hdCBkZXZpY2VTY2FsZUZhY3RvcikKLXsKLSAgICBtX3dlYlBhZ2Uuc2V0RGV2aWNl
U2NhbGVGYWN0b3IoZGV2aWNlU2NhbGVGYWN0b3IpOwotfQotI2VuZGlmCi0KLXZvaWQgUmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnNldExheWVyVHJlZVN0YXRlSXNGcm96ZW4oYm9vbCBpc0Zy
b3plbikKLXsKLSAgICBpZiAobV9pc0ZsdXNoaW5nU3VzcGVuZGVkID09IGlzRnJvemVuKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBtX2lzRmx1c2hpbmdTdXNwZW5kZWQgPSBpc0Zyb3plbjsKLQot
ICAgIGlmICghbV9pc0ZsdXNoaW5nU3VzcGVuZGVkICYmIG1faGFzRGVmZXJyZWRGbHVzaCkgewot
ICAgICAgICBtX2hhc0RlZmVycmVkRmx1c2ggPSBmYWxzZTsKLSAgICAgICAgc2NoZWR1bGVDb21w
b3NpdGluZ0xheWVyRmx1c2goKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJh
d2luZ0FyZWE6OmZvcmNlUmVwYWludCgpCi17Ci0gICAgaWYgKG1faXNGbHVzaGluZ1N1c3BlbmRl
ZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZm9yIChGcmFtZSogZnJhbWUgPSAmbV93ZWJQYWdl
LmNvcmVQYWdlKCktPm1haW5GcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLnRy
YXZlcnNlTmV4dCgpKSB7Ci0gICAgICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gZnJhbWUtPnZp
ZXcoKTsKLSAgICAgICAgaWYgKCFmcmFtZVZpZXcgfHwgIWZyYW1lVmlldy0+dGlsZWRCYWNraW5n
KCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBmcmFtZVZpZXctPnRpbGVkQmFj
a2luZygpLT5mb3JjZVJlcGFpbnQoKTsKLSAgICB9Ci0KLSAgICBmbHVzaExheWVycygpOwotfQot
Ci12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphY2NlbGVyYXRlZEFuaW1hdGlvbkRp
ZFN0YXJ0KHVpbnQ2NF90IGxheWVySUQsIGNvbnN0IFN0cmluZyYga2V5LCBkb3VibGUgc3RhcnRU
aW1lKQotewotICAgIG1fcmVtb3RlTGF5ZXJUcmVlQ29udGV4dC0+YW5pbWF0aW9uRGlkU3RhcnQo
bGF5ZXJJRCwga2V5LCBzdGFydFRpbWUpOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdp
bmdBcmVhOjphY2NlbGVyYXRlZEFuaW1hdGlvbkRpZEVuZCh1aW50NjRfdCBsYXllcklELCBjb25z
dCBTdHJpbmcmIGtleSkKLXsKLSAgICBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQtPmFuaW1hdGlv
bkRpZEVuZChsYXllcklELCBrZXkpOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdB
cmVhOjpzZXRWaWV3RXhwb3NlZFJlY3Qoc3RkOjpvcHRpb25hbDxXZWJDb3JlOjpGbG9hdFJlY3Q+
IHZpZXdFeHBvc2VkUmVjdCkKLXsKLSAgICBtX3ZpZXdFeHBvc2VkUmVjdCA9IHZpZXdFeHBvc2Vk
UmVjdDsKLSAgICB1cGRhdGVTY3JvbGxlZEV4cG9zZWRSZWN0KCk7Ci19Ci0KLSNpZiBQTEFURk9S
TShJT1MpCi1XZWJDb3JlOjpGbG9hdFJlY3QgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmV4
cG9zZWRDb250ZW50UmVjdCgpIGNvbnN0Ci17Ci0gICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBt
X3dlYlBhZ2UubWFpbkZyYW1lVmlldygpOwotICAgIGlmICghZnJhbWVWaWV3KQotICAgICAgICBy
ZXR1cm4gRmxvYXRSZWN0KCk7Ci0KLSAgICByZXR1cm4gZnJhbWVWaWV3LT5leHBvc2VkQ29udGVu
dFJlY3QoKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6c2V0RXhwb3Nl
ZENvbnRlbnRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgZXhwb3NlZENvbnRlbnRSZWN0KQotewotICAg
IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gbV93ZWJQYWdlLm1haW5GcmFtZVZpZXcoKTsKLSAgICBp
ZiAoIWZyYW1lVmlldykKLSAgICAgICAgcmV0dXJuOwotICAgIGlmIChmcmFtZVZpZXctPmV4cG9z
ZWRDb250ZW50UmVjdCgpID09IGV4cG9zZWRDb250ZW50UmVjdCkKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgZnJhbWVWaWV3LT5zZXRFeHBvc2VkQ29udGVudFJlY3QoZXhwb3NlZENvbnRlbnRSZWN0
KTsKLSAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOwotfQotI2VuZGlmCi0KLXZv
aWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnVwZGF0ZVNjcm9sbGVkRXhwb3NlZFJlY3Qo
KQotewotICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gbV93ZWJQYWdlLm1haW5GcmFtZVZpZXco
KTsKLSAgICBpZiAoIWZyYW1lVmlldykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9zY3JvbGxl
ZFZpZXdFeHBvc2VkUmVjdCA9IG1fdmlld0V4cG9zZWRSZWN0OwotCi0jaWYgIVBMQVRGT1JNKElP
UykKLSAgICBpZiAobV92aWV3RXhwb3NlZFJlY3QpIHsKLSAgICAgICAgU2Nyb2xsT2Zmc2V0IHNj
cm9sbE9mZnNldCA9IGZyYW1lVmlldy0+c2Nyb2xsT2Zmc2V0RnJvbVBvc2l0aW9uKGZyYW1lVmll
dy0+c2Nyb2xsUG9zaXRpb24oKSk7Ci0gICAgICAgIG1fc2Nyb2xsZWRWaWV3RXhwb3NlZFJlY3Qu
dmFsdWUoKS5tb3ZlQnkoc2Nyb2xsT2Zmc2V0KTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGZyYW1l
Vmlldy0+c2V0Vmlld0V4cG9zZWRSZWN0KG1fc2Nyb2xsZWRWaWV3RXhwb3NlZFJlY3QpOwotfQot
Ci1UaWxlZEJhY2tpbmcqIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjptYWluRnJhbWVUaWxl
ZEJhY2tpbmcoKSBjb25zdAotewotICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gbV93ZWJQYWdl
Lm1haW5GcmFtZVZpZXcoKTsKLSAgICByZXR1cm4gZnJhbWVWaWV3ID8gZnJhbWVWaWV3LT50aWxl
ZEJhY2tpbmcoKSA6IG51bGxwdHI7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0Fy
ZWE6OnNjaGVkdWxlQ29tcG9zaXRpbmdMYXllckZsdXNoSW1tZWRpYXRlbHkoKQotewotICAgIG1f
bGF5ZXJGbHVzaFRpbWVyLnN0YXJ0T25lU2hvdCgwX3MpOwotfQotCi12b2lkIFJlbW90ZUxheWVy
VHJlZURyYXdpbmdBcmVhOjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpCi17Ci0gICAg
aWYgKG1faXNGbHVzaGluZ1N1c3BlbmRlZCkgewotICAgICAgICBtX2lzTGF5ZXJGbHVzaFRocm90
dGxpbmdUZW1wb3JhcmlseURpc2FibGVkRm9ySW50ZXJhY3Rpb24gPSBmYWxzZTsKLSAgICAgICAg
bV9oYXNEZWZlcnJlZEZsdXNoID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBp
ZiAobV9pc0xheWVyRmx1c2hUaHJvdHRsaW5nVGVtcG9yYXJpbHlEaXNhYmxlZEZvckludGVyYWN0
aW9uKSB7Ci0gICAgICAgIG1faXNMYXllckZsdXNoVGhyb3R0bGluZ1RlbXBvcmFyaWx5RGlzYWJs
ZWRGb3JJbnRlcmFjdGlvbiA9IGZhbHNlOwotICAgICAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5
ZXJGbHVzaEltbWVkaWF0ZWx5KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAo
bV9sYXllckZsdXNoVGltZXIuaXNBY3RpdmUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29u
c3QgU2Vjb25kcyBpbml0aWFsRmx1c2hEZWxheSA9IDUwMF9tczsKLSAgICBjb25zdCBTZWNvbmRz
IGZsdXNoRGVsYXkgPSAxNTAwX21zOwotICAgIFNlY29uZHMgdGhyb3R0bGVEZWxheSA9IG1faXNU
aHJvdHRsaW5nTGF5ZXJGbHVzaGVzID8gKG1faXNJbml0aWFsVGhyb3R0bGVkTGF5ZXJGbHVzaCA/
IGluaXRpYWxGbHVzaERlbGF5IDogZmx1c2hEZWxheSkgOiAwX3M7Ci0gICAgbV9pc0luaXRpYWxU
aHJvdHRsZWRMYXllckZsdXNoID0gZmFsc2U7Ci0KLSAgICBtX2xheWVyRmx1c2hUaW1lci5zdGFy
dE9uZVNob3QodGhyb3R0bGVEZWxheSk7Ci19Ci0KLWJvb2wgUmVtb3RlTGF5ZXJUcmVlRHJhd2lu
Z0FyZWE6OmFkanVzdExheWVyRmx1c2hUaHJvdHRsaW5nKFdlYkNvcmU6OkxheWVyRmx1c2hUaHJv
dHRsZVN0YXRlOjpGbGFncyBmbGFncykKLXsKLSAgICBpZiAoZmxhZ3MgJiBXZWJDb3JlOjpMYXll
ckZsdXNoVGhyb3R0bGVTdGF0ZTo6VXNlcklzSW50ZXJhY3RpbmcpCi0gICAgICAgIG1faXNMYXll
ckZsdXNoVGhyb3R0bGluZ1RlbXBvcmFyaWx5RGlzYWJsZWRGb3JJbnRlcmFjdGlvbiA9IHRydWU7
Ci0KLSAgICBib29sIHdhc1Rocm90dGxpbmdMYXllckZsdXNoZXMgPSBtX2lzVGhyb3R0bGluZ0xh
eWVyRmx1c2hlczsKLSAgICBtX2lzVGhyb3R0bGluZ0xheWVyRmx1c2hlcyA9IGZsYWdzICYgV2Vi
Q29yZTo6TGF5ZXJGbHVzaFRocm90dGxlU3RhdGU6OkVuYWJsZWQ7Ci0KLSAgICBpZiAoIXdhc1Ro
cm90dGxpbmdMYXllckZsdXNoZXMgJiYgbV9pc1Rocm90dGxpbmdMYXllckZsdXNoZXMpCi0gICAg
ICAgIG1faXNJbml0aWFsVGhyb3R0bGVkTGF5ZXJGbHVzaCA9IHRydWU7Ci0KLSAgICAvLyBSZS1z
Y2hlZHVsZSB0aGUgZmx1c2ggaWYgd2Ugc3RvcHBlZCB0aHJvdHRsaW5nLgotICAgIGlmICh3YXNU
aHJvdHRsaW5nTGF5ZXJGbHVzaGVzICYmICFtX2lzVGhyb3R0bGluZ0xheWVyRmx1c2hlcyAmJiBt
X2xheWVyRmx1c2hUaW1lci5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgIG1fbGF5ZXJGbHVzaFRpbWVy
LnN0b3AoKTsKLSAgICAgICAgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKTsKLSAgICB9
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6
OmZsdXNoTGF5ZXJzKCkKLXsKLSAgICBpZiAoIW1fcm9vdExheWVyKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBpZiAobV9pc0ZsdXNoaW5nU3VzcGVuZGVkKSB7Ci0gICAgICAgIG1faGFzRGVmZXJy
ZWRGbHVzaCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobV93YWl0
aW5nRm9yQmFja2luZ1N0b3JlU3dhcCkgewotICAgICAgICBtX2hhZEZsdXNoRGVmZXJyZWRXaGls
ZVdhaXRpbmdGb3JCYWNraW5nU3RvcmVTd2FwID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIFJFTEVBU0VfQVNTRVJUKCFtX3BlbmRpbmdCYWNraW5nU3RvcmVGbHVzaGVyIHx8
IG1fcGVuZGluZ0JhY2tpbmdTdG9yZUZsdXNoZXItPmhhc0ZsdXNoZWQoKSk7Ci0KLSAgICBSZW1v
dGVMYXllckJhY2tpbmdTdG9yZUNvbGxlY3Rpb24mIGJhY2tpbmdTdG9yZUNvbGxlY3Rpb24gPSBt
X3JlbW90ZUxheWVyVHJlZUNvbnRleHQtPmJhY2tpbmdTdG9yZUNvbGxlY3Rpb24oKTsKLSAgICBi
YWNraW5nU3RvcmVDb2xsZWN0aW9uLndpbGxGbHVzaExheWVycygpOwotCi0gICAgbV93ZWJQYWdl
LmxheW91dElmTmVlZGVkKCk7Ci0KLSAgICBGbG9hdFJlY3QgdmlzaWJsZVJlY3QoRmxvYXRQb2lu
dCgpLCBtX3ZpZXdTaXplKTsKLSAgICBpZiAobV9zY3JvbGxlZFZpZXdFeHBvc2VkUmVjdCkKLSAg
ICAgICAgdmlzaWJsZVJlY3QuaW50ZXJzZWN0KG1fc2Nyb2xsZWRWaWV3RXhwb3NlZFJlY3QudmFs
dWUoKSk7Ci0KLSAgICBSZWZQdHI8V2ViUGFnZT4gcmV0YWluZWRQYWdlID0gJm1fd2ViUGFnZTsK
LSAgICBbQ0FUcmFuc2FjdGlvbiBhZGRDb21taXRIYW5kbGVyOltyZXRhaW5lZFBhZ2VdIHsKLSAg
ICAgICAgaWYgKFBhZ2UqIGNvcmVQYWdlID0gcmV0YWluZWRQYWdlLT5jb3JlUGFnZSgpKSB7Ci0g
ICAgICAgICAgICBpZiAoRnJhbWUqIGNvcmVGcmFtZSA9IHJldGFpbmVkUGFnZS0+bWFpbkZyYW1l
KCkpCi0gICAgICAgICAgICAgICAgY29yZVBhZ2UtPmluc3BlY3RvckNvbnRyb2xsZXIoKS5kaWRD
b21wb3NpdGUoKmNvcmVGcmFtZSk7Ci0gICAgICAgIH0KLSAgICB9IGZvclBoYXNlOmtDQVRyYW5z
YWN0aW9uUGhhc2VQb3N0Q29tbWl0XTsKLQotICAgIG1fd2ViUGFnZS5tYWluRnJhbWVWaWV3KCkt
PmZsdXNoQ29tcG9zaXRpbmdTdGF0ZUluY2x1ZGluZ1N1YmZyYW1lcygpOwotCi0gICAgLy8gQmVj
YXVzZSBvdXIgdmlldy1yZWxhdGl2ZSBvdmVybGF5IHJvb3QgbGF5ZXIgaXMgbm90IGF0dGFjaGVk
IHRvIHRoZSBGcmFtZVZpZXcncyBHcmFwaGljc0xheWVyIHRyZWUsIHdlIG5lZWQgdG8gZmx1c2gg
aXQgbWFudWFsbHkuCi0gICAgaWYgKG1fdmlld092ZXJsYXlSb290TGF5ZXIpCi0gICAgICAgIG1f
dmlld092ZXJsYXlSb290TGF5ZXItPmZsdXNoQ29tcG9zaXRpbmdTdGF0ZSh2aXNpYmxlUmVjdCk7
Ci0KLSAgICBtX3Jvb3RMYXllci0+Zmx1c2hDb21wb3NpdGluZ1N0YXRlRm9yVGhpc0xheWVyT25s
eSgpOwotCi0gICAgLy8gRklYTUU6IE1pbmltaXplIHRoZXNlIHRyYW5zYWN0aW9ucyBpZiBub3Ro
aW5nIGNoYW5nZWQuCi0gICAgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24gbGF5ZXJUcmFuc2Fj
dGlvbjsKLSAgICBsYXllclRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uSUQodGFrZU5leHRUcmFu
c2FjdGlvbklEKCkpOwotICAgIGxheWVyVHJhbnNhY3Rpb24uc2V0Q2FsbGJhY2tJRHMoV1RGTW92
ZShtX3BlbmRpbmdDYWxsYmFja0lEcykpOwotICAgIG1fcmVtb3RlTGF5ZXJUcmVlQ29udGV4dC0+
c2V0TmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludChtX25leHRGbHVzaElzRm9ySW1tZWRpYXRl
UGFpbnQpOwotICAgIG1fcmVtb3RlTGF5ZXJUcmVlQ29udGV4dC0+YnVpbGRUcmFuc2FjdGlvbihs
YXllclRyYW5zYWN0aW9uLCAqZG93bmNhc3Q8R3JhcGhpY3NMYXllckNBUmVtb3RlPigqbV9yb290
TGF5ZXIpLnBsYXRmb3JtQ0FMYXllcigpKTsKLSAgICBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQt
PnNldE5leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQoZmFsc2UpOwotICAgIGJhY2tpbmdTdG9y
ZUNvbGxlY3Rpb24ud2lsbENvbW1pdExheWVyVHJlZShsYXllclRyYW5zYWN0aW9uKTsKLSAgICBt
X3dlYlBhZ2Uud2lsbENvbW1pdExheWVyVHJlZShsYXllclRyYW5zYWN0aW9uKTsKLQotICAgIGxh
eWVyVHJhbnNhY3Rpb24uc2V0TmV3bHlSZWFjaGVkTGF5b3V0TWlsZXN0b25lcyhtX3BlbmRpbmdO
ZXdseVJlYWNoZWRMYXlvdXRNaWxlc3RvbmVzKTsKLSAgICBtX3BlbmRpbmdOZXdseVJlYWNoZWRM
YXlvdXRNaWxlc3RvbmVzID0gMDsKLQotICAgIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yVHJh
bnNhY3Rpb24gc2Nyb2xsaW5nVHJhbnNhY3Rpb247Ci0jaWYgRU5BQkxFKEFTWU5DX1NDUk9MTElO
RykKLSAgICBpZiAobV93ZWJQYWdlLnNjcm9sbGluZ0Nvb3JkaW5hdG9yKCkpCi0gICAgICAgIGRv
d25jYXN0PFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yPigqbV93ZWJQYWdlLnNjcm9sbGluZ0Nv
b3JkaW5hdG9yKCkpLmJ1aWxkVHJhbnNhY3Rpb24oc2Nyb2xsaW5nVHJhbnNhY3Rpb24pOwotI2Vu
ZGlmCi0KLSAgICBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQgPSBmYWxzZTsKLSAgICBt
X3dhaXRpbmdGb3JCYWNraW5nU3RvcmVTd2FwID0gdHJ1ZTsKLQotICAgIG1fd2ViUGFnZS5zZW5k
KE1lc3NhZ2VzOjpSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYVByb3h5OjpXaWxsQ29tbWl0TGF5
ZXJUcmVlKGxheWVyVHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JRCgpKSk7Ci0KLSAgICBNZXNzYWdl
czo6UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWFQcm94eTo6Q29tbWl0TGF5ZXJUcmVlIG1lc3Nh
Z2UobGF5ZXJUcmFuc2FjdGlvbiwgc2Nyb2xsaW5nVHJhbnNhY3Rpb24pOwotICAgIGF1dG8gY29t
bWl0RW5jb2RlciA9IHN0ZDo6bWFrZV91bmlxdWU8SVBDOjpFbmNvZGVyPihNZXNzYWdlczo6UmVt
b3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWFQcm94eTo6Q29tbWl0TGF5ZXJUcmVlOjpyZWNlaXZlck5h
bWUoKSwgTWVzc2FnZXM6OlJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhUHJveHk6OkNvbW1pdExh
eWVyVHJlZTo6bmFtZSgpLCBtX3dlYlBhZ2UucGFnZUlEKCkpOwotICAgIGNvbW1pdEVuY29kZXIt
PmVuY29kZShtZXNzYWdlLmFyZ3VtZW50cygpKTsKLQotICAgIC8vIEZJWE1FOiBNb3ZlIGFsbCBi
YWNraW5nIHN0b3JlIGZsdXNoaW5nIG1hbmFnZW1lbnQgdG8gUmVtb3RlTGF5ZXJCYWNraW5nU3Rv
cmVDb2xsZWN0aW9uLgotICAgIGJvb2wgaGFkQW55Q2hhbmdlZEJhY2tpbmdTdG9yZSA9IGZhbHNl
OwotICAgIFZlY3RvcjxSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPj4gY29udGV4dHNUb0ZsdXNoOwot
ICAgIGZvciAoYXV0byYgbGF5ZXIgOiBsYXllclRyYW5zYWN0aW9uLmNoYW5nZWRMYXllcnMoKSkg
ewotICAgICAgICBpZiAobGF5ZXItPnByb3BlcnRpZXMoKS5jaGFuZ2VkUHJvcGVydGllcyAmIFJl
bW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpMYXllckNoYW5nZXM6OkJhY2tpbmdTdG9yZUNoYW5n
ZWQpIHsKLSAgICAgICAgICAgIGhhZEFueUNoYW5nZWRCYWNraW5nU3RvcmUgPSB0cnVlOwotICAg
ICAgICAgICAgaWYgKGxheWVyLT5wcm9wZXJ0aWVzKCkuYmFja2luZ1N0b3JlKSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKGF1dG8gY29udGV4dFBlbmRpbmdGbHVzaCA9IGxheWVyLT5wcm9wZXJ0aWVz
KCkuYmFja2luZ1N0b3JlLT50YWtlRnJvbnRDb250ZXh0UGVuZGluZ0ZsdXNoKCkpCi0gICAgICAg
ICAgICAgICAgICAgIGNvbnRleHRzVG9GbHVzaC5hcHBlbmQoY29udGV4dFBlbmRpbmdGbHVzaCk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsYXllci0+ZGlkQ29tbWl0KCk7
Ci0gICAgfQotCi0gICAgYmFja2luZ1N0b3JlQ29sbGVjdGlvbi5kaWRGbHVzaExheWVycygpOwot
Ci0gICAgaWYgKGhhZEFueUNoYW5nZWRCYWNraW5nU3RvcmUpCi0gICAgICAgIGJhY2tpbmdTdG9y
ZUNvbGxlY3Rpb24uc2NoZWR1bGVWb2xhdGlsaXR5VGltZXIoKTsKLQotICAgIFJlZlB0cjxCYWNr
aW5nU3RvcmVGbHVzaGVyPiBiYWNraW5nU3RvcmVGbHVzaGVyID0gQmFja2luZ1N0b3JlRmx1c2hl
cjo6Y3JlYXRlKFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0aW9u
KCksIFdURk1vdmUoY29tbWl0RW5jb2RlciksIFdURk1vdmUoY29udGV4dHNUb0ZsdXNoKSk7Ci0g
ICAgbV9wZW5kaW5nQmFja2luZ1N0b3JlRmx1c2hlciA9IGJhY2tpbmdTdG9yZUZsdXNoZXI7Ci0K
LSAgICB1aW50NjRfdCBwYWdlSUQgPSBtX3dlYlBhZ2UucGFnZUlEKCk7Ci0gICAgZGlzcGF0Y2hf
YXN5bmMobV9jb21taXRRdWV1ZSwgW2JhY2tpbmdTdG9yZUZsdXNoZXIsIHBhZ2VJRF0gewotICAg
ICAgICBiYWNraW5nU3RvcmVGbHVzaGVyLT5mbHVzaCgpOwotCi0gICAgICAgIE1vbm90b25pY1Rp
bWUgdGltZXN0YW1wID0gTW9ub3RvbmljVGltZTo6bm93KCk7Ci0gICAgICAgIGRpc3BhdGNoX2Fz
eW5jKGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIFtwYWdlSUQsIHRpbWVzdGFtcF0gewotICAg
ICAgICAgICAgaWYgKFdlYlBhZ2UqIHdlYlBhZ2UgPSBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS53
ZWJQYWdlKHBhZ2VJRCkpCi0gICAgICAgICAgICAgICAgd2ViUGFnZS0+ZGlkRmx1c2hMYXllclRy
ZWVBdFRpbWUodGltZXN0YW1wKTsKLSAgICAgICAgfSk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgUmVt
b3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmRpZFVwZGF0ZSgpCi17Ci0gICAgLy8gRklYTUU6IFRo
aXMgc2hvdWxkIHVzZSBhIGNvdW50ZWQgcmVwbGFjZW1lbnQgZm9yIHNldExheWVyVHJlZVN0YXRl
SXNGcm96ZW4sIGJ1dAotICAgIC8vIHRoZSBjYWxsZXJzIG9mIHRoYXQgZnVuY3Rpb24gYXJlIG5v
dCBzdHJpY3RseSBwYWlyZWQuCi0KLSAgICBtX3dhaXRpbmdGb3JCYWNraW5nU3RvcmVTd2FwID0g
ZmFsc2U7Ci0KLSAgICBpZiAobV9oYWRGbHVzaERlZmVycmVkV2hpbGVXYWl0aW5nRm9yQmFja2lu
Z1N0b3JlU3dhcCkgewotICAgICAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOwot
ICAgICAgICBtX2hhZEZsdXNoRGVmZXJyZWRXaGlsZVdhaXRpbmdGb3JCYWNraW5nU3RvcmVTd2Fw
ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBlbXB0eSB0cmFuc2FjdGlvbiBzZXJ2ZXMg
dG8gdHJpZ2dlciBDQSdzIGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBJT1N1cmZhY2VzLiBTZWUgPHJk
YXI6Ly9wcm9ibGVtLzE2MTEwNjg3PgotICAgIFtDQVRyYW5zYWN0aW9uIGJlZ2luXTsKLSAgICBb
Q0FUcmFuc2FjdGlvbiBjb21taXRdOwotCi0gICAgSGFzaFNldDxSZW1vdGVMYXllclRyZWVEaXNw
bGF5UmVmcmVzaE1vbml0b3IqPiBtb25pdG9yc1RvTm90aWZ5ID0gbV9kaXNwbGF5UmVmcmVzaE1v
bml0b3JzOwotICAgIEFTU0VSVCghbV9kaXNwbGF5UmVmcmVzaE1vbml0b3JzVG9Ob3RpZnkpOwot
ICAgIG1fZGlzcGxheVJlZnJlc2hNb25pdG9yc1RvTm90aWZ5ID0gJm1vbml0b3JzVG9Ob3RpZnk7
Ci0gICAgd2hpbGUgKCFtb25pdG9yc1RvTm90aWZ5LmlzRW1wdHkoKSkKLSAgICAgICAgbW9uaXRv
cnNUb05vdGlmeS50YWtlQW55KCktPmRpZFVwZGF0ZUxheWVycygpOwotICAgIG1fZGlzcGxheVJl
ZnJlc2hNb25pdG9yc1RvTm90aWZ5ID0gbnVsbHB0cjsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRy
ZWVEcmF3aW5nQXJlYTo6bWFpbkZyYW1lQ29udGVudFNpemVDaGFuZ2VkKGNvbnN0IEludFNpemUm
IGNvbnRlbnRzU2l6ZSkKLXsKLSAgICBtX3Jvb3RMYXllci0+c2V0U2l6ZShjb250ZW50c1NpemUp
OwotfQotCi1ib29sIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjptYXJrTGF5ZXJzVm9sYXRp
bGVJbW1lZGlhdGVseUlmUG9zc2libGUoKQotewotICAgIHJldHVybiBtX3JlbW90ZUxheWVyVHJl
ZUNvbnRleHQtPmJhY2tpbmdTdG9yZUNvbGxlY3Rpb24oKS5tYXJrQWxsQmFja2luZ1N0b3JlVm9s
YXRpbGVJbW1lZGlhdGVseUlmUG9zc2libGUoKTsKLX0KLQotUmVmPFJlbW90ZUxheWVyVHJlZURy
YXdpbmdBcmVhOjpCYWNraW5nU3RvcmVGbHVzaGVyPiBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJl
YTo6QmFja2luZ1N0b3JlRmx1c2hlcjo6Y3JlYXRlKElQQzo6Q29ubmVjdGlvbiogY29ubmVjdGlv
biwgc3RkOjp1bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4gZW5jb2RlciwgVmVjdG9yPFJldGFpblB0
cjxDR0NvbnRleHRSZWY+PiBjb250ZXh0c1RvRmx1c2gpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVm
KCpuZXcgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OkJhY2tpbmdTdG9yZUZsdXNoZXIoY29u
bmVjdGlvbiwgV1RGTW92ZShlbmNvZGVyKSwgV1RGTW92ZShjb250ZXh0c1RvRmx1c2gpKSk7Ci19
Ci0KLVJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpCYWNraW5nU3RvcmVGbHVzaGVyOjpCYWNr
aW5nU3RvcmVGbHVzaGVyKElQQzo6Q29ubmVjdGlvbiogY29ubmVjdGlvbiwgc3RkOjp1bmlxdWVf
cHRyPElQQzo6RW5jb2Rlcj4gZW5jb2RlciwgVmVjdG9yPFJldGFpblB0cjxDR0NvbnRleHRSZWY+
PiBjb250ZXh0c1RvRmx1c2gpCi0gICAgOiBtX2Nvbm5lY3Rpb24oY29ubmVjdGlvbikKLSAgICAs
IG1fY29tbWl0RW5jb2RlcihXVEZNb3ZlKGVuY29kZXIpKQotICAgICwgbV9jb250ZXh0c1RvRmx1
c2goV1RGTW92ZShjb250ZXh0c1RvRmx1c2gpKQotICAgICwgbV9oYXNGbHVzaGVkKGZhbHNlKQot
ewotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpCYWNraW5nU3RvcmVGbHVz
aGVyOjpmbHVzaCgpCi17Ci0gICAgQVNTRVJUKCFtX2hhc0ZsdXNoZWQpOwotCi0gICAgVHJhY2VT
Y29wZSB0cmFjaW5nU2NvcGUoQmFja2luZ1N0b3JlRmx1c2hTdGFydCwgQmFja2luZ1N0b3JlRmx1
c2hFbmQpOwotICAgIAotICAgIGZvciAoYXV0byYgY29udGV4dCA6IG1fY29udGV4dHNUb0ZsdXNo
KQotICAgICAgICBDR0NvbnRleHRGbHVzaChjb250ZXh0LmdldCgpKTsKLSAgICBtX2hhc0ZsdXNo
ZWQgPSB0cnVlOwotCi0gICAgbV9jb25uZWN0aW9uLT5zZW5kTWVzc2FnZShXVEZNb3ZlKG1fY29t
bWl0RW5jb2RlciksIHsgfSk7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6
OmFjdGl2aXR5U3RhdGVEaWRDaGFuZ2UoQWN0aXZpdHlTdGF0ZTo6RmxhZ3MsIGJvb2wgd2FudHNE
aWRVcGRhdGVBY3Rpdml0eVN0YXRlLCBjb25zdCBWZWN0b3I8Q2FsbGJhY2tJRD4mKQotewotICAg
IC8vIEZJWE1FOiBTaG91bGQgd2Ugc3VzcGVuZCBwYWludGluZyB3aGlsZSBub3QgdmlzaWJsZSwg
bGlrZSBUaWxlZENvcmVBbmltYXRpb25EcmF3aW5nQXJlYT8gUHJvYmFibHkuCi0KLSAgICBpZiAo
d2FudHNEaWRVcGRhdGVBY3Rpdml0eVN0YXRlKSB7Ci0gICAgICAgIG1fbmV4dEZsdXNoSXNGb3JJ
bW1lZGlhdGVQYWludCA9IHRydWU7Ci0gICAgICAgIHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllckZs
dXNoSW1tZWRpYXRlbHkoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2lu
Z0FyZWE6OmFkZFRyYW5zYWN0aW9uQ2FsbGJhY2tJRChDYWxsYmFja0lEIGNhbGxiYWNrSUQpCi17
Ci0gICAgLy8gQXNzdW1lIHRoYXQgaWYgc29tZW9uZSBpcyBsaXN0ZW5pbmcgZm9yIHRoaXMgdHJh
bnNhY3Rpb24ncyBjb21wbGV0aW9uLCB0aGF0IHRoZXkgd2FudCBpdCB0bwotICAgIC8vIGJlIGEg
ImNvbXBsZXRlIiBwYWludCAoaW5jbHVkaW5nIGltYWdlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJl
IGFzeW5jaHJvbm91c2x5IGRlY29kaW5nKS4KLSAgICBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRl
UGFpbnQgPSB0cnVlOwotCi0gICAgbV9wZW5kaW5nQ2FsbGJhY2tJRHMuYXBwZW5kKHN0YXRpY19j
YXN0PFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpUcmFuc2FjdGlvbkNhbGxiYWNrSUQ+KGNh
bGxiYWNrSUQpKTsKLSAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOwotfQotCi1i
b29sIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpkaXNwYXRjaERpZFJlYWNoTGF5b3V0TWls
ZXN0b25lKFdlYkNvcmU6OkxheW91dE1pbGVzdG9uZXMgbGF5b3V0TWlsZXN0b25lcykKLXsKLSAg
ICBtX3BlbmRpbmdOZXdseVJlYWNoZWRMYXlvdXRNaWxlc3RvbmVzIHw9IGxheW91dE1pbGVzdG9u
ZXM7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319710</attachid>
            <date>2017-09-02 01:41:26 -0700</date>
            <delta_ts>2017-09-02 02:38:17 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-176271-20170902014125.patch</filename>
            <type>text/plain</type>
            <size>333434</size>
            <attacher name="Tim Horton">thorton</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjIxNTE0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDIxMDE0YmM0N2FjNjEwZWNj
OTNhNTM3YzQ4OWRhZGRmODQ0ZTA4MmIuLjFhY2U1YjI2MGRiYzVkNjY4OTA1OTU0MzIyYTc1ZWY2
NzlkYmQ0OGQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzcgQEAKKzIwMTctMDktMDIgIFRpbSBIb3J0
b24gIDx0aW1vdGh5X2hvcnRvbkBhcHBsZS5jb20+CisKKyAgICAgICAgTW92ZSBXZWIgUHJvY2Vz
cyBwYXJ0IG9mIHRoZSBSZW1vdGUgTGF5ZXIgVHJlZSBjb2RlIG91dCBvZiBhIE1hYy1zcGVjaWZp
YyBkaXJlY3RvcnkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE3NjI3MQorCisgICAgICAgIFJ1YmJlci1zdGFtcGVkIGJ5IERhbiBCZXJuc3RlaW4uCisK
KyAgICAgICAgVUktc2lkZSBjb21wb3NpdGluZyB3b3JrcyBvbiBhbGwgQ29jb2EgcGxhdGZvcm1z
LCBzbyB0aGUgY29kZSBzaG91bGQKKyAgICAgICAgbm90IGxpdmUgaW5zaWRlIE1hYy8uIEFsc28g
bWVyZ2UgdGhlIFNjcm9sbGluZyBkaXJlY3RvcnkgaW4gaGVyZSwKKyAgICAgICAgc2luY2UgdGhv
c2UgZmlsZXMgYXJlIHZlcnkgcmVsYXRlZC4KKworICAgICAgICAqIFdlYktpdC54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIERlcml2ZWRTb3VyY2VzLm1ha2U6CisgICAgICAg
ICogUGxhdGZvcm1NYWMuY21ha2U6CisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90
ZUxheWVyVHJlZS9HcmFwaGljc0xheWVyQ0FSZW1vdGUuY3BwOiBSZW5hbWVkIGZyb20gV2ViUHJv
Y2Vzcy9XZWJQYWdlL21hYy9HcmFwaGljc0xheWVyQ0FSZW1vdGUuY3BwLgorICAgICAgICAqIFdl
YlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvR3JhcGhpY3NMYXllckNBUmVtb3RlLmg6
IFJlbmFtZWQgZnJvbSBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL0dyYXBoaWNzTGF5ZXJDQVJlbW90
ZS5oLgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUGxhdGZv
cm1DQUFuaW1hdGlvblJlbW90ZS5oOiBSZW5hbWVkIGZyb20gV2ViUHJvY2Vzcy9XZWJQYWdlL21h
Yy9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQ
YWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLm1tOiBSZW5hbWVk
IGZyb20gV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLm1t
LgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1D
QUxheWVyUmVtb3RlLmNwcDogUmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxh
dGZvcm1DQUxheWVyUmVtb3RlLmNwcC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvUmVt
b3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5oOiBSZW5hbWVkIGZyb20gV2ViUHJv
Y2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaC4KKyAgICAgICAgKiBXZWJQ
cm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3Rv
bS5oOiBSZW5hbWVkIGZyb20gV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGVDdXN0b20uaC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJU
cmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5tbTogUmVuYW1lZCBmcm9tIFdlYlByb2Nl
c3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tLm1tLgorICAgICAgICAq
IFdlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUxheWVyUmVtb3Rl
VGlsZWRCYWNraW5nLmNwcDogUmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxh
dGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nLmNwcC4KKyAgICAgICAgKiBXZWJQcm9jZXNz
L1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2lu
Zy5oOiBSZW5hbWVkIGZyb20gV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGVUaWxlZEJhY2tpbmcuaC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3Rl
TGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZUNvbnRleHQuaDogUmVuYW1lZCBmcm9tIFdlYlByb2Nl
c3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5oLgorICAgICAgICAqIFdlYlBy
b2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5tbTog
UmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJUcmVlQ29udGV4
dC5tbS4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90
ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5oOiBSZW5hbWVkIGZyb20gV2ViUHJvY2Vz
cy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5oLgor
ICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJU
cmVlRGlzcGxheVJlZnJlc2hNb25pdG9yLm1tOiBSZW5hbWVkIGZyb20gV2ViUHJvY2Vzcy9XZWJQ
YWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5tbS4KKyAgICAg
ICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZURy
YXdpbmdBcmVhLmg6IFJlbmFtZWQgZnJvbSBXZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1JlbW90ZUxh
eWVyVHJlZURyYXdpbmdBcmVhLmguCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90
ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5tbTogUmVuYW1lZCBmcm9tIFdl
YlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEubW0uCisgICAg
ICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVTY3JvbGxpbmdD
b29yZGluYXRvci5oOiBSZW5hbWVkIGZyb20gV2ViUHJvY2Vzcy9TY3JvbGxpbmcvUmVtb3RlU2Ny
b2xsaW5nQ29vcmRpbmF0b3IuaC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3Rl
TGF5ZXJUcmVlL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1lc3NhZ2VzLmluOiBSZW5hbWVk
IGZyb20gV2ViUHJvY2Vzcy9TY3JvbGxpbmcvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVz
c2FnZXMuaW4uCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9S
ZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tbTogUmVuYW1lZCBmcm9tIFdlYlByb2Nlc3MvU2Ny
b2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1tLgorCiAyMDE3LTA5LTAyICBDYXJs
b3MgR2FyY2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlhLmNvbT4KIAogICAgICAgICBbR1RLXVtX
YXlsYW5kXSBPcGVuaW5nIEZlZG9yYVByb2plY3QncyBwYXN0ZWJpbiBjaGV3cyBDUFUKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvRGVyaXZlZFNvdXJjZXMubWFrZSBiL1NvdXJjZS9XZWJLaXQv
RGVyaXZlZFNvdXJjZXMubWFrZQppbmRleCBiY2Q1NWM4NzViZWFlMTJlM2Q3M2M1YTdjNWU1Zjk5
MWM4MjE3NjI2Li4xN2U3NmQ3YzI5OGNhYjgzYWIxMjE1OGEzMmMxNzBiZmEyY2M4ZDNkIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViS2l0L0Rlcml2ZWRTb3VyY2VzLm1ha2UKKysrIGIvU291cmNlL1dl
YktpdC9EZXJpdmVkU291cmNlcy5tYWtlCkBAIC01NSwxMSArNTUsMTEgQEAgVlBBVEggPSBcCiAg
ICAgJChXZWJLaXQyKS9XZWJQcm9jZXNzL09yaWdpbkRhdGEgXAogICAgICQoV2ViS2l0MikvV2Vi
UHJvY2Vzcy9QbHVnaW5zIFwKICAgICAkKFdlYktpdDIpL1dlYlByb2Nlc3MvUmVzb3VyY2VDYWNo
ZSBcCi0gICAgJChXZWJLaXQyKS9XZWJQcm9jZXNzL1Njcm9sbGluZyBcCiAgICAgJChXZWJLaXQy
KS9XZWJQcm9jZXNzL1N0b3JhZ2UgXAogICAgICQoV2ViS2l0MikvV2ViUHJvY2Vzcy9Vc2VyQ29u
dGVudCBcCiAgICAgJChXZWJLaXQyKS9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0IFwKICAgICAk
KFdlYktpdDIpL1dlYlByb2Nlc3MvV2ViUGFnZSBcCisgICAgJChXZWJLaXQyKS9XZWJQcm9jZXNz
L1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlIFwKICAgICAkKFdlYktpdDIpL1dlYlByb2Nlc3MvV2Vi
U3RvcmFnZSBcCiAgICAgJChXZWJLaXQyKS9XZWJQcm9jZXNzL2NvY29hIFwKICAgICAkKFdlYktp
dDIpL1dlYlByb2Nlc3MvaW9zIFwKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvUGxhdGZvcm1N
YWMuY21ha2UgYi9Tb3VyY2UvV2ViS2l0L1BsYXRmb3JtTWFjLmNtYWtlCmluZGV4IDllZmJlOGU2
NWNkMzkyZWJmODMzZTI5MjIzNjc2OTZmMWIyMTBjNGUuLjdmOWE4OTUzZjQzYzQ3NDFjNWZjMzc4
ZGM3YTQ2OTY5ODJmZjI4NjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvUGxhdGZvcm1NYWMu
Y21ha2UKKysrIGIvU291cmNlL1dlYktpdC9QbGF0Zm9ybU1hYy5jbWFrZQpAQCAtMzQ3LDcgKzM0
NywxNSBAQCBsaXN0KEFQUEVORCBXZWJLaXQyX1NPVVJDRVMKICAgICBXZWJQcm9jZXNzL1BsdWdp
bnMvUERGL1BERlBsdWdpblBhc3N3b3JkRmllbGQubW0KICAgICBXZWJQcm9jZXNzL1BsdWdpbnMv
UERGL1BERlBsdWdpblRleHRBbm5vdGF0aW9uLm1tCiAKLSAgICBXZWJQcm9jZXNzL1Njcm9sbGlu
Zy9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tbQorICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9S
ZW1vdGVMYXllclRyZWUvR3JhcGhpY3NMYXllckNBUmVtb3RlLmNwcAorICAgIFdlYlByb2Nlc3Mv
V2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5tbQorICAg
IFdlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUxheWVyUmVtb3Rl
LmNwcAorICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUxh
eWVyUmVtb3RlQ3VzdG9tLm1tCisgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJl
ZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuY3BwCisgICAgV2ViUHJvY2Vzcy9X
ZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVDb250ZXh0Lm1tCisgICAgV2Vi
UHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVEaXNwbGF5UmVm
cmVzaE1vbml0b3IubW0KKyAgICBXZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1Jl
bW90ZUxheWVyVHJlZURyYXdpbmdBcmVhLm1tCisgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90
ZUxheWVyVHJlZS9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tbQogCiAgICAgV2ViUHJvY2Vz
cy9XZWJDb3JlU3VwcG9ydC9XZWJQYXN0ZWJvYXJkT3ZlcnJpZGVzLmNwcAogICAgIFdlYlByb2Nl
c3MvV2ViQ29yZVN1cHBvcnQvV2ViVmFsaWRhdGlvbk1lc3NhZ2VDbGllbnQuY3BwCkBAIC0zNjIs
MTcgKzM3MCw5IEBAIGxpc3QoQVBQRU5EIFdlYktpdDJfU09VUkNFUwogCiAgICAgV2ViUHJvY2Vz
cy9XZWJQYWdlL1ZpZXdHZXN0dXJlR2VvbWV0cnlDb2xsZWN0b3IuY3BwCiAKLSAgICBXZWJQcm9j
ZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yLm1t
CiAgICAgV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1dlYlBhZ2VDb2NvYS5tbQogCi0gICAgV2Vi
UHJvY2Vzcy9XZWJQYWdlL21hYy9HcmFwaGljc0xheWVyQ0FSZW1vdGUuY3BwCiAgICAgV2ViUHJv
Y2Vzcy9XZWJQYWdlL21hYy9QYWdlQmFubmVyTWFjLm1tCi0gICAgV2ViUHJvY2Vzcy9XZWJQYWdl
L21hYy9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLm1tCi0gICAgV2ViUHJvY2Vzcy9XZWJQYWdl
L21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuY3BwCi0gICAgV2ViUHJvY2Vzcy9XZWJQYWdlL21h
Yy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20ubW0KLSAgICBXZWJQcm9jZXNzL1dlYlBhZ2Uv
bWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5jcHAKLSAgICBXZWJQcm9jZXNz
L1dlYlBhZ2UvbWFjL1JlbW90ZUxheWVyVHJlZUNvbnRleHQubW0KLSAgICBXZWJQcm9jZXNzL1dl
YlBhZ2UvbWFjL1JlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhLm1tCiAgICAgV2ViUHJvY2Vzcy9X
ZWJQYWdlL21hYy9UaWxlZENvcmVBbmltYXRpb25EcmF3aW5nQXJlYS5tbQogICAgIFdlYlByb2Nl
c3MvV2ViUGFnZS9tYWMvV0tBY2Nlc3NpYmlsaXR5V2ViUGFnZU9iamVjdEJhc2UubW0KICAgICBX
ZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1dLQWNjZXNzaWJpbGl0eVdlYlBhZ2VPYmplY3RNYWMubW0K
QEAgLTQyMiw4ICs0MjIsOCBAQCBsaXN0KEFQUEVORCBXZWJLaXQyX0lOQ0xVREVfRElSRUNUT1JJ
RVMKICAgICAiJHtXRUJLSVQyX0RJUn0vV2ViUHJvY2Vzcy9JbmplY3RlZEJ1bmRsZS9BUEkvbWFj
IgogICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1BsdWdpbnMvUERGIgogICAgICIke1dF
QktJVDJfRElSfS9XZWJQcm9jZXNzL1BsdWdpbnMvTmV0c2NhcGUvbWFjIgotICAgICIke1dFQktJ
VDJfRElSfS9XZWJQcm9jZXNzL1Njcm9sbGluZyIKICAgICAiJHtXRUJLSVQyX0RJUn0vV2ViUHJv
Y2Vzcy9XZWJQYWdlL0NvY29hIgorICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1dlYlBh
Z2UvUmVtb3RlTGF5ZXJUcmVlIgogICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1dlYlBh
Z2UvbWFjIgogICAgICIke1dFQktJVDJfRElSfS9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L21h
YyIKICAgICAiJHtGT1JXQVJESU5HX0hFQURFUlNfRElSfS9XZWJDb3JlIgpAQCAtNDc4LDcgKzQ3
OCw3IEBAIGxpc3QoQVBQRU5EIFdlYktpdDJfTUVTU0FHRVNfSU5fRklMRVMKICAgICBVSVByb2Nl
c3MvbWFjL1JlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhUHJveHkubWVzc2FnZXMuaW4KICAgICBV
SVByb2Nlc3MvbWFjL1NlY0l0ZW1TaGltUHJveHkubWVzc2FnZXMuaW4KIAotICAgIFdlYlByb2Nl
c3MvU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1lc3NhZ2VzLmluCisgICAg
V2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVTY3JvbGxpbmdDb29yZGlu
YXRvci5tZXNzYWdlcy5pbgogICAgIFdlYlByb2Nlc3MvV2ViUGFnZS9WaWV3R2VzdHVyZUdlb21l
dHJ5Q29sbGVjdG9yLm1lc3NhZ2VzLmluCiApCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
V2ViS2l0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9Tb3VyY2UvV2ViS2l0L1dlYktpdC54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IGFlYmM0NzZiMGNjNzA0MzdmYzQ5OGM0OWUy
NTFhYjliOGNhNzc5NTkuLmRkZjMwOTMxZjc4N2JlYzI5MzEyMmZiNmRmNjAyODRkMjdmNGE5Njkg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViS2l0Lnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2oKKysrIGIvU291cmNlL1dlYktpdC9XZWJLaXQueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpA
QCAtMjI3Nyw5ICsyMjc3LDkgQEAKIAkJMEYxNzRBQTYxNDJBQUM2MTAwMzkyNTBGIC8qIFdLR2Vv
bWV0cnkuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gV0tHZW9tZXRy
eS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGM0M3MjU3MTk2RjVGNTAwMEFF
REQwQyAvKiBXS0luc3BlY3RvckhpZ2hsaWdodFZpZXcubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5vYmpjcHA7IHBhdGggPSBXS0luc3BlY3RvckhpZ2hsaWdodFZpZXcubW07IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTBGM0M3MjU5MTk2RjVGNjgwMEFFREQwQyAvKiBXS0luc3Bl
Y3RvckhpZ2hsaWdodFZpZXcuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gV0tJ
bnNwZWN0b3JIaWdobGlnaHRWaWV3Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTBG
NTk0NzhEMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRv
ci5oOyBwYXRoID0gU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCTBGNTk0NzhFMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1v
dGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdlcy5pbiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IG5hbWUg
PSBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdlcy5pbjsgcGF0aCA9IFNjcm9sbGlu
Zy9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdlcy5pbjsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKLQkJMEY1OTQ3OEYxODdCM0IzQTAwNDM3ODU3IC8qIFJlbW90ZVNjcm9sbGlu
Z0Nvb3JkaW5hdG9yLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBuYW1lID0g
UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubW07IHBhdGggPSBTY3JvbGxpbmcvUmVtb3RlU2Ny
b2xsaW5nQ29vcmRpbmF0b3IubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGNTk0
NzhEMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5oICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQkwRjU5NDc4RTE4N0IzQjNBMDA0Mzc4NTcg
LyogUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMuaW4gKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0
OyBwYXRoID0gUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMuaW47IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CisJCTBGNTk0NzhGMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1vdGVT
Y3JvbGxpbmdDb29yZGluYXRvci5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsg
cGF0aCA9IFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1tOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQkwRjU5NDc5NDE4N0IzQjYwMDA0Mzc4NTcgLyogUmVtb3RlU2Nyb2xsaW5nQ29v
cmRpbmF0b3JQcm94eS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBS
ZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvclByb3h5LmNwcDsgcGF0aCA9IFNjcm9sbGluZy9SZW1v
dGVTY3JvbGxpbmdDb29yZGluYXRvclByb3h5LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJMEY1OTQ3OTUxODdCM0I2MDAwNDM3ODU3IC8qIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5h
dG9yUHJveHkuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gUmVtb3RlU2Nyb2xs
aW5nQ29vcmRpbmF0b3JQcm94eS5oOyBwYXRoID0gU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nv
b3JkaW5hdG9yUHJveHkuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMEY1OTQ3OTYx
ODdCM0I2MDAwNDM3ODU3IC8qIFJlbW90ZVNjcm9sbGluZ1RyZWUuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gUmVtb3RlU2Nyb2xsaW5nVHJlZS5jcHA7IHBhdGggPSBT
Y3JvbGxpbmcvUmVtb3RlU2Nyb2xsaW5nVHJlZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CkBAIC00NjMxLDE2ICs0NjMxLDYgQEAKIAkJCXRhYldpZHRoID0gODsKIAkJCXVzZXNUYWJz
ID0gMDsKIAkJfTsKLQkJMEY1OTQ3OEMxODdCM0IyQTAwNDM3ODU3IC8qIFNjcm9sbGluZyAqLyA9
IHsKLQkJCWlzYSA9IFBCWEdyb3VwOwotCQkJY2hpbGRyZW4gPSAoCi0JCQkJMEY1OTQ3OEQxODdC
M0IzQTAwNDM3ODU3IC8qIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmggKi8sCi0JCQkJMEY1
OTQ3OEUxODdCM0IzQTAwNDM3ODU3IC8qIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1lc3Nh
Z2VzLmluICovLAotCQkJCTBGNTk0NzhGMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1vdGVTY3JvbGxp
bmdDb29yZGluYXRvci5tbSAqLywKLQkJCSk7Ci0JCQluYW1lID0gU2Nyb2xsaW5nOwotCQkJc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsKLQkJfTsKIAkJMEY1OTQ3OTMxODdCM0I0QzAwNDM3ODU3IC8q
IFNjcm9sbGluZyAqLyA9IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCkBA
IC01NDMzLDYgKzU0MjMsMzIgQEAKIAkJCW5hbWUgPSBDdXN0b21Qcm90b2NvbHM7CiAJCQlzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOwogCQl9OworCQkyRDE1NTFBODFGNUE5NTIyMDAwNkUzRkUgLyog
UmVtb3RlTGF5ZXJUcmVlICovID0geworCQkJaXNhID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9
ICgKKwkJCQkyREEwNDlCNTE4MENDRDBBMDBBQUZBOUUgLyogR3JhcGhpY3NMYXllckNBUmVtb3Rl
LmNwcCAqLywKKwkJCQkyREEwNDlCNjE4MENDRDBBMDBBQUZBOUUgLyogR3JhcGhpY3NMYXllckNB
UmVtb3RlLmggKi8sCisJCQkJMEY1RTIwMDIxOEU3NzA1MTAwM0VDM0U1IC8qIFBsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGUuaCAqLywKKwkJCQkwRjVFMjAwMTE4RTc3MDUxMDAzRUMzRTUgLyogUGxh
dGZvcm1DQUFuaW1hdGlvblJlbW90ZS5tbSAqLywKKwkJCQkyREEwNDlCMTE4MENDQ0QzMDBBQUZB
OUUgLyogUGxhdGZvcm1DQUxheWVyUmVtb3RlLmNwcCAqLywKKwkJCQkyREEwNDlCMjE4MENDQ0Qz
MDBBQUZBOUUgLyogUGxhdGZvcm1DQUxheWVyUmVtb3RlLmggKi8sCisJCQkJMkQ4NzEwMTUxODI4
NDE1RDAwMThGQTAxIC8qIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5oICovLAorCQkJCTJE
ODcxMDE0MTgyODQxNUQwMDE4RkEwMSAvKiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20ubW0g
Ki8sCisJCQkJMkQ4OTQ5RUUxODIwNDRGNjAwRTg5OEFBIC8qIFBsYXRmb3JtQ0FMYXllclJlbW90
ZVRpbGVkQmFja2luZy5jcHAgKi8sCisJCQkJMkQ4OTQ5RUYxODIwNDRGNjAwRTg5OEFBIC8qIFBs
YXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5oICovLAorCQkJCTFBQjE2QUU4MTY0QjNB
ODgwMDI5MEQ2MiAvKiBSZW1vdGVMYXllclRyZWVDb250ZXh0LmggKi8sCisJCQkJMUFCMTZBRTcx
NjRCM0E4ODAwMjkwRDYyIC8qIFJlbW90ZUxheWVyVHJlZUNvbnRleHQubW0gKi8sCisJCQkJMkQy
OUVDQ0UxOTJGMkMyRTAwOTg0Qjc4IC8qIFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9u
aXRvci5oICovLAorCQkJCTJEMjlFQ0NGMTkyRjJDMkUwMDk4NEI3OCAvKiBSZW1vdGVMYXllclRy
ZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IubW0gKi8sCisJCQkJMUFCMTZBREMxNjQ4NTk4NDAwMjkw
RDYyIC8qIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhLmggKi8sCisJCQkJMUFCMTZBREIxNjQ4
NTk4NDAwMjkwRDYyIC8qIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhLm1tICovLAorCQkJCTBG
NTk0NzhEMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5oICov
LAorCQkJCTBGNTk0NzhFMTg3QjNCM0EwMDQzNzg1NyAvKiBSZW1vdGVTY3JvbGxpbmdDb29yZGlu
YXRvci5tZXNzYWdlcy5pbiAqLywKKwkJCQkwRjU5NDc4RjE4N0IzQjNBMDA0Mzc4NTcgLyogUmVt
b3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubW0gKi8sCisJCQkpOworCQkJcGF0aCA9IFJlbW90ZUxh
eWVyVHJlZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CisJCX07CiAJCTJEMjhGM0RGMTg4
NUNDQjQwMDRCOUVBRSAvKiBpb3MgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJCWNoaWxk
cmVuID0gKApAQCAtNTQ0OCw4ICs1NDY0LDYgQEAKIAkJMkQyOUVDQ0QxOTJGMkMyRTAwOTg0Qjc4
IC8qIENvY29hICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKLQkJ
CQkyRDI5RUNDRTE5MkYyQzJFMDA5ODRCNzggLyogUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJl
c2hNb25pdG9yLmggKi8sCi0JCQkJMkQyOUVDQ0YxOTJGMkMyRTAwOTg0Qjc4IC8qIFJlbW90ZUxh
eWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5tbSAqLywKIAkJCQkyREM0Q0Y3QTFEMkRFMjRC
MDBFQ0NDOTQgLyogV2ViUGFnZUNvY29hLm1tICovLAogCQkJKTsKIAkJCXBhdGggPSBDb2NvYTsK
QEAgLTY2OTEsNyArNjcwNSw2IEBACiAJCQkJNTEwNUIwRDIxNjJGN0E1RTAwRTI3NzA5IC8qIE5l
dHdvcmsgKi8sCiAJCQkJMzEwOTk5NzQxNDZDOEFBODAwMjlERUI5IC8qIE5vdGlmaWNhdGlvbnMg
KFVzZXIpICovLAogCQkJCTFBNkZCN0FBMTFFNjRCNDkwMERCMTM3MSAvKiBQbHVnaW5zICovLAot
CQkJCTBGNTk0NzhDMTg3QjNCMkEwMDQzNzg1NyAvKiBTY3JvbGxpbmcgKi8sCiAJCQkJNTExOEU5
OTgxRjI5NTI1OTAwM0VGOUY1IC8qIFN0b3JhZ2UgKi8sCiAJCQkJMUFBRjA4QUExOTI2OTMwQjAw
QjYzOTBDIC8qIFVzZXJDb250ZW50ICovLAogCQkJCUJDMDMyRDVEMTBGNDM3MjIwMDU4QzE1QSAv
KiBXZWJDb3JlU3VwcG9ydCAqLywKQEAgLTY3NjYsNiArNjc3OSw3IEBACiAJCQkJMkQyOUVDQ0Qx
OTJGMkMyRTAwOTg0Qjc4IC8qIENvY29hICovLAogCQkJCTJEQTk0NEI0MTg4NEVBMkEwMEVEODZE
QiAvKiBpb3MgKi8sCiAJCQkJQkM5NjNENkMxMTNERDE5NTAwNTc0QkUyIC8qIG1hYyAqLywKKwkJ
CQkyRDE1NTFBODFGNUE5NTIyMDAwNkUzRkUgLyogUmVtb3RlTGF5ZXJUcmVlICovLAogCQkJCUJD
ODQ1MkE1MTE2MkM4MDkwMENBQjlCNSAvKiBEcmF3aW5nQXJlYS5jcHAgKi8sCiAJCQkJQkM4NDUy
QTYxMTYyQzgwOTAwQ0FCOUI1IC8qIERyYXdpbmdBcmVhLmggKi8sCiAJCQkJMUE2NDIyOEExMkRE
MDI0NzAwQ0FBRTJDIC8qIERyYXdpbmdBcmVhLm1lc3NhZ2VzLmluICovLApAQCAtNzYxMCwyMSAr
NzYyNCw3IEBACiAJCUJDOTYzRDZDMTEzREQxOTUwMDU3NEJFMiAvKiBtYWMgKi8gPSB7CiAJCQlp
c2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKAotCQkJCTJEQTA0OUI1MTgwQ0NEMEEwMEFB
RkE5RSAvKiBHcmFwaGljc0xheWVyQ0FSZW1vdGUuY3BwICovLAotCQkJCTJEQTA0OUI2MTgwQ0NE
MEEwMEFBRkE5RSAvKiBHcmFwaGljc0xheWVyQ0FSZW1vdGUuaCAqLywKIAkJCQk3QzZEMzdGQTE3
MkY1NTVGMDA5RDI4NDcgLyogUGFnZUJhbm5lck1hYy5tbSAqLywKLQkJCQkwRjVFMjAwMjE4RTc3
MDUxMDAzRUMzRTUgLyogUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5oICovLAotCQkJCTBGNUUy
MDAxMThFNzcwNTEwMDNFQzNFNSAvKiBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLm1tICovLAot
CQkJCTJEQTA0OUIxMTgwQ0NDRDMwMEFBRkE5RSAvKiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuY3Bw
ICovLAotCQkJCTJEQTA0OUIyMTgwQ0NDRDMwMEFBRkE5RSAvKiBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGUuaCAqLywKLQkJCQkyRDg3MTAxNTE4Mjg0MTVEMDAxOEZBMDEgLyogUGxhdGZvcm1DQUxheWVy
UmVtb3RlQ3VzdG9tLmggKi8sCi0JCQkJMkQ4NzEwMTQxODI4NDE1RDAwMThGQTAxIC8qIFBsYXRm
b3JtQ0FMYXllclJlbW90ZUN1c3RvbS5tbSAqLywKLQkJCQkyRDg5NDlFRTE4MjA0NEY2MDBFODk4
QUEgLyogUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nLmNwcCAqLywKLQkJCQkyRDg5
NDlFRjE4MjA0NEY2MDBFODk4QUEgLyogUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5n
LmggKi8sCi0JCQkJMUFCMTZBRTgxNjRCM0E4ODAwMjkwRDYyIC8qIFJlbW90ZUxheWVyVHJlZUNv
bnRleHQuaCAqLywKLQkJCQkxQUIxNkFFNzE2NEIzQTg4MDAyOTBENjIgLyogUmVtb3RlTGF5ZXJU
cmVlQ29udGV4dC5tbSAqLywKLQkJCQkxQUIxNkFEQzE2NDg1OTg0MDAyOTBENjIgLyogUmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWEuaCAqLywKLQkJCQkxQUIxNkFEQjE2NDg1OTg0MDAyOTBENjIg
LyogUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEubW0gKi8sCiAJCQkJMUFBRjI2MzcxNDY4N0Mz
OTAwNEExRThBIC8qIFRpbGVkQ29yZUFuaW1hdGlvbkRyYXdpbmdBcmVhLmggKi8sCiAJCQkJMUFB
RjI2MzYxNDY4N0MzOTAwNEExRThBIC8qIFRpbGVkQ29yZUFuaW1hdGlvbkRyYXdpbmdBcmVhLm1t
ICovLAogCQkJCTFDOEUyREFEMTI3OEM1QjIwMEJDN0JEMCAvKiBXZWJJbnNwZWN0b3JVSU1hYy5t
bSAqLywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TY3JvbGxpbmcvUmVt
b3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TY3Jv
bGxpbmcvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggY2Y1ZGNlZDNiNGM3NDJiYjA5MzZjZjNlOGUzYmVjNDNkMmQyMDE3MS4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dl
YlByb2Nlc3MvU2Nyb2xsaW5nL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmgKKysrIC9kZXYv
bnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElT
JycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JT
Ci0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0g
KiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAq
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIFJlbW90ZVNj
cm9sbGluZ0Nvb3JkaW5hdG9yX2gKLSNkZWZpbmUgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3Jf
aAotCi0jaWYgRU5BQkxFKEFTWU5DX1NDUk9MTElORykKLQotI2luY2x1ZGUgIk1lc3NhZ2VSZWNl
aXZlci5oIgotI2luY2x1ZGUgPFdlYkNvcmUvQXN5bmNTY3JvbGxpbmdDb29yZGluYXRvci5oPgot
I2luY2x1ZGUgPFdlYkNvcmUvU2Nyb2xsVHlwZXMuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1Njcm9s
bGluZ0NvbnN0cmFpbnRzLmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9UaW1lci5oPgotCi1uYW1lc3Bh
Y2UgSVBDIHsKLWNsYXNzIERlY29kZXI7Ci1jbGFzcyBFbmNvZGVyOwotfQotCi1uYW1lc3BhY2Ug
V2ViS2l0IHsKLQotY2xhc3MgV2ViUGFnZTsKLWNsYXNzIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5h
dG9yVHJhbnNhY3Rpb247Ci0KLWNsYXNzIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yIDogcHVi
bGljIFdlYkNvcmU6OkFzeW5jU2Nyb2xsaW5nQ29vcmRpbmF0b3IsIHB1YmxpYyBJUEM6Ok1lc3Nh
Z2VSZWNlaXZlciB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxSZW1vdGVTY3JvbGxpbmdDb29y
ZGluYXRvcj4gY3JlYXRlKFdlYlBhZ2UqIHBhZ2UpCi0gICAgewotICAgICAgICByZXR1cm4gYWRv
cHRSZWYoKm5ldyBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcihwYWdlKSk7Ci0gICAgfQotCi0g
ICAgdm9pZCBidWlsZFRyYW5zYWN0aW9uKFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yVHJhbnNh
Y3Rpb24mKTsKLQotcHJpdmF0ZToKLSAgICBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcihXZWJQ
YWdlKik7Ci0gICAgdmlydHVhbCB+UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IoKTsKLQotICAg
IGJvb2wgaXNSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0
dXJuIHRydWU7IH0KLSAgICAKLSAgICAvLyBTY3JvbGxpbmdDb29yZGluYXRvcgotICAgIGJvb2wg
Y29vcmRpbmF0ZXNTY3JvbGxpbmdGb3JGcmFtZVZpZXcoY29uc3QgV2ViQ29yZTo6RnJhbWVWaWV3
JikgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzY2hlZHVsZVRyZWVTdGF0ZUNvbW1pdCgpIG92
ZXJyaWRlOwotCi0gICAgYm9vbCBpc1J1YmJlckJhbmRJblByb2dyZXNzKCkgY29uc3Qgb3ZlcnJp
ZGU7Ci0gICAgdm9pZCBzZXRTY3JvbGxQaW5uaW5nQmVoYXZpb3IoV2ViQ29yZTo6U2Nyb2xsUGlu
bmluZ0JlaGF2aW9yKSBvdmVycmlkZTsKLSAgICBib29sIGlzU2Nyb2xsU25hcEluUHJvZ3Jlc3Mo
KSBjb25zdCBvdmVycmlkZTsKLQotICAgIC8vIElQQzo6TWVzc2FnZVJlY2VpdmVyCi0gICAgdm9p
ZCBkaWRSZWNlaXZlTWVzc2FnZShJUEM6OkNvbm5lY3Rpb24mLCBJUEM6OkRlY29kZXImKSBvdmVy
cmlkZTsKLSAgICAKLSAgICAvLyBSZXNwb25kIHRvIFVJIHByb2Nlc3MgY2hhbmdlcy4KLSAgICB2
b2lkIHNjcm9sbFBvc2l0aW9uQ2hhbmdlZEZvck5vZGUoV2ViQ29yZTo6U2Nyb2xsaW5nTm9kZUlE
LCBjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50JiBzY3JvbGxQb3NpdGlvbiwgYm9vbCBzeW5jTGF5
ZXJQb3NpdGlvbik7Ci0gICAgdm9pZCBjdXJyZW50U25hcFBvaW50SW5kaWNlc0NoYW5nZWRGb3JO
b2RlKFdlYkNvcmU6OlNjcm9sbGluZ05vZGVJRCwgdW5zaWduZWQgaG9yaXpvbnRhbCwgdW5zaWdu
ZWQgdmVydGljYWwpOwotCi0gICAgV2ViUGFnZSogbV93ZWJQYWdlOwotfTsKLQotfSAvLyBuYW1l
c3BhY2UgV2ViS2l0Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfU0NST0xMSU5HX0NPT1JESU5B
VE9SKFdlYktpdDo6UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IsIGlzUmVtb3RlU2Nyb2xsaW5n
Q29vcmRpbmF0b3IoKSk7Ci0KLSNlbmRpZiAvLyBFTkFCTEUoQVNZTkNfU0NST0xMSU5HKQotCi0j
ZW5kaWYgLy8gUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JfaApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9XZWJQcm9jZXNzL1Njcm9sbGluZy9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5t
ZXNzYWdlcy5pbiBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TY3JvbGxpbmcvUmVtb3RlU2Ny
b2xsaW5nQ29vcmRpbmF0b3IubWVzc2FnZXMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDJjMDk4YTEwOTcwMjM2N2MzODMzNzFlODhlNWE3NjFkNDVlMTk5YWQuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9j
ZXNzL1Njcm9sbGluZy9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdlcy5pbgorKysg
L2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Ci0jIGFyZSBtZXQ6Ci0jIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMg
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5E
Ci0jIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0jIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSMgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IKLSMgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTAotIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotIyBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUgotIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotIyBPUiBUT1JUIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQot
IyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgotCi0jaWYgRU5BQkxFKEFTWU5DX1NDUk9MTElORykKLQotbWVzc2FnZXMg
LT4gUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IgewotICAgIFNjcm9sbFBvc2l0aW9uQ2hhbmdl
ZEZvck5vZGUodWludDY0X3Qgbm9kZUlELCBXZWJDb3JlOjpGbG9hdFBvaW50IHNjcm9sbFBvc2l0
aW9uLCBib29sIHN5bmNMYXllclBvc2l0aW9uKTsKLSAgICBDdXJyZW50U25hcFBvaW50SW5kaWNl
c0NoYW5nZWRGb3JOb2RlKHVpbnQ2NF90IG5vZGVJRCwgdW5zaWduZWQgaG9yaXpvbnRhbCwgdW5z
aWduZWQgdmVydGljYWwpOwotfQotCi0jZW5kaWYgLy8gRU5BQkxFKEFTWU5DX1NDUk9MTElORykK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9TY3JvbGxpbmcvUmVtb3RlU2Ny
b2xsaW5nQ29vcmRpbmF0b3IubW0gYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvU2Nyb2xsaW5n
L1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCA4ODY0MTUyNWU1MmI5NzlkZTQwM2E2ZTZhNzEwMmNkM2EyNWQzMjUyLi4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9TY3JvbGxpbmcvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IubW0KKysrIC9kZXYvbnVs
bApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAot
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
Ci0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwot
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICog
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2ltcG9ydCAiY29uZmlnLmgi
Ci0jaW1wb3J0ICJSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5oIgotCi0jaWYgRU5BQkxFKEFT
WU5DX1NDUk9MTElORykKLQotI2ltcG9ydCAiQXJndW1lbnRDb2RlcnMuaCIKLSNpbXBvcnQgIkdy
YXBoaWNzTGF5ZXJDQVJlbW90ZS5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0Fy
ZWEuaCIKLSNpbXBvcnQgIlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yTWVzc2FnZXMuaCIKLSNp
bXBvcnQgIlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yVHJhbnNhY3Rpb24uaCIKLSNpbXBvcnQg
IldlYkNvcmVBcmd1bWVudENvZGVycy5oIgotI2ltcG9ydCAiV2ViUGFnZS5oIgotI2ltcG9ydCAi
V2ViUHJvY2Vzcy5oIgotI2ltcG9ydCA8V2ViQ29yZS9HcmFwaGljc0xheWVyLmg+Ci0jaW1wb3J0
IDxXZWJDb3JlL0ZyYW1lVmlldy5oPgotI2ltcG9ydCA8V2ViQ29yZS9GcmFtZS5oPgotI2ltcG9y
dCA8V2ViQ29yZS9SZW5kZXJMYXllckNvbXBvc2l0b3IuaD4KLSNpbXBvcnQgPFdlYkNvcmUvUmVu
ZGVyVmlldy5oPgotI2ltcG9ydCA8V2ViQ29yZS9TY3JvbGxpbmdUcmVlRml4ZWROb2RlLmg+Ci0j
aW1wb3J0IDxXZWJDb3JlL1Njcm9sbGluZ1RyZWVTdGlja3lOb2RlLmg+Ci0KLXVzaW5nIG5hbWVz
cGFjZSBXZWJDb3JlOwotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotUmVtb3RlU2Nyb2xsaW5nQ29v
cmRpbmF0b3I6OlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yKFdlYlBhZ2UqIHBhZ2UpCi0gICAg
OiBBc3luY1Njcm9sbGluZ0Nvb3JkaW5hdG9yKHBhZ2UtPmNvcmVQYWdlKCkpCi0gICAgLCBtX3dl
YlBhZ2UocGFnZSkKLXsKLSAgICBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5hZGRNZXNzYWdlUmVj
ZWl2ZXIoTWVzc2FnZXM6OlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yOjptZXNzYWdlUmVjZWl2
ZXJOYW1lKCksIG1fd2ViUGFnZS0+cGFnZUlEKCksICp0aGlzKTsKLX0KLQotUmVtb3RlU2Nyb2xs
aW5nQ29vcmRpbmF0b3I6On5SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcigpCi17Ci0gICAgV2Vi
UHJvY2Vzczo6c2luZ2xldG9uKCkucmVtb3ZlTWVzc2FnZVJlY2VpdmVyKE1lc3NhZ2VzOjpSZW1v
dGVTY3JvbGxpbmdDb29yZGluYXRvcjo6bWVzc2FnZVJlY2VpdmVyTmFtZSgpLCBtX3dlYlBhZ2Ut
PnBhZ2VJRCgpKTsKLX0KLQotdm9pZCBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcjo6c2NoZWR1
bGVUcmVlU3RhdGVDb21taXQoKQotewotICAgIG1fd2ViUGFnZS0+ZHJhd2luZ0FyZWEoKS0+c2No
ZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKTsKLX0KLQotYm9vbCBSZW1vdGVTY3JvbGxpbmdD
b29yZGluYXRvcjo6Y29vcmRpbmF0ZXNTY3JvbGxpbmdGb3JGcmFtZVZpZXcoY29uc3QgRnJhbWVW
aWV3JiBmcmFtZVZpZXcpIGNvbnN0Ci17Ci0gICAgUmVuZGVyVmlldyogcmVuZGVyVmlldyA9IGZy
YW1lVmlldy5yZW5kZXJWaWV3KCk7Ci0gICAgcmV0dXJuIHJlbmRlclZpZXcgJiYgcmVuZGVyVmll
dy0+dXNlc0NvbXBvc2l0aW5nKCk7Ci19Ci0KLWJvb2wgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0
b3I6OmlzUnViYmVyQmFuZEluUHJvZ3Jlc3MoKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBuZWVk
IHRvIG1haW50YWluIHN0YXRlIGluIHRoZSB3ZWIgcHJvY2Vzcz8KLSAgICByZXR1cm4gZmFsc2U7
Ci19Ci0KLWJvb2wgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I6OmlzU2Nyb2xsU25hcEluUHJv
Z3Jlc3MoKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBuZWVkIHRvIG1haW50YWluIHN0YXRlIGlu
IHRoZSB3ZWIgcHJvY2Vzcz8KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgUmVtb3RlU2Ny
b2xsaW5nQ29vcmRpbmF0b3I6OnNldFNjcm9sbFBpbm5pbmdCZWhhdmlvcihTY3JvbGxQaW5uaW5n
QmVoYXZpb3IpCi17Ci0gICAgLy8gRklYTUU6IHNlbmQgdG8gdGhlIFVJIHByb2Nlc3MuCi19Ci0K
LXZvaWQgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I6OmJ1aWxkVHJhbnNhY3Rpb24oUmVtb3Rl
U2Nyb2xsaW5nQ29vcmRpbmF0b3JUcmFuc2FjdGlvbiYgdHJhbnNhY3Rpb24pCi17Ci0gICAgd2ls
bENvbW1pdFRyZWUoKTsKLSAgICB0cmFuc2FjdGlvbi5zZXRTdGF0ZVRyZWVUb0VuY29kZShzY3Jv
bGxpbmdTdGF0ZVRyZWUoKS0+Y29tbWl0KExheWVyUmVwcmVzZW50YXRpb246OlBsYXRmb3JtTGF5
ZXJJRFJlcHJlc2VudGF0aW9uKSk7Ci19Ci0KLS8vIE5vdGlmaWNhdGlvbiBmcm9tIHRoZSBVSSBw
cm9jZXNzIHRoYXQgd2Ugc2Nyb2xsZWQuCi12b2lkIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9y
OjpzY3JvbGxQb3NpdGlvbkNoYW5nZWRGb3JOb2RlKFNjcm9sbGluZ05vZGVJRCBub2RlSUQsIGNv
bnN0IEZsb2F0UG9pbnQmIHNjcm9sbFBvc2l0aW9uLCBib29sIHN5bmNMYXllclBvc2l0aW9uKQot
ewotICAgIHNjaGVkdWxlVXBkYXRlU2Nyb2xsUG9zaXRpb25BZnRlckFzeW5jU2Nyb2xsKG5vZGVJ
RCwgc2Nyb2xsUG9zaXRpb24sIHN0ZDo6bnVsbG9wdCwgZmFsc2UgLyogRklYTUUgKi8sIHN5bmNM
YXllclBvc2l0aW9uID8gU2Nyb2xsaW5nTGF5ZXJQb3NpdGlvbkFjdGlvbjo6U3luYyA6IFNjcm9s
bGluZ0xheWVyUG9zaXRpb25BY3Rpb246OlNldCk7Ci19Ci0KLXZvaWQgUmVtb3RlU2Nyb2xsaW5n
Q29vcmRpbmF0b3I6OmN1cnJlbnRTbmFwUG9pbnRJbmRpY2VzQ2hhbmdlZEZvck5vZGUoU2Nyb2xs
aW5nTm9kZUlEIG5vZGVJRCwgdW5zaWduZWQgaG9yaXpvbnRhbCwgdW5zaWduZWQgdmVydGljYWwp
Ci17Ci0gICAgc2V0QWN0aXZlU2Nyb2xsU25hcEluZGljZXMobm9kZUlELCBob3Jpem9udGFsLCB2
ZXJ0aWNhbCk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdAotCi0jZW5kaWYgLy8gRU5BQkxF
KEFTWU5DX1NDUk9MTElORykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9X
ZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5oIGIvU291
cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvQ29jb2EvUmVtb3RlTGF5ZXJUcmVlRGlzcGxh
eVJlZnJlc2hNb25pdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjdmNWFh
MTdhMzA2MzhjMmJkMGIwODE0OGNjZmQwN2Q4NjhkYjAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2Uv
Q29jb2EvUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yLmgKKysrIC9kZXYvbnVs
bApAQCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICog
YXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaWYgVVNFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1F
X0RJU1BMQVlfTU9OSVRPUikKLQotI2luY2x1ZGUgIlJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVh
LmgiCi0jaW5jbHVkZSA8V2ViQ29yZS9EaXNwbGF5UmVmcmVzaE1vbml0b3IuaD4KLQotbmFtZXNw
YWNlIFdlYktpdCB7Ci0KLWNsYXNzIFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRv
ciA6IHB1YmxpYyBXZWJDb3JlOjpEaXNwbGF5UmVmcmVzaE1vbml0b3IgewotcHVibGljOgotICAg
IHN0YXRpYyBSZWY8UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yPiBjcmVhdGUo
V2ViQ29yZTo6UGxhdGZvcm1EaXNwbGF5SUQgZGlzcGxheUlELCBSZW1vdGVMYXllclRyZWVEcmF3
aW5nQXJlYSYgZHJhd2luZ0FyZWEpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5l
dyBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IoZGlzcGxheUlELCBkcmF3aW5n
QXJlYSkpOwotICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIH5SZW1vdGVMYXllclRyZWVEaXNwbGF5
UmVmcmVzaE1vbml0b3IoKTsKLQotICAgIGJvb2wgcmVxdWVzdFJlZnJlc2hDYWxsYmFjaygpIG92
ZXJyaWRlOwotCi0gICAgdm9pZCBkaWRVcGRhdGVMYXllcnMoKTsKLQotcHJpdmF0ZToKLSAgICBl
eHBsaWNpdCBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IoV2ViQ29yZTo6UGxh
dGZvcm1EaXNwbGF5SUQsIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhJik7Ci0KLSAgICBXZWFr
UHRyPFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhPiBtX2RyYXdpbmdBcmVhOwotfTsKLQotfQot
Ci0jZW5kaWYgLy8gVVNFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FX0RJU1BMQVlfTU9OSVRPUikK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90
ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5tbSBiL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9XZWJQYWdlL0NvY29hL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5t
bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyZDY1NzE1NTk4Zjc3NGFiZjllMzQ0
OTA3NTcxNjNjYzQ0NTA4Mi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9Db2NvYS9SZW1vdGVMYXll
clRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IubW0KKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCww
IEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCi0g
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAotICovCi0KLSNpbXBv
cnQgImNvbmZpZy5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25p
dG9yLmgiCi0KLSNpZiBVU0UoUkVRVUVTVF9BTklNQVRJT05fRlJBTUVfRElTUExBWV9NT05JVE9S
KQotCi0jaW1wb3J0IDx3dGYvQ3VycmVudFRpbWUuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNv
cmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1SZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVz
aE1vbml0b3I6OlJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcihQbGF0Zm9ybURp
c3BsYXlJRCBkaXNwbGF5SUQsIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhJiBkcmF3aW5nQXJl
YSkKLSAgICA6IERpc3BsYXlSZWZyZXNoTW9uaXRvcihkaXNwbGF5SUQpCi0gICAgLCBtX2RyYXdp
bmdBcmVhKGRyYXdpbmdBcmVhLmNyZWF0ZVdlYWtQdHIoKSkKLXsKLX0KLQotUmVtb3RlTGF5ZXJU
cmVlRGlzcGxheVJlZnJlc2hNb25pdG9yOjp+UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hN
b25pdG9yKCkKLXsKLSAgICBpZiAobV9kcmF3aW5nQXJlYSkKLSAgICAgICAgbV9kcmF3aW5nQXJl
YS0+d2lsbERlc3Ryb3lEaXNwbGF5UmVmcmVzaE1vbml0b3IodGhpcyk7Ci19Ci0KLWJvb2wgUmVt
b3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yOjpyZXF1ZXN0UmVmcmVzaENhbGxiYWNr
KCkKLXsKLSAgICBpZiAoIW1fZHJhd2luZ0FyZWEgfHwgIWlzQWN0aXZlKCkpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIGlmICghaXNTY2hlZHVsZWQoKSkKLSAgICAgICAgc3RhdGljX2Nh
c3Q8RHJhd2luZ0FyZWEmPigqbV9kcmF3aW5nQXJlYS5nZXQoKSkuc2NoZWR1bGVDb21wb3NpdGlu
Z0xheWVyRmx1c2goKTsKLQotICAgIHNldElzQWN0aXZlKHRydWUpOwotICAgIHNldElzU2NoZWR1
bGVkKHRydWUpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURp
c3BsYXlSZWZyZXNoTW9uaXRvcjo6ZGlkVXBkYXRlTGF5ZXJzKCkKLXsKLSAgICBzZXRJc1NjaGVk
dWxlZChmYWxzZSk7Ci0KLSAgICBpZiAoIWlzUHJldmlvdXNGcmFtZURvbmUoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgc2V0SXNQcmV2aW91c0ZyYW1lRG9uZShmYWxzZSk7Ci0gICAgaGFuZGxl
RGlzcGxheVJlZnJlc2hlZE5vdGlmaWNhdGlvbk9uTWFpblRocmVhZCh0aGlzKTsKLX0KLQotfQot
Ci0jZW5kaWYgLy8gVVNFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1FX0RJU1BMQVlfTU9OSVRPUikK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVy
VHJlZS9HcmFwaGljc0xheWVyQ0FSZW1vdGUuY3BwIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNz
L1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5jcHAKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uMmRmNDJlOTQ3MzBmMTYzODNmOWI1YTczMmU4Mjk2Y2I1YzFhMjVmMAotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJl
ZS9HcmFwaGljc0xheWVyQ0FSZW1vdGUuY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiR3JhcGhpY3NMYXllckNBUmVtb3RlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ0FMYXllclJlbW90ZS5oIgorI2lu
Y2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1TY3JlZW4uaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNv
cmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitHcmFwaGljc0xheWVyQ0FSZW1vdGU6On5HcmFw
aGljc0xheWVyQ0FSZW1vdGUoKQoreworfQorCitib29sIEdyYXBoaWNzTGF5ZXJDQVJlbW90ZTo6
ZmlsdGVyc0NhbkJlQ29tcG9zaXRlZChjb25zdCBGaWx0ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKQor
eworICAgIHJldHVybiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmZpbHRlcnNDYW5CZUNvbXBvc2l0
ZWQoZmlsdGVycyk7Cit9CisKK1JlZjxQbGF0Zm9ybUNBTGF5ZXI+IEdyYXBoaWNzTGF5ZXJDQVJl
bW90ZTo6Y3JlYXRlUGxhdGZvcm1DQUxheWVyKFBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlIGxh
eWVyVHlwZSwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikKK3sKKyAgICBhdXRvIHJlc3Vs
dCA9IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y3JlYXRlKGxheWVyVHlwZSwgb3duZXIsIG1fY29u
dGV4dCk7CisKKyAgICBpZiAocmVzdWx0LT5jYW5IYXZlQmFja2luZ1N0b3JlKCkpCisgICAgICAg
IHJlc3VsdC0+c2V0V2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUoc2NyZWVuU3VwcG9ydHNFeHRl
bmRlZENvbG9yKCkpOworCisgICAgcmV0dXJuIFdURk1vdmUocmVzdWx0KTsKK30KKworUmVmPFBs
YXRmb3JtQ0FMYXllcj4gR3JhcGhpY3NMYXllckNBUmVtb3RlOjpjcmVhdGVQbGF0Zm9ybUNBTGF5
ZXIoUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllciwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBv
d25lcikKK3sKKyAgICByZXR1cm4gUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjcmVhdGUocGxhdGZv
cm1MYXllciwgb3duZXIsIG1fY29udGV4dCk7Cit9CisKK1JlZjxQbGF0Zm9ybUNBQW5pbWF0aW9u
PiBHcmFwaGljc0xheWVyQ0FSZW1vdGU6OmNyZWF0ZVBsYXRmb3JtQ0FBbmltYXRpb24oUGxhdGZv
cm1DQUFuaW1hdGlvbjo6QW5pbWF0aW9uVHlwZSB0eXBlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgp
Cit7CisgICAgcmV0dXJuIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNyZWF0ZSh0eXBlLCBr
ZXlQYXRoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvR3JhcGhpY3NMYXllckNB
UmVtb3RlLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRy
ZWUvR3JhcGhpY3NMYXllckNBUmVtb3RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZTRhOTI1N2E2OWFiMmFlZmQx
ZWE4NmQwYzhiYzU2Yzg1Njc4YTc2YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9HcmFwaGljc0xheWVyQ0FSZW1vdGUu
aApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxXZWJDb3JlL0dyYXBoaWNzTGF5ZXJD
QS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1MYXllci5oPgorCituYW1lc3BhY2UgV2Vi
S2l0IHsKKworY2xhc3MgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDsKKworY2xhc3MgR3JhcGhpY3NM
YXllckNBUmVtb3RlIGZpbmFsIDogcHVibGljIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDQSB7Citw
dWJsaWM6CisgICAgR3JhcGhpY3NMYXllckNBUmVtb3RlKFR5cGUgbGF5ZXJUeXBlLCBXZWJDb3Jl
OjpHcmFwaGljc0xheWVyQ2xpZW50JiBjbGllbnQsIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmIGNv
bnRleHQpCisgICAgICAgIDogR3JhcGhpY3NMYXllckNBKGxheWVyVHlwZSwgY2xpZW50KQorICAg
ICAgICAsIG1fY29udGV4dChjb250ZXh0KQorICAgIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5H
cmFwaGljc0xheWVyQ0FSZW1vdGUoKTsKKworICAgIGJvb2wgZmlsdGVyc0NhbkJlQ29tcG9zaXRl
ZChjb25zdCBXZWJDb3JlOjpGaWx0ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKSBvdmVycmlkZTsKKwor
cHJpdmF0ZToKKyAgICBib29sIGlzR3JhcGhpY3NMYXllckNBUmVtb3RlKCkgY29uc3Qgb3ZlcnJp
ZGUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgUmVmPFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcj4g
Y3JlYXRlUGxhdGZvcm1DQUxheWVyKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBl
LCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyKSBvdmVycmlkZTsKKyAgICBS
ZWY8V2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyPiBjcmVhdGVQbGF0Zm9ybUNBTGF5ZXIoUGxhdGZv
cm1MYXllciosIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIpIG92ZXJyaWRl
OworICAgIFJlZjxXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uPiBjcmVhdGVQbGF0Zm9ybUNB
QW5pbWF0aW9uKFdlYkNvcmU6OlBsYXRmb3JtQ0FBbmltYXRpb246OkFuaW1hdGlvblR5cGUsIGNv
bnN0IFN0cmluZyYga2V5UGF0aCkgb3ZlcnJpZGU7CisKKyAgICAvLyBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGUgY2FuJ3QgY3VycmVudGx5IHByb3h5IGRpcmVjdGx5IGNvbXBvc2l0ZWQgaW1hZ2UgY29u
dGVudHMsIHNvIG9wdCBvdXQgb2YgdGhpcyBvcHRpbWl6YXRpb24uCisgICAgYm9vbCBzaG91bGRE
aXJlY3RseUNvbXBvc2l0ZUltYWdlKFdlYkNvcmU6OkltYWdlKikgY29uc3Qgb3ZlcnJpZGUgeyBy
ZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBtX2NvbnRl
eHQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworU1BFQ0lBTElaRV9UWVBFX1RSQUlU
U19HUkFQSElDU0xBWUVSKFdlYktpdDo6R3JhcGhpY3NMYXllckNBUmVtb3RlLCBpc0dyYXBoaWNz
TGF5ZXJDQVJlbW90ZSgpKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dl
YlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUuaCBiL1NvdXJj
ZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBQW5p
bWF0aW9uUmVtb3RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzJkNjhkZTg1MjQxYTMyZTU4MjFkOGU3ZjNiY2Qw
ZGU3MzVhODc5ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9X
ZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLmgKQEAgLTAs
MCArMSwzMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaWZuZGVmIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGVfaAorI2RlZmluZSBQbGF0Zm9ybUNB
QW5pbWF0aW9uUmVtb3RlX2gKKworI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1DQUFuaW1hdGlv
bi5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4K
KworbmFtZXNwYWNlIElQQyB7CitjbGFzcyBFbmNvZGVyOworY2xhc3MgRGVjb2RlcjsKK307CisK
K25hbWVzcGFjZSBXVEYgeworY2xhc3MgVGV4dFN0cmVhbTsKK307CisKK09CSkNfQ0xBU1MgQ0FM
YXllcjsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFJlbW90ZUxheWVyVHJlZUhvc3Q7
CisKK2NsYXNzIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUgZmluYWwgOiBwdWJsaWMgV2ViQ29y
ZTo6UGxhdGZvcm1DQUFuaW1hdGlvbiB7CitwdWJsaWM6CisgICAgc3RhdGljIFJlZjxQbGF0Zm9y
bUNBQW5pbWF0aW9uPiBjcmVhdGUoQW5pbWF0aW9uVHlwZSwgY29uc3QgU3RyaW5nJiBrZXlQYXRo
KTsKKworICAgIHZpcnR1YWwgflBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUoKSB7IH0KKworICAg
IGJvb2wgaXNQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1
cm4gdHJ1ZTsgfQorCisgICAgUmVmPFBsYXRmb3JtQ0FBbmltYXRpb24+IGNvcHkoKSBjb25zdCBv
dmVycmlkZTsKKworICAgIFN0cmluZyBrZXlQYXRoKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBD
RlRpbWVJbnRlcnZhbCBiZWdpblRpbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldEJl
Z2luVGltZShDRlRpbWVJbnRlcnZhbCkgb3ZlcnJpZGU7CisKKyAgICBDRlRpbWVJbnRlcnZhbCBk
dXJhdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0RHVyYXRpb24oQ0ZUaW1lSW50
ZXJ2YWwpIG92ZXJyaWRlOworCisgICAgZmxvYXQgc3BlZWQoKSBjb25zdCBvdmVycmlkZTsKKyAg
ICB2b2lkIHNldFNwZWVkKGZsb2F0KSBvdmVycmlkZTsKKworICAgIENGVGltZUludGVydmFsIHRp
bWVPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFRpbWVPZmZzZXQoQ0ZUaW1l
SW50ZXJ2YWwpIG92ZXJyaWRlOworCisgICAgZmxvYXQgcmVwZWF0Q291bnQoKSBjb25zdCBvdmVy
cmlkZTsKKyAgICB2b2lkIHNldFJlcGVhdENvdW50KGZsb2F0KSBvdmVycmlkZTsKKworICAgIGJv
b2wgYXV0b3JldmVyc2VzKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRBdXRvcmV2ZXJz
ZXMoYm9vbCkgb3ZlcnJpZGU7CisKKyAgICBGaWxsTW9kZVR5cGUgZmlsbE1vZGUoKSBjb25zdCBv
dmVycmlkZTsKKyAgICB2b2lkIHNldEZpbGxNb2RlKEZpbGxNb2RlVHlwZSkgb3ZlcnJpZGU7CisK
KyAgICB2b2lkIHNldFRpbWluZ0Z1bmN0aW9uKGNvbnN0IFdlYkNvcmU6OlRpbWluZ0Z1bmN0aW9u
KiwgYm9vbCByZXZlcnNlID0gZmFsc2UpIG92ZXJyaWRlOworICAgIHZvaWQgY29weVRpbWluZ0Z1
bmN0aW9uRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uJikgb3ZlcnJpZGU7
CisKKyAgICBib29sIGlzUmVtb3ZlZE9uQ29tcGxldGlvbigpIGNvbnN0IG92ZXJyaWRlOworICAg
IHZvaWQgc2V0UmVtb3ZlZE9uQ29tcGxldGlvbihib29sKSBvdmVycmlkZTsKKworICAgIGJvb2wg
aXNBZGRpdGl2ZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0QWRkaXRpdmUoYm9vbCkg
b3ZlcnJpZGU7CisKKyAgICBWYWx1ZUZ1bmN0aW9uVHlwZSB2YWx1ZUZ1bmN0aW9uKCkgY29uc3Qg
b3ZlcnJpZGU7CisgICAgdm9pZCBzZXRWYWx1ZUZ1bmN0aW9uKFZhbHVlRnVuY3Rpb25UeXBlKSBv
dmVycmlkZTsKKworICAgIC8vIEJhc2ljLWFuaW1hdGlvbiBwcm9wZXJ0aWVzLgorICAgIHZvaWQg
c2V0RnJvbVZhbHVlKGZsb2F0KSBvdmVycmlkZTsKKyAgICB2b2lkIHNldEZyb21WYWx1ZShjb25z
dCBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCYpIG92ZXJyaWRlOworICAgIHZvaWQgc2V0
RnJvbVZhbHVlKGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQzRCYpIG92ZXJyaWRlOworICAgIHZv
aWQgc2V0RnJvbVZhbHVlKGNvbnN0IFdlYkNvcmU6OkNvbG9yJikgb3ZlcnJpZGU7CisgICAgdm9p
ZCBzZXRGcm9tVmFsdWUoY29uc3QgV2ViQ29yZTo6RmlsdGVyT3BlcmF0aW9uKiwgaW50IGludGVy
bmFsRmlsdGVyUHJvcGVydHlJbmRleCkgb3ZlcnJpZGU7CisgICAgdm9pZCBjb3B5RnJvbVZhbHVl
RnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uJikgb3ZlcnJpZGU7CisKKyAg
ICB2b2lkIHNldFRvVmFsdWUoZmxvYXQpIG92ZXJyaWRlOworICAgIHZvaWQgc2V0VG9WYWx1ZShj
b25zdCBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCYpIG92ZXJyaWRlOworICAgIHZvaWQg
c2V0VG9WYWx1ZShjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50M0QmKSBvdmVycmlkZTsKKyAgICB2
b2lkIHNldFRvVmFsdWUoY29uc3QgV2ViQ29yZTo6Q29sb3ImKSBvdmVycmlkZTsKKyAgICB2b2lk
IHNldFRvVmFsdWUoY29uc3QgV2ViQ29yZTo6RmlsdGVyT3BlcmF0aW9uKiwgaW50IGludGVybmFs
RmlsdGVyUHJvcGVydHlJbmRleCkgb3ZlcnJpZGU7CisgICAgdm9pZCBjb3B5VG9WYWx1ZUZyb20o
Y29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbiYpIG92ZXJyaWRlOworCisgICAgLy8g
S2V5ZnJhbWUtYW5pbWF0aW9uIHByb3BlcnRpZXMuCisgICAgdm9pZCBzZXRWYWx1ZXMoY29uc3Qg
VmVjdG9yPGZsb2F0PiYpIG92ZXJyaWRlOworICAgIHZvaWQgc2V0VmFsdWVzKGNvbnN0IFZlY3Rv
cjxXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeD4mKSBvdmVycmlkZTsKKyAgICB2b2lkIHNl
dFZhbHVlcyhjb25zdCBWZWN0b3I8V2ViQ29yZTo6RmxvYXRQb2ludDNEPiYpIG92ZXJyaWRlOwor
ICAgIHZvaWQgc2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpDb2xvcj4mKSBvdmVycmlk
ZTsKKyAgICB2b2lkIHNldFZhbHVlcyhjb25zdCBWZWN0b3I8UmVmUHRyPFdlYkNvcmU6OkZpbHRl
ck9wZXJhdGlvbj4+JiwgaW50IGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCkgb3ZlcnJpZGU7
CisgICAgdm9pZCBjb3B5VmFsdWVzRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0
aW9uJikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldEtleVRpbWVzKGNvbnN0IFZlY3RvcjxmbG9h
dD4mKSBvdmVycmlkZTsKKyAgICB2b2lkIGNvcHlLZXlUaW1lc0Zyb20oY29uc3QgV2ViQ29yZTo6
UGxhdGZvcm1DQUFuaW1hdGlvbiYpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRUaW1pbmdGdW5j
dGlvbnMoY29uc3QgVmVjdG9yPGNvbnN0IFdlYkNvcmU6OlRpbWluZ0Z1bmN0aW9uKj4mLCBib29s
IHJldmVyc2UgPSBmYWxzZSkgb3ZlcnJpZGU7CisgICAgdm9pZCBjb3B5VGltaW5nRnVuY3Rpb25z
RnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uJikgb3ZlcnJpZGU7CisKKyAg
ICBBbmltYXRpb25UeXBlIGFuaW1hdGlvblR5cGUoKSBjb25zdCB7IHJldHVybiBtX3Byb3BlcnRp
ZXMuYW5pbWF0aW9uVHlwZTsgfQorICAgIHZvaWQgc2V0SGFzRXhwbGljaXRCZWdpblRpbWUoYm9v
bCBoYXNFeHBsaWNpdEJlZ2luVGltZSkgeyBtX3Byb3BlcnRpZXMuaGFzRXhwbGljaXRCZWdpblRp
bWUgPSBoYXNFeHBsaWNpdEJlZ2luVGltZTsgfQorICAgIGJvb2wgaGFzRXhwbGljaXRCZWdpblRp
bWUoKSBjb25zdCB7IHJldHVybiBtX3Byb3BlcnRpZXMuaGFzRXhwbGljaXRCZWdpblRpbWU7IH0K
KworICAgIHZvaWQgZGlkU3RhcnQoQ0ZUaW1lSW50ZXJ2YWwgYmVnaW5UaW1lKSB7IG1fcHJvcGVy
dGllcy5iZWdpblRpbWUgPSBiZWdpblRpbWU7IH0KKworICAgIGNsYXNzIEtleWZyYW1lVmFsdWUg
eworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBLZXlmcmFtZVR5cGUgeworICAgICAgICAgICAg
TnVtYmVyS2V5VHlwZSwKKyAgICAgICAgICAgIENvbG9yS2V5VHlwZSwKKyAgICAgICAgICAgIFBv
aW50S2V5VHlwZSwKKyAgICAgICAgICAgIFRyYW5zZm9ybUtleVR5cGUsCisgICAgICAgICAgICBG
aWx0ZXJLZXlUeXBlLAorICAgICAgICB9OworCisgICAgICAgIH5LZXlmcmFtZVZhbHVlKCkKKyAg
ICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgS2V5ZnJhbWVWYWx1ZShmbG9hdCB2YWx1ZSA9
IDApCisgICAgICAgICAgICA6IGtleVR5cGUoTnVtYmVyS2V5VHlwZSkKKyAgICAgICAgICAgICwg
bnVtYmVyKHZhbHVlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBLZXlmcmFtZVZh
bHVlKFdlYkNvcmU6OkNvbG9yIHZhbHVlKQorICAgICAgICAgICAgOiBrZXlUeXBlKENvbG9yS2V5
VHlwZSkKKyAgICAgICAgICAgICwgY29sb3IodmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgfQor
CisgICAgICAgIEtleWZyYW1lVmFsdWUoY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludDNEJiB2YWx1
ZSkKKyAgICAgICAgICAgIDoga2V5VHlwZShQb2ludEtleVR5cGUpCisgICAgICAgICAgICAsIHBv
aW50KHZhbHVlKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBLZXlmcmFtZVZhbHVl
KGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4JiB2YWx1ZSkKKyAgICAgICAgICAg
IDoga2V5VHlwZShUcmFuc2Zvcm1LZXlUeXBlKQorICAgICAgICAgICAgLCB0cmFuc2Zvcm0odmFs
dWUpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEtleWZyYW1lVmFsdWUoUmVmUHRy
PFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbj4mJiB2YWx1ZSkKKyAgICAgICAgICAgIDoga2V5VHlw
ZShGaWx0ZXJLZXlUeXBlKQorICAgICAgICAgICAgLCBmaWx0ZXIoV1RGTW92ZSh2YWx1ZSkpCisg
ICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEtleWZyYW1lVmFsdWUoY29uc3QgS2V5ZnJh
bWVWYWx1ZSYgb3RoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgICp0aGlzID0gb3RoZXI7Cisg
ICAgICAgIH0KKworICAgICAgICBLZXlmcmFtZVZhbHVlJiBvcGVyYXRvcj0oY29uc3QgS2V5ZnJh
bWVWYWx1ZSYgb3RoZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGtleVR5cGUgPSBvdGhlci5r
ZXlUeXBlOworICAgICAgICAgICAgc3dpdGNoIChrZXlUeXBlKSB7CisgICAgICAgICAgICBjYXNl
IE51bWJlcktleVR5cGU6CisgICAgICAgICAgICAgICAgbnVtYmVyID0gb3RoZXIubnVtYmVyOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDb2xvcktleVR5cGU6Cisg
ICAgICAgICAgICAgICAgY29sb3IgPSBvdGhlci5jb2xvcjsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIGNhc2UgUG9pbnRLZXlUeXBlOgorICAgICAgICAgICAgICAgIHBvaW50
ID0gb3RoZXIucG9pbnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNl
IFRyYW5zZm9ybUtleVR5cGU6CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gb3RoZXIudHJh
bnNmb3JtOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGaWx0ZXJL
ZXlUeXBlOgorICAgICAgICAgICAgICAgIGZpbHRlciA9IG90aGVyLmZpbHRlcjsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICp0aGlz
OworICAgICAgICB9CisKKyAgICAgICAgS2V5ZnJhbWVUeXBlIGtleWZyYW1lVHlwZSgpIGNvbnN0
IHsgcmV0dXJuIGtleVR5cGU7IH0KKworICAgICAgICBmbG9hdCBudW1iZXJWYWx1ZSgpIGNvbnN0
CisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChrZXlUeXBlID09IE51bWJlcktleVR5cGUp
OworICAgICAgICAgICAgcmV0dXJuIG51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIFdlYkNv
cmU6OkNvbG9yIGNvbG9yVmFsdWUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBBU1NF
UlQoa2V5VHlwZSA9PSBDb2xvcktleVR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGNvbG9yOwor
ICAgICAgICB9CisKKyAgICAgICAgY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludDNEJiBwb2ludFZh
bHVlKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKGtleVR5cGUgPT0gUG9p
bnRLZXlUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBwb2ludDsKKyAgICAgICAgfQorCisgICAg
ICAgIGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm1WYWx1ZSgp
IGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChrZXlUeXBlID09IFRyYW5zZm9y
bUtleVR5cGUpOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybTsKKyAgICAgICAgfQorCisg
ICAgICAgIGNvbnN0IFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbiogZmlsdGVyVmFsdWUoKSBjb25z
dAorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoa2V5VHlwZSA9PSBGaWx0ZXJLZXlUeXBl
KTsKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXIuZ2V0KCk7CisgICAgICAgIH0KKworICAgICAg
ICB2b2lkIGVuY29kZShJUEM6OkVuY29kZXImKSBjb25zdDsKKyAgICAgICAgc3RhdGljIGJvb2wg
ZGVjb2RlKElQQzo6RGVjb2RlciYsIEtleWZyYW1lVmFsdWUmKTsKKworICAgIHByaXZhdGU6Cisg
ICAgICAgIEtleWZyYW1lVHlwZSBrZXlUeXBlOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAg
ICBmbG9hdCBudW1iZXI7CisgICAgICAgICAgICBXZWJDb3JlOjpDb2xvciBjb2xvcjsKKyAgICAg
ICAgICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQzRCBwb2ludDsKKyAgICAgICAgICAgIFdlYkNvcmU6
OlRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybTsKKyAgICAgICAgfTsKKyAgICAgICAgUmVm
UHRyPFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbj4gZmlsdGVyOworICAgIH07CisKKyAgICBzdHJ1
Y3QgUHJvcGVydGllcyB7CisgICAgICAgIFByb3BlcnRpZXMoKQorICAgICAgICAgICAgOiBhbmlt
YXRpb25UeXBlKEJhc2ljKQorICAgICAgICAgICAgLCBiZWdpblRpbWUoMCkKKyAgICAgICAgICAg
ICwgZHVyYXRpb24oMCkKKyAgICAgICAgICAgICwgdGltZU9mZnNldCgwKQorICAgICAgICAgICAg
LCByZXBlYXRDb3VudCgxKQorICAgICAgICAgICAgLCBzcGVlZCgxKQorICAgICAgICAgICAgLCBm
aWxsTW9kZShOb0ZpbGxNb2RlKQorICAgICAgICAgICAgLCB2YWx1ZUZ1bmN0aW9uKE5vVmFsdWVG
dW5jdGlvbikKKyAgICAgICAgICAgICwgYXV0b1JldmVyc2VzKGZhbHNlKQorICAgICAgICAgICAg
LCByZW1vdmVkT25Db21wbGV0aW9uKHRydWUpCisgICAgICAgICAgICAsIGFkZGl0aXZlKGZhbHNl
KQorICAgICAgICAgICAgLCByZXZlcnNlVGltaW5nRnVuY3Rpb25zKGZhbHNlKQorICAgICAgICAg
ICAgLCBoYXNFeHBsaWNpdEJlZ2luVGltZShmYWxzZSkKKyAgICAgICAgeworICAgICAgICB9CisK
KyAgICAgICAgdm9pZCBlbmNvZGUoSVBDOjpFbmNvZGVyJikgY29uc3Q7CisgICAgICAgIHN0YXRp
YyBib29sIGRlY29kZShJUEM6OkRlY29kZXImLCBQcm9wZXJ0aWVzJik7CisKKyAgICAgICAgU3Ry
aW5nIGtleVBhdGg7CisgICAgICAgIFBsYXRmb3JtQ0FBbmltYXRpb246OkFuaW1hdGlvblR5cGUg
YW5pbWF0aW9uVHlwZTsKKworICAgICAgICBkb3VibGUgYmVnaW5UaW1lOworICAgICAgICBkb3Vi
bGUgZHVyYXRpb247CisgICAgICAgIGRvdWJsZSB0aW1lT2Zmc2V0OworICAgICAgICBmbG9hdCBy
ZXBlYXRDb3VudDsKKyAgICAgICAgZmxvYXQgc3BlZWQ7CisKKyAgICAgICAgUGxhdGZvcm1DQUFu
aW1hdGlvbjo6RmlsbE1vZGVUeXBlIGZpbGxNb2RlOworICAgICAgICBQbGF0Zm9ybUNBQW5pbWF0
aW9uOjpWYWx1ZUZ1bmN0aW9uVHlwZSB2YWx1ZUZ1bmN0aW9uOworCisgICAgICAgIGJvb2wgYXV0
b1JldmVyc2VzOworICAgICAgICBib29sIHJlbW92ZWRPbkNvbXBsZXRpb247CisgICAgICAgIGJv
b2wgYWRkaXRpdmU7CisgICAgICAgIGJvb2wgcmV2ZXJzZVRpbWluZ0Z1bmN0aW9uczsKKyAgICAg
ICAgYm9vbCBoYXNFeHBsaWNpdEJlZ2luVGltZTsKKworICAgICAgICAvLyBGb3IgYmFzaWMgYW5p
bWF0aW9ucywgdGhlc2UgdmVjdG9ycyBoYXZlIHR3byBlbnRyaWVzLiBGb3Iga2V5ZnJhbWUgYW5p
bWF0aW9ucywgdHdvIG9yIG1vcmUuCisgICAgICAgIC8vIHRpbWluZ0Z1bmN0aW9ucyBoYXMgbi0x
IGVudHJpZXMuCisgICAgICAgIFZlY3RvcjxLZXlmcmFtZVZhbHVlPiBrZXlWYWx1ZXM7CisgICAg
ICAgIFZlY3RvcjxmbG9hdD4ga2V5VGltZXM7CisgICAgICAgIFZlY3RvcjxSZWZQdHI8V2ViQ29y
ZTo6VGltaW5nRnVuY3Rpb24+PiB0aW1pbmdGdW5jdGlvbnM7CisgICAgfTsKKworICAgIGNvbnN0
IFByb3BlcnRpZXMmIHByb3BlcnRpZXMoKSBjb25zdCB7IHJldHVybiBtX3Byb3BlcnRpZXM7IH0K
KworICAgIHR5cGVkZWYgVmVjdG9yPHN0ZDo6cGFpcjxTdHJpbmcsIFByb3BlcnRpZXM+PiBBbmlt
YXRpb25zTGlzdDsKKyAgICBzdGF0aWMgdm9pZCB1cGRhdGVMYXllckFuaW1hdGlvbnMoQ0FMYXll
ciAqLCBSZW1vdGVMYXllclRyZWVIb3N0KiwgY29uc3QgQW5pbWF0aW9uc0xpc3QmIGFuaW1hdGlv
bnNUb0FkZCwgY29uc3QgSGFzaFNldDxTdHJpbmc+JiBhbmltYXRpb25zVG9SZW1vdmUpOworCitw
cml2YXRlOgorICAgIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUoQW5pbWF0aW9uVHlwZSwgY29u
c3QgU3RyaW5nJiBrZXlQYXRoKTsKKworICAgIFByb3BlcnRpZXMgbV9wcm9wZXJ0aWVzOworfTsK
KworV1RGOjpUZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFdURjo6VGV4dFN0cmVhbSYsIGNvbnN0IFBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWUmKTsKK1dURjo6VGV4dFN0cmVh
bSYgb3BlcmF0b3I8PChXVEY6OlRleHRTdHJlYW0mLCBjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlOjpQcm9wZXJ0aWVzJik7CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCitTUEVDSUFM
SVpFX1RZUEVfVFJBSVRTX0NBQU5JTUFUSU9OKFdlYktpdDo6UGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZSwgaXNQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlKCkpCisKKyNlbmRpZiAvLyBQbGF0Zm9y
bUNBQW5pbWF0aW9uUmVtb3RlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLm1tIGIv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3Jt
Q0FBbmltYXRpb25SZW1vdGUubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDZlMjczYzNhNzE5ZTY5MTAwZDE1ZjVh
MzFhMWEyZDQ1ZmY2ZmY0MgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLm1t
CkBAIC0wLDAgKzEsOTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2ltcG9ydCAiUGxhdGZvcm1DQUFuaW1hdGlv
blJlbW90ZS5oIgorCisjaW1wb3J0ICJBcmd1bWVudENvZGVycy5oIgorI2ltcG9ydCAiUmVtb3Rl
TGF5ZXJUcmVlSG9zdC5oIgorI2ltcG9ydCAiV2ViQ29yZUFyZ3VtZW50Q29kZXJzLmgiCisjaW1w
b3J0IDxRdWFydHpDb3JlL1F1YXJ0ekNvcmUuaD4KKyNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NM
YXllci5oPgorI2ltcG9ydCA8V2ViQ29yZS9QbGF0Zm9ybUNBQW5pbWF0aW9uQ29jb2EuaD4KKyNp
bXBvcnQgPFdlYkNvcmUvUGxhdGZvcm1DQUZpbHRlcnMuaD4KKyNpbXBvcnQgPFdlYkNvcmUvVGlt
aW5nRnVuY3Rpb24uaD4KKyNpbXBvcnQgPHBhbC9zcGkvY29jb2EvUXVhcnR6Q29yZVNQSS5oPgor
I2ltcG9ydCA8d3RmL0Jsb2NrT2JqQ0V4Y2VwdGlvbnMuaD4KKyNpbXBvcnQgPHd0Zi9DdXJyZW50
VGltZS5oPgorI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgorI2ltcG9ydCA8d3RmL3RleHQvVGV4
dFN0cmVhbS5oPgorCit1c2luZyBuYW1lc3BhY2UgV1RGOwordXNpbmcgbmFtZXNwYWNlIFdlYkNv
cmU7CisKK3N0YXRpYyBkb3VibGUgbWVkaWFUaW1lVG9DdXJyZW50VGltZShDRlRpbWVJbnRlcnZh
bCB0KQoreworICAgIHJldHVybiBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKSArIHQgLSBD
QUN1cnJlbnRNZWRpYVRpbWUoKTsKK30KKworc3RhdGljIE5TU3RyaW5nICogY29uc3QgV0tFeHBs
aWNpdEJlZ2luVGltZUZsYWcgPSBAIldLUGxhdGZvcm1DQUFuaW1hdGlvbkV4cGxpY2l0QmVnaW5U
aW1lRmxhZyI7CisKK0BpbnRlcmZhY2UgV0tBbmltYXRpb25EZWxlZ2F0ZSA6IE5TT2JqZWN0IDxD
QUFuaW1hdGlvbkRlbGVnYXRlPiB7CisgICAgR3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklE
IF9sYXllcklEOworICAgIFdlYktpdDo6UmVtb3RlTGF5ZXJUcmVlSG9zdCogX2xheWVyVHJlZUhv
c3Q7Cit9CisKKy0gKGluc3RhbmNldHlwZSlpbml0V2l0aExheWVySUQ6KEdyYXBoaWNzTGF5ZXI6
OlBsYXRmb3JtTGF5ZXJJRClsYXllcklEIGxheWVyVHJlZUhvc3Q6KFdlYktpdDo6UmVtb3RlTGF5
ZXJUcmVlSG9zdCopbGF5ZXJUcmVlSG9zdDsKKy0gKHZvaWQpaW52YWxpZGF0ZTsKK0BlbmQKKwor
QGltcGxlbWVudGF0aW9uIFdLQW5pbWF0aW9uRGVsZWdhdGUKKworLSAoaW5zdGFuY2V0eXBlKWlu
aXRXaXRoTGF5ZXJJRDooR3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklEKWxheWVySUQgbGF5
ZXJUcmVlSG9zdDooV2ViS2l0OjpSZW1vdGVMYXllclRyZWVIb3N0KilsYXllclRyZWVIb3N0Cit7
CisgICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSkgeworICAgICAgICBfbGF5ZXJJRCA9IGxh
eWVySUQ7CisgICAgICAgIF9sYXllclRyZWVIb3N0ID0gbGF5ZXJUcmVlSG9zdDsKKyAgICB9Cisg
ICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQpaW52YWxpZGF0ZQoreworICAgIF9sYXllclRy
ZWVIb3N0ID0gbnVsbHB0cjsKK30KKworLSAodm9pZClhbmltYXRpb25EaWRTdGFydDooQ0FBbmlt
YXRpb24gKilhbmltYXRpb24KK3sKKyAgICBpZiAoIV9sYXllclRyZWVIb3N0KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBib29sIGhhc0V4cGxpY2l0QmVnaW5UaW1lID0gW1thbmltYXRpb24gdmFs
dWVGb3JLZXk6V0tFeHBsaWNpdEJlZ2luVGltZUZsYWddIGJvb2xWYWx1ZV07CisgICAgQ0ZUaW1l
SW50ZXJ2YWwgc3RhcnRUaW1lOworCisgICAgaWYgKGhhc0V4cGxpY2l0QmVnaW5UaW1lKSB7Cisg
ICAgICAgIC8vIFdlIGRvbid0IGtub3cgd2hhdCB0aW1lIENBIHVzZWQgdG8gY29tbWl0IHRoZSBh
bmltYXRpb24sIHNvIGp1c3QgdXNlIHRoZSBjdXJyZW50IHRpbWUKKyAgICAgICAgLy8gKGV2ZW4g
dGhvdWdoIHRoaXMgd2lsbCBiZSBzbGlnaHRseSBvZmYpLgorICAgICAgICBzdGFydFRpbWUgPSBt
ZWRpYVRpbWVUb0N1cnJlbnRUaW1lKENBQ3VycmVudE1lZGlhVGltZSgpKTsKKyAgICB9IGVsc2UK
KyAgICAgICAgc3RhcnRUaW1lID0gbWVkaWFUaW1lVG9DdXJyZW50VGltZShbYW5pbWF0aW9uIGJl
Z2luVGltZV0pOworCisgICAgX2xheWVyVHJlZUhvc3QtPmFuaW1hdGlvbkRpZFN0YXJ0KF9sYXll
cklELCBhbmltYXRpb24sIHN0YXJ0VGltZSk7Cit9CisKKy0gKHZvaWQpYW5pbWF0aW9uRGlkU3Rv
cDooQ0FBbmltYXRpb24gKilhbmltYXRpb24gZmluaXNoZWQ6KEJPT0wpZmluaXNoZWQKK3sKKyAg
ICBpZiAoIV9sYXllclRyZWVIb3N0KQorICAgICAgICByZXR1cm47CisKKyAgICBfbGF5ZXJUcmVl
SG9zdC0+YW5pbWF0aW9uRGlkRW5kKF9sYXllcklELCBhbmltYXRpb24pOworfQorCitAZW5kCisK
K25hbWVzcGFjZSBXZWJLaXQgeworCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6Oktl
eWZyYW1lVmFsdWU6OmVuY29kZShJUEM6OkVuY29kZXImIGVuY29kZXIpIGNvbnN0Cit7CisgICAg
ZW5jb2Rlci5lbmNvZGVFbnVtKGtleVR5cGUpOworCisgICAgc3dpdGNoIChrZXlUeXBlKSB7Cisg
ICAgY2FzZSBOdW1iZXJLZXlUeXBlOgorICAgICAgICBlbmNvZGVyIDw8IG51bWJlcjsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBDb2xvcktleVR5cGU6CisgICAgICAgIGVuY29kZXIgPDwgY29s
b3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUG9pbnRLZXlUeXBlOgorICAgICAgICBlbmNv
ZGVyIDw8IHBvaW50OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRyYW5zZm9ybUtleVR5cGU6
CisgICAgICAgIGVuY29kZXIgPDwgdHJhbnNmb3JtOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IEZpbHRlcktleVR5cGU6CisgICAgICAgIGVuY29kZXIgPDwgKmZpbHRlci5nZXQoKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorfQorCitib29sIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6Oktl
eWZyYW1lVmFsdWU6OmRlY29kZShJUEM6OkRlY29kZXImIGRlY29kZXIsIFBsYXRmb3JtQ0FBbmlt
YXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWUmIHZhbHVlKQoreworICAgIGlmICghZGVjb2Rlci5k
ZWNvZGVFbnVtKHZhbHVlLmtleVR5cGUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBz
d2l0Y2ggKHZhbHVlLmtleVR5cGUpIHsKKyAgICBjYXNlIE51bWJlcktleVR5cGU6CisgICAgICAg
IGlmICghZGVjb2Rlci5kZWNvZGUodmFsdWUubnVtYmVyKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb2xvcktleVR5cGU6CisgICAgICAgIGlm
ICghZGVjb2Rlci5kZWNvZGUodmFsdWUuY29sb3IpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBvaW50S2V5VHlwZToKKyAgICAgICAgaWYgKCFk
ZWNvZGVyLmRlY29kZSh2YWx1ZS5wb2ludCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgVHJhbnNmb3JtS2V5VHlwZToKKyAgICAgICAgaWYgKCFk
ZWNvZGVyLmRlY29kZSh2YWx1ZS50cmFuc2Zvcm0pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZpbHRlcktleVR5cGU6CisgICAgICAgIGlmICgh
ZGVjb2RlRmlsdGVyT3BlcmF0aW9uKGRlY29kZXIsIHZhbHVlLmZpbHRlcikpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiB0cnVl
OworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXM6OmVuY29k
ZShJUEM6OkVuY29kZXImIGVuY29kZXIpIGNvbnN0Cit7CisgICAgZW5jb2RlciA8PCBrZXlQYXRo
OworICAgIGVuY29kZXIuZW5jb2RlRW51bShhbmltYXRpb25UeXBlKTsKKworICAgIGVuY29kZXIg
PDwgYmVnaW5UaW1lOworICAgIGVuY29kZXIgPDwgZHVyYXRpb247CisgICAgZW5jb2RlciA8PCB0
aW1lT2Zmc2V0OworICAgIGVuY29kZXIgPDwgcmVwZWF0Q291bnQ7CisgICAgZW5jb2RlciA8PCBz
cGVlZDsKKworICAgIGVuY29kZXIuZW5jb2RlRW51bShmaWxsTW9kZSk7CisgICAgZW5jb2Rlci5l
bmNvZGVFbnVtKHZhbHVlRnVuY3Rpb24pOworCisgICAgZW5jb2RlciA8PCBhdXRvUmV2ZXJzZXM7
CisgICAgZW5jb2RlciA8PCByZW1vdmVkT25Db21wbGV0aW9uOworICAgIGVuY29kZXIgPDwgYWRk
aXRpdmU7CisgICAgZW5jb2RlciA8PCByZXZlcnNlVGltaW5nRnVuY3Rpb25zOworICAgIGVuY29k
ZXIgPDwgaGFzRXhwbGljaXRCZWdpblRpbWU7CisgICAgCisgICAgZW5jb2RlciA8PCBrZXlWYWx1
ZXM7CisgICAgZW5jb2RlciA8PCBrZXlUaW1lczsKKyAgICAKKyAgICBlbmNvZGVyIDw8IHN0YXRp
Y19jYXN0PHVpbnQ2NF90Pih0aW1pbmdGdW5jdGlvbnMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0
IGF1dG8mIHRpbWluZ0Z1bmN0aW9uIDogdGltaW5nRnVuY3Rpb25zKSB7CisgICAgICAgIHN3aXRj
aCAodGltaW5nRnVuY3Rpb24tPnR5cGUoKSkgeworICAgICAgICBjYXNlIFRpbWluZ0Z1bmN0aW9u
OjpMaW5lYXJGdW5jdGlvbjoKKyAgICAgICAgICAgIGVuY29kZXIgPDwgKnN0YXRpY19jYXN0PExp
bmVhclRpbWluZ0Z1bmN0aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBUaW1pbmdGdW5jdGlvbjo6Q3ViaWNC
ZXppZXJGdW5jdGlvbjoKKyAgICAgICAgICAgIGVuY29kZXIgPDwgKnN0YXRpY19jYXN0PEN1Ymlj
QmV6aWVyVGltaW5nRnVuY3Rpb24qPih0aW1pbmdGdW5jdGlvbi5nZXQoKSk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgCisgICAgICAgIGNhc2UgVGltaW5nRnVuY3Rpb246OlN0ZXBzRnVu
Y3Rpb246CisgICAgICAgICAgICBlbmNvZGVyIDw8ICpzdGF0aWNfY2FzdDxTdGVwc1RpbWluZ0Z1
bmN0aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAg
ICAgICAgY2FzZSBUaW1pbmdGdW5jdGlvbjo6U3ByaW5nRnVuY3Rpb246CisgICAgICAgICAgICBl
bmNvZGVyIDw8ICpzdGF0aWNfY2FzdDxTcHJpbmdUaW1pbmdGdW5jdGlvbio+KHRpbWluZ0Z1bmN0
aW9uLmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCiti
b29sIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXM6OmRlY29kZShJUEM6OkRl
Y29kZXImIGRlY29kZXIsIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXMmIHBy
b3BlcnRpZXMpCit7CisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmtleVBhdGgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWRlY29kZXIuZGVjb2RlRW51bShw
cm9wZXJ0aWVzLmFuaW1hdGlvblR5cGUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBp
ZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMuYmVnaW5UaW1lKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmR1cmF0aW9uKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0
aWVzLnRpbWVPZmZzZXQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWRlY29k
ZXIuZGVjb2RlKHByb3BlcnRpZXMucmVwZWF0Q291bnQpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMuc3BlZWQpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWRlY29kZXIuZGVjb2RlRW51bShwcm9wZXJ0aWVzLmZp
bGxNb2RlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29k
ZUVudW0ocHJvcGVydGllcy52YWx1ZUZ1bmN0aW9uKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmF1dG9SZXZlcnNlcykpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghZGVjb2Rlci5kZWNvZGUocHJvcGVydGllcy5y
ZW1vdmVkT25Db21wbGV0aW9uKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFk
ZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmFkZGl0aXZlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLnJldmVyc2VUaW1pbmdGdW5j
dGlvbnMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWRlY29kZXIuZGVjb2Rl
KHByb3BlcnRpZXMuaGFzRXhwbGljaXRCZWdpblRpbWUpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMua2V5VmFsdWVzKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmtl
eVRpbWVzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdWludDY0X3QgbnVtVGltaW5n
RnVuY3Rpb25zOworICAgIGlmICghZGVjb2Rlci5kZWNvZGUobnVtVGltaW5nRnVuY3Rpb25zKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIGlmIChudW1UaW1pbmdGdW5jdGlvbnMp
IHsKKyAgICAgICAgcHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMucmVzZXJ2ZUluaXRpYWxDYXBh
Y2l0eShudW1UaW1pbmdGdW5jdGlvbnMpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbnVtVGltaW5nRnVuY3Rpb25zOyArK2kpIHsKKyAgICAgICAgCisgICAgICAgICAgICBUaW1p
bmdGdW5jdGlvbjo6VGltaW5nRnVuY3Rpb25UeXBlIHR5cGU7CisgICAgICAgICAgICBpZiAoIWRl
Y29kZXIuZGVjb2RlRW51bSh0eXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICAgICAgICAgIFJlZlB0cjxUaW1pbmdGdW5jdGlvbj4gdGltaW5nRnVuY3Rpb247CisgICAg
ICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVGltaW5nRnVuY3Rpb246
OkxpbmVhckZ1bmN0aW9uOgorICAgICAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9uID0gTGluZWFy
VGltaW5nRnVuY3Rpb246OmNyZWF0ZSgpOworICAgICAgICAgICAgICAgIGlmICghZGVjb2Rlci5k
ZWNvZGUoKnN0YXRpY19jYXN0PExpbmVhclRpbWluZ0Z1bmN0aW9uKj4odGltaW5nRnVuY3Rpb24u
Z2V0KCkpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBUaW1pbmdGdW5j
dGlvbjo6Q3ViaWNCZXppZXJGdW5jdGlvbjoKKyAgICAgICAgICAgICAgICB0aW1pbmdGdW5jdGlv
biA9IEN1YmljQmV6aWVyVGltaW5nRnVuY3Rpb246OmNyZWF0ZSgpOworICAgICAgICAgICAgICAg
IGlmICghZGVjb2Rlci5kZWNvZGUoKnN0YXRpY19jYXN0PEN1YmljQmV6aWVyVGltaW5nRnVuY3Rp
b24qPih0aW1pbmdGdW5jdGlvbi5nZXQoKSkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgICAg
IGNhc2UgVGltaW5nRnVuY3Rpb246OlN0ZXBzRnVuY3Rpb246CisgICAgICAgICAgICAgICAgdGlt
aW5nRnVuY3Rpb24gPSBTdGVwc1RpbWluZ0Z1bmN0aW9uOjpjcmVhdGUoKTsKKyAgICAgICAgICAg
ICAgICBpZiAoIWRlY29kZXIuZGVjb2RlKCpzdGF0aWNfY2FzdDxTdGVwc1RpbWluZ0Z1bmN0aW9u
Kj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFRpbWluZ0Z1
bmN0aW9uOjpTcHJpbmdGdW5jdGlvbjoKKyAgICAgICAgICAgICAgICB0aW1pbmdGdW5jdGlvbiA9
IFNwcmluZ1RpbWluZ0Z1bmN0aW9uOjpjcmVhdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRl
Y29kZXIuZGVjb2RlKCpzdGF0aWNfY2FzdDxTcHJpbmdUaW1pbmdGdW5jdGlvbio+KHRpbWluZ0Z1
bmN0aW9uLmdldCgpKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAg
ICAgcHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMudW5jaGVja2VkQXBwZW5kKFdURk1vdmUodGlt
aW5nRnVuY3Rpb24pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQor
ICAgIAorUmVmPFBsYXRmb3JtQ0FBbmltYXRpb24+IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6
OmNyZWF0ZShQbGF0Zm9ybUNBQW5pbWF0aW9uOjpBbmltYXRpb25UeXBlIHR5cGUsIGNvbnN0IFN0
cmluZyYga2V5UGF0aCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBQbGF0Zm9ybUNBQW5p
bWF0aW9uUmVtb3RlKHR5cGUsIGtleVBhdGgpKTsKK30KKworUmVmPFBsYXRmb3JtQ0FBbmltYXRp
b24+IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNvcHkoKSBjb25zdAoreworICAgIGF1dG8g
YW5pbWF0aW9uID0gY3JlYXRlKGFuaW1hdGlvblR5cGUoKSwga2V5UGF0aCgpKTsKKyAgICAKKyAg
ICBhbmltYXRpb24tPnNldEJlZ2luVGltZShiZWdpblRpbWUoKSk7CisgICAgYW5pbWF0aW9uLT5z
ZXREdXJhdGlvbihkdXJhdGlvbigpKTsKKyAgICBhbmltYXRpb24tPnNldFNwZWVkKHNwZWVkKCkp
OworICAgIGFuaW1hdGlvbi0+c2V0VGltZU9mZnNldCh0aW1lT2Zmc2V0KCkpOworICAgIGFuaW1h
dGlvbi0+c2V0UmVwZWF0Q291bnQocmVwZWF0Q291bnQoKSk7CisgICAgYW5pbWF0aW9uLT5zZXRB
dXRvcmV2ZXJzZXMoYXV0b3JldmVyc2VzKCkpOworICAgIGFuaW1hdGlvbi0+c2V0RmlsbE1vZGUo
ZmlsbE1vZGUoKSk7CisgICAgYW5pbWF0aW9uLT5zZXRSZW1vdmVkT25Db21wbGV0aW9uKGlzUmVt
b3ZlZE9uQ29tcGxldGlvbigpKTsKKyAgICBhbmltYXRpb24tPnNldEFkZGl0aXZlKGlzQWRkaXRp
dmUoKSk7CisgICAgYW5pbWF0aW9uLT5jb3B5VGltaW5nRnVuY3Rpb25Gcm9tKCp0aGlzKTsKKyAg
ICBhbmltYXRpb24tPnNldFZhbHVlRnVuY3Rpb24odmFsdWVGdW5jdGlvbigpKTsKKworICAgIGRv
d25jYXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KGFuaW1hdGlvbi5nZXQoKSkuc2V0SGFz
RXhwbGljaXRCZWdpblRpbWUoaGFzRXhwbGljaXRCZWdpblRpbWUoKSk7CisgICAgCisgICAgLy8g
Q29weSB0aGUgc3BlY2lmaWMgQmFzaWMgb3IgS2V5ZnJhbWUgdmFsdWVzLgorICAgIGlmIChhbmlt
YXRpb25UeXBlKCkgPT0gS2V5ZnJhbWUpIHsKKyAgICAgICAgYW5pbWF0aW9uLT5jb3B5VmFsdWVz
RnJvbSgqdGhpcyk7CisgICAgICAgIGFuaW1hdGlvbi0+Y29weUtleVRpbWVzRnJvbSgqdGhpcyk7
CisgICAgICAgIGFuaW1hdGlvbi0+Y29weVRpbWluZ0Z1bmN0aW9uc0Zyb20oKnRoaXMpOworICAg
IH0gZWxzZSB7CisgICAgICAgIGFuaW1hdGlvbi0+Y29weUZyb21WYWx1ZUZyb20oKnRoaXMpOwor
ICAgICAgICBhbmltYXRpb24tPmNvcHlUb1ZhbHVlRnJvbSgqdGhpcyk7CisgICAgfQorICAgIAor
ICAgIHJldHVybiBhbmltYXRpb247Cit9CisKK1BsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGUoQW5pbWF0aW9uVHlwZSB0eXBlLCBjb25zdCBTdHJpbmcm
IGtleVBhdGgpCisgICAgOiBQbGF0Zm9ybUNBQW5pbWF0aW9uKHR5cGUpCit7CisgICAgbV9wcm9w
ZXJ0aWVzLmtleVBhdGggPSBrZXlQYXRoOworICAgIG1fcHJvcGVydGllcy5hbmltYXRpb25UeXBl
ID0gdHlwZTsKK30KKworU3RyaW5nIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmtleVBhdGgo
KSBjb25zdAoreworICAgIHJldHVybiBtX3Byb3BlcnRpZXMua2V5UGF0aDsKK30KKworQ0ZUaW1l
SW50ZXJ2YWwgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6YmVnaW5UaW1lKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmJlZ2luVGltZTsKK30KKwordm9pZCBQbGF0Zm9ybUNB
QW5pbWF0aW9uUmVtb3RlOjpzZXRCZWdpblRpbWUoQ0ZUaW1lSW50ZXJ2YWwgdmFsdWUpCit7Cisg
ICAgbV9wcm9wZXJ0aWVzLmJlZ2luVGltZSA9IHZhbHVlOworICAgIAorICAgIC8vIEFsc28gc2V0
IGEgZmxhZyB0byB0ZWxsIHVzIGlmIHdlJ3ZlIHBhc3NlZCBpbiBhIDAgdmFsdWUuIAorICAgIC8v
IFRoZSBmbGFnIGlzIG5lZWRlZCBiZWNhdXNlIGxhdGVyIGJlZ2luVGltZSB3aWxsIGdldCBjaGFu
Z2VkCisgICAgLy8gdG8gdGhlIHRpbWUgYXQgd2hpY2ggaXQgZmlyZWQgYW5kIHdlIG5lZWQgdG8g
a25vdyB3aGV0aGVyCisgICAgLy8gb3Igbm90IGl0IHdhcyAwIHRvIGJlZ2luIHdpdGguCisgICAg
aWYgKHZhbHVlKQorICAgICAgICBtX3Byb3BlcnRpZXMuaGFzRXhwbGljaXRCZWdpblRpbWUgPSB2
YWx1ZTsKK30KKworQ0ZUaW1lSW50ZXJ2YWwgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6ZHVy
YXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtX3Byb3BlcnRpZXMuZHVyYXRpb247Cit9CisK
K3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0RHVyYXRpb24oQ0ZUaW1lSW50ZXJ2
YWwgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLmR1cmF0aW9uID0gdmFsdWU7Cit9CisKK2Zs
b2F0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNwZWVkKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9wcm9wZXJ0aWVzLnNwZWVkOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU6OnNldFNwZWVkKGZsb2F0IHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5zcGVlZCA9IHZh
bHVlOworfQorCitDRlRpbWVJbnRlcnZhbCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjp0aW1l
T2Zmc2V0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnRpbWVPZmZzZXQ7Cit9
CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VGltZU9mZnNldChDRlRpbWVJ
bnRlcnZhbCB2YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMudGltZU9mZnNldCA9IHZhbHVlOwor
fQorCitmbG9hdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpyZXBlYXRDb3VudCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5yZXBlYXRDb3VudDsKK30KKwordm9pZCBQbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRSZXBlYXRDb3VudChmbG9hdCB2YWx1ZSkKK3sKKyAg
ICBtX3Byb3BlcnRpZXMucmVwZWF0Q291bnQgPSB2YWx1ZTsKK30KKworYm9vbCBQbGF0Zm9ybUNB
QW5pbWF0aW9uUmVtb3RlOjphdXRvcmV2ZXJzZXMoKSBjb25zdAoreworICAgIHJldHVybiBtX3By
b3BlcnRpZXMuYXV0b1JldmVyc2VzOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU6OnNldEF1dG9yZXZlcnNlcyhib29sIHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5hdXRv
UmV2ZXJzZXMgPSB2YWx1ZTsKK30KKworUGxhdGZvcm1DQUFuaW1hdGlvbjo6RmlsbE1vZGVUeXBl
IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmZpbGxNb2RlKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9wcm9wZXJ0aWVzLmZpbGxNb2RlOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OnNldEZpbGxNb2RlKEZpbGxNb2RlVHlwZSB2YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRp
ZXMuZmlsbE1vZGUgPSB2YWx1ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3Rl
OjpzZXRUaW1pbmdGdW5jdGlvbihjb25zdCBUaW1pbmdGdW5jdGlvbiogdmFsdWUsIGJvb2wgcmV2
ZXJzZSkKK3sKKyAgICBWZWN0b3I8UmVmUHRyPFRpbWluZ0Z1bmN0aW9uPj4gdGltaW5nRnVuY3Rp
b25zOworICAgIHRpbWluZ0Z1bmN0aW9ucy5hcHBlbmQodmFsdWUtPmNsb25lKCkpOworCisgICAg
bV9wcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucyA9IFdURk1vdmUodGltaW5nRnVuY3Rpb25zKTsK
KyAgICBtX3Byb3BlcnRpZXMucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyA9IHJldmVyc2U7Cit9CisK
K3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6Y29weVRpbWluZ0Z1bmN0aW9uRnJvbShj
b25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uJiB2YWx1ZSkKK3sKKyAgICBjb3B5VGltaW5nRnVuY3Rp
b25zRnJvbSh2YWx1ZSk7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6aXNS
ZW1vdmVkT25Db21wbGV0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnJl
bW92ZWRPbkNvbXBsZXRpb247Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6
c2V0UmVtb3ZlZE9uQ29tcGxldGlvbihib29sIHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5y
ZW1vdmVkT25Db21wbGV0aW9uID0gdmFsdWU7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUFuaW1hdGlv
blJlbW90ZTo6aXNBZGRpdGl2ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5h
ZGRpdGl2ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRBZGRpdGl2
ZShib29sIHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5hZGRpdGl2ZSA9IHZhbHVlOworfQor
CitQbGF0Zm9ybUNBQW5pbWF0aW9uOjpWYWx1ZUZ1bmN0aW9uVHlwZSBQbGF0Zm9ybUNBQW5pbWF0
aW9uUmVtb3RlOjp2YWx1ZUZ1bmN0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0
aWVzLnZhbHVlRnVuY3Rpb247Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6
c2V0VmFsdWVGdW5jdGlvbihWYWx1ZUZ1bmN0aW9uVHlwZSB2YWx1ZSkKK3sKKyAgICBtX3Byb3Bl
cnRpZXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGU6OnNldEZyb21WYWx1ZShmbG9hdCB2YWx1ZSkKK3sKKyAgICBpZiAoYW5pbWF0aW9u
VHlwZSgpICE9IEJhc2ljKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3BlcnRpZXMua2V5
VmFsdWVzLnJlc2l6ZSgyKTsKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzBdID0gS2V5ZnJh
bWVWYWx1ZSh2YWx1ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0
RnJvbVZhbHVlKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB2YWx1ZSkKK3sKKyAgICBpZiAo
YW5pbWF0aW9uVHlwZSgpICE9IEJhc2ljKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3Bl
cnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzBd
ID0gS2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6c2V0RnJvbVZhbHVlKGNvbnN0IEZsb2F0UG9pbnQzRCYgdmFsdWUpCit7CisgICAgaWYg
KGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcm9w
ZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1sw
XSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OnNldEZyb21WYWx1ZShjb25zdCBDb2xvciYgdmFsdWUpCit7CisgICAgaWYgKGFuaW1h
dGlvblR5cGUoKSAhPSBCYXNpYykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVz
LmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1swXSA9IEtl
eWZyYW1lVmFsdWUodmFsdWUpOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6
OnNldEZyb21WYWx1ZShjb25zdCBGaWx0ZXJPcGVyYXRpb24qIG9wZXJhdGlvbiwgaW50IGludGVy
bmFsRmlsdGVyUHJvcGVydHlJbmRleCkKK3sKKyAgICBpZiAoYW5pbWF0aW9uVHlwZSgpICE9IEJh
c2ljKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzLnJlc2l6
ZSgyKTsKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzBdID0gS2V5ZnJhbWVWYWx1ZShvcGVy
YXRpb24tPmNsb25lKCkpOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNv
cHlGcm9tVmFsdWVGcm9tKGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb24mIHZhbHVlKQoreworICAg
IGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUmIG90aGVyID0gZG93bmNhc3Q8UGxhdGZv
cm1DQUFuaW1hdGlvblJlbW90ZT4odmFsdWUpOworCisgICAgaWYgKG90aGVyLm1fcHJvcGVydGll
cy5rZXlWYWx1ZXMuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgbV9wcm9w
ZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1sw
XSA9IG90aGVyLm1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMF07Cit9CisKK3ZvaWQgUGxhdGZvcm1D
QUFuaW1hdGlvblJlbW90ZTo6c2V0VG9WYWx1ZShmbG9hdCB2YWx1ZSkKK3sKKyAgICBpZiAoYW5p
bWF0aW9uVHlwZSgpICE9IEJhc2ljKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3BlcnRp
ZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzFdID0g
S2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90
ZTo6c2V0VG9WYWx1ZShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdmFsdWUpCit7CisgICAg
aWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9w
cm9wZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVl
c1sxXSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGU6OnNldFRvVmFsdWUoY29uc3QgRmxvYXRQb2ludDNEJiB2YWx1ZSkKK3sKKyAgICBp
ZiAoYW5pbWF0aW9uVHlwZSgpICE9IEJhc2ljKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3By
b3BlcnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKKyAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVz
WzFdID0gS2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlv
blJlbW90ZTo6c2V0VG9WYWx1ZShjb25zdCBDb2xvciYgdmFsdWUpCit7CisgICAgaWYgKGFuaW1h
dGlvblR5cGUoKSAhPSBCYXNpYykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVz
LmtleVZhbHVlcy5yZXNpemUoMik7CisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1sxXSA9IEtl
eWZyYW1lVmFsdWUodmFsdWUpOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6
OnNldFRvVmFsdWUoY29uc3QgRmlsdGVyT3BlcmF0aW9uKiBvcGVyYXRpb24sIGludCBpbnRlcm5h
bEZpbHRlclByb3BlcnR5SW5kZXgpCit7CisgICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNp
YykKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIFVOVVNFRF9QQVJBTShpbnRlcm5hbEZpbHRl
clByb3BlcnR5SW5kZXgpOworICAgIEFTU0VSVChvcGVyYXRpb24pOworICAgIG1fcHJvcGVydGll
cy5rZXlWYWx1ZXMucmVzaXplKDIpOworICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMV0gPSBL
ZXlmcmFtZVZhbHVlKG9wZXJhdGlvbi0+Y2xvbmUoKSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZTo6Y29weVRvVmFsdWVGcm9tKGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb24m
IHZhbHVlKQoreworICAgIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUmIG90aGVyID0g
ZG93bmNhc3Q8UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4odmFsdWUpOworCisgICAgaWYgKG90
aGVyLm1fcHJvcGVydGllcy5rZXlWYWx1ZXMuc2l6ZSgpIDwgMikKKyAgICAgICAgcmV0dXJuOwor
ICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMucmVzaXplKDIpOworICAgIG1fcHJvcGVydGllcy5r
ZXlWYWx1ZXNbMV0gPSBvdGhlci5tX3Byb3BlcnRpZXMua2V5VmFsdWVzWzFdOworfQorCisvLyBL
ZXlmcmFtZS1hbmltYXRpb24gcHJvcGVydGllcy4KK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxmbG9hdD4mIHZhbHVlcykKK3sKKyAgICBpZiAo
YW5pbWF0aW9uVHlwZSgpICE9IEtleWZyYW1lKQorICAgICAgICByZXR1cm47CisKKyAgICBWZWN0
b3I8S2V5ZnJhbWVWYWx1ZT4ga2V5ZnJhbWVzOworICAgIGtleWZyYW1lcy5yZXNlcnZlSW5pdGlh
bENhcGFjaXR5KHZhbHVlcy5zaXplKCkpOworICAgIAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgdmFsdWVzLnNpemUoKTsgKytpKQorICAgICAgICBrZXlmcmFtZXMudW5jaGVja2VkQXBwZW5k
KEtleWZyYW1lVmFsdWUodmFsdWVzW2ldKSk7CisgICAgCisgICAgbV9wcm9wZXJ0aWVzLmtleVZh
bHVlcyA9IFdURk1vdmUoa2V5ZnJhbWVzKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlOjpzZXRWYWx1ZXMoY29uc3QgVmVjdG9yPFRyYW5zZm9ybWF0aW9uTWF0cml4PiYgdmFs
dWVzKQoreworICAgIGlmIChhbmltYXRpb25UeXBlKCkgIT0gS2V5ZnJhbWUpCisgICAgICAgIHJl
dHVybjsKKyAgICAgICAgCisgICAgVmVjdG9yPEtleWZyYW1lVmFsdWU+IGtleWZyYW1lczsKKyAg
ICBrZXlmcmFtZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eSh2YWx1ZXMuc2l6ZSgpKTsKKyAgICAK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7ICsraSkKKyAgICAgICAg
a2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlmcmFtZVZhbHVlKHZhbHVlc1tpXSkpOworICAg
IAorICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMgPSBXVEZNb3ZlKGtleWZyYW1lcyk7Cit9CisK
K3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxG
bG9hdFBvaW50M0Q+JiB2YWx1ZXMpCit7CisgICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBLZXlm
cmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICBWZWN0b3I8S2V5ZnJhbWVWYWx1
ZT4ga2V5ZnJhbWVzOworICAgIGtleWZyYW1lcy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KHZhbHVl
cy5zaXplKCkpOworICAgIAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUo
KTsgKytpKQorICAgICAgICBrZXlmcmFtZXMudW5jaGVja2VkQXBwZW5kKEtleWZyYW1lVmFsdWUo
dmFsdWVzW2ldKSk7CisgICAgCisgICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcyA9IFdURk1vdmUo
a2V5ZnJhbWVzKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRWYWx1
ZXMoY29uc3QgVmVjdG9yPENvbG9yPiYgdmFsdWVzKQoreworICAgIGlmIChhbmltYXRpb25UeXBl
KCkgIT0gS2V5ZnJhbWUpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgVmVjdG9yPEtl
eWZyYW1lVmFsdWU+IGtleWZyYW1lczsKKyAgICBrZXlmcmFtZXMucmVzZXJ2ZUluaXRpYWxDYXBh
Y2l0eSh2YWx1ZXMuc2l6ZSgpKTsKKyAgICAKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZh
bHVlcy5zaXplKCk7ICsraSkKKyAgICAgICAga2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlm
cmFtZVZhbHVlKHZhbHVlc1tpXSkpOworICAgIAorICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMg
PSBXVEZNb3ZlKGtleWZyYW1lcyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90
ZTo6c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPj4mIHZhbHVl
cywgaW50IGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCkKK3sKKyAgICBVTlVTRURfUEFSQU0o
aW50ZXJuYWxGaWx0ZXJQcm9wZXJ0eUluZGV4KTsKKyAgICAKKyAgICBpZiAoYW5pbWF0aW9uVHlw
ZSgpICE9IEtleWZyYW1lKQorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIFZlY3RvcjxL
ZXlmcmFtZVZhbHVlPiBrZXlmcmFtZXM7CisgICAga2V5ZnJhbWVzLnJlc2VydmVJbml0aWFsQ2Fw
YWNpdHkodmFsdWVzLnNpemUoKSk7CisgICAgCisgICAgZm9yIChhdXRvJiB2YWx1ZSA6IHZhbHVl
cykKKyAgICAgICAga2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlmcmFtZVZhbHVlIHsgdmFs
dWUuY29weVJlZigpIH0pOworICAgIAorICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMgPSBXVEZN
b3ZlKGtleWZyYW1lcyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6Y29w
eVZhbHVlc0Zyb20oY29uc3QgUGxhdGZvcm1DQUFuaW1hdGlvbiYgdmFsdWUpCit7CisgICAgbV9w
cm9wZXJ0aWVzLmtleVZhbHVlcyA9IGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+
KHZhbHVlKS5tX3Byb3BlcnRpZXMua2V5VmFsdWVzOworfQorCit2b2lkIFBsYXRmb3JtQ0FBbmlt
YXRpb25SZW1vdGU6OnNldEtleVRpbWVzKGNvbnN0IFZlY3RvcjxmbG9hdD4mIGtleVRpbWVzKQor
eworICAgIG1fcHJvcGVydGllcy5rZXlUaW1lcyA9IGtleVRpbWVzOworfQorCit2b2lkIFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU6OmNvcHlLZXlUaW1lc0Zyb20oY29uc3QgUGxhdGZvcm1DQUFu
aW1hdGlvbiYgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLmtleVRpbWVzID0gZG93bmNhc3Q8
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4odmFsdWUpLm1fcHJvcGVydGllcy5rZXlUaW1lczsK
K30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRUaW1pbmdGdW5jdGlvbnMo
Y29uc3QgVmVjdG9yPGNvbnN0IFRpbWluZ0Z1bmN0aW9uKj4mIHZhbHVlcywgYm9vbCByZXZlcnNl
KQoreworICAgIFZlY3RvcjxSZWZQdHI8V2ViQ29yZTo6VGltaW5nRnVuY3Rpb24+PiB0aW1pbmdG
dW5jdGlvbnM7CisgICAgdGltaW5nRnVuY3Rpb25zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkodmFs
dWVzLnNpemUoKSk7CisgICAgCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6
ZSgpOyArK2kpCisgICAgICAgIHRpbWluZ0Z1bmN0aW9ucy51bmNoZWNrZWRBcHBlbmQodmFsdWVz
W2ldLT5jbG9uZSgpKTsKKyAgICAKKyAgICBtX3Byb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zID0g
V1RGTW92ZSh0aW1pbmdGdW5jdGlvbnMpOworICAgIG1fcHJvcGVydGllcy5yZXZlcnNlVGltaW5n
RnVuY3Rpb25zID0gcmV2ZXJzZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3Rl
Ojpjb3B5VGltaW5nRnVuY3Rpb25zRnJvbShjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uJiB2YWx1
ZSkKK3sKKyAgICBjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlJiBvdGhlciA9IGRvd25j
YXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KHZhbHVlKTsKKworICAgIG1fcHJvcGVydGll
cy50aW1pbmdGdW5jdGlvbnMgPSBvdGhlci5tX3Byb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zOwor
ICAgIG1fcHJvcGVydGllcy5yZXZlcnNlVGltaW5nRnVuY3Rpb25zID0gb3RoZXIubV9wcm9wZXJ0
aWVzLnJldmVyc2VUaW1pbmdGdW5jdGlvbnM7Cit9CisKK3N0YXRpYyBOU09iamVjdCogYW5pbWF0
aW9uVmFsdWVGcm9tS2V5ZnJhbWVWYWx1ZShjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3Rl
OjpLZXlmcmFtZVZhbHVlJiBrZXlmcmFtZVZhbHVlKQoreworICAgIHN3aXRjaCAoa2V5ZnJhbWVW
YWx1ZS5rZXlmcmFtZVR5cGUoKSkgeworICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90
ZTo6S2V5ZnJhbWVWYWx1ZTo6TnVtYmVyS2V5VHlwZToKKyAgICAgICAgcmV0dXJuIEAoa2V5ZnJh
bWVWYWx1ZS5udW1iZXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIAorICAgIGNhc2UgUGxhdGZvcm1D
QUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6Q29sb3JLZXlUeXBlOiB7CisgICAgICAg
IENvbG9yIGNvbG9yID0ga2V5ZnJhbWVWYWx1ZS5jb2xvclZhbHVlKCk7CisgICAgICAgIHJldHVy
biBAWyBAKGNvbG9yLnJlZCgpKSwgQChjb2xvci5ncmVlbigpKSwgQChjb2xvci5ibHVlKCkpLCBA
KGNvbG9yLmFscGhhKCkpIF07CisgICAgfQorCisgICAgY2FzZSBQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlOjpLZXlmcmFtZVZhbHVlOjpQb2ludEtleVR5cGU6IHsKKyAgICAgICAgRmxvYXRQb2lu
dDNEIHBvaW50ID0ga2V5ZnJhbWVWYWx1ZS5wb2ludFZhbHVlKCk7CisgICAgICAgIHJldHVybiBA
WyBAKHBvaW50LngoKSksIEAocG9pbnQueSgpKSwgQChwb2ludC56KCkpIF07CisgICAgfQorICAg
IGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6VHJhbnNmb3Jt
S2V5VHlwZToKKyAgICAgICAgcmV0dXJuIFtOU1ZhbHVlIHZhbHVlV2l0aENBVHJhbnNmb3JtM0Q6
a2V5ZnJhbWVWYWx1ZS50cmFuc2Zvcm1WYWx1ZSgpXTsKKyAgICAgICAgICAgIAorICAgIGNhc2Ug
UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6RmlsdGVyS2V5VHlwZToK
KyAgICAgICAgcmV0dXJuIFBsYXRmb3JtQ0FGaWx0ZXJzOjpmaWx0ZXJWYWx1ZUZvck9wZXJhdGlv
bihrZXlmcmFtZVZhbHVlLmZpbHRlclZhbHVlKCksIDAgLyogdW51c2VkICovKS5hdXRvcmVsZWFz
ZSgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYWRkQW5pbWF0aW9uVG9MYXllcihDQUxheWVy
ICpsYXllciwgUmVtb3RlTGF5ZXJUcmVlSG9zdCogbGF5ZXJUcmVlSG9zdCwgY29uc3QgU3RyaW5n
JiBrZXksIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXMmIHByb3Bl
cnRpZXMpCit7CisgICAgUmV0YWluUHRyPENBUHJvcGVydHlBbmltYXRpb24+IGNhQW5pbWF0aW9u
OworICAgIHN3aXRjaCAocHJvcGVydGllcy5hbmltYXRpb25UeXBlKSB7CisgICAgY2FzZSBQbGF0
Zm9ybUNBQW5pbWF0aW9uOjpCYXNpYzogeworICAgICAgICBSZXRhaW5QdHI8Q0FCYXNpY0FuaW1h
dGlvbj4gYmFzaWNBbmltYXRpb247CisgICAgICAgIGJhc2ljQW5pbWF0aW9uID0gW0NBQmFzaWNB
bmltYXRpb24gYW5pbWF0aW9uV2l0aEtleVBhdGg6cHJvcGVydGllcy5rZXlQYXRoXTsKKyAgICAg
ICAgCisgICAgICAgIGlmIChwcm9wZXJ0aWVzLmtleVZhbHVlcy5zaXplKCkgPiAxKSB7CisgICAg
ICAgICAgICBbYmFzaWNBbmltYXRpb24gc2V0RnJvbVZhbHVlOmFuaW1hdGlvblZhbHVlRnJvbUtl
eWZyYW1lVmFsdWUocHJvcGVydGllcy5rZXlWYWx1ZXNbMF0pXTsKKyAgICAgICAgICAgIFtiYXNp
Y0FuaW1hdGlvbiBzZXRUb1ZhbHVlOmFuaW1hdGlvblZhbHVlRnJvbUtleWZyYW1lVmFsdWUocHJv
cGVydGllcy5rZXlWYWx1ZXNbMV0pXTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYg
KHByb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zLnNpemUoKSkKKyAgICAgICAgICAgIFtiYXNpY0Fu
aW1hdGlvbiBzZXRUaW1pbmdGdW5jdGlvbjp0b0NBTWVkaWFUaW1pbmdGdW5jdGlvbihwcm9wZXJ0
aWVzLnRpbWluZ0Z1bmN0aW9uc1swXS5nZXQoKSwgcHJvcGVydGllcy5yZXZlcnNlVGltaW5nRnVu
Y3Rpb25zKV07CisgICAgICAgIAorICAgICAgICBjYUFuaW1hdGlvbiA9IGJhc2ljQW5pbWF0aW9u
OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQbGF0Zm9ybUNBQW5pbWF0aW9uOjpL
ZXlmcmFtZTogeworICAgICAgICBSZXRhaW5QdHI8Q0FLZXlmcmFtZUFuaW1hdGlvbj4ga2V5ZnJh
bWVBbmltYXRpb247CisgICAgICAgIGtleWZyYW1lQW5pbWF0aW9uID0gW0NBS2V5ZnJhbWVBbmlt
YXRpb24gYW5pbWF0aW9uV2l0aEtleVBhdGg6cHJvcGVydGllcy5rZXlQYXRoXTsKKworICAgICAg
ICBpZiAocHJvcGVydGllcy5rZXlWYWx1ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBSZXRhaW5Q
dHI8TlNNdXRhYmxlQXJyYXk+IGtleWZyYW1lcyA9IGFkb3B0TlMoW1tOU011dGFibGVBcnJheSBh
bGxvY10gaW5pdFdpdGhDYXBhY2l0eTpwcm9wZXJ0aWVzLmtleVZhbHVlcy5zaXplKCldKTsKKyAg
ICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdmFsdWUgOiBwcm9wZXJ0aWVzLmtleVZhbHVlcykK
KyAgICAgICAgICAgICAgICBba2V5ZnJhbWVzIGFkZE9iamVjdDphbmltYXRpb25WYWx1ZUZyb21L
ZXlmcmFtZVZhbHVlKHZhbHVlKV07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFtrZXlmcmFt
ZUFuaW1hdGlvbiBzZXRWYWx1ZXM6a2V5ZnJhbWVzLmdldCgpXTsKKyAgICAgICAgfQorCisgICAg
ICAgIGlmIChwcm9wZXJ0aWVzLmtleVRpbWVzLnNpemUoKSkgeworICAgICAgICAgICAgUmV0YWlu
UHRyPE5TTXV0YWJsZUFycmF5PiBrZXlUaW1lcyA9IGFkb3B0TlMoW1tOU011dGFibGVBcnJheSBh
bGxvY10gaW5pdFdpdGhDYXBhY2l0eTpwcm9wZXJ0aWVzLmtleVRpbWVzLnNpemUoKV0pOworICAg
ICAgICAgICAgZm9yIChhdXRvIGtleVRpbWUgOiBwcm9wZXJ0aWVzLmtleVRpbWVzKQorICAgICAg
ICAgICAgICAgIFtrZXlUaW1lcyBhZGRPYmplY3Q6QChrZXlUaW1lKV07CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIFtrZXlmcmFtZUFuaW1hdGlvbiBzZXRLZXlUaW1lczprZXlUaW1lcy5nZXQo
KV07CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMu
c2l6ZSgpKSB7CisgICAgICAgICAgICBSZXRhaW5QdHI8TlNNdXRhYmxlQXJyYXk+IHRpbWluZ0Z1
bmN0aW9ucyA9IGFkb3B0TlMoW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0
eTpwcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucy5zaXplKCldKTsKKyAgICAgICAgICAgIGZvciAo
Y29uc3QgYXV0byYgdGltaW5nRnVuY3Rpb24gOiBwcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucykK
KyAgICAgICAgICAgICAgICBbdGltaW5nRnVuY3Rpb25zIGFkZE9iamVjdDp0b0NBTWVkaWFUaW1p
bmdGdW5jdGlvbih0aW1pbmdGdW5jdGlvbi5nZXQoKSwgcHJvcGVydGllcy5yZXZlcnNlVGltaW5n
RnVuY3Rpb25zKV07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFtrZXlmcmFtZUFuaW1hdGlv
biBzZXRUaW1pbmdGdW5jdGlvbnM6dGltaW5nRnVuY3Rpb25zLmdldCgpXTsKKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgY2FBbmltYXRpb24gPSBrZXlmcmFtZUFuaW1hdGlvbjsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvbjo6U3ByaW5nOiB7
CisgICAgICAgIFJldGFpblB0cjxDQVNwcmluZ0FuaW1hdGlvbj4gc3ByaW5nQW5pbWF0aW9uOwor
ICAgICAgICBzcHJpbmdBbmltYXRpb24gPSBbQ0FTcHJpbmdBbmltYXRpb24gYW5pbWF0aW9uV2l0
aEtleVBhdGg6cHJvcGVydGllcy5rZXlQYXRoXTsKKyAgICAgICAgCisgICAgICAgIGlmIChwcm9w
ZXJ0aWVzLmtleVZhbHVlcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBbc3ByaW5nQW5pbWF0
aW9uIHNldEZyb21WYWx1ZTphbmltYXRpb25WYWx1ZUZyb21LZXlmcmFtZVZhbHVlKHByb3BlcnRp
ZXMua2V5VmFsdWVzWzBdKV07CisgICAgICAgICAgICBbc3ByaW5nQW5pbWF0aW9uIHNldFRvVmFs
dWU6YW5pbWF0aW9uVmFsdWVGcm9tS2V5ZnJhbWVWYWx1ZShwcm9wZXJ0aWVzLmtleVZhbHVlc1sx
XSldOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocHJvcGVydGllcy50aW1pbmdG
dW5jdGlvbnMuc2l6ZSgpKSB7CisgICAgICAgICAgICBhdXRvJiB0aW1pbmdGdW5jdGlvbiA9IHBy
b3BlcnRpZXMudGltaW5nRnVuY3Rpb25zWzBdOworICAgICAgICAgICAgaWYgKHRpbWluZ0Z1bmN0
aW9uLT5pc1NwcmluZ1RpbWluZ0Z1bmN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvJiBm
dW5jdGlvbiA9ICpzdGF0aWNfY2FzdDxjb25zdCBTcHJpbmdUaW1pbmdGdW5jdGlvbio+KHRpbWlu
Z0Z1bmN0aW9uLmdldCgpKTsKKyAgICAgICAgICAgICAgICBbc3ByaW5nQW5pbWF0aW9uIHNldE1h
c3M6ZnVuY3Rpb24ubWFzcygpXTsKKyAgICAgICAgICAgICAgICBbc3ByaW5nQW5pbWF0aW9uIHNl
dFN0aWZmbmVzczpmdW5jdGlvbi5zdGlmZm5lc3MoKV07CisgICAgICAgICAgICAgICAgW3Nwcmlu
Z0FuaW1hdGlvbiBzZXREYW1waW5nOmZ1bmN0aW9uLmRhbXBpbmcoKV07CisgICAgICAgICAgICAg
ICAgW3NwcmluZ0FuaW1hdGlvbiBzZXRJbml0aWFsVmVsb2NpdHk6ZnVuY3Rpb24uaW5pdGlhbFZl
bG9jaXR5KCldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhQW5pbWF0aW9u
ID0gc3ByaW5nQW5pbWF0aW9uOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIAor
ICAgIFtjYUFuaW1hdGlvbiBzZXRCZWdpblRpbWU6cHJvcGVydGllcy5iZWdpblRpbWVdOworICAg
IFtjYUFuaW1hdGlvbiBzZXREdXJhdGlvbjpwcm9wZXJ0aWVzLmR1cmF0aW9uXTsKKyAgICBbY2FB
bmltYXRpb24gc2V0VGltZU9mZnNldDpwcm9wZXJ0aWVzLnRpbWVPZmZzZXRdOworICAgIFtjYUFu
aW1hdGlvbiBzZXRSZXBlYXRDb3VudDpwcm9wZXJ0aWVzLnJlcGVhdENvdW50XTsKKyAgICBbY2FB
bmltYXRpb24gc2V0U3BlZWQ6cHJvcGVydGllcy5zcGVlZF07CisgICAgW2NhQW5pbWF0aW9uIHNl
dEF1dG9yZXZlcnNlczpwcm9wZXJ0aWVzLmF1dG9SZXZlcnNlc107CisgICAgW2NhQW5pbWF0aW9u
IHNldFJlbW92ZWRPbkNvbXBsZXRpb246cHJvcGVydGllcy5yZW1vdmVkT25Db21wbGV0aW9uXTsK
KyAgICBbY2FBbmltYXRpb24gc2V0QWRkaXRpdmU6cHJvcGVydGllcy5hZGRpdGl2ZV07CisgICAg
CisgICAgaWYgKHByb3BlcnRpZXMuZmlsbE1vZGUgIT0gUGxhdGZvcm1DQUFuaW1hdGlvbjo6Tm9G
aWxsTW9kZSkKKyAgICAgICAgW2NhQW5pbWF0aW9uIHNldEZpbGxNb2RlOnRvQ0FGaWxsTW9kZVR5
cGUocHJvcGVydGllcy5maWxsTW9kZSldOworCisgICAgaWYgKHByb3BlcnRpZXMudmFsdWVGdW5j
dGlvbiAhPSBQbGF0Zm9ybUNBQW5pbWF0aW9uOjpOb1ZhbHVlRnVuY3Rpb24pCisgICAgICAgIFtj
YUFuaW1hdGlvbiBzZXRWYWx1ZUZ1bmN0aW9uOltDQVZhbHVlRnVuY3Rpb24gZnVuY3Rpb25XaXRo
TmFtZTp0b0NBVmFsdWVGdW5jdGlvblR5cGUocHJvcGVydGllcy52YWx1ZUZ1bmN0aW9uKV1dOwor
ICAgIAorICAgIGlmIChwcm9wZXJ0aWVzLmhhc0V4cGxpY2l0QmVnaW5UaW1lKQorICAgICAgICBb
Y2FBbmltYXRpb24gc2V0VmFsdWU6QFlFUyBmb3JLZXk6V0tFeHBsaWNpdEJlZ2luVGltZUZsYWdd
OworICAgIAorICAgIGlmIChsYXllclRyZWVIb3N0KSB7CisgICAgICAgIEdyYXBoaWNzTGF5ZXI6
OlBsYXRmb3JtTGF5ZXJJRCBsYXllcklEID0gUmVtb3RlTGF5ZXJUcmVlSG9zdDo6bGF5ZXJJRChs
YXllcik7CisgICAgCisgICAgICAgIFJldGFpblB0cjxXS0FuaW1hdGlvbkRlbGVnYXRlPiYgZGVs
ZWdhdGUgPSBsYXllclRyZWVIb3N0LT5hbmltYXRpb25EZWxlZ2F0ZXMoKS5hZGQobGF5ZXJJRCwg
bnVsbHB0cikuaXRlcmF0b3ItPnZhbHVlOworICAgICAgICBpZiAoIWRlbGVnYXRlKQorICAgICAg
ICAgICAgZGVsZWdhdGUgPSBhZG9wdE5TKFtbV0tBbmltYXRpb25EZWxlZ2F0ZSBhbGxvY10gaW5p
dFdpdGhMYXllcklEOmxheWVySUQgbGF5ZXJUcmVlSG9zdDpsYXllclRyZWVIb3N0XSk7CisKKyAg
ICAgICAgW2NhQW5pbWF0aW9uIHNldERlbGVnYXRlOmRlbGVnYXRlLmdldCgpXTsKKyAgICB9Cisg
ICAgCisgICAgW2xheWVyIGFkZEFuaW1hdGlvbjpjYUFuaW1hdGlvbi5nZXQoKSBmb3JLZXk6a2V5
XTsKK30KKwordm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjp1cGRhdGVMYXllckFuaW1h
dGlvbnMoQ0FMYXllciAqbGF5ZXIsIFJlbW90ZUxheWVyVHJlZUhvc3QqIGxheWVyVHJlZUhvc3Qs
IGNvbnN0IEFuaW1hdGlvbnNMaXN0JiBhbmltYXRpb25zVG9BZGQsIGNvbnN0IEhhc2hTZXQ8U3Ry
aW5nPiYgYW5pbWF0aW9uc1RvUmVtb3ZlKQoreworICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBU
SU9OUzsKKworICAgIGZvciAoY29uc3QgYXV0byYgdmFsdWUgOiBhbmltYXRpb25zVG9SZW1vdmUp
CisgICAgICAgIFtsYXllciByZW1vdmVBbmltYXRpb25Gb3JLZXk6dmFsdWVdOworCisgICAgZm9y
IChjb25zdCBhdXRvJiBrZXlBbmltYXRpb25QYWlyIDogYW5pbWF0aW9uc1RvQWRkKQorICAgICAg
ICBhZGRBbmltYXRpb25Ub0xheWVyKGxheWVyLCBsYXllclRyZWVIb3N0LCBrZXlBbmltYXRpb25Q
YWlyLmZpcnN0LCBrZXlBbmltYXRpb25QYWlyLnNlY29uZCk7CisKKyAgICBFTkRfQkxPQ0tfT0JK
Q19FWENFUFRJT05TOworfQorCitUZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFRleHRTdHJlYW0mdHMs
IGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWUmIHZhbHVlKQor
eworICAgIHN3aXRjaCAodmFsdWUua2V5ZnJhbWVUeXBlKCkpIHsKKyAgICBjYXNlIFBsYXRmb3Jt
Q0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6Ok51bWJlcktleVR5cGU6CisgICAgICAg
IHRzIDw8ICJudW1iZXI9IiA8PCB2YWx1ZS5udW1iZXJWYWx1ZSgpOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6OkNvbG9y
S2V5VHlwZToKKyAgICAgICAgdHMgPDwgImNvbG9yPSI7CisgICAgICAgIHRzIDw8IHZhbHVlLmNv
bG9yVmFsdWUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlOjpLZXlmcmFtZVZhbHVlOjpQb2ludEtleVR5cGU6CisgICAgICAgIHRzIDw8ICJwb2lu
dD0iOworICAgICAgICB0cyA8PCB2YWx1ZS5wb2ludFZhbHVlKCk7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6VHJhbnNm
b3JtS2V5VHlwZToKKyAgICAgICAgdHMgPDwgInRyYW5zZm9ybT0iOworICAgICAgICB0cyA8PCB2
YWx1ZS50cmFuc2Zvcm1WYWx1ZSgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBsYXRmb3Jt
Q0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6OkZpbHRlcktleVR5cGU6CisgICAgICAg
IHRzIDw8ICJmaWx0ZXI9IjsKKyAgICAgICAgaWYgKHZhbHVlLmZpbHRlclZhbHVlKCkpCisgICAg
ICAgICAgICB0cyA8PCAqdmFsdWUuZmlsdGVyVmFsdWUoKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgdHMgPDwgIm51bGwiOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHRz
OworfQorCitUZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFRleHRTdHJlYW0mIHRzLCBjb25zdCBQbGF0
Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpQcm9wZXJ0aWVzJiBhbmltYXRpb24pCit7CisgICAgdHMg
PDwgInR5cGU9IjsKKyAgICB0cyA8PCBhbmltYXRpb24uYW5pbWF0aW9uVHlwZTsKKyAgICB0cyA8
PCAiIGtleVBhdGg9IjsKKyAgICB0cyA8PCBhbmltYXRpb24ua2V5UGF0aDsKKworICAgIGlmIChh
bmltYXRpb24uYmVnaW5UaW1lKQorICAgICAgICB0cy5kdW1wUHJvcGVydHkoImJlZ2luVGltZSIs
IGFuaW1hdGlvbi5iZWdpblRpbWUpOworCisgICAgaWYgKGFuaW1hdGlvbi5kdXJhdGlvbikKKyAg
ICAgICAgdHMuZHVtcFByb3BlcnR5KCJkdXJhdGlvbiIsIGFuaW1hdGlvbi5kdXJhdGlvbik7CisK
KyAgICBpZiAoYW5pbWF0aW9uLnRpbWVPZmZzZXQpCisgICAgICAgIHRzLmR1bXBQcm9wZXJ0eSgi
dGltZU9mZnNldCIsIGFuaW1hdGlvbi50aW1lT2Zmc2V0KTsKKworICAgIHRzLmR1bXBQcm9wZXJ0
eSgicmVwZWF0Q291bnQiLCBhbmltYXRpb24ucmVwZWF0Q291bnQpOworCisgICAgaWYgKGFuaW1h
dGlvbi5zcGVlZCAhPSAxKQorICAgICAgICB0cy5kdW1wUHJvcGVydHkoInNwZWVkIiwgYW5pbWF0
aW9uLnNwZWVkKTsKKworICAgIHRzLmR1bXBQcm9wZXJ0eSgiZmlsbE1vZGUiLCBhbmltYXRpb24u
ZmlsbE1vZGUpOworICAgIHRzLmR1bXBQcm9wZXJ0eSgidmFsdWVGdW5jdGlvbiIsIGFuaW1hdGlv
bi52YWx1ZUZ1bmN0aW9uKTsKKworICAgIGlmIChhbmltYXRpb24uYXV0b1JldmVyc2VzKQorICAg
ICAgICB0cy5kdW1wUHJvcGVydHkoImF1dG9SZXZlcnNlcyIsIGFuaW1hdGlvbi5hdXRvUmV2ZXJz
ZXMpOworCisgICAgaWYgKCFhbmltYXRpb24ucmVtb3ZlZE9uQ29tcGxldGlvbikKKyAgICAgICAg
dHMuZHVtcFByb3BlcnR5KCJyZW1vdmVkT25Db21wbGV0aW9uIiwgYW5pbWF0aW9uLnJlbW92ZWRP
bkNvbXBsZXRpb24pOworCisgICAgaWYgKGFuaW1hdGlvbi5hZGRpdGl2ZSkKKyAgICAgICAgdHMu
ZHVtcFByb3BlcnR5KCJhZGRpdGl2ZSIsIGFuaW1hdGlvbi5hZGRpdGl2ZSk7CisKKyAgICBpZiAo
YW5pbWF0aW9uLnJldmVyc2VUaW1pbmdGdW5jdGlvbnMpCisgICAgICAgIHRzLmR1bXBQcm9wZXJ0
eSgicmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyIsIGFuaW1hdGlvbi5yZXZlcnNlVGltaW5nRnVuY3Rp
b25zKTsKKworICAgIGlmIChhbmltYXRpb24uaGFzRXhwbGljaXRCZWdpblRpbWUpCisgICAgICAg
IHRzLmR1bXBQcm9wZXJ0eSgiaGFzRXhwbGljaXRCZWdpblRpbWUiLCBhbmltYXRpb24uaGFzRXhw
bGljaXRCZWdpblRpbWUpOworCisgICAgdHMgPDwgIlxuIjsKKyAgICB0cy5pbmNyZWFzZUluZGVu
dCgpOworICAgIHRzLndyaXRlSW5kZW50KCk7CisgICAgdHMgPDwgIigiIDw8ICJrZXlmcmFtZXMi
OworICAgIHRzLmluY3JlYXNlSW5kZW50KCk7CisKKyAgICBzaXplX3QgbWF4RnJhbWVzID0gc3Rk
OjptYXgoYW5pbWF0aW9uLmtleVZhbHVlcy5zaXplKCksIGFuaW1hdGlvbi5rZXlUaW1lcy5zaXpl
KCkpOworICAgIG1heEZyYW1lcyA9IHN0ZDo6bWF4KG1heEZyYW1lcywgYW5pbWF0aW9uLnRpbWlu
Z0Z1bmN0aW9ucy5zaXplKCkpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXhGcmFt
ZXM7ICsraSkgeworICAgICAgICB0cyA8PCAiXG4iOworICAgICAgICB0cy53cml0ZUluZGVudCgp
OworICAgICAgICB0cyA8PCAiKGtleWZyYW1lICIgPDwgdW5zaWduZWQoaSk7CisgICAgICAgIGlm
IChpIDwgYW5pbWF0aW9uLmtleVRpbWVzLnNpemUoKSkKKyAgICAgICAgICAgIHRzLmR1bXBQcm9w
ZXJ0eSgidGltZSIsIGFuaW1hdGlvbi5rZXlUaW1lc1tpXSk7CisKKyAgICAgICAgaWYgKGkgPCBh
bmltYXRpb24udGltaW5nRnVuY3Rpb25zLnNpemUoKSAmJiBhbmltYXRpb24udGltaW5nRnVuY3Rp
b25zW2ldKQorICAgICAgICAgICAgdHMuZHVtcFByb3BlcnR5PGNvbnN0IFRpbWluZ0Z1bmN0aW9u
Jj4oInRpbWluZyBmdW5jdGlvbiIsICphbmltYXRpb24udGltaW5nRnVuY3Rpb25zW2ldKTsKKwor
ICAgICAgICBpZiAoaSA8IGFuaW1hdGlvbi5rZXlWYWx1ZXMuc2l6ZSgpKQorICAgICAgICAgICAg
dHMuZHVtcFByb3BlcnR5KCJ2YWx1ZSIsIGFuaW1hdGlvbi5rZXlWYWx1ZXNbaV0pOworCisgICAg
ICAgIHRzIDw8ICIpIjsKKyAgICB9CisKKyAgICB0cy5kZWNyZWFzZUluZGVudCgpOworICAgIHRz
LmRlY3JlYXNlSW5kZW50KCk7CisKKyAgICByZXR1cm4gdHM7Cit9CisKK30gLy8gbmFtZXNwYWNl
IFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVt
b3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dl
YlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUGxhdGZvcm1DQUxheWVyUmVtb3RlLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi4wZDE0ZWVkODExNzcwZmZkMDQ5NTFlOTJiMDEyMTM1NjZjNWUwYmRmCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3Rl
TGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5jcHAKQEAgLTAsMCArMSw4NTMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW1wb3J0ICJQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaCIKKworI2ltcG9ydCAiUGxh
dGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tLmgiCisjaW1wb3J0ICJQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGVUaWxlZEJhY2tpbmcuaCIKKyNpbXBvcnQgIlJlbW90ZUxheWVyQmFja2luZ1N0b3JlLmgiCisj
aW1wb3J0ICJSZW1vdGVMYXllclRyZWVDb250ZXh0LmgiCisjaW1wb3J0ICJSZW1vdGVMYXllclRy
ZWVQcm9wZXJ0eUFwcGxpZXIuaCIKKyNpbXBvcnQgPFdlYkNvcmUvQW5pbWF0aW9uVXRpbGl0aWVz
Lmg+CisjaW1wb3J0IDxXZWJDb3JlL0dyYXBoaWNzQ29udGV4dC5oPgorI2ltcG9ydCA8V2ViQ29y
ZS9HcmFwaGljc0xheWVyQ0EuaD4KKyNpbXBvcnQgPFdlYkNvcmUvTGVuZ3RoRnVuY3Rpb25zLmg+
CisjaW1wb3J0IDxXZWJDb3JlL1BsYXRmb3JtQ0FGaWx0ZXJzLmg+CisjaW1wb3J0IDxXZWJDb3Jl
L1BsYXRmb3JtQ0FMYXllckNvY29hLmg+CisjaW1wb3J0IDxXZWJDb3JlL1RpbGVkQmFja2luZy5o
PgorI2ltcG9ydCA8d3RmL0N1cnJlbnRUaW1lLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OworCituYW1lc3BhY2UgV2ViS2l0IHsKKworUmVmPFBsYXRmb3JtQ0FMYXllclJlbW90ZT4gUGxh
dGZvcm1DQUxheWVyUmVtb3RlOjpjcmVhdGUoTGF5ZXJUeXBlIGxheWVyVHlwZSwgUGxhdGZvcm1D
QUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCkKK3sK
KyAgICBSZWZQdHI8UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBsYXllcjsKKworICAgIGlmIChsYXll
clR5cGUgPT0gTGF5ZXJUeXBlVGlsZWRCYWNraW5nTGF5ZXIgfHwgIGxheWVyVHlwZSA9PSBMYXll
clR5cGVQYWdlVGlsZWRCYWNraW5nTGF5ZXIpCisgICAgICAgIGxheWVyID0gYWRvcHRSZWYobmV3
IFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZyhsYXllclR5cGUsIG93bmVyLCBjb250
ZXh0KSk7CisgICAgZWxzZQorICAgICAgICBsYXllciA9IGFkb3B0UmVmKG5ldyBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGUobGF5ZXJUeXBlLCBvd25lciwgY29udGV4dCkpOworCisgICAgY29udGV4dC5s
YXllcldhc0NyZWF0ZWQoKmxheWVyLCBsYXllclR5cGUpOworCisgICAgcmV0dXJuIGxheWVyLnJl
bGVhc2VOb25OdWxsKCk7Cit9CisKK1JlZjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+IFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6Y3JlYXRlKFBsYXRmb3JtTGF5ZXIgKnBsYXRmb3JtTGF5ZXIsIFBsYXRm
b3JtQ0FMYXllckNsaWVudCogb3duZXIsIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmIGNvbnRleHQp
Cit7CisgICAgcmV0dXJuIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6Y3JlYXRlKHBsYXRm
b3JtTGF5ZXIsIG93bmVyLCBjb250ZXh0KTsKK30KKworUmVmPFBsYXRmb3JtQ0FMYXllclJlbW90
ZT4gUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjcmVhdGUoY29uc3QgUGxhdGZvcm1DQUxheWVyUmVt
b3RlJiBvdGhlciwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3Rl
TGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCkKK3sKKyAgICBhdXRvIGxheWVyID0gYWRvcHRSZWYo
Km5ldyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUob3RoZXIsIG93bmVyLCBjb250ZXh0KSk7CisKKyAg
ICBjb250ZXh0LmxheWVyV2FzQ3JlYXRlZChsYXllci5nZXQoKSwgb3RoZXIubGF5ZXJUeXBlKCkp
OworCisgICAgcmV0dXJuIGxheWVyOworfQorCitQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OlBsYXRm
b3JtQ0FMYXllclJlbW90ZShMYXllclR5cGUgbGF5ZXJUeXBlLCBQbGF0Zm9ybUNBTGF5ZXJDbGll
bnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250ZXh0KQorICAgIDogUGxhdGZv
cm1DQUxheWVyKGxheWVyVHlwZSwgb3duZXIpCisgICAgLCBtX2NvbnRleHQoJmNvbnRleHQpCit7
CisgICAgaWYgKG93bmVyICYmIGxheWVyVHlwZSAhPSBMYXllclR5cGVDb250ZW50c1Byb3ZpZGVk
TGF5ZXIgJiYgbGF5ZXJUeXBlICE9IExheWVyVHlwZVRyYW5zZm9ybUxheWVyKSB7CisgICAgICAg
IG1fcHJvcGVydGllcy5jb250ZW50c1NjYWxlID0gb3duZXItPnBsYXRmb3JtQ0FMYXllckRldmlj
ZVNjYWxlRmFjdG9yKCk7CisgICAgICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5n
ZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNvbnRlbnRzU2NhbGVDaGFuZ2VkKTsKKyAg
ICB9Cit9CisKK1BsYXRmb3JtQ0FMYXllclJlbW90ZTo6UGxhdGZvcm1DQUxheWVyUmVtb3RlKGNv
bnN0IFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgb3RoZXIsIFBsYXRmb3JtQ0FMYXllckNsaWVudCog
b3duZXIsIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmIGNvbnRleHQpCisgICAgOiBQbGF0Zm9ybUNB
TGF5ZXIob3RoZXIubGF5ZXJUeXBlKCksIG93bmVyKQorICAgICwgbV9hY2NlbGVyYXRlc0RyYXdp
bmcob3RoZXIuYWNjZWxlcmF0ZXNEcmF3aW5nKCkpCisgICAgLCBtX2NvbnRleHQoJmNvbnRleHQp
Cit7Cit9CisKK1JlZjxQbGF0Zm9ybUNBTGF5ZXI+IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y2xv
bmUoUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikgY29uc3QKK3sKKyAgICBhdXRvIGNsb25l
ID0gUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjcmVhdGUoKnRoaXMsIG93bmVyLCAqbV9jb250ZXh0
KTsKKworICAgIHVwZGF0ZUNsb25lZExheWVyUHJvcGVydGllcyhjbG9uZSk7CisKKyAgICBjbG9u
ZS0+c2V0Q2xvbmVkTGF5ZXIodGhpcyk7CisgICAgcmV0dXJuIFdURk1vdmUoY2xvbmUpOworfQor
CitQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6On5QbGF0Zm9ybUNBTGF5ZXJSZW1vdGUoKQoreworICAg
IGZvciAoY29uc3QgYXV0byYgbGF5ZXIgOiBtX2NoaWxkcmVuKQorICAgICAgICBkb3duY2FzdDxQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU+KCpsYXllcikubV9zdXBlcmxheWVyID0gbnVsbHB0cjsKKwor
ICAgIGlmIChtX2NvbnRleHQpCisgICAgICAgIG1fY29udGV4dC0+bGF5ZXJXaWxsQmVEZXN0cm95
ZWQoKnRoaXMpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6dXBkYXRlQ2xvbmVk
TGF5ZXJQcm9wZXJ0aWVzKFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgY2xvbmUsIGJvb2wgY29weUNv
bnRlbnRzKSBjb25zdAoreworICAgIGNsb25lLnNldFBvc2l0aW9uKHBvc2l0aW9uKCkpOworICAg
IGNsb25lLnNldEJvdW5kcyhib3VuZHMoKSk7CisgICAgY2xvbmUuc2V0QW5jaG9yUG9pbnQoYW5j
aG9yUG9pbnQoKSk7CisKKyAgICBpZiAobV9wcm9wZXJ0aWVzLnRyYW5zZm9ybSkKKyAgICAgICAg
Y2xvbmUuc2V0VHJhbnNmb3JtKCptX3Byb3BlcnRpZXMudHJhbnNmb3JtKTsKKworICAgIGlmICht
X3Byb3BlcnRpZXMuc3VibGF5ZXJUcmFuc2Zvcm0pCisgICAgICAgIGNsb25lLnNldFN1YmxheWVy
VHJhbnNmb3JtKCptX3Byb3BlcnRpZXMuc3VibGF5ZXJUcmFuc2Zvcm0pOworCisgICAgaWYgKGNv
cHlDb250ZW50cykKKyAgICAgICAgY2xvbmUuc2V0Q29udGVudHMoY29udGVudHMoKSk7CisKKyAg
ICBjbG9uZS5zZXRNYXNrc1RvQm91bmRzKG1hc2tzVG9Cb3VuZHMoKSk7CisgICAgY2xvbmUuc2V0
RG91YmxlU2lkZWQoaXNEb3VibGVTaWRlZCgpKTsKKyAgICBjbG9uZS5zZXRPcGFxdWUoaXNPcGFx
dWUoKSk7CisgICAgY2xvbmUuc2V0QmFja2dyb3VuZENvbG9yKGJhY2tncm91bmRDb2xvcigpKTsK
KyAgICBjbG9uZS5zZXRDb250ZW50c1NjYWxlKGNvbnRlbnRzU2NhbGUoKSk7CisgICAgY2xvbmUu
c2V0Q29ybmVyUmFkaXVzKGNvcm5lclJhZGl1cygpKTsKKworICAgIGlmICghbV9wcm9wZXJ0aWVz
LnNoYXBlUGF0aC5pc051bGwoKSkKKyAgICAgICAgY2xvbmUuc2V0U2hhcGVQYXRoKG1fcHJvcGVy
dGllcy5zaGFwZVBhdGgpOworCisgICAgaWYgKG1fcHJvcGVydGllcy5zaGFwZVJvdW5kZWRSZWN0
KQorICAgICAgICBjbG9uZS5zZXRTaGFwZVJvdW5kZWRSZWN0KCptX3Byb3BlcnRpZXMuc2hhcGVS
b3VuZGVkUmVjdCk7CisKKyAgICBpZiAobV9wcm9wZXJ0aWVzLmZpbHRlcnMpCisgICAgICAgIGNs
b25lLmNvcHlGaWx0ZXJzRnJvbSgqdGhpcyk7CisKKyAgICBjbG9uZS51cGRhdGVDdXN0b21BcHBl
YXJhbmNlKGN1c3RvbUFwcGVhcmFuY2UoKSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjpyZWN1cnNpdmVCdWlsZFRyYW5zYWN0aW9uKFJlbW90ZUxheWVyVHJlZUNvbnRleHQmIGNv
bnRleHQsIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uJiB0cmFuc2FjdGlvbikKK3sKKyAgICBB
U1NFUlQoIW1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUgfHwgb3duZXIoKSk7CisgICAgQVNTRVJU
X1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oJmNvbnRleHQgPT0gbV9jb250ZXh0KTsKKyAgICAK
KyAgICBpZiAobV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZSAmJiAoIW93bmVyKCkgfHwgIW93bmVy
KCktPnBsYXRmb3JtQ0FMYXllckRyYXdzQ29udGVudCgpKSkgeworICAgICAgICBtX3Byb3BlcnRp
ZXMuYmFja2luZ1N0b3JlID0gbnVsbHB0cjsKKyAgICAgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9w
ZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6QmFja2luZ1N0b3JlQ2hh
bmdlZCk7CisgICAgfQorCisgICAgaWYgKG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUgJiYgbV9w
cm9wZXJ0aWVzLmJhY2tpbmdTdG9yZUF0dGFjaGVkICYmIG1fcHJvcGVydGllcy5iYWNraW5nU3Rv
cmUtPmRpc3BsYXkoKSkKKyAgICAgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdl
ZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6QmFja2luZ1N0b3JlQ2hhbmdlZCk7CisKKyAg
ICBpZiAobV9wcm9wZXJ0aWVzLmNoYW5nZWRQcm9wZXJ0aWVzICE9IFJlbW90ZUxheWVyVHJlZVRy
YW5zYWN0aW9uOjpOb0NoYW5nZSkgeworICAgICAgICBpZiAobV9wcm9wZXJ0aWVzLmNoYW5nZWRQ
cm9wZXJ0aWVzICYgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNoaWxkcmVuQ2hhbmdlZCkg
eworICAgICAgICAgICAgbV9wcm9wZXJ0aWVzLmNoaWxkcmVuLnJlc2l6ZShtX2NoaWxkcmVuLnNp
emUoKSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fY2hpbGRyZW4uc2l6
ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgbV9wcm9wZXJ0aWVzLmNoaWxkcmVuW2ldID0gbV9j
aGlsZHJlbltpXS0+bGF5ZXJJRCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzUGxhdGZv
cm1DQUxheWVyUmVtb3RlQ3VzdG9tKCkpIHsKKyAgICAgICAgICAgIFJlbW90ZUxheWVyVHJlZVBy
b3BlcnR5QXBwbGllcjo6YXBwbHlQcm9wZXJ0aWVzKHBsYXRmb3JtTGF5ZXIoKSwgbnVsbHB0ciwg
bV9wcm9wZXJ0aWVzLCBSZW1vdGVMYXllclRyZWVQcm9wZXJ0eUFwcGxpZXI6OlJlbGF0ZWRMYXll
ck1hcCgpLCBSZW1vdGVMYXllckJhY2tpbmdTdG9yZTo6TGF5ZXJDb250ZW50c1R5cGU6OkNBTWFj
aFBvcnQpOworICAgICAgICAgICAgZGlkQ29tbWl0KCk7CisgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgIH0KKworICAgICAgICB0cmFuc2FjdGlvbi5sYXllclByb3BlcnRpZXNDaGFuZ2VkKCp0
aGlzKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fY2hpbGRyZW4uc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlJiBjaGlsZCA9IGRvd25j
YXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4oKm1fY2hpbGRyZW5baV0pOworICAgICAgICBBU1NF
UlQoY2hpbGQuc3VwZXJsYXllcigpID09IHRoaXMpOworICAgICAgICBjaGlsZC5yZWN1cnNpdmVC
dWlsZFRyYW5zYWN0aW9uKGNvbnRleHQsIHRyYW5zYWN0aW9uKTsKKyAgICB9CisKKyAgICBpZiAo
bV9tYXNrTGF5ZXIpCisgICAgICAgIG1fbWFza0xheWVyLT5yZWN1cnNpdmVCdWlsZFRyYW5zYWN0
aW9uKGNvbnRleHQsIHRyYW5zYWN0aW9uKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6OmRpZENvbW1pdCgpCit7CisgICAgbV9wcm9wZXJ0aWVzLmFkZGVkQW5pbWF0aW9ucy5jbGVh
cigpOworICAgIG1fcHJvcGVydGllcy5rZXlQYXRoc09mQW5pbWF0aW9uc1RvUmVtb3ZlLmNsZWFy
KCk7CisgICAgbV9wcm9wZXJ0aWVzLnJlc2V0Q2hhbmdlZFByb3BlcnRpZXMoKTsKK30KKwordm9p
ZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmVuc3VyZUJhY2tpbmdTdG9yZSgpCit7CisgICAgQVNT
RVJUKG93bmVyKCkpOworICAgIAorICAgIGlmICghbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZSkK
KyAgICAgICAgbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZSA9IHN0ZDo6bWFrZV91bmlxdWU8UmVt
b3RlTGF5ZXJCYWNraW5nU3RvcmU+KHRoaXMpOworCisgICAgdXBkYXRlQmFja2luZ1N0b3JlKCk7
Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjp1cGRhdGVCYWNraW5nU3RvcmUoKQor
eworICAgIGlmICghbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZS0+ZW5zdXJlQmFja2luZ1N0b3JlKG1fcHJv
cGVydGllcy5ib3VuZHMuc2l6ZSgpLCBtX3Byb3BlcnRpZXMuY29udGVudHNTY2FsZSwgbV9hY2Nl
bGVyYXRlc0RyYXdpbmcsIG1fd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUsIG1fcHJvcGVydGll
cy5vcGFxdWUpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TmVlZHNEaXNw
bGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBlbnN1cmVCYWNraW5nU3Rv
cmUoKTsKKworICAgIC8vIEZJWE1FOiBOZWVkIHRvIG1hcCB0aGlzIHRocm91Z2ggY29udGVudHNS
ZWN0L2V0Yy4KKyAgICBtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlLT5zZXROZWVkc0Rpc3BsYXko
ZW5jbG9zaW5nSW50UmVjdChyZWN0KSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
OjpzZXROZWVkc0Rpc3BsYXkoKQoreworICAgIGVuc3VyZUJhY2tpbmdTdG9yZSgpOworCisgICAg
bV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZS0+c2V0TmVlZHNEaXNwbGF5KCk7Cit9CisKK3ZvaWQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjb3B5Q29udGVudHNGcm9tTGF5ZXIoUGxhdGZvcm1DQUxh
eWVyKiBsYXllcikKK3sKKyAgICBBU1NFUlQobV9wcm9wZXJ0aWVzLmNsb25lZExheWVySUQgPT0g
bGF5ZXItPmxheWVySUQoKSk7CisgICAgCisgICAgaWYgKCFtX3Byb3BlcnRpZXMuY2hhbmdlZFBy
b3BlcnRpZXMpCisgICAgICAgIG1fY29udGV4dC0+bGF5ZXJQcm9wZXJ0eUNoYW5nZWRXaGlsZUJ1
aWxkaW5nVHJhbnNhY3Rpb24oKnRoaXMpOworCisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0
aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q2xvbmVkQ29udGVudHNDaGFu
Z2VkKTsKK30KKworUGxhdGZvcm1DQUxheWVyKiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnN1cGVy
bGF5ZXIoKSBjb25zdAoreworICAgIHJldHVybiBtX3N1cGVybGF5ZXI7Cit9CisKK3ZvaWQgUGxh
dGZvcm1DQUxheWVyUmVtb3RlOjpyZW1vdmVGcm9tU3VwZXJsYXllcigpCit7CisgICAgaWYgKCFt
X3N1cGVybGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIG1fc3VwZXJsYXllci0+cmVtb3Zl
U3VibGF5ZXIodGhpcyk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpyZW1vdmVT
dWJsYXllcihQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUqIGxheWVyKQoreworICAgIHNpemVfdCBjaGls
ZEluZGV4ID0gbV9jaGlsZHJlbi5maW5kKGxheWVyKTsKKyAgICBpZiAoY2hpbGRJbmRleCAhPSBu
b3RGb3VuZCkKKyAgICAgICAgbV9jaGlsZHJlbi5yZW1vdmUoY2hpbGRJbmRleCk7CisgICAgbGF5
ZXItPm1fc3VwZXJsYXllciA9IG51bGxwdHI7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0
aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q2hpbGRyZW5DaGFuZ2VkKTsK
K30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFN1YmxheWVycyhjb25zdCBQbGF0
Zm9ybUNBTGF5ZXJMaXN0JiBsaXN0KQoreworICAgIHJlbW92ZUFsbFN1YmxheWVycygpOworICAg
IG1fY2hpbGRyZW4gPSBsaXN0OworCisgICAgZm9yIChjb25zdCBhdXRvJiBsYXllciA6IGxpc3Qp
IHsKKyAgICAgICAgbGF5ZXItPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgICAgIGRvd25j
YXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4oKmxheWVyKS5tX3N1cGVybGF5ZXIgPSB0aGlzOwor
ICAgIH0KKworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5
ZXJUcmVlVHJhbnNhY3Rpb246OkNoaWxkcmVuQ2hhbmdlZCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjpyZW1vdmVBbGxTdWJsYXllcnMoKQoreworICAgIFBsYXRmb3JtQ0FMYXll
ckxpc3QgbGF5ZXJzVG9SZW1vdmUgPSBtX2NoaWxkcmVuOworICAgIGZvciAoY29uc3QgYXV0byYg
bGF5ZXIgOiBsYXllcnNUb1JlbW92ZSkKKyAgICAgICAgbGF5ZXItPnJlbW92ZUZyb21TdXBlcmxh
eWVyKCk7CisgICAgQVNTRVJUKG1fY2hpbGRyZW4uaXNFbXB0eSgpKTsKKyAgICBtX3Byb3BlcnRp
ZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDaGls
ZHJlbkNoYW5nZWQpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6YXBwZW5kU3Vi
bGF5ZXIoUGxhdGZvcm1DQUxheWVyJiBsYXllcikKK3sKKyAgICBSZWY8UGxhdGZvcm1DQUxheWVy
PiBsYXllclByb3RlY3RvcihsYXllcik7CisKKyAgICBsYXllci5yZW1vdmVGcm9tU3VwZXJsYXll
cigpOworICAgIG1fY2hpbGRyZW4uYXBwZW5kKCZsYXllcik7CisgICAgZG93bmNhc3Q8UGxhdGZv
cm1DQUxheWVyUmVtb3RlPihsYXllcikubV9zdXBlcmxheWVyID0gdGhpczsKKyAgICBtX3Byb3Bl
cnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpD
aGlsZHJlbkNoYW5nZWQpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6aW5zZXJ0
U3VibGF5ZXIoUGxhdGZvcm1DQUxheWVyJiBsYXllciwgc2l6ZV90IGluZGV4KQoreworICAgIFJl
ZjxQbGF0Zm9ybUNBTGF5ZXI+IGxheWVyUHJvdGVjdG9yKGxheWVyKTsKKworICAgIGxheWVyLnJl
bW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgbV9jaGlsZHJlbi5pbnNlcnQoaW5kZXgsICZsYXll
cik7CisgICAgZG93bmNhc3Q8UGxhdGZvcm1DQUxheWVyUmVtb3RlPihsYXllcikubV9zdXBlcmxh
eWVyID0gdGhpczsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90
ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDaGlsZHJlbkNoYW5nZWQpOworfQorCit2b2lkIFBsYXRm
b3JtQ0FMYXllclJlbW90ZTo6cmVwbGFjZVN1YmxheWVyKFBsYXRmb3JtQ0FMYXllciYgcmVmZXJl
bmNlLCBQbGF0Zm9ybUNBTGF5ZXImIGxheWVyKQoreworICAgIEFTU0VSVChyZWZlcmVuY2Uuc3Vw
ZXJsYXllcigpID09IHRoaXMpOworICAgIFJlZjxQbGF0Zm9ybUNBTGF5ZXI+IGxheWVyUHJvdGVj
dG9yKGxheWVyKTsKKworICAgIGxheWVyLnJlbW92ZUZyb21TdXBlcmxheWVyKCk7CisgICAgc2l6
ZV90IHJlZmVyZW5jZUluZGV4ID0gbV9jaGlsZHJlbi5maW5kKCZyZWZlcmVuY2UpOworICAgIGlm
IChyZWZlcmVuY2VJbmRleCAhPSBub3RGb3VuZCkgeworICAgICAgICBtX2NoaWxkcmVuW3JlZmVy
ZW5jZUluZGV4XS0+cmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKKyAgICAgICAgbV9jaGlsZHJlbi5p
bnNlcnQocmVmZXJlbmNlSW5kZXgsICZsYXllcik7CisgICAgICAgIGRvd25jYXN0PFBsYXRmb3Jt
Q0FMYXllclJlbW90ZT4obGF5ZXIpLm1fc3VwZXJsYXllciA9IHRoaXM7CisgICAgfQorCisgICAg
bV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2Fj
dGlvbjo6Q2hpbGRyZW5DaGFuZ2VkKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6
OmFkb3B0U3VibGF5ZXJzKFBsYXRmb3JtQ0FMYXllciYgc291cmNlKQoreworICAgIFBsYXRmb3Jt
Q0FMYXllckxpc3QgbGF5ZXJzVG9Nb3ZlID0gZG93bmNhc3Q8UGxhdGZvcm1DQUxheWVyUmVtb3Rl
Pihzb3VyY2UpLm1fY2hpbGRyZW47CisKKyAgICBpZiAoY29uc3QgUGxhdGZvcm1DQUxheWVyTGlz
dCogY3VzdG9tTGF5ZXJzID0gc291cmNlLmN1c3RvbVN1YmxheWVycygpKSB7CisgICAgICAgIGZv
ciAoY29uc3QgYXV0byYgbGF5ZXIgOiAqY3VzdG9tTGF5ZXJzKSB7CisgICAgICAgICAgICBzaXpl
X3QgbGF5ZXJJbmRleCA9IGxheWVyc1RvTW92ZS5maW5kKGxheWVyKTsKKyAgICAgICAgICAgIGlm
IChsYXllckluZGV4ICE9IG5vdEZvdW5kKQorICAgICAgICAgICAgICAgIGxheWVyc1RvTW92ZS5y
ZW1vdmUobGF5ZXJJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzZXRTdWJsYXllcnMo
bGF5ZXJzVG9Nb3ZlKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmFkZEFuaW1h
dGlvbkZvcktleShjb25zdCBTdHJpbmcmIGtleSwgUGxhdGZvcm1DQUFuaW1hdGlvbiYgYW5pbWF0
aW9uKQoreworICAgIGF1dG8gYWRkUmVzdWx0ID0gbV9hbmltYXRpb25zLnNldChrZXksICZhbmlt
YXRpb24pOworICAgIGlmIChhZGRSZXN1bHQuaXNOZXdFbnRyeSkKKyAgICAgICAgbV9wcm9wZXJ0
aWVzLmFkZGVkQW5pbWF0aW9ucy5hcHBlbmQoc3RkOjpwYWlyPFN0cmluZywgUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZTo6UHJvcGVydGllcz4oa2V5LCBkb3duY2FzdDxQbGF0Zm9ybUNBQW5pbWF0
aW9uUmVtb3RlPihhbmltYXRpb24pLnByb3BlcnRpZXMoKSkpOworICAgIGVsc2UgeworICAgICAg
ICBmb3IgKGF1dG8mIGtleUFuaW1hdGlvblBhaXIgOiBtX3Byb3BlcnRpZXMuYWRkZWRBbmltYXRp
b25zKSB7CisgICAgICAgICAgICBpZiAoa2V5QW5pbWF0aW9uUGFpci5maXJzdCA9PSBrZXkpIHsK
KyAgICAgICAgICAgICAgICBrZXlBbmltYXRpb25QYWlyLnNlY29uZCA9IGRvd25jYXN0PFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU+KGFuaW1hdGlvbikucHJvcGVydGllcygpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAg
IG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNh
Y3Rpb246OkFuaW1hdGlvbnNDaGFuZ2VkKTsKKworICAgIGlmIChtX2NvbnRleHQpCisgICAgICAg
IG1fY29udGV4dC0+d2lsbFN0YXJ0QW5pbWF0aW9uT25MYXllcigqdGhpcyk7Cit9CisKK3ZvaWQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpyZW1vdmVBbmltYXRpb25Gb3JLZXkoY29uc3QgU3RyaW5n
JiBrZXkpCit7CisgICAgaWYgKG1fYW5pbWF0aW9ucy5yZW1vdmUoa2V5KSkgeworICAgICAgICBt
X3Byb3BlcnRpZXMuYWRkZWRBbmltYXRpb25zLnJlbW92ZUZpcnN0TWF0Y2hpbmcoWyZrZXldKGF1
dG8mIHBhaXIpIHsKKyAgICAgICAgICAgIHJldHVybiBwYWlyLmZpcnN0ID09IGtleTsKKyAgICAg
ICAgfSk7CisgICAgfQorICAgIG1fcHJvcGVydGllcy5rZXlQYXRoc09mQW5pbWF0aW9uc1RvUmVt
b3ZlLmFkZChrZXkpOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkFuaW1hdGlvbnNDaGFuZ2VkKTsKK30KKworUmVmUHRy
PFBsYXRmb3JtQ0FBbmltYXRpb24+IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6YW5pbWF0aW9uRm9y
S2V5KGNvbnN0IFN0cmluZyYga2V5KQoreworICAgIHJldHVybiBtX2FuaW1hdGlvbnMuZ2V0KGtl
eSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0VxdWl2YWxlbnRMYXllcihjb25zdCBQbGF0
Zm9ybUNBTGF5ZXIqIGxheWVyLCBHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQgbGF5ZXJJ
RCkKK3sKKyAgICBHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQgbmV3TGF5ZXJJRCA9IGxh
eWVyID8gbGF5ZXItPmxheWVySUQoKSA6IDA7CisgICAgcmV0dXJuIGxheWVySUQgPT0gbmV3TGF5
ZXJJRDsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmFuaW1hdGlvblN0YXJ0ZWQo
Y29uc3QgU3RyaW5nJiBrZXksIENGVGltZUludGVydmFsIGJlZ2luVGltZSkKK3sKKyAgICBhdXRv
IGl0ID0gbV9hbmltYXRpb25zLmZpbmQoa2V5KTsKKyAgICBpZiAoaXQgIT0gbV9hbmltYXRpb25z
LmVuZCgpKQorICAgICAgICBkb3duY2FzdDxQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlPigqaXQt
PnZhbHVlKS5kaWRTdGFydChiZWdpblRpbWUpOworICAgIAorICAgIGlmIChtX293bmVyKQorICAg
ICAgICBtX293bmVyLT5wbGF0Zm9ybUNBTGF5ZXJBbmltYXRpb25TdGFydGVkKGtleSwgYmVnaW5U
aW1lKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmFuaW1hdGlvbkVuZGVkKGNv
bnN0IFN0cmluZyYga2V5KQoreworICAgIGlmIChtX293bmVyKQorICAgICAgICBtX293bmVyLT5w
bGF0Zm9ybUNBTGF5ZXJBbmltYXRpb25FbmRlZChrZXkpOworfQorCit2b2lkIFBsYXRmb3JtQ0FM
YXllclJlbW90ZTo6c2V0TWFzayhQbGF0Zm9ybUNBTGF5ZXIqIGxheWVyKQoreworICAgIGlmIChp
c0VxdWl2YWxlbnRMYXllcihsYXllciwgbV9wcm9wZXJ0aWVzLm1hc2tMYXllcklEKSkKKyAgICAg
ICAgcmV0dXJuOworICAgIAorICAgIGlmIChsYXllcikgeworICAgICAgICBtX21hc2tMYXllciA9
IGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4obGF5ZXIpOworICAgICAgICBtX3Byb3Bl
cnRpZXMubWFza0xheWVySUQgPSBtX21hc2tMYXllci0+bGF5ZXJJRCgpOworICAgIH0gZWxzZSB7
CisgICAgICAgIG1fbWFza0xheWVyID0gbnVsbHB0cjsKKyAgICAgICAgbV9wcm9wZXJ0aWVzLm1h
c2tMYXllcklEID0gMDsKKyAgICB9CisKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXND
aGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpNYXNrTGF5ZXJDaGFuZ2VkKTsKK30K
Kwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldENsb25lZExheWVyKGNvbnN0IFBsYXRm
b3JtQ0FMYXllciogbGF5ZXIpCit7CisgICAgaWYgKGlzRXF1aXZhbGVudExheWVyKGxheWVyLCBt
X3Byb3BlcnRpZXMuY2xvbmVkTGF5ZXJJRCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChs
YXllcikKKyAgICAgICAgbV9wcm9wZXJ0aWVzLmNsb25lZExheWVySUQgPSBsYXllci0+bGF5ZXJJ
RCgpOworICAgIGVsc2UKKyAgICAgICAgbV9wcm9wZXJ0aWVzLmNsb25lZExheWVySUQgPSAwOwor
CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6Q2xvbmVkQ29udGVudHNDaGFuZ2VkKTsKK30KKworYm9vbCBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU6OmlzT3BhcXVlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVz
Lm9wYXF1ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldE9wYXF1ZShib29s
IHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5vcGFxdWUgPSB2YWx1ZTsKKyAgICBtX3Byb3Bl
cnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpP
cGFxdWVDaGFuZ2VkKTsKKworICAgIHVwZGF0ZUJhY2tpbmdTdG9yZSgpOworfQorCitGbG9hdFJl
Y3QgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpib3VuZHMoKSBjb25zdAoreworICAgIHJldHVybiBt
X3Byb3BlcnRpZXMuYm91bmRzOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0
Qm91bmRzKGNvbnN0IEZsb2F0UmVjdCYgdmFsdWUpCit7CisgICAgaWYgKHZhbHVlID09IG1fcHJv
cGVydGllcy5ib3VuZHMpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcHJvcGVydGllcy5ib3Vu
ZHMgPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90
ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpCb3VuZHNDaGFuZ2VkKTsKKyAgICAKKyAgICBpZiAocmVx
dWlyZXNDdXN0b21BcHBlYXJhbmNlVXBkYXRlT25Cb3VuZHNDaGFuZ2UoKSkKKyAgICAgICAgbV9w
cm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlv
bjo6Q3VzdG9tQXBwZWFyYW5jZUNoYW5nZWQpOworCisgICAgdXBkYXRlQmFja2luZ1N0b3JlKCk7
Cit9CisKK0Zsb2F0UG9pbnQzRCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnBvc2l0aW9uKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnBvc2l0aW9uOworfQorCit2b2lkIFBsYXRm
b3JtQ0FMYXllclJlbW90ZTo6c2V0UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludDNEJiB2YWx1ZSkK
K3sKKyAgICAvLyBXZSBjYW4ndCBlYXJseSByZXR1cm4gaGVyZSBpZiB0aGUgcG9zaXRpb24gaGFz
IG5vdCBjaGFuZ2VkLCBzaW5jZSBHcmFwaGljc0xheWVyQ0E6OnN5bmNQb3NpdGlvbigpIG1heSBo
YXZlIGNoYW5nZWQKKyAgICAvLyB0aGUgR3JhcGhpY3NMYXllciBwb3NpdGlvbiAod2hpY2ggZG9l
c24ndCBmb3JjZSBhIGdlb21ldHJ5IHVwZGF0ZSkgYnV0IHdlIHdhbnQgYSBzdWJzZXF1ZW50IEdy
YXBoaWNzTGF5ZXJDQTo6c2V0UG9zaXRpb24oKQorICAgIC8vIHRvIHB1c2ggYSBuZXcgcG9zaXRp
b24gdG8gdGhlIFVJIHByb2Nlc3MsIGV2ZW4gdGhvdWdoIG91ciBtX3Byb3BlcnRpZXMucG9zaXRp
b24gaGFzbid0IGNoYW5nZWQuCisgICAgbV9wcm9wZXJ0aWVzLnBvc2l0aW9uID0gdmFsdWU7Cisg
ICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFu
c2FjdGlvbjo6UG9zaXRpb25DaGFuZ2VkKTsKK30KKworRmxvYXRQb2ludDNEIFBsYXRmb3JtQ0FM
YXllclJlbW90ZTo6YW5jaG9yUG9pbnQoKSBjb25zdAoreworICAgIHJldHVybiBtX3Byb3BlcnRp
ZXMuYW5jaG9yUG9pbnQ7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRBbmNo
b3JQb2ludChjb25zdCBGbG9hdFBvaW50M0QmIHZhbHVlKQoreworICAgIGlmICh2YWx1ZSA9PSBt
X3Byb3BlcnRpZXMuYW5jaG9yUG9pbnQpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcHJvcGVy
dGllcy5hbmNob3JQb2ludCA9IHZhbHVlOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGll
c0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkFuY2hvclBvaW50Q2hhbmdlZCk7
Cit9CisKK1RyYW5zZm9ybWF0aW9uTWF0cml4IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6dHJhbnNm
b3JtKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnRyYW5zZm9ybSA/ICptX3By
b3BlcnRpZXMudHJhbnNmb3JtIDogVHJhbnNmb3JtYXRpb25NYXRyaXgoKTsKK30KKwordm9pZCBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLnRyYW5zZm9ybSA9IHN0ZDo6bWFrZV91
bmlxdWU8VHJhbnNmb3JtYXRpb25NYXRyaXg+KHZhbHVlKTsKKyAgICBtX3Byb3BlcnRpZXMubm90
ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpUcmFuc2Zvcm1D
aGFuZ2VkKTsKK30KKworVHJhbnNmb3JtYXRpb25NYXRyaXggUGxhdGZvcm1DQUxheWVyUmVtb3Rl
OjpzdWJsYXllclRyYW5zZm9ybSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5z
dWJsYXllclRyYW5zZm9ybSA/ICptX3Byb3BlcnRpZXMuc3VibGF5ZXJUcmFuc2Zvcm0gOiBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCgpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0
U3VibGF5ZXJUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHZhbHVlKQorewor
ICAgIG1fcHJvcGVydGllcy5zdWJsYXllclRyYW5zZm9ybSA9IHN0ZDo6bWFrZV91bmlxdWU8VHJh
bnNmb3JtYXRpb25NYXRyaXg+KHZhbHVlKTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRp
ZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpTdWJsYXllclRyYW5zZm9ybUNo
YW5nZWQpOworfQorCitib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6aXNIaWRkZW4oKSBjb25z
dAoreworICAgIHJldHVybiBtX3Byb3BlcnRpZXMuaGlkZGVuOworfQorCit2b2lkIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6c2V0SGlkZGVuKGJvb2wgdmFsdWUpCit7CisgICAgaWYgKG1fcHJvcGVy
dGllcy5oaWRkZW4gPT0gdmFsdWUpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcHJvcGVydGll
cy5oaWRkZW4gPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2Vk
KFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpIaWRkZW5DaGFuZ2VkKTsKK30KKworYm9vbCBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNvbnRlbnRzSGlkZGVuKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9wcm9wZXJ0aWVzLmNvbnRlbnRzSGlkZGVuOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXll
clJlbW90ZTo6c2V0Q29udGVudHNIaWRkZW4oYm9vbCB2YWx1ZSkKK3sKKyAgICBpZiAobV9wcm9w
ZXJ0aWVzLmNvbnRlbnRzSGlkZGVuID09IHZhbHVlKQorICAgICAgICByZXR1cm47CisKKyAgICBt
X3Byb3BlcnRpZXMuY29udGVudHNIaWRkZW4gPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90
ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDb250ZW50c0hp
ZGRlbkNoYW5nZWQpOworfQorCitib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6dXNlckludGVy
YWN0aW9uRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy51c2VySW50
ZXJhY3Rpb25FbmFibGVkOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0VXNl
ckludGVyYWN0aW9uRW5hYmxlZChib29sIHZhbHVlKQoreworICAgIGlmIChtX3Byb3BlcnRpZXMu
dXNlckludGVyYWN0aW9uRW5hYmxlZCA9PSB2YWx1ZSkKKyAgICAgICAgcmV0dXJuOworICAgIAor
ICAgIG1fcHJvcGVydGllcy51c2VySW50ZXJhY3Rpb25FbmFibGVkID0gdmFsdWU7CisgICAgbV9w
cm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlv
bjo6VXNlckludGVyYWN0aW9uRW5hYmxlZENoYW5nZWQpOworfQorCit2b2lkIFBsYXRmb3JtQ0FM
YXllclJlbW90ZTo6c2V0QmFja2luZ1N0b3JlQXR0YWNoZWQoYm9vbCB2YWx1ZSkKK3sKKyAgICBp
ZiAobV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZUF0dGFjaGVkID09IHZhbHVlKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlQXR0YWNoZWQgPSB2YWx1ZTsK
KyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRy
YW5zYWN0aW9uOjpCYWNraW5nU3RvcmVBdHRhY2htZW50Q2hhbmdlZCk7Cit9CisKK2Jvb2wgUGxh
dGZvcm1DQUxheWVyUmVtb3RlOjpiYWNraW5nU3RvcmVBdHRhY2hlZCgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmVBdHRhY2hlZDsKK30KKwordm9pZCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEdlb21ldHJ5RmxpcHBlZChib29sIHZhbHVlKQoreworICAg
IG1fcHJvcGVydGllcy5nZW9tZXRyeUZsaXBwZWQgPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMu
bm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpHZW9tZXRy
eUZsaXBwZWRDaGFuZ2VkKTsKK30KKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6Omdlb21l
dHJ5RmxpcHBlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5nZW9tZXRyeUZs
aXBwZWQ7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjppc0RvdWJsZVNpZGVkKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmRvdWJsZVNpZGVkOworfQorCit2b2lk
IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0RG91YmxlU2lkZWQoYm9vbCB2YWx1ZSkKK3sKKyAg
ICBtX3Byb3BlcnRpZXMuZG91YmxlU2lkZWQgPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90
ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpEb3VibGVTaWRl
ZENoYW5nZWQpOworfQorCitib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6bWFza3NUb0JvdW5k
cygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5tYXNrc1RvQm91bmRzOworfQor
Cit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TWFza3NUb0JvdW5kcyhib29sIHZhbHVl
KQoreworICAgIGlmICh2YWx1ZSA9PSBtX3Byb3BlcnRpZXMubWFza3NUb0JvdW5kcykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVzLm1hc2tzVG9Cb3VuZHMgPSB2YWx1ZTsKKyAg
ICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5z
YWN0aW9uOjpNYXNrc1RvQm91bmRzQ2hhbmdlZCk7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjphY2NlbGVyYXRlc0RyYXdpbmcoKSBjb25zdAoreworICAgIHJldHVybiBtX2FjY2Vs
ZXJhdGVzRHJhd2luZzsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEFjY2Vs
ZXJhdGVzRHJhd2luZyhib29sIGFjY2VsZXJhdGVzRHJhd2luZykKK3sKKyAgICBtX2FjY2VsZXJh
dGVzRHJhd2luZyA9IGFjY2VsZXJhdGVzRHJhd2luZzsKKyAgICB1cGRhdGVCYWNraW5nU3RvcmUo
KTsKK30KKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OndhbnRzRGVlcENvbG9yQmFja2lu
Z1N0b3JlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV93YW50c0RlZXBDb2xvckJhY2tpbmdTdG9y
ZTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFdhbnRzRGVlcENvbG9yQmFj
a2luZ1N0b3JlKGJvb2wgd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUpCit7CisgICAgbV93YW50
c0RlZXBDb2xvckJhY2tpbmdTdG9yZSA9IHdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlOworICAg
IHVwZGF0ZUJhY2tpbmdTdG9yZSgpOworfQorCitib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
c3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZh
bHNlOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0U3VwcG9ydHNTdWJwaXhl
bEFudGlhbGlhc2VkVGV4dChib29sKQoreworfQorCitDRlR5cGVSZWYgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjpjb250ZW50cygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3Zv
aWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRDb250ZW50cyhDRlR5cGVSZWYgdmFsdWUpCit7
Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRDb250ZW50c1JlY3QoY29uc3Qg
RmxvYXRSZWN0JiB2YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMuY29udGVudHNSZWN0ID0gdmFs
dWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRy
ZWVUcmFuc2FjdGlvbjo6Q29udGVudHNSZWN0Q2hhbmdlZCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjpzZXRNaW5pZmljYXRpb25GaWx0ZXIoRmlsdGVyVHlwZSB2YWx1ZSkKK3sK
KyAgICBtX3Byb3BlcnRpZXMubWluaWZpY2F0aW9uRmlsdGVyID0gdmFsdWU7CisgICAgbV9wcm9w
ZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6
TWluaWZpY2F0aW9uRmlsdGVyQ2hhbmdlZCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjpzZXRNYWduaWZpY2F0aW9uRmlsdGVyKEZpbHRlclR5cGUgdmFsdWUpCit7CisgICAgbV9w
cm9wZXJ0aWVzLm1hZ25pZmljYXRpb25GaWx0ZXIgPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMu
bm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpNYWduaWZp
Y2F0aW9uRmlsdGVyQ2hhbmdlZCk7Cit9CisKK0NvbG9yIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
YmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmJhY2tn
cm91bmRDb2xvcjsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEJhY2tncm91
bmRDb2xvcihjb25zdCBDb2xvciYgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLmJhY2tncm91
bmRDb2xvciA9IHZhbHVlOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQo
UmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkJhY2tncm91bmRDb2xvckNoYW5nZWQpOworfQor
Cit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0Qm9yZGVyV2lkdGgoZmxvYXQgdmFsdWUp
Cit7CisgICAgaWYgKHZhbHVlID09IG1fcHJvcGVydGllcy5ib3JkZXJXaWR0aCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVzLmJvcmRlcldpZHRoID0gdmFsdWU7CisgICAgbV9w
cm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlv
bjo6Qm9yZGVyV2lkdGhDaGFuZ2VkKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6
OnNldEJvcmRlckNvbG9yKGNvbnN0IENvbG9yJiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPT0g
bV9wcm9wZXJ0aWVzLmJvcmRlckNvbG9yKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3Bl
cnRpZXMuYm9yZGVyQ29sb3IgPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRp
ZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpCb3JkZXJDb2xvckNoYW5nZWQp
OworfQorCitmbG9hdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6Om9wYWNpdHkoKSBjb25zdAorewor
ICAgIHJldHVybiBtX3Byb3BlcnRpZXMub3BhY2l0eTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGU6OnNldE9wYWNpdHkoZmxvYXQgdmFsdWUpCit7CisgICAgbV9wcm9wZXJ0aWVzLm9w
YWNpdHkgPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJl
bW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpPcGFjaXR5Q2hhbmdlZCk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1DQUxheWVyUmVtb3RlOjpzZXRGaWx0ZXJzKGNvbnN0IEZpbHRlck9wZXJhdGlvbnMmIGZp
bHRlcnMpCit7CisgICAgbV9wcm9wZXJ0aWVzLmZpbHRlcnMgPSBzdGQ6Om1ha2VfdW5pcXVlPEZp
bHRlck9wZXJhdGlvbnM+KGZpbHRlcnMpOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGll
c0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkZpbHRlcnNDaGFuZ2VkKTsKK30K
Kwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNvcHlGaWx0ZXJzRnJvbShjb25zdCBQbGF0
Zm9ybUNBTGF5ZXImIHNvdXJjZUxheWVyKQoreworICAgIGlmIChjb25zdCBGaWx0ZXJPcGVyYXRp
b25zKiBmaWx0ZXJzID0gZG93bmNhc3Q8UGxhdGZvcm1DQUxheWVyUmVtb3RlPihzb3VyY2VMYXll
cikubV9wcm9wZXJ0aWVzLmZpbHRlcnMuZ2V0KCkpCisgICAgICAgIHNldEZpbHRlcnMoKmZpbHRl
cnMpOworICAgIGVsc2UgaWYgKG1fcHJvcGVydGllcy5maWx0ZXJzKQorICAgICAgICBtX3Byb3Bl
cnRpZXMuZmlsdGVycyA9IG51bGxwdHI7CisKKyAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRp
ZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpGaWx0ZXJzQ2hhbmdlZCk7Cit9
CisKKyNpZiBFTkFCTEUoQ1NTX0NPTVBPU0lUSU5HKQordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6OnNldEJsZW5kTW9kZShCbGVuZE1vZGUgYmxlbmRNb2RlKQoreworICAgIG1fcHJvcGVydGll
cy5ibGVuZE1vZGUgPSBibGVuZE1vZGU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVz
Q2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6QmxlbmRNb2RlQ2hhbmdlZCk7Cit9
CisjZW5kaWYKKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmZpbHRlcnNDYW5CZUNvbXBv
c2l0ZWQoY29uc3QgRmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycykKK3sKKyAgICByZXR1cm4gUGxh
dGZvcm1DQUxheWVyQ29jb2E6OmZpbHRlcnNDYW5CZUNvbXBvc2l0ZWQoZmlsdGVycyk7Cit9CisK
K3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXROYW1lKGNvbnN0IFN0cmluZyYgdmFsdWUp
Cit7CisgICAgbV9wcm9wZXJ0aWVzLm5hbWUgPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMubm90
ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpOYW1lQ2hhbmdl
ZCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRTcGVlZChmbG9hdCB2YWx1
ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMuc3BlZWQgPSB2YWx1ZTsKKyAgICBtX3Byb3BlcnRpZXMu
bm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpTcGVlZENo
YW5nZWQpOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0VGltZU9mZnNldChD
RlRpbWVJbnRlcnZhbCB2YWx1ZSkKK3sKKyAgICBtX3Byb3BlcnRpZXMudGltZU9mZnNldCA9IHZh
bHVlOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJU
cmVlVHJhbnNhY3Rpb246OlRpbWVPZmZzZXRDaGFuZ2VkKTsKK30KKworZmxvYXQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjpjb250ZW50c1NjYWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9w
ZXJ0aWVzLmNvbnRlbnRzU2NhbGU7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpz
ZXRDb250ZW50c1NjYWxlKGZsb2F0IHZhbHVlKQoreworICAgIG1fcHJvcGVydGllcy5jb250ZW50
c1NjYWxlID0gdmFsdWU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChS
ZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q29udGVudHNTY2FsZUNoYW5nZWQpOworCisgICAg
dXBkYXRlQmFja2luZ1N0b3JlKCk7Cit9CisKK2Zsb2F0IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
Y29ybmVyUmFkaXVzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmNvcm5lclJh
ZGl1czsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldENvcm5lclJhZGl1cyhm
bG9hdCB2YWx1ZSkKK3sKKyAgICBpZiAobV9wcm9wZXJ0aWVzLmNvcm5lclJhZGl1cyA9PSB2YWx1
ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9wcm9wZXJ0aWVzLmNvcm5lclJhZGl1cyA9IHZh
bHVlOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJU
cmVlVHJhbnNhY3Rpb246OkNvcm5lclJhZGl1c0NoYW5nZWQpOworfQorCit2b2lkIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6c2V0RWRnZUFudGlhbGlhc2luZ01hc2sodW5zaWduZWQgdmFsdWUpCit7
CisgICAgbV9wcm9wZXJ0aWVzLmVkZ2VBbnRpYWxpYXNpbmdNYXNrID0gdmFsdWU7CisgICAgbV9w
cm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlv
bjo6RWRnZUFudGlhbGlhc2luZ01hc2tDaGFuZ2VkKTsKK30KKworRmxvYXRSb3VuZGVkUmVjdCBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNoYXBlUm91bmRlZFJlY3QoKSBjb25zdAoreworICAgIHJl
dHVybiBtX3Byb3BlcnRpZXMuc2hhcGVSb3VuZGVkUmVjdCA/ICptX3Byb3BlcnRpZXMuc2hhcGVS
b3VuZGVkUmVjdCA6IEZsb2F0Um91bmRlZFJlY3QoRmxvYXRSZWN0KCkpOworfQorCit2b2lkIFBs
YXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0U2hhcGVSb3VuZGVkUmVjdChjb25zdCBGbG9hdFJvdW5k
ZWRSZWN0JiByb3VuZGVkUmVjdCkKK3sKKyAgICBpZiAobV9wcm9wZXJ0aWVzLnNoYXBlUm91bmRl
ZFJlY3QgJiYgKm1fcHJvcGVydGllcy5zaGFwZVJvdW5kZWRSZWN0ID09IHJvdW5kZWRSZWN0KQor
ICAgICAgICByZXR1cm47CisKKyAgICBtX3Byb3BlcnRpZXMuc2hhcGVSb3VuZGVkUmVjdCA9IHN0
ZDo6bWFrZV91bmlxdWU8RmxvYXRSb3VuZGVkUmVjdD4ocm91bmRlZFJlY3QpOworICAgIG1fcHJv
cGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246
OlNoYXBlUm91bmRlZFJlY3RDaGFuZ2VkKTsKK30KKworUGF0aCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6OnNoYXBlUGF0aCgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1fbGF5ZXJUeXBlID09IExheWVy
VHlwZVNoYXBlTGF5ZXIpOworICAgIHJldHVybiBtX3Byb3BlcnRpZXMuc2hhcGVQYXRoOworfQor
Cit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0U2hhcGVQYXRoKGNvbnN0IFBhdGgmIHBh
dGgpCit7CisgICAgQVNTRVJUKG1fbGF5ZXJUeXBlID09IExheWVyVHlwZVNoYXBlTGF5ZXIpOwor
ICAgIG1fcHJvcGVydGllcy5zaGFwZVBhdGggPSBwYXRoOworICAgIG1fcHJvcGVydGllcy5ub3Rl
UHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlNoYXBlUGF0aENo
YW5nZWQpOworfQorCitXaW5kUnVsZSBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNoYXBlV2luZFJ1
bGUoKSBjb25zdAoreworICAgIEFTU0VSVChtX2xheWVyVHlwZSA9PSBMYXllclR5cGVTaGFwZUxh
eWVyKTsKKyAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLndpbmRSdWxlOworfQorCit2b2lkIFBsYXRm
b3JtQ0FMYXllclJlbW90ZTo6c2V0U2hhcGVXaW5kUnVsZShXaW5kUnVsZSB3aW5kUnVsZSkKK3sK
KyAgICBBU1NFUlQobV9sYXllclR5cGUgPT0gTGF5ZXJUeXBlU2hhcGVMYXllcik7CisgICAgbV9w
cm9wZXJ0aWVzLndpbmRSdWxlID0gd2luZFJ1bGU7CisgICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9w
ZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6V2luZFJ1bGVDaGFuZ2Vk
KTsKK30KKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnJlcXVpcmVzQ3VzdG9tQXBwZWFy
YW5jZVVwZGF0ZU9uQm91bmRzQ2hhbmdlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wcm9wZXJ0
aWVzLmN1c3RvbUFwcGVhcmFuY2UgPT0gR3JhcGhpY3NMYXllcjo6U2Nyb2xsaW5nU2hhZG93Owor
fQorCitHcmFwaGljc0xheWVyOjpDdXN0b21BcHBlYXJhbmNlIFBsYXRmb3JtQ0FMYXllclJlbW90
ZTo6Y3VzdG9tQXBwZWFyYW5jZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5j
dXN0b21BcHBlYXJhbmNlOworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6dXBkYXRl
Q3VzdG9tQXBwZWFyYW5jZShHcmFwaGljc0xheWVyOjpDdXN0b21BcHBlYXJhbmNlIGN1c3RvbUFw
cGVhcmFuY2UpCit7CisgICAgbV9wcm9wZXJ0aWVzLmN1c3RvbUFwcGVhcmFuY2UgPSBjdXN0b21B
cHBlYXJhbmNlOworICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3Rl
TGF5ZXJUcmVlVHJhbnNhY3Rpb246OkN1c3RvbUFwcGVhcmFuY2VDaGFuZ2VkKTsKK30KKworUmVm
PFBsYXRmb3JtQ0FMYXllcj4gUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjcmVhdGVDb21wYXRpYmxl
TGF5ZXIoUGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGUgbGF5ZXJUeXBlLCBQbGF0Zm9ybUNBTGF5
ZXJDbGllbnQqIGNsaWVudCkgY29uc3QKK3sKKyAgICByZXR1cm4gUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjpjcmVhdGUobGF5ZXJUeXBlLCBjbGllbnQsICptX2NvbnRleHQpOworfQorCit2b2lkIFBs
YXRmb3JtQ0FMYXllclJlbW90ZTo6ZW51bWVyYXRlUmVjdHNCZWluZ0RyYXduKENHQ29udGV4dFJl
ZiBjb250ZXh0LCB2b2lkICheYmxvY2spKENHUmVjdCkpCit7CisgICAgbV9wcm9wZXJ0aWVzLmJh
Y2tpbmdTdG9yZS0+ZW51bWVyYXRlUmVjdHNCZWluZ0RyYXduKGNvbnRleHQsIGJsb2NrKTsKK30K
KwordWludDMyX3QgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpob3N0aW5nQ29udGV4dElEKCkKK3sK
KyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKwordW5zaWduZWQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpiYWNraW5nU3RvcmVCeXRlc1BlclBpeGVsKCkgY29uc3QK
K3sKKyAgICBpZiAoIW1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUpCisgICAgICAgIHJldHVybiA0
OworCisgICAgcmV0dXJuIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUtPmJ5dGVzUGVyUGl4ZWwo
KTsKK30KKworTGF5ZXJQb29sJiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmxheWVyUG9vbCgpCit7
CisgICAgcmV0dXJuIG1fY29udGV4dC0+bGF5ZXJQb29sKCk7Cit9CisKK30gLy8gbmFtZXNwYWNl
IFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVt
b3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5oIGIvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZS5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmE5NjM1ZWY5MWYzMTljNzI3ZGVjYzIyY2IxYTg4ZmMwNzY4MDA4MGQKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXll
clRyZWUvUGxhdGZvcm1DQUxheWVyUmVtb3RlLmgKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2lu
Y2x1ZGUgIlJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uLmgiCisjaW5jbHVkZSA8V2ViQ29yZS9Q
bGF0Zm9ybUNBTGF5ZXIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtTGF5ZXIuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgTGF5ZXJQb29sOworfQorCituYW1lc3BhY2UgV2Vi
S2l0IHsKKworY2xhc3MgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDsKKworY2xhc3MgUGxhdGZvcm1D
QUxheWVyUmVtb3RlIDogcHVibGljIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllciB7CitwdWJsaWM6
CisgICAgc3RhdGljIFJlZjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+IGNyZWF0ZShXZWJDb3JlOjpQ
bGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50
KiwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYpOworICAgIHN0YXRpYyBSZWY8UGxhdGZvcm1DQUxh
eWVyUmVtb3RlPiBjcmVhdGUoUGxhdGZvcm1MYXllciAqLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5
ZXJDbGllbnQqLCBSZW1vdGVMYXllclRyZWVDb250ZXh0Jik7CisgICAgc3RhdGljIFJlZjxQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU+IGNyZWF0ZShjb25zdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmLCBX
ZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqLCBSZW1vdGVMYXllclRyZWVDb250ZXh0Jik7
CisKKyAgICB2aXJ0dWFsIH5QbGF0Zm9ybUNBTGF5ZXJSZW1vdGUoKTsKKworICAgIFBsYXRmb3Jt
TGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9
CisKKyAgICB2b2lkIHJlY3Vyc2l2ZUJ1aWxkVHJhbnNhY3Rpb24oUmVtb3RlTGF5ZXJUcmVlQ29u
dGV4dCYsIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uJik7CisKKyAgICB2b2lkIHNldE5lZWRz
RGlzcGxheUluUmVjdChjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmIGRpcnR5UmVjdCkgb3ZlcnJp
ZGU7CisgICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKSBvdmVycmlkZTsKKworICAgIHZvaWQgY29w
eUNvbnRlbnRzRnJvbUxheWVyKFBsYXRmb3JtQ0FMYXllciopIG92ZXJyaWRlOworCisgICAgV2Vi
Q29yZTo6UGxhdGZvcm1DQUxheWVyKiBzdXBlcmxheWVyKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAg
dm9pZCByZW1vdmVGcm9tU3VwZXJsYXllcigpIG92ZXJyaWRlOworICAgIHZvaWQgc2V0U3VibGF5
ZXJzKGNvbnN0IFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckxpc3QmKSBvdmVycmlkZTsKKyAgICB2
b2lkIHJlbW92ZUFsbFN1YmxheWVycygpIG92ZXJyaWRlOworICAgIHZvaWQgYXBwZW5kU3VibGF5
ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyJikgb3ZlcnJpZGU7CisgICAgdm9pZCBpbnNlcnRT
dWJsYXllcihXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXImLCBzaXplX3QgaW5kZXgpIG92ZXJyaWRl
OworICAgIHZvaWQgcmVwbGFjZVN1YmxheWVyKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllciYgcmVm
ZXJlbmNlLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXImKSBvdmVycmlkZTsKKyAgICBjb25zdCBX
ZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJMaXN0KiBjdXN0b21TdWJsYXllcnMoKSBjb25zdCBvdmVy
cmlkZSB7IHJldHVybiBudWxscHRyOyB9CisgICAgdm9pZCBhZG9wdFN1YmxheWVycyhXZWJDb3Jl
OjpQbGF0Zm9ybUNBTGF5ZXImIHNvdXJjZSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGFkZEFuaW1h
dGlvbkZvcktleShjb25zdCBTdHJpbmcmIGtleSwgV2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlv
biYpIG92ZXJyaWRlOworICAgIHZvaWQgcmVtb3ZlQW5pbWF0aW9uRm9yS2V5KGNvbnN0IFN0cmlu
ZyYga2V5KSBvdmVycmlkZTsKKyAgICBSZWZQdHI8V2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlv
bj4gYW5pbWF0aW9uRm9yS2V5KGNvbnN0IFN0cmluZyYga2V5KSBvdmVycmlkZTsKKyAgICB2b2lk
IGFuaW1hdGlvblN0YXJ0ZWQoY29uc3QgU3RyaW5nJiBrZXksIENGVGltZUludGVydmFsIGJlZ2lu
VGltZSkgb3ZlcnJpZGU7CisgICAgdm9pZCBhbmltYXRpb25FbmRlZChjb25zdCBTdHJpbmcmIGtl
eSkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldE1hc2soV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVy
Kikgb3ZlcnJpZGU7CisKKyAgICBib29sIGlzT3BhcXVlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAg
dm9pZCBzZXRPcGFxdWUoYm9vbCkgb3ZlcnJpZGU7CisKKyAgICBXZWJDb3JlOjpGbG9hdFJlY3Qg
Ym91bmRzKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRCb3VuZHMoY29uc3QgV2ViQ29y
ZTo6RmxvYXRSZWN0Jikgb3ZlcnJpZGU7CisKKyAgICBXZWJDb3JlOjpGbG9hdFBvaW50M0QgcG9z
aXRpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFBvc2l0aW9uKGNvbnN0IFdlYkNv
cmU6OkZsb2F0UG9pbnQzRCYpIG92ZXJyaWRlOworCisgICAgV2ViQ29yZTo6RmxvYXRQb2ludDNE
IGFuY2hvclBvaW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRBbmNob3JQb2ludChj
b25zdCBXZWJDb3JlOjpGbG9hdFBvaW50M0QmKSBvdmVycmlkZTsKKworICAgIFdlYkNvcmU6OlRy
YW5zZm9ybWF0aW9uTWF0cml4IHRyYW5zZm9ybSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQg
c2V0VHJhbnNmb3JtKGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4Jikgb3ZlcnJp
ZGU7CisKKyAgICBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCBzdWJsYXllclRyYW5zZm9y
bSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0U3VibGF5ZXJUcmFuc2Zvcm0oY29uc3Qg
V2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgmKSBvdmVycmlkZTsKKworICAgIGJvb2wgaXNI
aWRkZW4oKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldEhpZGRlbihib29sKSBvdmVycmlk
ZTsKKworICAgIGJvb2wgY29udGVudHNIaWRkZW4oKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lk
IHNldENvbnRlbnRzSGlkZGVuKGJvb2wpIG92ZXJyaWRlOworCisgICAgYm9vbCB1c2VySW50ZXJh
Y3Rpb25FbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRVc2VySW50ZXJhY3Rp
b25FbmFibGVkKGJvb2wpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRCYWNraW5nU3RvcmVBdHRh
Y2hlZChib29sKSBvdmVycmlkZTsKKyAgICBib29sIGJhY2tpbmdTdG9yZUF0dGFjaGVkKCkgY29u
c3Qgb3ZlcnJpZGU7CisKKyAgICBib29sIGdlb21ldHJ5RmxpcHBlZCgpIGNvbnN0IG92ZXJyaWRl
OworICAgIHZvaWQgc2V0R2VvbWV0cnlGbGlwcGVkKGJvb2wpIG92ZXJyaWRlOworCisgICAgYm9v
bCBpc0RvdWJsZVNpZGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXREb3VibGVTaWRl
ZChib29sKSBvdmVycmlkZTsKKworICAgIGJvb2wgbWFza3NUb0JvdW5kcygpIGNvbnN0IG92ZXJy
aWRlOworICAgIHZvaWQgc2V0TWFza3NUb0JvdW5kcyhib29sKSBvdmVycmlkZTsKKworICAgIGJv
b2wgYWNjZWxlcmF0ZXNEcmF3aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRBY2Nl
bGVyYXRlc0RyYXdpbmcoYm9vbCkgb3ZlcnJpZGU7CisKKyAgICBib29sIHdhbnRzRGVlcENvbG9y
QmFja2luZ1N0b3JlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRXYW50c0RlZXBDb2xv
ckJhY2tpbmdTdG9yZShib29sKSBvdmVycmlkZTsKKworICAgIGJvb2wgc3VwcG9ydHNTdWJwaXhl
bEFudGlhbGlhc2VkVGV4dCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0U3VwcG9ydHNT
dWJwaXhlbEFudGlhbGlhc2VkVGV4dChib29sKSBvdmVycmlkZTsKKworICAgIENGVHlwZVJlZiBj
b250ZW50cygpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0Q29udGVudHMoQ0ZUeXBlUmVm
KSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0Q29udGVudHNSZWN0KGNvbnN0IFdlYkNvcmU6OkZs
b2F0UmVjdCYpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRNaW5pZmljYXRpb25GaWx0ZXIoV2Vi
Q29yZTo6UGxhdGZvcm1DQUxheWVyOjpGaWx0ZXJUeXBlKSBvdmVycmlkZTsKKyAgICB2b2lkIHNl
dE1hZ25pZmljYXRpb25GaWx0ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyOjpGaWx0ZXJUeXBl
KSBvdmVycmlkZTsKKworICAgIFdlYkNvcmU6OkNvbG9yIGJhY2tncm91bmRDb2xvcigpIGNvbnN0
IG92ZXJyaWRlOworICAgIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IFdlYkNvcmU6OkNv
bG9yJikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldEJvcmRlcldpZHRoKGZsb2F0KSBvdmVycmlk
ZTsKKyAgICB2b2lkIHNldEJvcmRlckNvbG9yKGNvbnN0IFdlYkNvcmU6OkNvbG9yJikgb3ZlcnJp
ZGU7CisKKyAgICBmbG9hdCBvcGFjaXR5KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRP
cGFjaXR5KGZsb2F0KSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0RmlsdGVycyhjb25zdCBXZWJD
b3JlOjpGaWx0ZXJPcGVyYXRpb25zJikgb3ZlcnJpZGU7CisgICAgc3RhdGljIGJvb2wgZmlsdGVy
c0NhbkJlQ29tcG9zaXRlZChjb25zdCBXZWJDb3JlOjpGaWx0ZXJPcGVyYXRpb25zJik7CisgICAg
dm9pZCBjb3B5RmlsdGVyc0Zyb20oY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyJikgb3Zl
cnJpZGU7CisKKyNpZiBFTkFCTEUoQ1NTX0NPTVBPU0lUSU5HKQorICAgIHZvaWQgc2V0QmxlbmRN
b2RlKFdlYkNvcmU6OkJsZW5kTW9kZSkgb3ZlcnJpZGU7CisjZW5kaWYKKworICAgIHZvaWQgc2V0
TmFtZShjb25zdCBTdHJpbmcmKSBvdmVycmlkZTsKKworICAgIHZvaWQgc2V0U3BlZWQoZmxvYXQp
IG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRUaW1lT2Zmc2V0KENGVGltZUludGVydmFsKSBvdmVy
cmlkZTsKKworICAgIGZsb2F0IGNvbnRlbnRzU2NhbGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2
b2lkIHNldENvbnRlbnRzU2NhbGUoZmxvYXQpIG92ZXJyaWRlOworCisgICAgZmxvYXQgY29ybmVy
UmFkaXVzKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRDb3JuZXJSYWRpdXMoZmxvYXQp
IG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRFZGdlQW50aWFsaWFzaW5nTWFzayh1bnNpZ25lZCkg
b3ZlcnJpZGU7CisKKyAgICAvLyBGSVhNRTogSGF2aW5nIGJvdGggc2hhcGVSb3VuZGVkUmVjdCBh
bmQgc2hhcGVQYXRoIGlzIHJlZHVuZGFudC4gV2UgY291bGQgdXNlIHNoYXBlUGF0aCBmb3IgZXZl
cnl0aGluZy4KKyAgICBXZWJDb3JlOjpGbG9hdFJvdW5kZWRSZWN0IHNoYXBlUm91bmRlZFJlY3Qo
KSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFNoYXBlUm91bmRlZFJlY3QoY29uc3QgV2Vi
Q29yZTo6RmxvYXRSb3VuZGVkUmVjdCYpIG92ZXJyaWRlOworCisgICAgV2ViQ29yZTo6UGF0aCBz
aGFwZVBhdGgoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFNoYXBlUGF0aChjb25zdCBX
ZWJDb3JlOjpQYXRoJikgb3ZlcnJpZGU7CisKKyAgICBXZWJDb3JlOjpXaW5kUnVsZSBzaGFwZVdp
bmRSdWxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRTaGFwZVdpbmRSdWxlKFdlYkNv
cmU6OldpbmRSdWxlKSBvdmVycmlkZTsKKworICAgIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OkN1
c3RvbUFwcGVhcmFuY2UgY3VzdG9tQXBwZWFyYW5jZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZv
aWQgdXBkYXRlQ3VzdG9tQXBwZWFyYW5jZShXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpDdXN0b21B
cHBlYXJhbmNlKSBvdmVycmlkZTsKKworICAgIFdlYkNvcmU6OlRpbGVkQmFja2luZyogdGlsZWRC
YWNraW5nKCkgb3ZlcnJpZGUgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgICAgUmVmPFdlYkNvcmU6
OlBsYXRmb3JtQ0FMYXllcj4gY2xvbmUoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBv
d25lcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBSZWY8UGxhdGZvcm1DQUxheWVyPiBjcmVhdGVD
b21wYXRpYmxlTGF5ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyOjpMYXllclR5cGUsIFdlYkNv
cmU6OlBsYXRmb3JtQ0FMYXllckNsaWVudCopIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9pZCBl
bnVtZXJhdGVSZWN0c0JlaW5nRHJhd24oQ0dDb250ZXh0UmVmLCB2b2lkICheYmxvY2spKENHUmVj
dCkpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB1aW50MzJfdCBob3N0aW5nQ29udGV4dElEKCk7
CisKKyAgICB1bnNpZ25lZCBiYWNraW5nU3RvcmVCeXRlc1BlclBpeGVsKCkgY29uc3Qgb3ZlcnJp
ZGU7CisKKyAgICB2b2lkIHNldENsb25lZExheWVyKGNvbnN0IFBsYXRmb3JtQ0FMYXllciopOwor
CisgICAgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkxheWVyUHJvcGVydGllcyYgcHJvcGVy
dGllcygpIHsgcmV0dXJuIG1fcHJvcGVydGllczsgfQorICAgIGNvbnN0IFJlbW90ZUxheWVyVHJl
ZVRyYW5zYWN0aW9uOjpMYXllclByb3BlcnRpZXMmIHByb3BlcnRpZXMoKSBjb25zdCB7IHJldHVy
biBtX3Byb3BlcnRpZXM7IH0KKworICAgIHZvaWQgZGlkQ29tbWl0KCk7CisKKyAgICB2b2lkIGNs
ZWFyQ29udGV4dCgpIHsgbV9jb250ZXh0ID0gbnVsbHB0cjsgfQorICAgIFJlbW90ZUxheWVyVHJl
ZUNvbnRleHQqIGNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX2NvbnRleHQ7IH0KKworcHJvdGVj
dGVkOgorICAgIFBsYXRmb3JtQ0FMYXllclJlbW90ZShXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6
OkxheWVyVHlwZSwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3Rl
TGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCk7CisgICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlKGNv
bnN0IFBsYXRmb3JtQ0FMYXllclJlbW90ZSYsIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckNsaWVu
dCosIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmKTsKKworICAgIHZvaWQgdXBkYXRlQ2xvbmVkTGF5
ZXJQcm9wZXJ0aWVzKFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgY2xvbmUsIGJvb2wgY29weUNvbnRl
bnRzID0gdHJ1ZSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgYm9vbCBpc1BsYXRmb3JtQ0FMYXll
clJlbW90ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2b2lkIGVuc3Vy
ZUJhY2tpbmdTdG9yZSgpOworICAgIHZvaWQgdXBkYXRlQmFja2luZ1N0b3JlKCk7CisgICAgdm9p
ZCByZW1vdmVTdWJsYXllcihQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUqKTsKKworICAgIGJvb2wgcmVx
dWlyZXNDdXN0b21BcHBlYXJhbmNlVXBkYXRlT25Cb3VuZHNDaGFuZ2UoKSBjb25zdDsKKworICAg
IFdlYkNvcmU6OkxheWVyUG9vbCYgbGF5ZXJQb29sKCkgb3ZlcnJpZGU7CisKKyAgICBSZW1vdGVM
YXllclRyZWVUcmFuc2FjdGlvbjo6TGF5ZXJQcm9wZXJ0aWVzIG1fcHJvcGVydGllczsKKyAgICBX
ZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJMaXN0IG1fY2hpbGRyZW47CisgICAgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlKiBtX3N1cGVybGF5ZXIgeyBudWxscHRyIH07CisgICAgUGxhdGZvcm1DQUxheWVy
UmVtb3RlKiBtX21hc2tMYXllciB7IG51bGxwdHIgfTsKKyAgICBIYXNoTWFwPFN0cmluZywgUmVm
UHRyPFdlYkNvcmU6OlBsYXRmb3JtQ0FBbmltYXRpb24+PiBtX2FuaW1hdGlvbnM7CisKKyAgICBi
b29sIG1fYWNjZWxlcmF0ZXNEcmF3aW5nIHsgZmFsc2UgfTsKKyAgICBib29sIG1fd2FudHNEZWVw
Q29sb3JCYWNraW5nU3RvcmUgeyBmYWxzZSB9OworCisgICAgUmVtb3RlTGF5ZXJUcmVlQ29udGV4
dCogbV9jb250ZXh0OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKK1NQRUNJQUxJWkVf
VFlQRV9UUkFJVFNfUExBVEZPUk1fQ0FMQVlFUihXZWJLaXQ6OlBsYXRmb3JtQ0FMYXllclJlbW90
ZSwgaXNQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVD
dXN0b20uaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJl
ZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYWQ2NGNmMGNmYjQw
MWYwYjdjZTNmMTZiNGMwYWI0ZDA4ZDI2NjQxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJl
bW90ZUN1c3RvbS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlBsYXRmb3JtQ0FM
YXllclJlbW90ZS5oIgorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgTGF5ZXJIb3N0aW5n
Q29udGV4dDsKKworLy8gUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tIGlzIHVzZWQgZm9yIENB
TGF5ZXJzIHRoYXQgbGl2ZSBpbiB0aGUgd2ViIHByb2Nlc3MgYW5kIGFyZSBob3N0ZWQgaW50byB0
aGUgVUkgcHJvY2VzcyB2aWEgcmVtb3RlIGNvbnRleHQuCitjbGFzcyBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGVDdXN0b20gZmluYWwgOiBwdWJsaWMgUGxhdGZvcm1DQUxheWVyUmVtb3RlIHsKKyAgICBm
cmllbmQgY2xhc3MgUGxhdGZvcm1DQUxheWVyUmVtb3RlOworcHVibGljOgorICAgIHN0YXRpYyBS
ZWY8UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBjcmVhdGUoUGxhdGZvcm1MYXllciAqLCBXZWJDb3Jl
OjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqLCBSZW1vdGVMYXllclRyZWVDb250ZXh0Jik7CisKKyAg
ICB2aXJ0dWFsIH5QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20oKTsKKworICAgIFBsYXRmb3Jt
TGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtX3BsYXRmb3Jt
TGF5ZXIuZ2V0KCk7IH0KKworICAgIHVpbnQzMl90IGhvc3RpbmdDb250ZXh0SUQoKSBvdmVycmlk
ZTsKKworICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IFdlYkNvcmU6OkZsb2F0
UmVjdCYgZGlydHlSZWN0KSBvdmVycmlkZTsKKyAgICB2b2lkIHNldE5lZWRzRGlzcGxheSgpIG92
ZXJyaWRlOworCitwcml2YXRlOgorICAgIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbShXZWJD
b3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSwgUGxhdGZvcm1MYXllciAqLCBXZWJDb3Jl
OjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0Jik7
CisKKyAgICBSZWY8V2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyPiBjbG9uZShXZWJDb3JlOjpQbGF0
Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyKSBjb25zdCBvdmVycmlkZTsKKworICAgIGJvb2wgaXNQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVl
OyB9CisKKyAgICBDRlR5cGVSZWYgY29udGVudHMoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lk
IHNldENvbnRlbnRzKENGVHlwZVJlZikgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8
TGF5ZXJIb3N0aW5nQ29udGV4dD4gbV9sYXllckhvc3RpbmdDb250ZXh0OworICAgIFJldGFpblB0
cjxQbGF0Zm9ybUxheWVyPiBtX3BsYXRmb3JtTGF5ZXI7CisgICAgYm9vbCBtX3Byb3ZpZGVzQ29u
dGVudHM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworU1BFQ0lBTElaRV9UWVBFX1RS
QUlUU19QTEFURk9STV9DQUxBWUVSKFdlYktpdDo6UGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9t
LCBpc1BsYXRmb3JtQ0FMYXllclJlbW90ZSgpKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9X
ZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1
c3RvbS5tbSBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJl
ZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20ubW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzY5YjliMzE1YWM4
M2RiNmQ3ODhjOGYxMzYzMjJlODY3NzYyYzYwMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGVDdXN0b20ubW0KQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW1wb3J0ICJQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20uaCIKKworI2ltcG9ydCAiTGF5ZXJIb3N0aW5nQ29udGV4
dC5oIgorI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5oIgorI2ltcG9ydCAiUmVtb3Rl
TGF5ZXJUcmVlUHJvcGVydHlBcHBsaWVyLmgiCisjaW1wb3J0ICJXZWJQcm9jZXNzLmgiCisjaW1w
b3J0IDxBVkZvdW5kYXRpb24vQVZGb3VuZGF0aW9uLmg+CisjaW1wb3J0IDxXZWJDb3JlL0dyYXBo
aWNzTGF5ZXJDQS5oPgorI2ltcG9ydCA8V2ViQ29yZS9QbGF0Zm9ybUNBTGF5ZXJDb2NvYS5oPgor
I2ltcG9ydCA8V2ViQ29yZS9XZWJDb3JlQ0FMYXllckV4dHJhcy5oPgorI2ltcG9ydCA8d3RmL1Jl
dGFpblB0ci5oPgorI2ltcG9ydCA8d3RmL1NvZnRMaW5raW5nLmg+CisKK1NPRlRfTElOS19GUkFN
RVdPUktfT1BUSU9OQUwoQVZGb3VuZGF0aW9uKQorU09GVF9MSU5LX0NMQVNTX09QVElPTkFMKEFW
Rm91bmRhdGlvbiwgQVZQbGF5ZXJMYXllcikKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisK
K25hbWVzcGFjZSBXZWJLaXQgeworCitzdGF0aWMgTlNTdHJpbmcgKiBjb25zdCBwbGF0Zm9ybUNB
TGF5ZXJQb2ludGVyID0gQCJXS1BsYXRmb3JtQ0FMYXllciI7CisKK1JlZjxQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGU+IFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6Y3JlYXRlKFBsYXRmb3JtTGF5
ZXIgKnBsYXRmb3JtTGF5ZXIsIFBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIsIFJlbW90ZUxh
eWVyVHJlZUNvbnRleHQmIGNvbnRleHQpCit7CisgICAgYXV0byBsYXllciA9IGFkb3B0UmVmKCpu
ZXcgUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKFBsYXRmb3JtQ0FMYXllckNvY29hOjpsYXll
clR5cGVGb3JQbGF0Zm9ybUxheWVyKHBsYXRmb3JtTGF5ZXIpLCBwbGF0Zm9ybUxheWVyLCBvd25l
ciwgY29udGV4dCkpOworICAgIGNvbnRleHQubGF5ZXJXYXNDcmVhdGVkKGxheWVyLmdldCgpLCBs
YXllci0+bGF5ZXJUeXBlKCkpOworICAgIHJldHVybiBXVEZNb3ZlKGxheWVyKTsKK30KKworUGxh
dGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tOjpQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20oTGF5
ZXJUeXBlIGxheWVyVHlwZSwgUGxhdGZvcm1MYXllciAqIGN1c3RvbUxheWVyLCBQbGF0Zm9ybUNB
TGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250ZXh0KQorICAg
IDogUGxhdGZvcm1DQUxheWVyUmVtb3RlKGxheWVyVHlwZSwgb3duZXIsIGNvbnRleHQpCit7Cisg
ICAgc3dpdGNoIChjb250ZXh0LmxheWVySG9zdGluZ01vZGUoKSkgeworICAgIGNhc2UgTGF5ZXJI
b3N0aW5nTW9kZTo6SW5Qcm9jZXNzOgorICAgICAgICBtX2xheWVySG9zdGluZ0NvbnRleHQgPSBM
YXllckhvc3RpbmdDb250ZXh0OjpjcmVhdGVGb3JQb3J0KFdlYlByb2Nlc3M6OnNpbmdsZXRvbigp
LmNvbXBvc2l0aW5nUmVuZGVyU2VydmVyUG9ydCgpKTsKKyAgICAgICAgYnJlYWs7CisjaWYgSEFW
RShPVVRfT0ZfUFJPQ0VTU19MQVlFUl9IT1NUSU5HKQorICAgIGNhc2UgTGF5ZXJIb3N0aW5nTW9k
ZTo6T3V0T2ZQcm9jZXNzOgorICAgICAgICBtX2xheWVySG9zdGluZ0NvbnRleHQgPSBMYXllckhv
c3RpbmdDb250ZXh0OjpjcmVhdGVGb3JFeHRlcm5hbEhvc3RpbmdQcm9jZXNzKCk7CisjaWYgUExB
VEZPUk0oSU9TKQorICAgICAgICBpZiAobGF5ZXJUeXBlID09IExheWVyVHlwZUFWUGxheWVyTGF5
ZXIpIHsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlRmFjdG9yID0gY29udGV4dC5kZXZpY2VTY2Fs
ZUZhY3RvcigpOworICAgICAgICAgICAgLy8gU2V0IGEgc2NhbGUgZmFjdG9yIGhlcmUgdG8gbWFr
ZSBjb252ZXJ0UmVjdDp0b0xheWVyOm5pbCB0YWtlIHNjYWxlIGZhY3RvciBpbnRvIGFjY291bnQu
IDxyZGFyOi8vcHJvYmxlbS8xODMxNjU0Mj4uCisgICAgICAgICAgICAvLyBUaGlzIHNjYWxlIGZh
Y3RvciBpcyBpbnZlcnRlZCBpbiB0aGUgaG9zdGluZyBwcm9jZXNzLgorICAgICAgICAgICAgW2N1
c3RvbUxheWVyIHNldFRyYW5zZm9ybTpDQVRyYW5zZm9ybTNETWFrZVNjYWxlKHNjYWxlRmFjdG9y
LCBzY2FsZUZhY3RvciwgMSldOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgYnJlYWs7Cisj
ZW5kaWYKKyAgICB9CisKKyAgICBtX2xheWVySG9zdGluZ0NvbnRleHQtPnNldFJvb3RMYXllcihj
dXN0b21MYXllcik7CisgICAgW2N1c3RvbUxheWVyIHNldFZhbHVlOltOU1ZhbHVlIHZhbHVlV2l0
aFBvaW50ZXI6dGhpc10gZm9yS2V5OnBsYXRmb3JtQ0FMYXllclBvaW50ZXJdOworCisgICAgbV9w
bGF0Zm9ybUxheWVyID0gY3VzdG9tTGF5ZXI7CisgICAgW2N1c3RvbUxheWVyIHdlYl9kaXNhYmxl
QWxsQWN0aW9uc107CisKKyAgICBtX3Byb3ZpZGVzQ29udGVudHMgPSBsYXllclR5cGUgPT0gTGF5
ZXJUeXBlQ29udGVudHNQcm92aWRlZExheWVyOworCisgICAgcHJvcGVydGllcygpLnBvc2l0aW9u
ID0gRmxvYXRQb2ludDNEKGN1c3RvbUxheWVyLnBvc2l0aW9uLngsIGN1c3RvbUxheWVyLnBvc2l0
aW9uLnksIGN1c3RvbUxheWVyLnpQb3NpdGlvbik7CisgICAgcHJvcGVydGllcygpLmFuY2hvclBv
aW50ID0gRmxvYXRQb2ludDNEKGN1c3RvbUxheWVyLmFuY2hvclBvaW50LngsIGN1c3RvbUxheWVy
LmFuY2hvclBvaW50LnksIGN1c3RvbUxheWVyLmFuY2hvclBvaW50Wik7CisgICAgcHJvcGVydGll
cygpLmJvdW5kcyA9IGN1c3RvbUxheWVyLmJvdW5kczsKKyAgICBwcm9wZXJ0aWVzKCkuY29udGVu
dHNSZWN0ID0gY3VzdG9tTGF5ZXIuY29udGVudHNSZWN0OworfQorCitQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGVDdXN0b206On5QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20oKQoreworICAgIFttX3Bs
YXRmb3JtTGF5ZXIgc2V0VmFsdWU6bmlsIGZvcktleTpwbGF0Zm9ybUNBTGF5ZXJQb2ludGVyXTsK
K30KKwordWludDMyX3QgUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tOjpob3N0aW5nQ29udGV4
dElEKCkKK3sKKyAgICByZXR1cm4gbV9sYXllckhvc3RpbmdDb250ZXh0LT5jb250ZXh0SUQoKTsK
K30KKworUmVmPFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcj4gUGxhdGZvcm1DQUxheWVyUmVtb3Rl
Q3VzdG9tOjpjbG9uZShQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyKSBjb25zdAoreworICAg
IFJldGFpblB0cjxDQUxheWVyICo+IGNsb25lZExheWVyOworICAgIGJvb2wgY29weUNvbnRlbnRz
ID0gdHJ1ZTsKKworICAgIGlmIChsYXllclR5cGUoKSA9PSBMYXllclR5cGVBVlBsYXllckxheWVy
KSB7CisgICAgICAgIAorICAgICAgICBpZiAoW3BsYXRmb3JtTGF5ZXIoKSBpc0tpbmRPZkNsYXNz
OmdldEFWUGxheWVyTGF5ZXJDbGFzcygpXSkgeworICAgICAgICAgICAgY2xvbmVkTGF5ZXIgPSBh
ZG9wdE5TKFthbGxvY0FWUGxheWVyTGF5ZXJJbnN0YW5jZSgpIGluaXRdKTsKKworICAgICAgICAg
ICAgQVZQbGF5ZXJMYXllciogZGVzdGluYXRpb25QbGF5ZXJMYXllciA9IHN0YXRpY19jYXN0PEFW
UGxheWVyTGF5ZXIgKj4oY2xvbmVkTGF5ZXIuZ2V0KCkpOworICAgICAgICAgICAgQVZQbGF5ZXJM
YXllciogc291cmNlUGxheWVyTGF5ZXIgPSBzdGF0aWNfY2FzdDxBVlBsYXllckxheWVyICo+KHBs
YXRmb3JtTGF5ZXIoKSk7CisgICAgICAgICAgICBkaXNwYXRjaF9hc3luYyhkaXNwYXRjaF9nZXRf
bWFpbl9xdWV1ZSgpLCBeeworICAgICAgICAgICAgICAgIFtkZXN0aW5hdGlvblBsYXllckxheWVy
IHNldFBsYXllcjpbc291cmNlUGxheWVyTGF5ZXIgcGxheWVyXV07CisgICAgICAgICAgICB9KTsK
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE9uIGlPUywgdGhlIEFWUGxheWVyTGF5
ZXIgaXMgaW5zaWRlIGEgV2ViVmlkZW9Db250YWluZXJMYXllci4gVGhpcyBjb2RlIG5lZWRzIHRv
IHNoYXJlIGxvZ2ljIHdpdGggTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uT2JqQzo6Y3Jl
YXRlQVZQbGF5ZXJMYXllcigpLgorICAgICAgICAgICAgY2xvbmVkTGF5ZXIgPSBhZG9wdE5TKFtb
Q0FMYXllciBhbGxvY10gaW5pdF0pOworICAgICAgICB9CisKKyAgICAgICAgY29weUNvbnRlbnRz
ID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChsYXllclR5cGUoKSA9PSBMYXllclR5cGVDb250ZW50
c1Byb3ZpZGVkTGF5ZXIpIHsKKyAgICAgICAgY2xvbmVkTGF5ZXIgPSBhZG9wdE5TKFtbQ0FMYXll
ciBhbGxvY10gaW5pdF0pOworICAgICAgICAvLyBGSVhNRTogY3VycmVudGx5IGNvcHlpbmcgV2Vi
R0wgY29udGVudHMgYnJlYWtzIHRoZSBvcmlnaW5hbCBsYXllci4KKyAgICAgICAgY29weUNvbnRl
bnRzID0gZmFsc2U7CisgICAgfQorCisgICAgYXV0byBjbG9uZSA9IGFkb3B0UmVmKCpuZXcgUGxh
dGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKGxheWVyVHlwZSgpLCBjbG9uZWRMYXllci5nZXQoKSwg
b3duZXIsICpjb250ZXh0KCkpKTsKKyAgICBjb250ZXh0KCktPmxheWVyV2FzQ3JlYXRlZChjbG9u
ZS5nZXQoKSwgY2xvbmUtPmxheWVyVHlwZSgpKTsKKworICAgIHVwZGF0ZUNsb25lZExheWVyUHJv
cGVydGllcyhjbG9uZS5nZXQoKSwgY29weUNvbnRlbnRzKTsKKworICAgIGNsb25lLT5zZXRDbG9u
ZWRMYXllcih0aGlzKTsKKyAgICByZXR1cm4gV1RGTW92ZShjbG9uZSk7Cit9CisKK0NGVHlwZVJl
ZiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b206OmNvbnRlbnRzKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gW21fcGxhdGZvcm1MYXllciBjb250ZW50c107Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlQ3VzdG9tOjpzZXRDb250ZW50cyhDRlR5cGVSZWYgY29udGVudHMpCit7CisgICAg
W21fcGxhdGZvcm1MYXllciBzZXRDb250ZW50czooaWQpY29udGVudHNdOworfQorCit2b2lkIFBs
YXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZs
b2F0UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAobV9wcm92aWRlc0NvbnRlbnRzKQorICAgICAgICBb
bV9wbGF0Zm9ybUxheWVyIHNldE5lZWRzRGlzcGxheUluUmVjdDpyZWN0XTsKKyAgICBlbHNlCisg
ICAgICAgIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KHJlY3Qp
OworfQorCit2b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6c2V0TmVlZHNEaXNwbGF5
KCkKK3sKKyAgICBpZiAobV9wcm92aWRlc0NvbnRlbnRzKQorICAgICAgICBbbV9wbGF0Zm9ybUxh
eWVyIHNldE5lZWRzRGlzcGxheV07CisgICAgZWxzZQorICAgICAgICBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGU6OnNldE5lZWRzRGlzcGxheSgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJl
ZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuY3BwIGIvU291cmNlL1dlYktpdC9X
ZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRp
bGVkQmFja2luZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZmVjMzBjMmQyMTZlN2E0OWIyYzJmZjEzZWU2OWYw
OWVhNzg1YTI4MQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9X
ZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcu
Y3BwCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVy
UmVtb3RlVGlsZWRCYWNraW5nLmgiCisKKyNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZUNvbnRleHQu
aCIKKyNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NMYXllckNBLmg+CisjaW1wb3J0IDxXZWJDb3Jl
L1BsYXRmb3JtQ0FMYXllckNvY29hLmg+CisjaW1wb3J0IDx3dGYvUmV0YWluUHRyLmg+CisKK3Vz
aW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworUGxhdGZvcm1D
QUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tp
bmcoTGF5ZXJUeXBlIGxheWVyVHlwZSwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVt
b3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCkKKyAgICA6IFBsYXRmb3JtQ0FMYXllclJlbW90
ZShsYXllclR5cGUsIG93bmVyLCBjb250ZXh0KQorICAgICwgbV90aWxlQ29udHJvbGxlcihzdGQ6
Om1ha2VfdW5pcXVlPFRpbGVDb250cm9sbGVyPih0aGlzKSkKK3sKK30KKworUGxhdGZvcm1DQUxh
eWVyUmVtb3RlVGlsZWRCYWNraW5nOjp+UGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5n
KCkKK3sKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldE5l
ZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmIGRpcnR5UmVjdCkKK3sKKyAgICBtX3Rp
bGVDb250cm9sbGVyLT5zZXROZWVkc0Rpc3BsYXlJblJlY3QoZW5jbG9zaW5nSW50UmVjdChkaXJ0
eVJlY3QpKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNl
dE5lZWRzRGlzcGxheSgpCit7CisgICAgbV90aWxlQ29udHJvbGxlci0+c2V0TmVlZHNEaXNwbGF5
KCk7Cit9CisKK2NvbnN0IFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckxpc3QqIFBsYXRmb3JtQ0FM
YXllclJlbW90ZVRpbGVkQmFja2luZzo6Y3VzdG9tU3VibGF5ZXJzKCkgY29uc3QKK3sKKyAgICBt
X2N1c3RvbVN1YmxheWVycyA9IG1fdGlsZUNvbnRyb2xsZXItPmNvbnRhaW5lckxheWVycygpOwor
ICAgIHJldHVybiAmbV9jdXN0b21TdWJsYXllcnM7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVy
UmVtb3RlVGlsZWRCYWNraW5nOjpzZXRCb3VuZHMoY29uc3QgV2ViQ29yZTo6RmxvYXRSZWN0JiBi
b3VuZHMpCit7CisgICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCb3VuZHMoYm91bmRzKTsK
KyAgICBtX3RpbGVDb250cm9sbGVyLT50aWxlQ2FjaGVMYXllckJvdW5kc0NoYW5nZWQoKTsKK30K
KworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OmlzT3BhcXVlKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gbV90aWxlQ29udHJvbGxlci0+dGlsZXNBcmVPcGFxdWUoKTsKK30K
Kwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldE9wYXF1ZShib29s
IG9wYXF1ZSkKK3sKKyAgICBtX3RpbGVDb250cm9sbGVyLT5zZXRUaWxlc09wYXF1ZShvcGFxdWUp
OworfQorCitib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6YWNjZWxlcmF0
ZXNEcmF3aW5nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90aWxlQ29udHJvbGxlci0+YWNjZWxl
cmF0ZXNEcmF3aW5nKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNr
aW5nOjpzZXRBY2NlbGVyYXRlc0RyYXdpbmcoYm9vbCBhY2NlbGVyYXRlc0RyYXdpbmcpCit7Cisg
ICAgbV90aWxlQ29udHJvbGxlci0+c2V0QWNjZWxlcmF0ZXNEcmF3aW5nKGFjY2VsZXJhdGVzRHJh
d2luZyk7Cit9CisKK2Jvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjp3YW50
c0RlZXBDb2xvckJhY2tpbmdTdG9yZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdGlsZUNvbnRy
b2xsZXItPndhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRXYW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZShi
b29sIHdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKQoreworICAgIG1fdGlsZUNvbnRyb2xsZXIt
PnNldFdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKHdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3Jl
KTsKK30KKworYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnN1cHBvcnRz
U3VicGl4ZWxBbnRpYWxpYXNlZFRleHQoKSBjb25zdAoreworICAgIHJldHVybiBtX3RpbGVDb250
cm9sbGVyLT5zdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KCk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRTdXBwb3J0c1N1YnBpeGVsQW50aWFs
aWFzZWRUZXh0KGJvb2wgc3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dCkKK3sKKyAgICBt
X3RpbGVDb250cm9sbGVyLT5zZXRTdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KHN1cHBv
cnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRleHQpOworfQorCitmbG9hdCBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGVUaWxlZEJhY2tpbmc6OmNvbnRlbnRzU2NhbGUoKSBjb25zdAoreworICAgIHJldHVybiBt
X3RpbGVDb250cm9sbGVyLT5jb250ZW50c1NjYWxlKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRDb250ZW50c1NjYWxlKGZsb2F0IHNjYWxlKQorewor
ICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldENvbnRlbnRzU2NhbGUoc2NhbGUpOworfQorCit2b2lk
IFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6c2V0Qm9yZGVyV2lkdGgoZmxvYXQg
Ym9yZGVyV2lkdGgpCit7CisgICAgbV90aWxlQ29udHJvbGxlci0+c2V0VGlsZURlYnVnQm9yZGVy
V2lkdGgoYm9yZGVyV2lkdGggLyAyKTsKK30KKwordm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVU
aWxlZEJhY2tpbmc6OnNldEJvcmRlckNvbG9yKGNvbnN0IFdlYkNvcmU6OkNvbG9yJiBjb2xvcikK
K3sKKyAgICBtX3RpbGVDb250cm9sbGVyLT5zZXRUaWxlRGVidWdCb3JkZXJDb2xvcihjb2xvcik7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9X
ZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRp
bGVkQmFja2luZy5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5
ZXJUcmVlL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBk
ZGZjZTg1MmQ1MTI3MDNkMzRmNDM1MmEzOWY0NWEzZTVkMTVhNTkKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUGxhdGZv
cm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlVGlsZWRCYWNraW5nX2gKKyNkZWZpbmUgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGls
ZWRCYWNraW5nX2gKKworI2luY2x1ZGUgIlBsYXRmb3JtQ0FMYXllclJlbW90ZS5oIgorI2luY2x1
ZGUgPFdlYkNvcmUvVGlsZUNvbnRyb2xsZXIuaD4KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2Ns
YXNzIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZyBmaW5hbCA6IHB1YmxpYyBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGUgeworICAgIGZyaWVuZCBjbGFzcyBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU7CitwdWJsaWM6CisgICAgdmlydHVhbCB+UGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNr
aW5nKCk7CisKK3ByaXZhdGU6CisgICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5n
KFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlLCBXZWJDb3JlOjpQbGF0Zm9ybUNB
TGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0Jik7CisKKyAgICBXZWJD
b3JlOjpUaWxlZEJhY2tpbmcqIHRpbGVkQmFja2luZygpIG92ZXJyaWRlIHsgcmV0dXJuIG1fdGls
ZUNvbnRyb2xsZXIuZ2V0KCk7IH0KKworICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNv
bnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYgZGlydHlSZWN0KSBvdmVycmlkZTsKKyAgICB2b2lkIHNl
dE5lZWRzRGlzcGxheSgpIG92ZXJyaWRlOworCisgICAgY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1D
QUxheWVyTGlzdCogY3VzdG9tU3VibGF5ZXJzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2b2lk
IHNldEJvdW5kcyhjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmKSBvdmVycmlkZTsKKyAgICAKKyAg
ICBib29sIGlzT3BhcXVlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRPcGFxdWUoYm9v
bCkgb3ZlcnJpZGU7CisgICAgCisgICAgYm9vbCBhY2NlbGVyYXRlc0RyYXdpbmcoKSBjb25zdCBv
dmVycmlkZTsKKyAgICB2b2lkIHNldEFjY2VsZXJhdGVzRHJhd2luZyhib29sKSBvdmVycmlkZTsK
KworICAgIGJvb2wgd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUoKSBjb25zdCBvdmVycmlkZTsK
KyAgICB2b2lkIHNldFdhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKGJvb2wpIG92ZXJyaWRlOwor
CisgICAgYm9vbCBzdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KCkgY29uc3Qgb3ZlcnJp
ZGU7CisgICAgdm9pZCBzZXRTdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KGJvb2wpIG92
ZXJyaWRlOworCisgICAgZmxvYXQgY29udGVudHNTY2FsZSgpIGNvbnN0IG92ZXJyaWRlOworICAg
IHZvaWQgc2V0Q29udGVudHNTY2FsZShmbG9hdCkgb3ZlcnJpZGU7CisgICAgCisgICAgdm9pZCBz
ZXRCb3JkZXJXaWR0aChmbG9hdCkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRCb3JkZXJDb2xvcihj
b25zdCBXZWJDb3JlOjpDb2xvciYpIG92ZXJyaWRlOworCisgICAgc3RkOjp1bmlxdWVfcHRyPFdl
YkNvcmU6OlRpbGVDb250cm9sbGVyPiBtX3RpbGVDb250cm9sbGVyOworICAgIG11dGFibGUgV2Vi
Q29yZTo6UGxhdGZvcm1DQUxheWVyTGlzdCBtX2N1c3RvbVN1YmxheWVyczsKK307CisKK30gLy8g
bmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8gUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRC
YWNraW5nX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1Jl
bW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVDb250ZXh0LmggYi9Tb3VyY2UvV2ViS2l0L1dl
YlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjI1NTQ4ZWExYzk0NTAzYWU5YTBiMDVkMzYyYjQ3MWIxZDAwYTBjYjgKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVM
YXllclRyZWUvUmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTIgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaWZuZGVmIFJlbW90ZUxheWVyVHJlZUNvbnRleHRfaAorI2RlZmluZSBSZW1vdGVM
YXllclRyZWVDb250ZXh0X2gKKworI2luY2x1ZGUgIkxheWVyVHJlZUNvbnRleHQuaCIKKyNpbmNs
dWRlICJSZW1vdGVMYXllckJhY2tpbmdTdG9yZUNvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJSZW1v
dGVMYXllclRyZWVUcmFuc2FjdGlvbi5oIgorI2luY2x1ZGUgPFdlYkNvcmUvR3JhcGhpY3NMYXll
ckZhY3RvcnkuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0xheWVyUG9vbC5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvUGxhdGZvcm1DQUxheWVyLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1l
c3BhY2UgV2ViS2l0IHsKKworY2xhc3MgUGxhdGZvcm1DQUxheWVyUmVtb3RlOworY2xhc3MgV2Vi
UGFnZTsKKworLy8gRklYTUU6IFRoaXMgY2xhc3MgZG9lc24ndCBkbyBtdWNoIG5vdy4gUm9sbCBp
bnRvIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhPworY2xhc3MgUmVtb3RlTGF5ZXJUcmVlQ29u
dGV4dCA6IHB1YmxpYyBXZWJDb3JlOjpHcmFwaGljc0xheWVyRmFjdG9yeSB7CitwdWJsaWM6Cisg
ICAgZXhwbGljaXQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dChXZWJQYWdlJik7CisgICAgflJlbW90
ZUxheWVyVHJlZUNvbnRleHQoKTsKKworICAgIHZvaWQgbGF5ZXJXYXNDcmVhdGVkKFBsYXRmb3Jt
Q0FMYXllclJlbW90ZSYsIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlKTsKKyAg
ICB2b2lkIGxheWVyV2lsbEJlRGVzdHJveWVkKFBsYXRmb3JtQ0FMYXllclJlbW90ZSYpOworCisg
ICAgdm9pZCBiYWNraW5nU3RvcmVXYXNDcmVhdGVkKFJlbW90ZUxheWVyQmFja2luZ1N0b3JlJik7
CisgICAgdm9pZCBiYWNraW5nU3RvcmVXaWxsQmVEZXN0cm95ZWQoUmVtb3RlTGF5ZXJCYWNraW5n
U3RvcmUmKTsKKyAgICBib29sIGJhY2tpbmdTdG9yZVdpbGxCZURpc3BsYXllZChSZW1vdGVMYXll
ckJhY2tpbmdTdG9yZSYpOworCisgICAgV2ViQ29yZTo6TGF5ZXJQb29sJiBsYXllclBvb2woKSB7
IHJldHVybiBtX2xheWVyUG9vbDsgfQorCisgICAgZmxvYXQgZGV2aWNlU2NhbGVGYWN0b3IoKSBj
b25zdDsKKworICAgIExheWVySG9zdGluZ01vZGUgbGF5ZXJIb3N0aW5nTW9kZSgpIGNvbnN0Owor
CisgICAgdm9pZCBidWlsZFRyYW5zYWN0aW9uKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uJiwg
V2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyJiByb290TGF5ZXIpOworCisgICAgdm9pZCBsYXllclBy
b3BlcnR5Q2hhbmdlZFdoaWxlQnVpbGRpbmdUcmFuc2FjdGlvbihQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGUmKTsKKworICAgIC8vIEZyb20gdGhlIFVJIHByb2Nlc3MKKyAgICB2b2lkIGFuaW1hdGlvbkRp
ZFN0YXJ0KFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCwgY29uc3QgU3Ry
aW5nJiBrZXksIGRvdWJsZSBzdGFydFRpbWUpOworICAgIHZvaWQgYW5pbWF0aW9uRGlkRW5kKFdl
YkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCwgY29uc3QgU3RyaW5nJiBrZXkp
OworCisgICAgdm9pZCB3aWxsU3RhcnRBbmltYXRpb25PbkxheWVyKFBsYXRmb3JtQ0FMYXllclJl
bW90ZSYpOworCisgICAgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmVDb2xsZWN0aW9uJiBiYWNraW5n
U3RvcmVDb2xsZWN0aW9uKCkgeyByZXR1cm4gbV9iYWNraW5nU3RvcmVDb2xsZWN0aW9uOyB9Cisg
ICAgCisgICAgdm9pZCBzZXROZXh0Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50KGJvb2wgbmV4dEZs
dXNoSXNGb3JJbW1lZGlhdGVQYWludCkgeyBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQg
PSBuZXh0Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50OyB9CisgICAgYm9vbCBuZXh0Rmx1c2hJc0Zv
ckltbWVkaWF0ZVBhaW50KCkgY29uc3QgeyByZXR1cm4gbV9uZXh0Rmx1c2hJc0ZvckltbWVkaWF0
ZVBhaW50OyB9CisKK3ByaXZhdGU6CisgICAgLy8gV2ViQ29yZTo6R3JhcGhpY3NMYXllckZhY3Rv
cnkKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6R3JhcGhpY3NMYXllcj4gY3JlYXRlR3Jh
cGhpY3NMYXllcihXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpUeXBlLCBXZWJDb3JlOjpHcmFwaGlj
c0xheWVyQ2xpZW50Jikgb3ZlcnJpZGU7CisKKyAgICBXZWJQYWdlJiBtX3dlYlBhZ2U7CisKKyAg
ICBIYXNoTWFwPFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCwgUmVtb3Rl
TGF5ZXJUcmVlVHJhbnNhY3Rpb246OkxheWVyQ3JlYXRpb25Qcm9wZXJ0aWVzPiBtX2NyZWF0ZWRM
YXllcnM7CisgICAgVmVjdG9yPFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJ
RD4gbV9kZXN0cm95ZWRMYXllcnM7CisKKyAgICBIYXNoTWFwPFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXI6OlBsYXRmb3JtTGF5ZXJJRCwgUGxhdGZvcm1DQUxheWVyUmVtb3RlKj4gbV9saXZlTGF5ZXJz
OworICAgIEhhc2hNYXA8V2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklELCBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGUqPiBtX2xheWVyc1dpdGhBbmltYXRpb25zOworCisgICAgUmVt
b3RlTGF5ZXJCYWNraW5nU3RvcmVDb2xsZWN0aW9uIG1fYmFja2luZ1N0b3JlQ29sbGVjdGlvbjsK
KyAgICAKKyAgICBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbiogbV9jdXJyZW50VHJhbnNhY3Rp
b247CisKKyAgICBXZWJDb3JlOjpMYXllclBvb2wgbV9sYXllclBvb2w7CisgICAgCisgICAgYm9v
bCBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQgeyBmYWxzZSB9OworfTsKKworfSAvLyBu
YW1lc3BhY2UgV2ViS2l0CisKKyNlbmRpZiAvLyBSZW1vdGVMYXllclRyZWVDb250ZXh0X2gKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJl
ZS9SZW1vdGVMYXllclRyZWVDb250ZXh0Lm1tIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dl
YlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZUNvbnRleHQubW0KbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uOTBjNDg2YjU4MmIwZDE1ODcwNTZhNDhkMTgxMmRiMzlmN2I1MmIwMgotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9S
ZW1vdGVMYXllclRyZWVDb250ZXh0Lm1tCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDEyIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2ltcG9ydCAiY29uZmlnLmgiCisjaW1wb3J0ICJSZW1vdGVMYXllclRyZWVDb250ZXh0LmgiCisK
KyNpbXBvcnQgIkdlbmVyaWNDYWxsYmFjay5oIgorI2ltcG9ydCAiR3JhcGhpY3NMYXllckNBUmVt
b3RlLmgiCisjaW1wb3J0ICJQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaCIKKyNpbXBvcnQgIlJlbW90
ZUxheWVyQmFja2luZ1N0b3JlQ29sbGVjdGlvbi5oIgorI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVl
VHJhbnNhY3Rpb24uaCIKKyNpbXBvcnQgIldlYlBhZ2UuaCIKKyNpbXBvcnQgPFdlYkNvcmUvRnJh
bWVWaWV3Lmg+CisjaW1wb3J0IDxXZWJDb3JlL01haW5GcmFtZS5oPgorI2ltcG9ydCA8V2ViQ29y
ZS9QYWdlLmg+CisjaW1wb3J0IDx3dGYvU2V0Rm9yU2NvcGUuaD4KKyNpbXBvcnQgPHd0Zi9TeXN0
ZW1UcmFjaW5nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2Vi
S2l0IHsKKworUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6UmVtb3RlTGF5ZXJUcmVlQ29udGV4dChX
ZWJQYWdlJiB3ZWJQYWdlKQorICAgIDogbV93ZWJQYWdlKHdlYlBhZ2UpCisgICAgLCBtX2N1cnJl
bnRUcmFuc2FjdGlvbihudWxscHRyKQoreworfQorCitSZW1vdGVMYXllclRyZWVDb250ZXh0Ojp+
UmVtb3RlTGF5ZXJUcmVlQ29udGV4dCgpCit7CisgICAgZm9yIChhdXRvJiBsYXllciA6IG1fbGl2
ZUxheWVycy52YWx1ZXMoKSkKKyAgICAgICAgbGF5ZXItPmNsZWFyQ29udGV4dCgpOworfQorCitm
bG9hdCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpkZXZpY2VTY2FsZUZhY3RvcigpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1fd2ViUGFnZS5kZXZpY2VTY2FsZUZhY3RvcigpOworfQorCitMYXllckhv
c3RpbmdNb2RlIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmxheWVySG9zdGluZ01vZGUoKSBjb25z
dAoreworICAgIHJldHVybiBtX3dlYlBhZ2UubGF5ZXJIb3N0aW5nTW9kZSgpOworfQorCit2b2lk
IFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmxheWVyV2FzQ3JlYXRlZChQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGUmIGxheWVyLCBQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSB0eXBlKQoreworICAgIEdy
YXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCBsYXllcklEID0gbGF5ZXIubGF5ZXJJRCgpOwor
CisgICAgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkxheWVyQ3JlYXRpb25Qcm9wZXJ0aWVz
IGNyZWF0aW9uUHJvcGVydGllczsKKyAgICBjcmVhdGlvblByb3BlcnRpZXMubGF5ZXJJRCA9IGxh
eWVySUQ7CisgICAgY3JlYXRpb25Qcm9wZXJ0aWVzLnR5cGUgPSB0eXBlOworCisgICAgaWYgKGxh
eWVyLmlzUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKCkpIHsKKyAgICAgICAgY3JlYXRpb25Q
cm9wZXJ0aWVzLmhvc3RpbmdDb250ZXh0SUQgPSBsYXllci5ob3N0aW5nQ29udGV4dElEKCk7Cisg
ICAgICAgIGNyZWF0aW9uUHJvcGVydGllcy5ob3N0aW5nRGV2aWNlU2NhbGVGYWN0b3IgPSBkZXZp
Y2VTY2FsZUZhY3RvcigpOworICAgIH0KKworICAgIG1fY3JlYXRlZExheWVycy5hZGQobGF5ZXJJ
RCwgV1RGTW92ZShjcmVhdGlvblByb3BlcnRpZXMpKTsKKyAgICBtX2xpdmVMYXllcnMuYWRkKGxh
eWVySUQsICZsYXllcik7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6bGF5ZXJX
aWxsQmVEZXN0cm95ZWQoUGxhdGZvcm1DQUxheWVyUmVtb3RlJiBsYXllcikKK3sKKyAgICBBU1NF
UlQobGF5ZXIubGF5ZXJJRCgpKTsKKyAgICBHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQg
bGF5ZXJJRCA9IGxheWVyLmxheWVySUQoKTsKKworICAgIG1fY3JlYXRlZExheWVycy5yZW1vdmUo
bGF5ZXJJRCk7CisgICAgbV9saXZlTGF5ZXJzLnJlbW92ZShsYXllcklEKTsKKworICAgIEFTU0VS
VCghbV9kZXN0cm95ZWRMYXllcnMuY29udGFpbnMobGF5ZXJJRCkpOworICAgIG1fZGVzdHJveWVk
TGF5ZXJzLmFwcGVuZChsYXllcklEKTsKKyAgICAKKyAgICBtX2xheWVyc1dpdGhBbmltYXRpb25z
LnJlbW92ZShsYXllcklEKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpiYWNr
aW5nU3RvcmVXYXNDcmVhdGVkKFJlbW90ZUxheWVyQmFja2luZ1N0b3JlJiBiYWNraW5nU3RvcmUp
Cit7CisgICAgbV9iYWNraW5nU3RvcmVDb2xsZWN0aW9uLmJhY2tpbmdTdG9yZVdhc0NyZWF0ZWQo
YmFja2luZ1N0b3JlKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpiYWNraW5n
U3RvcmVXaWxsQmVEZXN0cm95ZWQoUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmUmIGJhY2tpbmdTdG9y
ZSkKK3sKKyAgICBtX2JhY2tpbmdTdG9yZUNvbGxlY3Rpb24uYmFja2luZ1N0b3JlV2lsbEJlRGVz
dHJveWVkKGJhY2tpbmdTdG9yZSk7Cit9CisKK2Jvb2wgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6
YmFja2luZ1N0b3JlV2lsbEJlRGlzcGxheWVkKFJlbW90ZUxheWVyQmFja2luZ1N0b3JlJiBiYWNr
aW5nU3RvcmUpCit7CisgICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ29sbGVjdGlvbi5iYWNraW5n
U3RvcmVXaWxsQmVEaXNwbGF5ZWQoYmFja2luZ1N0b3JlKTsKK30KKworc3RkOjp1bmlxdWVfcHRy
PEdyYXBoaWNzTGF5ZXI+IFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmNyZWF0ZUdyYXBoaWNzTGF5
ZXIoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6VHlwZSBsYXllclR5cGUsIEdyYXBoaWNzTGF5ZXJD
bGllbnQmIGNsaWVudCkKK3sKKyAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxHcmFwaGljc0xh
eWVyQ0FSZW1vdGU+KGxheWVyVHlwZSwgY2xpZW50LCAqdGhpcyk7Cit9CisKK3ZvaWQgUmVtb3Rl
TGF5ZXJUcmVlQ29udGV4dDo6YnVpbGRUcmFuc2FjdGlvbihSZW1vdGVMYXllclRyZWVUcmFuc2Fj
dGlvbiYgdHJhbnNhY3Rpb24sIFBsYXRmb3JtQ0FMYXllciYgcm9vdExheWVyKQoreworICAgIFRy
YWNlU2NvcGUgdHJhY2luZ1Njb3BlKEJ1aWxkVHJhbnNhY3Rpb25TdGFydCwgQnVpbGRUcmFuc2Fj
dGlvbkVuZCk7CisKKyAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmIHJvb3RMYXllclJlbW90ZSA9
IGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4ocm9vdExheWVyKTsKKyAgICB0cmFuc2Fj
dGlvbi5zZXRSb290TGF5ZXJJRChyb290TGF5ZXJSZW1vdGUubGF5ZXJJRCgpKTsKKworICAgIG1f
Y3VycmVudFRyYW5zYWN0aW9uID0gJnRyYW5zYWN0aW9uOworICAgIHJvb3RMYXllclJlbW90ZS5y
ZWN1cnNpdmVCdWlsZFRyYW5zYWN0aW9uKCp0aGlzLCB0cmFuc2FjdGlvbik7CisgICAgbV9jdXJy
ZW50VHJhbnNhY3Rpb24gPSBudWxscHRyOworCisgICAgVmVjdG9yPFJlbW90ZUxheWVyVHJlZVRy
YW5zYWN0aW9uOjpMYXllckNyZWF0aW9uUHJvcGVydGllcz4gY3JlYXRlZExheWVyUHJvcGVydGll
czsKKyAgICBjb3B5VmFsdWVzVG9WZWN0b3IobV9jcmVhdGVkTGF5ZXJzLCBjcmVhdGVkTGF5ZXJQ
cm9wZXJ0aWVzKTsKKyAgICB0cmFuc2FjdGlvbi5zZXRDcmVhdGVkTGF5ZXJzKFdURk1vdmUoY3Jl
YXRlZExheWVyUHJvcGVydGllcykpOworICAgIHRyYW5zYWN0aW9uLnNldERlc3Ryb3llZExheWVy
SURzKFdURk1vdmUobV9kZXN0cm95ZWRMYXllcnMpKTsKKyAgICAKKyAgICBtX2NyZWF0ZWRMYXll
cnMuY2xlYXIoKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpsYXllclByb3Bl
cnR5Q2hhbmdlZFdoaWxlQnVpbGRpbmdUcmFuc2FjdGlvbihQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUm
IGxheWVyKQoreworICAgIGlmIChtX2N1cnJlbnRUcmFuc2FjdGlvbikKKyAgICAgICAgbV9jdXJy
ZW50VHJhbnNhY3Rpb24tPmxheWVyUHJvcGVydGllc0NoYW5nZWQobGF5ZXIpOworfQorCit2b2lk
IFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OndpbGxTdGFydEFuaW1hdGlvbk9uTGF5ZXIoUGxhdGZv
cm1DQUxheWVyUmVtb3RlJiBsYXllcikKK3sKKyAgICBtX2xheWVyc1dpdGhBbmltYXRpb25zLmFk
ZChsYXllci5sYXllcklEKCksICZsYXllcik7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlQ29u
dGV4dDo6YW5pbWF0aW9uRGlkU3RhcnQoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6UGxhdGZvcm1M
YXllcklEIGxheWVySUQsIGNvbnN0IFN0cmluZyYga2V5LCBkb3VibGUgc3RhcnRUaW1lKQorewor
ICAgIGF1dG8gaXQgPSBtX2xheWVyc1dpdGhBbmltYXRpb25zLmZpbmQobGF5ZXJJRCk7CisgICAg
aWYgKGl0ICE9IG1fbGF5ZXJzV2l0aEFuaW1hdGlvbnMuZW5kKCkpCisgICAgICAgIGl0LT52YWx1
ZS0+YW5pbWF0aW9uU3RhcnRlZChrZXksIHN0YXJ0VGltZSk7Cit9CisKK3ZvaWQgUmVtb3RlTGF5
ZXJUcmVlQ29udGV4dDo6YW5pbWF0aW9uRGlkRW5kKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlBs
YXRmb3JtTGF5ZXJJRCBsYXllcklELCBjb25zdCBTdHJpbmcmIGtleSkKK3sKKyAgICBhdXRvIGl0
ID0gbV9sYXllcnNXaXRoQW5pbWF0aW9ucy5maW5kKGxheWVySUQpOworICAgIGlmIChpdCAhPSBt
X2xheWVyc1dpdGhBbmltYXRpb25zLmVuZCgpKQorICAgICAgICBpdC0+dmFsdWUtPmFuaW1hdGlv
bkVuZGVkKGtleSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVy
VHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5oIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dl
YlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRv
ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjMyYjdmNWFhMTdhMzA2MzhjMmJkMGIwODE0OGNjZmQwN2Q4NjhkYjAK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1v
dGVMYXllclRyZWUvUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yLmgKQEAgLTAs
MCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjcHJhZ21hIG9uY2UKKworI2lmIFVTRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRV9ESVNQTEFZ
X01PTklUT1IpCisKKyNpbmNsdWRlICJSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5oIgorI2lu
Y2x1ZGUgPFdlYkNvcmUvRGlzcGxheVJlZnJlc2hNb25pdG9yLmg+CisKK25hbWVzcGFjZSBXZWJL
aXQgeworCitjbGFzcyBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IgOiBwdWJs
aWMgV2ViQ29yZTo6RGlzcGxheVJlZnJlc2hNb25pdG9yIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMg
UmVmPFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcj4gY3JlYXRlKFdlYkNvcmU6
OlBsYXRmb3JtRGlzcGxheUlEIGRpc3BsYXlJRCwgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEm
IGRyYXdpbmdBcmVhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgUmVtb3Rl
TGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yKGRpc3BsYXlJRCwgZHJhd2luZ0FyZWEpKTsK
KyAgICB9CisgICAgCisgICAgdmlydHVhbCB+UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hN
b25pdG9yKCk7CisKKyAgICBib29sIHJlcXVlc3RSZWZyZXNoQ2FsbGJhY2soKSBvdmVycmlkZTsK
KworICAgIHZvaWQgZGlkVXBkYXRlTGF5ZXJzKCk7CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQg
UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yKFdlYkNvcmU6OlBsYXRmb3JtRGlz
cGxheUlELCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYSYpOworCisgICAgV2Vha1B0cjxSZW1v
dGVMYXllclRyZWVEcmF3aW5nQXJlYT4gbV9kcmF3aW5nQXJlYTsKK307CisKK30KKworI2VuZGlm
IC8vIFVTRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRV9ESVNQTEFZX01PTklUT1IpCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUmVt
b3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yLm1tIGIvU291cmNlL1dlYktpdC9XZWJQ
cm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZy
ZXNoTW9uaXRvci5tbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44OTJkNjU3MTU1OThmNzc0YWJmOWUzNDQ5MDc1NzE2
M2NjNDQ1MDgyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dl
YlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRv
ci5tbQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpbXBvcnQgImNvbmZpZy5oIgorI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVl
RGlzcGxheVJlZnJlc2hNb25pdG9yLmgiCisKKyNpZiBVU0UoUkVRVUVTVF9BTklNQVRJT05fRlJB
TUVfRElTUExBWV9NT05JVE9SKQorCisjaW1wb3J0IDx3dGYvQ3VycmVudFRpbWUuaD4KKwordXNp
bmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitSZW1vdGVMYXll
clRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3I6OlJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNo
TW9uaXRvcihQbGF0Zm9ybURpc3BsYXlJRCBkaXNwbGF5SUQsIFJlbW90ZUxheWVyVHJlZURyYXdp
bmdBcmVhJiBkcmF3aW5nQXJlYSkKKyAgICA6IERpc3BsYXlSZWZyZXNoTW9uaXRvcihkaXNwbGF5
SUQpCisgICAgLCBtX2RyYXdpbmdBcmVhKGRyYXdpbmdBcmVhLmNyZWF0ZVdlYWtQdHIoKSkKK3sK
K30KKworUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yOjp+UmVtb3RlTGF5ZXJU
cmVlRGlzcGxheVJlZnJlc2hNb25pdG9yKCkKK3sKKyAgICBpZiAobV9kcmF3aW5nQXJlYSkKKyAg
ICAgICAgbV9kcmF3aW5nQXJlYS0+d2lsbERlc3Ryb3lEaXNwbGF5UmVmcmVzaE1vbml0b3IodGhp
cyk7Cit9CisKK2Jvb2wgUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25pdG9yOjpyZXF1
ZXN0UmVmcmVzaENhbGxiYWNrKCkKK3sKKyAgICBpZiAoIW1fZHJhd2luZ0FyZWEgfHwgIWlzQWN0
aXZlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghaXNTY2hlZHVsZWQoKSkK
KyAgICAgICAgc3RhdGljX2Nhc3Q8RHJhd2luZ0FyZWEmPigqbV9kcmF3aW5nQXJlYS5nZXQoKSku
c2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKTsKKworICAgIHNldElzQWN0aXZlKHRydWUp
OworICAgIHNldElzU2NoZWR1bGVkKHRydWUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lk
IFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcjo6ZGlkVXBkYXRlTGF5ZXJzKCkK
K3sKKyAgICBzZXRJc1NjaGVkdWxlZChmYWxzZSk7CisKKyAgICBpZiAoIWlzUHJldmlvdXNGcmFt
ZURvbmUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2V0SXNQcmV2aW91c0ZyYW1lRG9uZShm
YWxzZSk7CisgICAgaGFuZGxlRGlzcGxheVJlZnJlc2hlZE5vdGlmaWNhdGlvbk9uTWFpblRocmVh
ZCh0aGlzKTsKK30KKworfQorCisjZW5kaWYgLy8gVVNFKFJFUVVFU1RfQU5JTUFUSU9OX0ZSQU1F
X0RJU1BMQVlfTU9OSVRPUikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9X
ZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5oIGIvU291
cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZUxheWVy
VHJlZURyYXdpbmdBcmVhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNDI3NWFlMzExNWE2ZDI1MTg0YmMyYmRkZDgy
ZDA0YTU1YTk5OTdiZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5oCkBA
IC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTQgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1
ZGUgIkNhbGxiYWNrSUQuaCIKKyNpbmNsdWRlICJEcmF3aW5nQXJlYS5oIgorI2luY2x1ZGUgIkdy
YXBoaWNzTGF5ZXJDQVJlbW90ZS5oIgorI2luY2x1ZGUgIlJlbW90ZUxheWVyVHJlZVRyYW5zYWN0
aW9uLmgiCisjaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0xheWVyQ2xpZW50Lmg+CisjaW5jbHVk
ZSA8V2ViQ29yZS9UaW1lci5oPgorI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxkaXNwYXRj
aC9kaXNwYXRjaC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL1dl
YWtQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgUGxhdGZvcm1DQUxheWVyOwor
fQorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDsK
K2NsYXNzIFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvcjsKKworY2xhc3MgUmVt
b3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEgOiBwdWJsaWMgRHJhd2luZ0FyZWEsIHB1YmxpYyBXZWJD
b3JlOjpHcmFwaGljc0xheWVyQ2xpZW50IHsKKyAgICBmcmllbmQgY2xhc3MgUmVtb3RlTGF5ZXJU
cmVlRGlzcGxheVJlZnJlc2hNb25pdG9yOworcHVibGljOgorICAgIFJlbW90ZUxheWVyVHJlZURy
YXdpbmdBcmVhKFdlYlBhZ2UmLCBjb25zdCBXZWJQYWdlQ3JlYXRpb25QYXJhbWV0ZXJzJik7Cisg
ICAgdmlydHVhbCB+UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEoKTsKKworICAgIHVpbnQ2NF90
IG5leHRUcmFuc2FjdGlvbklEKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50VHJhbnNhY3Rpb25J
RCArIDE7IH0KKyAgICB1aW50NjRfdCBsYXN0Q29tbWl0dGVkVHJhbnNhY3Rpb25JRCgpIGNvbnN0
IHsgcmV0dXJuIG1fY3VycmVudFRyYW5zYWN0aW9uSUQ7IH0KKworICAgIFdlYWtQdHI8UmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWE+IGNyZWF0ZVdlYWtQdHIoKSB7IHJldHVybiBtX3dlYWtQdHJG
YWN0b3J5LmNyZWF0ZVdlYWtQdHIoKTsgfQorCitwcml2YXRlOgorICAgIC8vIERyYXdpbmdBcmVh
CisgICAgdm9pZCBzZXROZWVkc0Rpc3BsYXkoKSBvdmVycmlkZTsKKyAgICB2b2lkIHNldE5lZWRz
RGlzcGxheUluUmVjdChjb25zdCBXZWJDb3JlOjpJbnRSZWN0Jikgb3ZlcnJpZGU7CisgICAgdm9p
ZCBzY3JvbGwoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgc2Nyb2xsUmVjdCwgY29uc3QgV2ViQ29y
ZTo6SW50U2l6ZSYgc2Nyb2xsRGVsdGEpIG92ZXJyaWRlOworICAgIHZvaWQgdXBkYXRlR2VvbWV0
cnkoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYgdmlld1NpemUsIGNvbnN0IFdlYkNvcmU6OkludFNp
emUmIGxheWVyUG9zaXRpb24sIGJvb2wgZmx1c2hTeW5jaHJvbm91c2x5LCBjb25zdCBXZWJDb3Jl
OjpNYWNoU2VuZFJpZ2h0JiBmZW5jZVBvcnQpIG92ZXJyaWRlOworCisgICAgV2ViQ29yZTo6R3Jh
cGhpY3NMYXllckZhY3RvcnkqIGdyYXBoaWNzTGF5ZXJGYWN0b3J5KCkgb3ZlcnJpZGU7CisgICAg
dm9pZCBzZXRSb290Q29tcG9zaXRpbmdMYXllcihXZWJDb3JlOjpHcmFwaGljc0xheWVyKikgb3Zl
cnJpZGU7CisgICAgdm9pZCBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpIG92ZXJyaWRl
OworICAgIHZvaWQgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2hJbW1lZGlhdGVseSgpIG92
ZXJyaWRlOworICAgIHZvaWQgYXR0YWNoVmlld092ZXJsYXlHcmFwaGljc0xheWVyKFdlYkNvcmU6
OkZyYW1lKiwgV2ViQ29yZTo6R3JhcGhpY3NMYXllciopIG92ZXJyaWRlOworCisgICAgdm9pZCBh
ZGRUcmFuc2FjdGlvbkNhbGxiYWNrSUQoQ2FsbGJhY2tJRCkgb3ZlcnJpZGU7CisKKyAgICBSZWZQ
dHI8V2ViQ29yZTo6RGlzcGxheVJlZnJlc2hNb25pdG9yPiBjcmVhdGVEaXNwbGF5UmVmcmVzaE1v
bml0b3IoV2ViQ29yZTo6UGxhdGZvcm1EaXNwbGF5SUQpIG92ZXJyaWRlOworICAgIHZvaWQgd2ls
bERlc3Ryb3lEaXNwbGF5UmVmcmVzaE1vbml0b3IoV2ViQ29yZTo6RGlzcGxheVJlZnJlc2hNb25p
dG9yKik7CisKKyAgICBib29sIHNob3VsZFVzZVRpbGVkQmFja2luZ0ZvckZyYW1lVmlldyhjb25z
dCBXZWJDb3JlOjpGcmFtZVZpZXcmKSBvdmVycmlkZTsKKworICAgIHZvaWQgdXBkYXRlUHJlZmVy
ZW5jZXMoY29uc3QgV2ViUHJlZmVyZW5jZXNTdG9yZSYpIG92ZXJyaWRlOworCisgICAgYm9vbCBz
dXBwb3J0c0FzeW5jU2Nyb2xsaW5nKCkgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAg
dm9pZCBzZXRMYXllclRyZWVTdGF0ZUlzRnJvemVuKGJvb2wpIG92ZXJyaWRlOworCisgICAgdm9p
ZCBmb3JjZVJlcGFpbnQoKSBvdmVycmlkZTsKKyAgICBib29sIGZvcmNlUmVwYWludEFzeW5jKENh
bGxiYWNrSUQpIG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB2b2lkIHNldFZpZXdF
eHBvc2VkUmVjdChzdGQ6Om9wdGlvbmFsPFdlYkNvcmU6OkZsb2F0UmVjdD4pIG92ZXJyaWRlOwor
ICAgIHN0ZDo6b3B0aW9uYWw8V2ViQ29yZTo6RmxvYXRSZWN0PiB2aWV3RXhwb3NlZFJlY3QoKSBj
b25zdCBvdmVycmlkZSB7IHJldHVybiBtX3Njcm9sbGVkVmlld0V4cG9zZWRSZWN0OyB9CisKKyAg
ICB2b2lkIGFjY2VsZXJhdGVkQW5pbWF0aW9uRGlkU3RhcnQodWludDY0X3QgbGF5ZXJJRCwgY29u
c3QgU3RyaW5nJiBrZXksIGRvdWJsZSBzdGFydFRpbWUpIG92ZXJyaWRlOworICAgIHZvaWQgYWNj
ZWxlcmF0ZWRBbmltYXRpb25EaWRFbmQodWludDY0X3QgbGF5ZXJJRCwgY29uc3QgU3RyaW5nJiBr
ZXkpIG92ZXJyaWRlOworCisjaWYgUExBVEZPUk0oSU9TKQorICAgIFdlYkNvcmU6OkZsb2F0UmVj
dCBleHBvc2VkQ29udGVudFJlY3QoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldEV4cG9z
ZWRDb250ZW50UmVjdChjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmKSBvdmVycmlkZTsKKyNlbmRp
ZgorCisgICAgdm9pZCBkaWRVcGRhdGUoKSBvdmVycmlkZTsKKworI2lmIFBMQVRGT1JNKElPUykK
KyAgICB2b2lkIHNldERldmljZVNjYWxlRmFjdG9yKGZsb2F0KSBvdmVycmlkZTsKKyNlbmRpZgor
CisgICAgdm9pZCBtYWluRnJhbWVDb250ZW50U2l6ZUNoYW5nZWQoY29uc3QgV2ViQ29yZTo6SW50
U2l6ZSYpIG92ZXJyaWRlOworCisgICAgdm9pZCBhY3Rpdml0eVN0YXRlRGlkQ2hhbmdlKFdlYkNv
cmU6OkFjdGl2aXR5U3RhdGU6OkZsYWdzIGNoYW5nZWQsIGJvb2wgd2FudHNEaWRVcGRhdGVBY3Rp
dml0eVN0YXRlLCBjb25zdCBWZWN0b3I8Q2FsbGJhY2tJRD4mIGNhbGxiYWNrSURzKSBvdmVycmlk
ZTsKKworICAgIGJvb2wgYWRqdXN0TGF5ZXJGbHVzaFRocm90dGxpbmcoV2ViQ29yZTo6TGF5ZXJG
bHVzaFRocm90dGxlU3RhdGU6OkZsYWdzKSBvdmVycmlkZTsKKworICAgIGJvb2wgZGlzcGF0Y2hE
aWRSZWFjaExheW91dE1pbGVzdG9uZShXZWJDb3JlOjpMYXlvdXRNaWxlc3RvbmVzKSBvdmVycmlk
ZTsKKworICAgIHZvaWQgdXBkYXRlU2Nyb2xsZWRFeHBvc2VkUmVjdCgpOworICAgIHZvaWQgdXBk
YXRlUm9vdExheWVycygpOworCisgICAgdm9pZCBmbHVzaExheWVycygpOworCisgICAgV2ViQ29y
ZTo6VGlsZWRCYWNraW5nKiBtYWluRnJhbWVUaWxlZEJhY2tpbmcoKSBjb25zdDsKKworICAgIHVp
bnQ2NF90IHRha2VOZXh0VHJhbnNhY3Rpb25JRCgpIHsgcmV0dXJuICsrbV9jdXJyZW50VHJhbnNh
Y3Rpb25JRDsgfQorCisgICAgYm9vbCBtYXJrTGF5ZXJzVm9sYXRpbGVJbW1lZGlhdGVseUlmUG9z
c2libGUoKSBvdmVycmlkZTsKKworICAgIGNsYXNzIEJhY2tpbmdTdG9yZUZsdXNoZXIgOiBwdWJs
aWMgVGhyZWFkU2FmZVJlZkNvdW50ZWQ8QmFja2luZ1N0b3JlRmx1c2hlcj4geworICAgIHB1Ymxp
YzoKKyAgICAgICAgc3RhdGljIFJlZjxCYWNraW5nU3RvcmVGbHVzaGVyPiBjcmVhdGUoSVBDOjpD
b25uZWN0aW9uKiwgc3RkOjp1bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4sIFZlY3RvcjxSZXRhaW5Q
dHI8Q0dDb250ZXh0UmVmPj4pOworCisgICAgICAgIHZvaWQgZmx1c2goKTsKKyAgICAgICAgYm9v
bCBoYXNGbHVzaGVkKCkgY29uc3QgeyByZXR1cm4gbV9oYXNGbHVzaGVkOyB9CisKKyAgICBwcml2
YXRlOgorICAgICAgICBCYWNraW5nU3RvcmVGbHVzaGVyKElQQzo6Q29ubmVjdGlvbiosIHN0ZDo6
dW5pcXVlX3B0cjxJUEM6OkVuY29kZXI+LCBWZWN0b3I8UmV0YWluUHRyPENHQ29udGV4dFJlZj4+
KTsKKworICAgICAgICBSZWZQdHI8SVBDOjpDb25uZWN0aW9uPiBtX2Nvbm5lY3Rpb247CisgICAg
ICAgIHN0ZDo6dW5pcXVlX3B0cjxJUEM6OkVuY29kZXI+IG1fY29tbWl0RW5jb2RlcjsKKyAgICAg
ICAgVmVjdG9yPFJldGFpblB0cjxDR0NvbnRleHRSZWY+PiBtX2NvbnRleHRzVG9GbHVzaDsKKwor
ICAgICAgICBzdGQ6OmF0b21pYzxib29sPiBtX2hhc0ZsdXNoZWQ7CisgICAgfTsKKworICAgIHN0
ZDo6dW5pcXVlX3B0cjxSZW1vdGVMYXllclRyZWVDb250ZXh0PiBtX3JlbW90ZUxheWVyVHJlZUNv
bnRleHQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI+IG1fcm9v
dExheWVyOworCisgICAgV2ViQ29yZTo6SW50U2l6ZSBtX3ZpZXdTaXplOworCisgICAgc3RkOjpv
cHRpb25hbDxXZWJDb3JlOjpGbG9hdFJlY3Q+IG1fdmlld0V4cG9zZWRSZWN0OworICAgIHN0ZDo6
b3B0aW9uYWw8V2ViQ29yZTo6RmxvYXRSZWN0PiBtX3Njcm9sbGVkVmlld0V4cG9zZWRSZWN0Owor
CisgICAgV2ViQ29yZTo6VGltZXIgbV9sYXllckZsdXNoVGltZXI7CisgICAgYm9vbCBtX2lzRmx1
c2hpbmdTdXNwZW5kZWQgeyBmYWxzZSB9OworICAgIGJvb2wgbV9oYXNEZWZlcnJlZEZsdXNoIHsg
ZmFsc2UgfTsKKyAgICBib29sIG1faXNUaHJvdHRsaW5nTGF5ZXJGbHVzaGVzIHsgZmFsc2UgfTsK
KyAgICBib29sIG1faXNMYXllckZsdXNoVGhyb3R0bGluZ1RlbXBvcmFyaWx5RGlzYWJsZWRGb3JJ
bnRlcmFjdGlvbiB7IGZhbHNlIH07CisgICAgYm9vbCBtX2lzSW5pdGlhbFRocm90dGxlZExheWVy
Rmx1c2ggeyBmYWxzZSB9OworCisgICAgYm9vbCBtX3dhaXRpbmdGb3JCYWNraW5nU3RvcmVTd2Fw
IHsgZmFsc2UgfTsKKyAgICBib29sIG1faGFkRmx1c2hEZWZlcnJlZFdoaWxlV2FpdGluZ0ZvckJh
Y2tpbmdTdG9yZVN3YXAgeyBmYWxzZSB9OworICAgIGJvb2wgbV9uZXh0Rmx1c2hJc0ZvckltbWVk
aWF0ZVBhaW50IHsgZmFsc2UgfTsKKworICAgIGRpc3BhdGNoX3F1ZXVlX3QgbV9jb21taXRRdWV1
ZTsKKyAgICBSZWZQdHI8QmFja2luZ1N0b3JlRmx1c2hlcj4gbV9wZW5kaW5nQmFja2luZ1N0b3Jl
Rmx1c2hlcjsKKworICAgIEhhc2hTZXQ8UmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25p
dG9yKj4gbV9kaXNwbGF5UmVmcmVzaE1vbml0b3JzOworICAgIEhhc2hTZXQ8UmVtb3RlTGF5ZXJU
cmVlRGlzcGxheVJlZnJlc2hNb25pdG9yKj4qIG1fZGlzcGxheVJlZnJlc2hNb25pdG9yc1RvTm90
aWZ5IHsgbnVsbHB0ciB9OworCisgICAgdWludDY0X3QgbV9jdXJyZW50VHJhbnNhY3Rpb25JRCB7
IDAgfTsKKyAgICBWZWN0b3I8UmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlRyYW5zYWN0aW9u
Q2FsbGJhY2tJRD4gbV9wZW5kaW5nQ2FsbGJhY2tJRHM7CisKKyAgICBXZWJDb3JlOjpMYXlvdXRN
aWxlc3RvbmVzIG1fcGVuZGluZ05ld2x5UmVhY2hlZExheW91dE1pbGVzdG9uZXMgeyAwIH07CisK
KyAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBtX2NvbnRlbnRMYXllciB7IG51bGxwdHIgfTsK
KyAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBtX3ZpZXdPdmVybGF5Um9vdExheWVyIHsgbnVs
bHB0ciB9OworICAgIAorICAgIFdlYWtQdHJGYWN0b3J5PFJlbW90ZUxheWVyVHJlZURyYXdpbmdB
cmVhPiBtX3dlYWtQdHJGYWN0b3J5OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKK1NQ
RUNJQUxJWkVfVFlQRV9UUkFJVFNfRFJBV0lOR19BUkVBKFJlbW90ZUxheWVyVHJlZURyYXdpbmdB
cmVhLCBEcmF3aW5nQXJlYVR5cGVSZW1vdGVMYXllclRyZWUpCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUmVtb3RlTGF5ZXJUcmVl
RHJhd2luZ0FyZWEubW0gYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9SZW1vdGVM
YXllclRyZWUvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEubW0KbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjE0NmZh
MGYwYjg2NjVjOWQyNDA2MDhkZWQ3MWVjYjgzNTYzYTE2MwotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVMYXll
clRyZWVEcmF3aW5nQXJlYS5tbQpAQCAtMCwwICsxLDUxNCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMi0yMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05U
UklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2ltcG9ydCAiY29uZmlnLmgiCisjaW1wb3J0ICJSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5o
IgorCisjaW1wb3J0ICJEcmF3aW5nQXJlYVByb3h5TWVzc2FnZXMuaCIKKyNpbXBvcnQgIkdyYXBo
aWNzTGF5ZXJDQVJlbW90ZS5oIgorI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVyUmVtb3RlLmgiCisj
aW1wb3J0ICJSZW1vdGVMYXllckJhY2tpbmdTdG9yZUNvbGxlY3Rpb24uaCIKKyNpbXBvcnQgIlJl
bW90ZUxheWVyVHJlZUNvbnRleHQuaCIKKyNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZURpc3BsYXlS
ZWZyZXNoTW9uaXRvci5oIgorI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWFQcm94
eU1lc3NhZ2VzLmgiCisjaW1wb3J0ICJSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5oIgorI2lt
cG9ydCAiUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JUcmFuc2FjdGlvbi5oIgorI2ltcG9ydCAi
V2ViUGFnZS5oIgorI2ltcG9ydCAiV2ViUHJvY2Vzcy5oIgorI2ltcG9ydCA8UXVhcnR6Q29yZS9R
dWFydHpDb3JlLmg+CisjaW1wb3J0IDxXZWJDb3JlL0RlYnVnUGFnZU92ZXJsYXlzLmg+CisjaW1w
b3J0IDxXZWJDb3JlL0ZyYW1lLmg+CisjaW1wb3J0IDxXZWJDb3JlL0ZyYW1lVmlldy5oPgorI2lt
cG9ydCA8V2ViQ29yZS9JbnNwZWN0b3JDb250cm9sbGVyLmg+CisjaW1wb3J0IDxXZWJDb3JlL01h
aW5GcmFtZS5oPgorI2ltcG9ydCA8V2ViQ29yZS9QYWdlT3ZlcmxheUNvbnRyb2xsZXIuaD4KKyNp
bXBvcnQgPFdlYkNvcmUvUmVuZGVyTGF5ZXJDb21wb3NpdG9yLmg+CisjaW1wb3J0IDxXZWJDb3Jl
L1JlbmRlclZpZXcuaD4KKyNpbXBvcnQgPFdlYkNvcmUvU2V0dGluZ3MuaD4KKyNpbXBvcnQgPFdl
YkNvcmUvVGlsZWRCYWNraW5nLmg+CisjaW1wb3J0IDxwYWwvc3BpL2NvY29hL1F1YXJ0ekNvcmVT
UEkuaD4KKyNpbXBvcnQgPHd0Zi9TeXN0ZW1UcmFjaW5nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBX
ZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0Fy
ZWE6OlJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhKFdlYlBhZ2UmIHdlYlBhZ2UsIGNvbnN0IFdl
YlBhZ2VDcmVhdGlvblBhcmFtZXRlcnMmKQorICAgIDogRHJhd2luZ0FyZWEoRHJhd2luZ0FyZWFU
eXBlUmVtb3RlTGF5ZXJUcmVlLCB3ZWJQYWdlKQorICAgICwgbV9yZW1vdGVMYXllclRyZWVDb250
ZXh0KHN0ZDo6bWFrZV91bmlxdWU8UmVtb3RlTGF5ZXJUcmVlQ29udGV4dD4od2ViUGFnZSkpCisg
ICAgLCBtX3Jvb3RMYXllcihHcmFwaGljc0xheWVyOjpjcmVhdGUoZ3JhcGhpY3NMYXllckZhY3Rv
cnkoKSwgKnRoaXMpKQorICAgICwgbV9sYXllckZsdXNoVGltZXIoKnRoaXMsICZSZW1vdGVMYXll
clRyZWVEcmF3aW5nQXJlYTo6Zmx1c2hMYXllcnMpCisgICAgLCBtX3dlYWtQdHJGYWN0b3J5KHRo
aXMpCit7CisgICAgd2ViUGFnZS5jb3JlUGFnZSgpLT5zZXR0aW5ncygpLnNldEZvcmNlQ29tcG9z
aXRpbmdNb2RlKHRydWUpOworI2lmIFBMQVRGT1JNKElPUykKKyAgICB3ZWJQYWdlLmNvcmVQYWdl
KCktPnNldHRpbmdzKCkuc2V0RGVsZWdhdGVzUGFnZVNjYWxpbmcodHJ1ZSk7CisjZW5kaWYKKyAg
ICBtX3Jvb3RMYXllci0+c2V0TmFtZSgiZHJhd2luZyBhcmVhIHJvb3QiKTsKKworICAgIG1fY29t
bWl0UXVldWUgPSBkaXNwYXRjaF9xdWV1ZV9jcmVhdGUoImNvbS5hcHBsZS5XZWJLaXQuV2ViQ29u
dGVudC5SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5Db21taXRRdWV1ZSIsIG51bGxwdHIpOwor
CisgICAgLy8gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgd2UgZ2V0IGEgdW5pcXVlIERpc3BsYXlS
ZWZyZXNoTW9uaXRvciBwZXItRHJhd2luZ0FyZWEgKG5lY2Vzc2FyeSBiZWNhdXNlIERpc3BsYXlS
ZWZyZXNoTW9uaXRvcgorICAgIC8vIGlzIGRyaXZlbiBieSB0aGlzIGNsYXNzKSwgZ2l2ZSBlYWNo
IHBhZ2UgYSB1bmlxdWUgRGlzcGxheUlEIGRlcml2ZWQgZnJvbSBXZWJQYWdlJ3MgdW5pcXVlIElE
LgorICAgIC8vIEZJWE1FOiBXaGlsZSB1c2luZyB0aGUgaGlnaCBlbmQgb2YgdGhlIHJhbmdlIG9m
IERpc3BsYXlJRHMgbWFrZXMgYSBjb2xsaXNpb24gd2l0aCByZWFsLCBub24tUmVtb3RlTGF5ZXJU
cmVlRHJhd2luZ0FyZWEKKyAgICAvLyBEaXNwbGF5SURzIGxlc3MgbGlrZWx5LCBpdCBpcyBub3Qg
ZW50aXJlbHkgc2FmZSB0byBoYXZlIGEgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEgYW5kIFRp
bGVkQ29yZUFuaW1hdGlvbkRyYXdpbmdBcmVhCisgICAgLy8gY29lZXhpc3QgaW4gdGhlIHNhbWUg
cHJvY2Vzcy4KKyAgICB3ZWJQYWdlLndpbmRvd1NjcmVlbkRpZENoYW5nZShzdGQ6Om51bWVyaWNf
bGltaXRzPHVpbnQzMl90Pjo6bWF4KCkgLSB3ZWJQYWdlLnBhZ2VJRCgpKTsKK30KKworUmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWE6On5SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYSgpCit7Cisg
ICAgZGlzcGF0Y2hfcmVsZWFzZShtX2NvbW1pdFF1ZXVlKTsKK30KKwordm9pZCBSZW1vdGVMYXll
clRyZWVEcmF3aW5nQXJlYTo6c2V0TmVlZHNEaXNwbGF5KCkKK3sKK30KKwordm9pZCBSZW1vdGVM
YXllclRyZWVEcmF3aW5nQXJlYTo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEludFJlY3Qm
KQoreworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzY3JvbGwoY29uc3Qg
SW50UmVjdCYgc2Nyb2xsUmVjdCwgY29uc3QgSW50U2l6ZSYgc2Nyb2xsRGVsdGEpCit7Cit9CisK
K0dyYXBoaWNzTGF5ZXJGYWN0b3J5KiBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6Z3JhcGhp
Y3NMYXllckZhY3RvcnkoKQoreworICAgIHJldHVybiBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQu
Z2V0KCk7Cit9CisKK1JlZlB0cjxEaXNwbGF5UmVmcmVzaE1vbml0b3I+IFJlbW90ZUxheWVyVHJl
ZURyYXdpbmdBcmVhOjpjcmVhdGVEaXNwbGF5UmVmcmVzaE1vbml0b3IoUGxhdGZvcm1EaXNwbGF5
SUQgZGlzcGxheUlEKQoreworICAgIGF1dG8gbW9uaXRvciA9IFJlbW90ZUxheWVyVHJlZURpc3Bs
YXlSZWZyZXNoTW9uaXRvcjo6Y3JlYXRlKGRpc3BsYXlJRCwgKnRoaXMpOworICAgIG1fZGlzcGxh
eVJlZnJlc2hNb25pdG9ycy5hZGQobW9uaXRvci5wdHIoKSk7CisgICAgcmV0dXJuIFdURk1vdmUo
bW9uaXRvcik7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OndpbGxEZXN0
cm95RGlzcGxheVJlZnJlc2hNb25pdG9yKERpc3BsYXlSZWZyZXNoTW9uaXRvciogbW9uaXRvcikK
K3sKKyAgICBhdXRvIHJlbW90ZU1vbml0b3IgPSBzdGF0aWNfY2FzdDxSZW1vdGVMYXllclRyZWVE
aXNwbGF5UmVmcmVzaE1vbml0b3IqPihtb25pdG9yKTsKKyAgICBtX2Rpc3BsYXlSZWZyZXNoTW9u
aXRvcnMucmVtb3ZlKHJlbW90ZU1vbml0b3IpOworCisgICAgaWYgKG1fZGlzcGxheVJlZnJlc2hN
b25pdG9yc1RvTm90aWZ5KQorICAgICAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnNUb05vdGlm
eS0+cmVtb3ZlKHJlbW90ZU1vbml0b3IpOworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdp
bmdBcmVhOjp1cGRhdGVSb290TGF5ZXJzKCkKK3sKKyAgICBWZWN0b3I8R3JhcGhpY3NMYXllcio+
IGNoaWxkcmVuOworICAgIGlmIChtX2NvbnRlbnRMYXllcikgeworICAgICAgICBjaGlsZHJlbi5h
cHBlbmQobV9jb250ZW50TGF5ZXIpOworICAgICAgICBpZiAobV92aWV3T3ZlcmxheVJvb3RMYXll
cikKKyAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZChtX3ZpZXdPdmVybGF5Um9vdExheWVyKTsK
KyAgICB9CisKKyAgICBtX3Jvb3RMYXllci0+c2V0Q2hpbGRyZW4oY2hpbGRyZW4pOworfQorCit2
b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphdHRhY2hWaWV3T3ZlcmxheUdyYXBoaWNz
TGF5ZXIoRnJhbWUqIGZyYW1lLCBHcmFwaGljc0xheWVyKiB2aWV3T3ZlcmxheVJvb3RMYXllcikK
K3sKKyAgICBpZiAoIWZyYW1lLT5pc01haW5GcmFtZSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBtX3ZpZXdPdmVybGF5Um9vdExheWVyID0gdmlld092ZXJsYXlSb290TGF5ZXI7CisgICAgdXBk
YXRlUm9vdExheWVycygpOworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpz
ZXRSb290Q29tcG9zaXRpbmdMYXllcihHcmFwaGljc0xheWVyKiByb290TGF5ZXIpCit7CisgICAg
bV9jb250ZW50TGF5ZXIgPSByb290TGF5ZXI7CisgICAgdXBkYXRlUm9vdExheWVycygpOworICAg
IHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllckZsdXNoKCk7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJU
cmVlRHJhd2luZ0FyZWE6OnVwZGF0ZUdlb21ldHJ5KGNvbnN0IEludFNpemUmIHZpZXdTaXplLCBj
b25zdCBJbnRTaXplJiBsYXllclBvc2l0aW9uLCBib29sIGZsdXNoU3luY2hyb25vdXNseSwgY29u
c3QgV2ViQ29yZTo6TWFjaFNlbmRSaWdodCYpCit7CisgICAgbV92aWV3U2l6ZSA9IHZpZXdTaXpl
OworICAgIG1fd2ViUGFnZS5zZXRTaXplKHZpZXdTaXplKTsKKworICAgIHNjaGVkdWxlQ29tcG9z
aXRpbmdMYXllckZsdXNoKCk7CisKKyAgICBtX3dlYlBhZ2Uuc2VuZChNZXNzYWdlczo6RHJhd2lu
Z0FyZWFQcm94eTo6RGlkVXBkYXRlR2VvbWV0cnkoKSk7Cit9CisKK2Jvb2wgUmVtb3RlTGF5ZXJU
cmVlRHJhd2luZ0FyZWE6OnNob3VsZFVzZVRpbGVkQmFja2luZ0ZvckZyYW1lVmlldyhjb25zdCBG
cmFtZVZpZXcmIGZyYW1lVmlldykKK3sKKyAgICByZXR1cm4gZnJhbWVWaWV3LmZyYW1lKCkuaXNN
YWluRnJhbWUoKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6dXBkYXRl
UHJlZmVyZW5jZXMoY29uc3QgV2ViUHJlZmVyZW5jZXNTdG9yZSYpCit7CisgICAgU2V0dGluZ3Mm
IHNldHRpbmdzID0gbV93ZWJQYWdlLmNvcmVQYWdlKCktPnNldHRpbmdzKCk7CisKKyAgICAvLyBG
aXhlZCBwb3NpdGlvbiBlbGVtZW50cyBuZWVkIHRvIGJlIGNvbXBvc2l0ZWQgYW5kIGNyZWF0ZSBz
dGFja2luZyBjb250ZXh0cworICAgIC8vIGluIG9yZGVyIHRvIGJlIHNjcm9sbGVkIGJ5IHRoZSBT
Y3JvbGxpbmdDb29yZGluYXRvci4KKyAgICBzZXR0aW5ncy5zZXRBY2NlbGVyYXRlZENvbXBvc2l0
aW5nRm9yRml4ZWRQb3NpdGlvbkVuYWJsZWQodHJ1ZSk7CisKKyAgICBtX3Jvb3RMYXllci0+c2V0
U2hvd0RlYnVnQm9yZGVyKHNldHRpbmdzLnNob3dEZWJ1Z0JvcmRlcnMoKSk7CisKKyAgICBpZiAo
TWFpbkZyYW1lKiBtYWluRnJhbWUgPSBtX3dlYlBhZ2UubWFpbkZyYW1lKCkpCisgICAgICAgIERl
YnVnUGFnZU92ZXJsYXlzOjpzZXR0aW5nc0NoYW5nZWQoKm1haW5GcmFtZSk7Cit9CisKKyNpZiBQ
TEFURk9STShJT1MpCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzZXREZXZpY2VT
Y2FsZUZhY3RvcihmbG9hdCBkZXZpY2VTY2FsZUZhY3RvcikKK3sKKyAgICBtX3dlYlBhZ2Uuc2V0
RGV2aWNlU2NhbGVGYWN0b3IoZGV2aWNlU2NhbGVGYWN0b3IpOworfQorI2VuZGlmCisKK3ZvaWQg
UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnNldExheWVyVHJlZVN0YXRlSXNGcm96ZW4oYm9v
bCBpc0Zyb3plbikKK3sKKyAgICBpZiAobV9pc0ZsdXNoaW5nU3VzcGVuZGVkID09IGlzRnJvemVu
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX2lzRmx1c2hpbmdTdXNwZW5kZWQgPSBpc0Zyb3pl
bjsKKworICAgIGlmICghbV9pc0ZsdXNoaW5nU3VzcGVuZGVkICYmIG1faGFzRGVmZXJyZWRGbHVz
aCkgeworICAgICAgICBtX2hhc0RlZmVycmVkRmx1c2ggPSBmYWxzZTsKKyAgICAgICAgc2NoZWR1
bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJU
cmVlRHJhd2luZ0FyZWE6OmZvcmNlUmVwYWludCgpCit7CisgICAgaWYgKG1faXNGbHVzaGluZ1N1
c3BlbmRlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChGcmFtZSogZnJhbWUgPSAmbV93
ZWJQYWdlLmNvcmVQYWdlKCktPm1haW5GcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJl
ZSgpLnRyYXZlcnNlTmV4dCgpKSB7CisgICAgICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gZnJh
bWUtPnZpZXcoKTsKKyAgICAgICAgaWYgKCFmcmFtZVZpZXcgfHwgIWZyYW1lVmlldy0+dGlsZWRC
YWNraW5nKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmcmFtZVZpZXctPnRp
bGVkQmFja2luZygpLT5mb3JjZVJlcGFpbnQoKTsKKyAgICB9CisKKyAgICBmbHVzaExheWVycygp
OworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphY2NlbGVyYXRlZEFuaW1h
dGlvbkRpZFN0YXJ0KHVpbnQ2NF90IGxheWVySUQsIGNvbnN0IFN0cmluZyYga2V5LCBkb3VibGUg
c3RhcnRUaW1lKQoreworICAgIG1fcmVtb3RlTGF5ZXJUcmVlQ29udGV4dC0+YW5pbWF0aW9uRGlk
U3RhcnQobGF5ZXJJRCwga2V5LCBzdGFydFRpbWUpOworfQorCit2b2lkIFJlbW90ZUxheWVyVHJl
ZURyYXdpbmdBcmVhOjphY2NlbGVyYXRlZEFuaW1hdGlvbkRpZEVuZCh1aW50NjRfdCBsYXllcklE
LCBjb25zdCBTdHJpbmcmIGtleSkKK3sKKyAgICBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQtPmFu
aW1hdGlvbkRpZEVuZChsYXllcklELCBrZXkpOworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURy
YXdpbmdBcmVhOjpzZXRWaWV3RXhwb3NlZFJlY3Qoc3RkOjpvcHRpb25hbDxXZWJDb3JlOjpGbG9h
dFJlY3Q+IHZpZXdFeHBvc2VkUmVjdCkKK3sKKyAgICBtX3ZpZXdFeHBvc2VkUmVjdCA9IHZpZXdF
eHBvc2VkUmVjdDsKKyAgICB1cGRhdGVTY3JvbGxlZEV4cG9zZWRSZWN0KCk7Cit9CisKKyNpZiBQ
TEFURk9STShJT1MpCitXZWJDb3JlOjpGbG9hdFJlY3QgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0Fy
ZWE6OmV4cG9zZWRDb250ZW50UmVjdCgpIGNvbnN0Cit7CisgICAgRnJhbWVWaWV3KiBmcmFtZVZp
ZXcgPSBtX3dlYlBhZ2UubWFpbkZyYW1lVmlldygpOworICAgIGlmICghZnJhbWVWaWV3KQorICAg
ICAgICByZXR1cm4gRmxvYXRSZWN0KCk7CisKKyAgICByZXR1cm4gZnJhbWVWaWV3LT5leHBvc2Vk
Q29udGVudFJlY3QoKTsKK30KKwordm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6c2V0
RXhwb3NlZENvbnRlbnRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgZXhwb3NlZENvbnRlbnRSZWN0KQor
eworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gbV93ZWJQYWdlLm1haW5GcmFtZVZpZXcoKTsK
KyAgICBpZiAoIWZyYW1lVmlldykKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChmcmFtZVZpZXct
PmV4cG9zZWRDb250ZW50UmVjdCgpID09IGV4cG9zZWRDb250ZW50UmVjdCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgZnJhbWVWaWV3LT5zZXRFeHBvc2VkQ29udGVudFJlY3QoZXhwb3NlZENvbnRl
bnRSZWN0KTsKKyAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOworfQorI2VuZGlm
CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnVwZGF0ZVNjcm9sbGVkRXhwb3Nl
ZFJlY3QoKQoreworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gbV93ZWJQYWdlLm1haW5GcmFt
ZVZpZXcoKTsKKyAgICBpZiAoIWZyYW1lVmlldykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9z
Y3JvbGxlZFZpZXdFeHBvc2VkUmVjdCA9IG1fdmlld0V4cG9zZWRSZWN0OworCisjaWYgIVBMQVRG
T1JNKElPUykKKyAgICBpZiAobV92aWV3RXhwb3NlZFJlY3QpIHsKKyAgICAgICAgU2Nyb2xsT2Zm
c2V0IHNjcm9sbE9mZnNldCA9IGZyYW1lVmlldy0+c2Nyb2xsT2Zmc2V0RnJvbVBvc2l0aW9uKGZy
YW1lVmlldy0+c2Nyb2xsUG9zaXRpb24oKSk7CisgICAgICAgIG1fc2Nyb2xsZWRWaWV3RXhwb3Nl
ZFJlY3QudmFsdWUoKS5tb3ZlQnkoc2Nyb2xsT2Zmc2V0KTsKKyAgICB9CisjZW5kaWYKKworICAg
IGZyYW1lVmlldy0+c2V0Vmlld0V4cG9zZWRSZWN0KG1fc2Nyb2xsZWRWaWV3RXhwb3NlZFJlY3Qp
OworfQorCitUaWxlZEJhY2tpbmcqIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjptYWluRnJh
bWVUaWxlZEJhY2tpbmcoKSBjb25zdAoreworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gbV93
ZWJQYWdlLm1haW5GcmFtZVZpZXcoKTsKKyAgICByZXR1cm4gZnJhbWVWaWV3ID8gZnJhbWVWaWV3
LT50aWxlZEJhY2tpbmcoKSA6IG51bGxwdHI7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJh
d2luZ0FyZWE6OnNjaGVkdWxlQ29tcG9zaXRpbmdMYXllckZsdXNoSW1tZWRpYXRlbHkoKQorewor
ICAgIG1fbGF5ZXJGbHVzaFRpbWVyLnN0YXJ0T25lU2hvdCgwX3MpOworfQorCit2b2lkIFJlbW90
ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpCit7
CisgICAgaWYgKG1faXNGbHVzaGluZ1N1c3BlbmRlZCkgeworICAgICAgICBtX2lzTGF5ZXJGbHVz
aFRocm90dGxpbmdUZW1wb3JhcmlseURpc2FibGVkRm9ySW50ZXJhY3Rpb24gPSBmYWxzZTsKKyAg
ICAgICAgbV9oYXNEZWZlcnJlZEZsdXNoID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyAgICBpZiAobV9pc0xheWVyRmx1c2hUaHJvdHRsaW5nVGVtcG9yYXJpbHlEaXNhYmxlZEZvcklu
dGVyYWN0aW9uKSB7CisgICAgICAgIG1faXNMYXllckZsdXNoVGhyb3R0bGluZ1RlbXBvcmFyaWx5
RGlzYWJsZWRGb3JJbnRlcmFjdGlvbiA9IGZhbHNlOworICAgICAgICBzY2hlZHVsZUNvbXBvc2l0
aW5nTGF5ZXJGbHVzaEltbWVkaWF0ZWx5KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBpZiAobV9sYXllckZsdXNoVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgY29uc3QgU2Vjb25kcyBpbml0aWFsRmx1c2hEZWxheSA9IDUwMF9tczsKKyAgICBjb25zdCBT
ZWNvbmRzIGZsdXNoRGVsYXkgPSAxNTAwX21zOworICAgIFNlY29uZHMgdGhyb3R0bGVEZWxheSA9
IG1faXNUaHJvdHRsaW5nTGF5ZXJGbHVzaGVzID8gKG1faXNJbml0aWFsVGhyb3R0bGVkTGF5ZXJG
bHVzaCA/IGluaXRpYWxGbHVzaERlbGF5IDogZmx1c2hEZWxheSkgOiAwX3M7CisgICAgbV9pc0lu
aXRpYWxUaHJvdHRsZWRMYXllckZsdXNoID0gZmFsc2U7CisKKyAgICBtX2xheWVyRmx1c2hUaW1l
ci5zdGFydE9uZVNob3QodGhyb3R0bGVEZWxheSk7Cit9CisKK2Jvb2wgUmVtb3RlTGF5ZXJUcmVl
RHJhd2luZ0FyZWE6OmFkanVzdExheWVyRmx1c2hUaHJvdHRsaW5nKFdlYkNvcmU6OkxheWVyRmx1
c2hUaHJvdHRsZVN0YXRlOjpGbGFncyBmbGFncykKK3sKKyAgICBpZiAoZmxhZ3MgJiBXZWJDb3Jl
OjpMYXllckZsdXNoVGhyb3R0bGVTdGF0ZTo6VXNlcklzSW50ZXJhY3RpbmcpCisgICAgICAgIG1f
aXNMYXllckZsdXNoVGhyb3R0bGluZ1RlbXBvcmFyaWx5RGlzYWJsZWRGb3JJbnRlcmFjdGlvbiA9
IHRydWU7CisKKyAgICBib29sIHdhc1Rocm90dGxpbmdMYXllckZsdXNoZXMgPSBtX2lzVGhyb3R0
bGluZ0xheWVyRmx1c2hlczsKKyAgICBtX2lzVGhyb3R0bGluZ0xheWVyRmx1c2hlcyA9IGZsYWdz
ICYgV2ViQ29yZTo6TGF5ZXJGbHVzaFRocm90dGxlU3RhdGU6OkVuYWJsZWQ7CisKKyAgICBpZiAo
IXdhc1Rocm90dGxpbmdMYXllckZsdXNoZXMgJiYgbV9pc1Rocm90dGxpbmdMYXllckZsdXNoZXMp
CisgICAgICAgIG1faXNJbml0aWFsVGhyb3R0bGVkTGF5ZXJGbHVzaCA9IHRydWU7CisKKyAgICAv
LyBSZS1zY2hlZHVsZSB0aGUgZmx1c2ggaWYgd2Ugc3RvcHBlZCB0aHJvdHRsaW5nLgorICAgIGlm
ICh3YXNUaHJvdHRsaW5nTGF5ZXJGbHVzaGVzICYmICFtX2lzVGhyb3R0bGluZ0xheWVyRmx1c2hl
cyAmJiBtX2xheWVyRmx1c2hUaW1lci5pc0FjdGl2ZSgpKSB7CisgICAgICAgIG1fbGF5ZXJGbHVz
aFRpbWVyLnN0b3AoKTsKKyAgICAgICAgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKTsK
KyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2lu
Z0FyZWE6OmZsdXNoTGF5ZXJzKCkKK3sKKyAgICBpZiAoIW1fcm9vdExheWVyKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBpZiAobV9pc0ZsdXNoaW5nU3VzcGVuZGVkKSB7CisgICAgICAgIG1faGFz
RGVmZXJyZWRGbHVzaCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAo
bV93YWl0aW5nRm9yQmFja2luZ1N0b3JlU3dhcCkgeworICAgICAgICBtX2hhZEZsdXNoRGVmZXJy
ZWRXaGlsZVdhaXRpbmdGb3JCYWNraW5nU3RvcmVTd2FwID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIFJFTEVBU0VfQVNTRVJUKCFtX3BlbmRpbmdCYWNraW5nU3RvcmVGbHVz
aGVyIHx8IG1fcGVuZGluZ0JhY2tpbmdTdG9yZUZsdXNoZXItPmhhc0ZsdXNoZWQoKSk7CisKKyAg
ICBSZW1vdGVMYXllckJhY2tpbmdTdG9yZUNvbGxlY3Rpb24mIGJhY2tpbmdTdG9yZUNvbGxlY3Rp
b24gPSBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQtPmJhY2tpbmdTdG9yZUNvbGxlY3Rpb24oKTsK
KyAgICBiYWNraW5nU3RvcmVDb2xsZWN0aW9uLndpbGxGbHVzaExheWVycygpOworCisgICAgbV93
ZWJQYWdlLmxheW91dElmTmVlZGVkKCk7CisKKyAgICBGbG9hdFJlY3QgdmlzaWJsZVJlY3QoRmxv
YXRQb2ludCgpLCBtX3ZpZXdTaXplKTsKKyAgICBpZiAobV9zY3JvbGxlZFZpZXdFeHBvc2VkUmVj
dCkKKyAgICAgICAgdmlzaWJsZVJlY3QuaW50ZXJzZWN0KG1fc2Nyb2xsZWRWaWV3RXhwb3NlZFJl
Y3QudmFsdWUoKSk7CisKKyAgICBSZWZQdHI8V2ViUGFnZT4gcmV0YWluZWRQYWdlID0gJm1fd2Vi
UGFnZTsKKyAgICBbQ0FUcmFuc2FjdGlvbiBhZGRDb21taXRIYW5kbGVyOltyZXRhaW5lZFBhZ2Vd
IHsKKyAgICAgICAgaWYgKFBhZ2UqIGNvcmVQYWdlID0gcmV0YWluZWRQYWdlLT5jb3JlUGFnZSgp
KSB7CisgICAgICAgICAgICBpZiAoRnJhbWUqIGNvcmVGcmFtZSA9IHJldGFpbmVkUGFnZS0+bWFp
bkZyYW1lKCkpCisgICAgICAgICAgICAgICAgY29yZVBhZ2UtPmluc3BlY3RvckNvbnRyb2xsZXIo
KS5kaWRDb21wb3NpdGUoKmNvcmVGcmFtZSk7CisgICAgICAgIH0KKyAgICB9IGZvclBoYXNlOmtD
QVRyYW5zYWN0aW9uUGhhc2VQb3N0Q29tbWl0XTsKKworICAgIG1fd2ViUGFnZS5tYWluRnJhbWVW
aWV3KCktPmZsdXNoQ29tcG9zaXRpbmdTdGF0ZUluY2x1ZGluZ1N1YmZyYW1lcygpOworCisgICAg
Ly8gQmVjYXVzZSBvdXIgdmlldy1yZWxhdGl2ZSBvdmVybGF5IHJvb3QgbGF5ZXIgaXMgbm90IGF0
dGFjaGVkIHRvIHRoZSBGcmFtZVZpZXcncyBHcmFwaGljc0xheWVyIHRyZWUsIHdlIG5lZWQgdG8g
Zmx1c2ggaXQgbWFudWFsbHkuCisgICAgaWYgKG1fdmlld092ZXJsYXlSb290TGF5ZXIpCisgICAg
ICAgIG1fdmlld092ZXJsYXlSb290TGF5ZXItPmZsdXNoQ29tcG9zaXRpbmdTdGF0ZSh2aXNpYmxl
UmVjdCk7CisKKyAgICBtX3Jvb3RMYXllci0+Zmx1c2hDb21wb3NpdGluZ1N0YXRlRm9yVGhpc0xh
eWVyT25seSgpOworCisgICAgLy8gRklYTUU6IE1pbmltaXplIHRoZXNlIHRyYW5zYWN0aW9ucyBp
ZiBub3RoaW5nIGNoYW5nZWQuCisgICAgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24gbGF5ZXJU
cmFuc2FjdGlvbjsKKyAgICBsYXllclRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uSUQodGFrZU5l
eHRUcmFuc2FjdGlvbklEKCkpOworICAgIGxheWVyVHJhbnNhY3Rpb24uc2V0Q2FsbGJhY2tJRHMo
V1RGTW92ZShtX3BlbmRpbmdDYWxsYmFja0lEcykpOworICAgIG1fcmVtb3RlTGF5ZXJUcmVlQ29u
dGV4dC0+c2V0TmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludChtX25leHRGbHVzaElzRm9ySW1t
ZWRpYXRlUGFpbnQpOworICAgIG1fcmVtb3RlTGF5ZXJUcmVlQ29udGV4dC0+YnVpbGRUcmFuc2Fj
dGlvbihsYXllclRyYW5zYWN0aW9uLCAqZG93bmNhc3Q8R3JhcGhpY3NMYXllckNBUmVtb3RlPigq
bV9yb290TGF5ZXIpLnBsYXRmb3JtQ0FMYXllcigpKTsKKyAgICBtX3JlbW90ZUxheWVyVHJlZUNv
bnRleHQtPnNldE5leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQoZmFsc2UpOworICAgIGJhY2tp
bmdTdG9yZUNvbGxlY3Rpb24ud2lsbENvbW1pdExheWVyVHJlZShsYXllclRyYW5zYWN0aW9uKTsK
KyAgICBtX3dlYlBhZ2Uud2lsbENvbW1pdExheWVyVHJlZShsYXllclRyYW5zYWN0aW9uKTsKKwor
ICAgIGxheWVyVHJhbnNhY3Rpb24uc2V0TmV3bHlSZWFjaGVkTGF5b3V0TWlsZXN0b25lcyhtX3Bl
bmRpbmdOZXdseVJlYWNoZWRMYXlvdXRNaWxlc3RvbmVzKTsKKyAgICBtX3BlbmRpbmdOZXdseVJl
YWNoZWRMYXlvdXRNaWxlc3RvbmVzID0gMDsKKworICAgIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5h
dG9yVHJhbnNhY3Rpb24gc2Nyb2xsaW5nVHJhbnNhY3Rpb247CisjaWYgRU5BQkxFKEFTWU5DX1ND
Uk9MTElORykKKyAgICBpZiAobV93ZWJQYWdlLnNjcm9sbGluZ0Nvb3JkaW5hdG9yKCkpCisgICAg
ICAgIGRvd25jYXN0PFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yPigqbV93ZWJQYWdlLnNjcm9s
bGluZ0Nvb3JkaW5hdG9yKCkpLmJ1aWxkVHJhbnNhY3Rpb24oc2Nyb2xsaW5nVHJhbnNhY3Rpb24p
OworI2VuZGlmCisKKyAgICBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQgPSBmYWxzZTsK
KyAgICBtX3dhaXRpbmdGb3JCYWNraW5nU3RvcmVTd2FwID0gdHJ1ZTsKKworICAgIG1fd2ViUGFn
ZS5zZW5kKE1lc3NhZ2VzOjpSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYVByb3h5OjpXaWxsQ29t
bWl0TGF5ZXJUcmVlKGxheWVyVHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JRCgpKSk7CisKKyAgICBN
ZXNzYWdlczo6UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWFQcm94eTo6Q29tbWl0TGF5ZXJUcmVl
IG1lc3NhZ2UobGF5ZXJUcmFuc2FjdGlvbiwgc2Nyb2xsaW5nVHJhbnNhY3Rpb24pOworICAgIGF1
dG8gY29tbWl0RW5jb2RlciA9IHN0ZDo6bWFrZV91bmlxdWU8SVBDOjpFbmNvZGVyPihNZXNzYWdl
czo6UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWFQcm94eTo6Q29tbWl0TGF5ZXJUcmVlOjpyZWNl
aXZlck5hbWUoKSwgTWVzc2FnZXM6OlJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhUHJveHk6OkNv
bW1pdExheWVyVHJlZTo6bmFtZSgpLCBtX3dlYlBhZ2UucGFnZUlEKCkpOworICAgIGNvbW1pdEVu
Y29kZXItPmVuY29kZShtZXNzYWdlLmFyZ3VtZW50cygpKTsKKworICAgIC8vIEZJWE1FOiBNb3Zl
IGFsbCBiYWNraW5nIHN0b3JlIGZsdXNoaW5nIG1hbmFnZW1lbnQgdG8gUmVtb3RlTGF5ZXJCYWNr
aW5nU3RvcmVDb2xsZWN0aW9uLgorICAgIGJvb2wgaGFkQW55Q2hhbmdlZEJhY2tpbmdTdG9yZSA9
IGZhbHNlOworICAgIFZlY3RvcjxSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPj4gY29udGV4dHNUb0Zs
dXNoOworICAgIGZvciAoYXV0byYgbGF5ZXIgOiBsYXllclRyYW5zYWN0aW9uLmNoYW5nZWRMYXll
cnMoKSkgeworICAgICAgICBpZiAobGF5ZXItPnByb3BlcnRpZXMoKS5jaGFuZ2VkUHJvcGVydGll
cyAmIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpMYXllckNoYW5nZXM6OkJhY2tpbmdTdG9y
ZUNoYW5nZWQpIHsKKyAgICAgICAgICAgIGhhZEFueUNoYW5nZWRCYWNraW5nU3RvcmUgPSB0cnVl
OworICAgICAgICAgICAgaWYgKGxheWVyLT5wcm9wZXJ0aWVzKCkuYmFja2luZ1N0b3JlKSB7Cisg
ICAgICAgICAgICAgICAgaWYgKGF1dG8gY29udGV4dFBlbmRpbmdGbHVzaCA9IGxheWVyLT5wcm9w
ZXJ0aWVzKCkuYmFja2luZ1N0b3JlLT50YWtlRnJvbnRDb250ZXh0UGVuZGluZ0ZsdXNoKCkpCisg
ICAgICAgICAgICAgICAgICAgIGNvbnRleHRzVG9GbHVzaC5hcHBlbmQoY29udGV4dFBlbmRpbmdG
bHVzaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsYXllci0+ZGlkQ29t
bWl0KCk7CisgICAgfQorCisgICAgYmFja2luZ1N0b3JlQ29sbGVjdGlvbi5kaWRGbHVzaExheWVy
cygpOworCisgICAgaWYgKGhhZEFueUNoYW5nZWRCYWNraW5nU3RvcmUpCisgICAgICAgIGJhY2tp
bmdTdG9yZUNvbGxlY3Rpb24uc2NoZWR1bGVWb2xhdGlsaXR5VGltZXIoKTsKKworICAgIFJlZlB0
cjxCYWNraW5nU3RvcmVGbHVzaGVyPiBiYWNraW5nU3RvcmVGbHVzaGVyID0gQmFja2luZ1N0b3Jl
Rmx1c2hlcjo6Y3JlYXRlKFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25u
ZWN0aW9uKCksIFdURk1vdmUoY29tbWl0RW5jb2RlciksIFdURk1vdmUoY29udGV4dHNUb0ZsdXNo
KSk7CisgICAgbV9wZW5kaW5nQmFja2luZ1N0b3JlRmx1c2hlciA9IGJhY2tpbmdTdG9yZUZsdXNo
ZXI7CisKKyAgICB1aW50NjRfdCBwYWdlSUQgPSBtX3dlYlBhZ2UucGFnZUlEKCk7CisgICAgZGlz
cGF0Y2hfYXN5bmMobV9jb21taXRRdWV1ZSwgW2JhY2tpbmdTdG9yZUZsdXNoZXIsIHBhZ2VJRF0g
eworICAgICAgICBiYWNraW5nU3RvcmVGbHVzaGVyLT5mbHVzaCgpOworCisgICAgICAgIE1vbm90
b25pY1RpbWUgdGltZXN0YW1wID0gTW9ub3RvbmljVGltZTo6bm93KCk7CisgICAgICAgIGRpc3Bh
dGNoX2FzeW5jKGRpc3BhdGNoX2dldF9tYWluX3F1ZXVlKCksIFtwYWdlSUQsIHRpbWVzdGFtcF0g
eworICAgICAgICAgICAgaWYgKFdlYlBhZ2UqIHdlYlBhZ2UgPSBXZWJQcm9jZXNzOjpzaW5nbGV0
b24oKS53ZWJQYWdlKHBhZ2VJRCkpCisgICAgICAgICAgICAgICAgd2ViUGFnZS0+ZGlkRmx1c2hM
YXllclRyZWVBdFRpbWUodGltZXN0YW1wKTsKKyAgICAgICAgfSk7CisgICAgfSk7Cit9CisKK3Zv
aWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmRpZFVwZGF0ZSgpCit7CisgICAgLy8gRklY
TUU6IFRoaXMgc2hvdWxkIHVzZSBhIGNvdW50ZWQgcmVwbGFjZW1lbnQgZm9yIHNldExheWVyVHJl
ZVN0YXRlSXNGcm96ZW4sIGJ1dAorICAgIC8vIHRoZSBjYWxsZXJzIG9mIHRoYXQgZnVuY3Rpb24g
YXJlIG5vdCBzdHJpY3RseSBwYWlyZWQuCisKKyAgICBtX3dhaXRpbmdGb3JCYWNraW5nU3RvcmVT
d2FwID0gZmFsc2U7CisKKyAgICBpZiAobV9oYWRGbHVzaERlZmVycmVkV2hpbGVXYWl0aW5nRm9y
QmFja2luZ1N0b3JlU3dhcCkgeworICAgICAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVz
aCgpOworICAgICAgICBtX2hhZEZsdXNoRGVmZXJyZWRXaGlsZVdhaXRpbmdGb3JCYWNraW5nU3Rv
cmVTd2FwID0gZmFsc2U7CisgICAgfQorCisgICAgLy8gVGhpcyBlbXB0eSB0cmFuc2FjdGlvbiBz
ZXJ2ZXMgdG8gdHJpZ2dlciBDQSdzIGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBJT1N1cmZhY2VzLiBT
ZWUgPHJkYXI6Ly9wcm9ibGVtLzE2MTEwNjg3PgorICAgIFtDQVRyYW5zYWN0aW9uIGJlZ2luXTsK
KyAgICBbQ0FUcmFuc2FjdGlvbiBjb21taXRdOworCisgICAgSGFzaFNldDxSZW1vdGVMYXllclRy
ZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IqPiBtb25pdG9yc1RvTm90aWZ5ID0gbV9kaXNwbGF5UmVm
cmVzaE1vbml0b3JzOworICAgIEFTU0VSVCghbV9kaXNwbGF5UmVmcmVzaE1vbml0b3JzVG9Ob3Rp
ZnkpOworICAgIG1fZGlzcGxheVJlZnJlc2hNb25pdG9yc1RvTm90aWZ5ID0gJm1vbml0b3JzVG9O
b3RpZnk7CisgICAgd2hpbGUgKCFtb25pdG9yc1RvTm90aWZ5LmlzRW1wdHkoKSkKKyAgICAgICAg
bW9uaXRvcnNUb05vdGlmeS50YWtlQW55KCktPmRpZFVwZGF0ZUxheWVycygpOworICAgIG1fZGlz
cGxheVJlZnJlc2hNb25pdG9yc1RvTm90aWZ5ID0gbnVsbHB0cjsKK30KKwordm9pZCBSZW1vdGVM
YXllclRyZWVEcmF3aW5nQXJlYTo6bWFpbkZyYW1lQ29udGVudFNpemVDaGFuZ2VkKGNvbnN0IElu
dFNpemUmIGNvbnRlbnRzU2l6ZSkKK3sKKyAgICBtX3Jvb3RMYXllci0+c2V0U2l6ZShjb250ZW50
c1NpemUpOworfQorCitib29sIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjptYXJrTGF5ZXJz
Vm9sYXRpbGVJbW1lZGlhdGVseUlmUG9zc2libGUoKQoreworICAgIHJldHVybiBtX3JlbW90ZUxh
eWVyVHJlZUNvbnRleHQtPmJhY2tpbmdTdG9yZUNvbGxlY3Rpb24oKS5tYXJrQWxsQmFja2luZ1N0
b3JlVm9sYXRpbGVJbW1lZGlhdGVseUlmUG9zc2libGUoKTsKK30KKworUmVmPFJlbW90ZUxheWVy
VHJlZURyYXdpbmdBcmVhOjpCYWNraW5nU3RvcmVGbHVzaGVyPiBSZW1vdGVMYXllclRyZWVEcmF3
aW5nQXJlYTo6QmFja2luZ1N0b3JlRmx1c2hlcjo6Y3JlYXRlKElQQzo6Q29ubmVjdGlvbiogY29u
bmVjdGlvbiwgc3RkOjp1bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4gZW5jb2RlciwgVmVjdG9yPFJl
dGFpblB0cjxDR0NvbnRleHRSZWY+PiBjb250ZXh0c1RvRmx1c2gpCit7CisgICAgcmV0dXJuIGFk
b3B0UmVmKCpuZXcgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OkJhY2tpbmdTdG9yZUZsdXNo
ZXIoY29ubmVjdGlvbiwgV1RGTW92ZShlbmNvZGVyKSwgV1RGTW92ZShjb250ZXh0c1RvRmx1c2gp
KSk7Cit9CisKK1JlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpCYWNraW5nU3RvcmVGbHVzaGVy
OjpCYWNraW5nU3RvcmVGbHVzaGVyKElQQzo6Q29ubmVjdGlvbiogY29ubmVjdGlvbiwgc3RkOjp1
bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4gZW5jb2RlciwgVmVjdG9yPFJldGFpblB0cjxDR0NvbnRl
eHRSZWY+PiBjb250ZXh0c1RvRmx1c2gpCisgICAgOiBtX2Nvbm5lY3Rpb24oY29ubmVjdGlvbikK
KyAgICAsIG1fY29tbWl0RW5jb2RlcihXVEZNb3ZlKGVuY29kZXIpKQorICAgICwgbV9jb250ZXh0
c1RvRmx1c2goV1RGTW92ZShjb250ZXh0c1RvRmx1c2gpKQorICAgICwgbV9oYXNGbHVzaGVkKGZh
bHNlKQoreworfQorCit2b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpCYWNraW5nU3Rv
cmVGbHVzaGVyOjpmbHVzaCgpCit7CisgICAgQVNTRVJUKCFtX2hhc0ZsdXNoZWQpOworCisgICAg
VHJhY2VTY29wZSB0cmFjaW5nU2NvcGUoQmFja2luZ1N0b3JlRmx1c2hTdGFydCwgQmFja2luZ1N0
b3JlRmx1c2hFbmQpOworICAgIAorICAgIGZvciAoYXV0byYgY29udGV4dCA6IG1fY29udGV4dHNU
b0ZsdXNoKQorICAgICAgICBDR0NvbnRleHRGbHVzaChjb250ZXh0LmdldCgpKTsKKyAgICBtX2hh
c0ZsdXNoZWQgPSB0cnVlOworCisgICAgbV9jb25uZWN0aW9uLT5zZW5kTWVzc2FnZShXVEZNb3Zl
KG1fY29tbWl0RW5jb2RlciksIHsgfSk7Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2lu
Z0FyZWE6OmFjdGl2aXR5U3RhdGVEaWRDaGFuZ2UoQWN0aXZpdHlTdGF0ZTo6RmxhZ3MsIGJvb2wg
d2FudHNEaWRVcGRhdGVBY3Rpdml0eVN0YXRlLCBjb25zdCBWZWN0b3I8Q2FsbGJhY2tJRD4mKQor
eworICAgIC8vIEZJWE1FOiBTaG91bGQgd2Ugc3VzcGVuZCBwYWludGluZyB3aGlsZSBub3Qgdmlz
aWJsZSwgbGlrZSBUaWxlZENvcmVBbmltYXRpb25EcmF3aW5nQXJlYT8gUHJvYmFibHkuCisKKyAg
ICBpZiAod2FudHNEaWRVcGRhdGVBY3Rpdml0eVN0YXRlKSB7CisgICAgICAgIG1fbmV4dEZsdXNo
SXNGb3JJbW1lZGlhdGVQYWludCA9IHRydWU7CisgICAgICAgIHNjaGVkdWxlQ29tcG9zaXRpbmdM
YXllckZsdXNoSW1tZWRpYXRlbHkoKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVtb3RlTGF5ZXJUcmVl
RHJhd2luZ0FyZWE6OmFkZFRyYW5zYWN0aW9uQ2FsbGJhY2tJRChDYWxsYmFja0lEIGNhbGxiYWNr
SUQpCit7CisgICAgLy8gQXNzdW1lIHRoYXQgaWYgc29tZW9uZSBpcyBsaXN0ZW5pbmcgZm9yIHRo
aXMgdHJhbnNhY3Rpb24ncyBjb21wbGV0aW9uLCB0aGF0IHRoZXkgd2FudCBpdCB0bworICAgIC8v
IGJlIGEgImNvbXBsZXRlIiBwYWludCAoaW5jbHVkaW5nIGltYWdlcyB0aGF0IHdvdWxkIG5vcm1h
bGx5IGJlIGFzeW5jaHJvbm91c2x5IGRlY29kaW5nKS4KKyAgICBtX25leHRGbHVzaElzRm9ySW1t
ZWRpYXRlUGFpbnQgPSB0cnVlOworCisgICAgbV9wZW5kaW5nQ2FsbGJhY2tJRHMuYXBwZW5kKHN0
YXRpY19jYXN0PFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpUcmFuc2FjdGlvbkNhbGxiYWNr
SUQ+KGNhbGxiYWNrSUQpKTsKKyAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOwor
fQorCitib29sIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpkaXNwYXRjaERpZFJlYWNoTGF5
b3V0TWlsZXN0b25lKFdlYkNvcmU6OkxheW91dE1pbGVzdG9uZXMgbGF5b3V0TWlsZXN0b25lcykK
K3sKKyAgICBtX3BlbmRpbmdOZXdseVJlYWNoZWRMYXlvdXRNaWxlc3RvbmVzIHw9IGxheW91dE1p
bGVzdG9uZXM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJU
cmVlL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nl
c3MvV2ViUGFnZS9SZW1vdGVMYXllclRyZWUvUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi5jZjVkY2VkM2I0Yzc0MmJiMDkzNmNmM2U4ZTNiZWM0M2QyZDIwMTcxCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5
ZXJUcmVlL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmgKQEAgLTAsMCArMSw4NiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcl9oCisjZGVm
aW5lIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yX2gKKworI2lmIEVOQUJMRShBU1lOQ19TQ1JP
TExJTkcpCisKKyNpbmNsdWRlICJNZXNzYWdlUmVjZWl2ZXIuaCIKKyNpbmNsdWRlIDxXZWJDb3Jl
L0FzeW5jU2Nyb2xsaW5nQ29vcmRpbmF0b3IuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1Njcm9sbFR5
cGVzLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TY3JvbGxpbmdDb25zdHJhaW50cy5oPgorI2luY2x1
ZGUgPFdlYkNvcmUvVGltZXIuaD4KKworbmFtZXNwYWNlIElQQyB7CitjbGFzcyBEZWNvZGVyOwor
Y2xhc3MgRW5jb2RlcjsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFdlYlBhZ2U7
CitjbGFzcyBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvclRyYW5zYWN0aW9uOworCitjbGFzcyBS
ZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvciA6IHB1YmxpYyBXZWJDb3JlOjpBc3luY1Njcm9sbGlu
Z0Nvb3JkaW5hdG9yLCBwdWJsaWMgSVBDOjpNZXNzYWdlUmVjZWl2ZXIgeworcHVibGljOgorICAg
IHN0YXRpYyBSZWY8UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I+IGNyZWF0ZShXZWJQYWdlKiBw
YWdlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgUmVtb3RlU2Nyb2xsaW5n
Q29vcmRpbmF0b3IocGFnZSkpOworICAgIH0KKworICAgIHZvaWQgYnVpbGRUcmFuc2FjdGlvbihS
ZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvclRyYW5zYWN0aW9uJik7CisKK3ByaXZhdGU6CisgICAg
UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IoV2ViUGFnZSopOworICAgIHZpcnR1YWwgflJlbW90
ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yKCk7CisKKyAgICBib29sIGlzUmVtb3RlU2Nyb2xsaW5nQ29v
cmRpbmF0b3IoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgLy8g
U2Nyb2xsaW5nQ29vcmRpbmF0b3IKKyAgICBib29sIGNvb3JkaW5hdGVzU2Nyb2xsaW5nRm9yRnJh
bWVWaWV3KGNvbnN0IFdlYkNvcmU6OkZyYW1lVmlldyYpIGNvbnN0IG92ZXJyaWRlOworICAgIHZv
aWQgc2NoZWR1bGVUcmVlU3RhdGVDb21taXQoKSBvdmVycmlkZTsKKworICAgIGJvb2wgaXNSdWJi
ZXJCYW5kSW5Qcm9ncmVzcygpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0U2Nyb2xsUGlu
bmluZ0JlaGF2aW9yKFdlYkNvcmU6OlNjcm9sbFBpbm5pbmdCZWhhdmlvcikgb3ZlcnJpZGU7Cisg
ICAgYm9vbCBpc1Njcm9sbFNuYXBJblByb2dyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAv
LyBJUEM6Ok1lc3NhZ2VSZWNlaXZlcgorICAgIHZvaWQgZGlkUmVjZWl2ZU1lc3NhZ2UoSVBDOjpD
b25uZWN0aW9uJiwgSVBDOjpEZWNvZGVyJikgb3ZlcnJpZGU7CisgICAgCisgICAgLy8gUmVzcG9u
ZCB0byBVSSBwcm9jZXNzIGNoYW5nZXMuCisgICAgdm9pZCBzY3JvbGxQb3NpdGlvbkNoYW5nZWRG
b3JOb2RlKFdlYkNvcmU6OlNjcm9sbGluZ05vZGVJRCwgY29uc3QgV2ViQ29yZTo6RmxvYXRQb2lu
dCYgc2Nyb2xsUG9zaXRpb24sIGJvb2wgc3luY0xheWVyUG9zaXRpb24pOworICAgIHZvaWQgY3Vy
cmVudFNuYXBQb2ludEluZGljZXNDaGFuZ2VkRm9yTm9kZShXZWJDb3JlOjpTY3JvbGxpbmdOb2Rl
SUQsIHVuc2lnbmVkIGhvcml6b250YWwsIHVuc2lnbmVkIHZlcnRpY2FsKTsKKworICAgIFdlYlBh
Z2UqIG1fd2ViUGFnZTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCitTUEVDSUFMSVpF
X1RZUEVfVFJBSVRTX1NDUk9MTElOR19DT09SRElOQVRPUihXZWJLaXQ6OlJlbW90ZVNjcm9sbGlu
Z0Nvb3JkaW5hdG9yLCBpc1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yKCkpOworCisjZW5kaWYg
Ly8gRU5BQkxFKEFTWU5DX1NDUk9MTElORykKKworI2VuZGlmIC8vIFJlbW90ZVNjcm9sbGluZ0Nv
b3JkaW5hdG9yX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdl
L1JlbW90ZUxheWVyVHJlZS9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdlcy5pbiBi
L1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVT
Y3JvbGxpbmdDb29yZGluYXRvci5tZXNzYWdlcy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yYzA5OGExMDk3MDIz
NjdjMzgzMzcxZTg4ZTVhNzYxZDQ1ZTE5OWFkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZVNjcm9sbGluZ0Nv
b3JkaW5hdG9yLm1lc3NhZ2VzLmluCkBAIC0wLDAgKzEsMzAgQEAKKyMgQ29weXJpZ2h0IChDKSAy
MDE0LTIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBg
YEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyMg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IKKyMgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgor
IyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorIyBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWYgRU5BQkxFKEFTWU5DX1NDUk9MTElORykK
KworbWVzc2FnZXMgLT4gUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IgeworICAgIFNjcm9sbFBv
c2l0aW9uQ2hhbmdlZEZvck5vZGUodWludDY0X3Qgbm9kZUlELCBXZWJDb3JlOjpGbG9hdFBvaW50
IHNjcm9sbFBvc2l0aW9uLCBib29sIHN5bmNMYXllclBvc2l0aW9uKTsKKyAgICBDdXJyZW50U25h
cFBvaW50SW5kaWNlc0NoYW5nZWRGb3JOb2RlKHVpbnQ2NF90IG5vZGVJRCwgdW5zaWduZWQgaG9y
aXpvbnRhbCwgdW5zaWduZWQgdmVydGljYWwpOworfQorCisjZW5kaWYgLy8gRU5BQkxFKEFTWU5D
X1NDUk9MTElORykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdl
L1JlbW90ZUxheWVyVHJlZS9SZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5tbSBiL1NvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL1JlbW90ZUxheWVyVHJlZS9SZW1vdGVTY3JvbGxpbmdD
b29yZGluYXRvci5tbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44ODY0MTUyNWU1MmI5NzlkZTQwM2E2ZTZhNzEwMmNk
M2EyNWQzMjUyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dl
YlBhZ2UvUmVtb3RlTGF5ZXJUcmVlL1JlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLm1tCkBAIC0w
LDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBv
cnQgIlJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yLmgiCisKKyNpZiBFTkFCTEUoQVNZTkNfU0NS
T0xMSU5HKQorCisjaW1wb3J0ICJBcmd1bWVudENvZGVycy5oIgorI2ltcG9ydCAiR3JhcGhpY3NM
YXllckNBUmVtb3RlLmgiCisjaW1wb3J0ICJSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5oIgor
I2ltcG9ydCAiUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JNZXNzYWdlcy5oIgorI2ltcG9ydCAi
UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3JUcmFuc2FjdGlvbi5oIgorI2ltcG9ydCAiV2ViQ29y
ZUFyZ3VtZW50Q29kZXJzLmgiCisjaW1wb3J0ICJXZWJQYWdlLmgiCisjaW1wb3J0ICJXZWJQcm9j
ZXNzLmgiCisjaW1wb3J0IDxXZWJDb3JlL0dyYXBoaWNzTGF5ZXIuaD4KKyNpbXBvcnQgPFdlYkNv
cmUvRnJhbWVWaWV3Lmg+CisjaW1wb3J0IDxXZWJDb3JlL0ZyYW1lLmg+CisjaW1wb3J0IDxXZWJD
b3JlL1JlbmRlckxheWVyQ29tcG9zaXRvci5oPgorI2ltcG9ydCA8V2ViQ29yZS9SZW5kZXJWaWV3
Lmg+CisjaW1wb3J0IDxXZWJDb3JlL1Njcm9sbGluZ1RyZWVGaXhlZE5vZGUuaD4KKyNpbXBvcnQg
PFdlYkNvcmUvU2Nyb2xsaW5nVHJlZVN0aWNreU5vZGUuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdl
YkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRv
cjo6UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3IoV2ViUGFnZSogcGFnZSkKKyAgICA6IEFzeW5j
U2Nyb2xsaW5nQ29vcmRpbmF0b3IocGFnZS0+Y29yZVBhZ2UoKSkKKyAgICAsIG1fd2ViUGFnZShw
YWdlKQoreworICAgIFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLmFkZE1lc3NhZ2VSZWNlaXZlcihN
ZXNzYWdlczo6UmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I6Om1lc3NhZ2VSZWNlaXZlck5hbWUo
KSwgbV93ZWJQYWdlLT5wYWdlSUQoKSwgKnRoaXMpOworfQorCitSZW1vdGVTY3JvbGxpbmdDb29y
ZGluYXRvcjo6flJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yKCkKK3sKKyAgICBXZWJQcm9jZXNz
OjpzaW5nbGV0b24oKS5yZW1vdmVNZXNzYWdlUmVjZWl2ZXIoTWVzc2FnZXM6OlJlbW90ZVNjcm9s
bGluZ0Nvb3JkaW5hdG9yOjptZXNzYWdlUmVjZWl2ZXJOYW1lKCksIG1fd2ViUGFnZS0+cGFnZUlE
KCkpOworfQorCit2b2lkIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yOjpzY2hlZHVsZVRyZWVT
dGF0ZUNvbW1pdCgpCit7CisgICAgbV93ZWJQYWdlLT5kcmF3aW5nQXJlYSgpLT5zY2hlZHVsZUNv
bXBvc2l0aW5nTGF5ZXJGbHVzaCgpOworfQorCitib29sIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5h
dG9yOjpjb29yZGluYXRlc1Njcm9sbGluZ0ZvckZyYW1lVmlldyhjb25zdCBGcmFtZVZpZXcmIGZy
YW1lVmlldykgY29uc3QKK3sKKyAgICBSZW5kZXJWaWV3KiByZW5kZXJWaWV3ID0gZnJhbWVWaWV3
LnJlbmRlclZpZXcoKTsKKyAgICByZXR1cm4gcmVuZGVyVmlldyAmJiByZW5kZXJWaWV3LT51c2Vz
Q29tcG9zaXRpbmcoKTsKK30KKworYm9vbCBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcjo6aXNS
dWJiZXJCYW5kSW5Qcm9ncmVzcygpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IG5lZWQgdG8gbWFp
bnRhaW4gc3RhdGUgaW4gdGhlIHdlYiBwcm9jZXNzPworICAgIHJldHVybiBmYWxzZTsKK30KKwor
Ym9vbCBSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcjo6aXNTY3JvbGxTbmFwSW5Qcm9ncmVzcygp
IGNvbnN0Cit7CisgICAgLy8gRklYTUU6IG5lZWQgdG8gbWFpbnRhaW4gc3RhdGUgaW4gdGhlIHdl
YiBwcm9jZXNzPworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW1vdGVTY3JvbGxpbmdD
b29yZGluYXRvcjo6c2V0U2Nyb2xsUGlubmluZ0JlaGF2aW9yKFNjcm9sbFBpbm5pbmdCZWhhdmlv
cikKK3sKKyAgICAvLyBGSVhNRTogc2VuZCB0byB0aGUgVUkgcHJvY2Vzcy4KK30KKwordm9pZCBS
ZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvcjo6YnVpbGRUcmFuc2FjdGlvbihSZW1vdGVTY3JvbGxp
bmdDb29yZGluYXRvclRyYW5zYWN0aW9uJiB0cmFuc2FjdGlvbikKK3sKKyAgICB3aWxsQ29tbWl0
VHJlZSgpOworICAgIHRyYW5zYWN0aW9uLnNldFN0YXRlVHJlZVRvRW5jb2RlKHNjcm9sbGluZ1N0
YXRlVHJlZSgpLT5jb21taXQoTGF5ZXJSZXByZXNlbnRhdGlvbjo6UGxhdGZvcm1MYXllcklEUmVw
cmVzZW50YXRpb24pKTsKK30KKworLy8gTm90aWZpY2F0aW9uIGZyb20gdGhlIFVJIHByb2Nlc3Mg
dGhhdCB3ZSBzY3JvbGxlZC4KK3ZvaWQgUmVtb3RlU2Nyb2xsaW5nQ29vcmRpbmF0b3I6OnNjcm9s
bFBvc2l0aW9uQ2hhbmdlZEZvck5vZGUoU2Nyb2xsaW5nTm9kZUlEIG5vZGVJRCwgY29uc3QgRmxv
YXRQb2ludCYgc2Nyb2xsUG9zaXRpb24sIGJvb2wgc3luY0xheWVyUG9zaXRpb24pCit7CisgICAg
c2NoZWR1bGVVcGRhdGVTY3JvbGxQb3NpdGlvbkFmdGVyQXN5bmNTY3JvbGwobm9kZUlELCBzY3Jv
bGxQb3NpdGlvbiwgc3RkOjpudWxsb3B0LCBmYWxzZSAvKiBGSVhNRSAqLywgc3luY0xheWVyUG9z
aXRpb24gPyBTY3JvbGxpbmdMYXllclBvc2l0aW9uQWN0aW9uOjpTeW5jIDogU2Nyb2xsaW5nTGF5
ZXJQb3NpdGlvbkFjdGlvbjo6U2V0KTsKK30KKwordm9pZCBSZW1vdGVTY3JvbGxpbmdDb29yZGlu
YXRvcjo6Y3VycmVudFNuYXBQb2ludEluZGljZXNDaGFuZ2VkRm9yTm9kZShTY3JvbGxpbmdOb2Rl
SUQgbm9kZUlELCB1bnNpZ25lZCBob3Jpem9udGFsLCB1bnNpZ25lZCB2ZXJ0aWNhbCkKK3sKKyAg
ICBzZXRBY3RpdmVTY3JvbGxTbmFwSW5kaWNlcyhub2RlSUQsIGhvcml6b250YWwsIHZlcnRpY2Fs
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKKyNlbmRpZiAvLyBFTkFCTEUoQVNZTkNf
U0NST0xMSU5HKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2Uv
bWFjL0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3Mv
V2ViUGFnZS9tYWMvR3JhcGhpY3NMYXllckNBUmVtb3RlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMmRmNDJlOTQ3MzBmMTYzODNmOWI1YTczMmU4Mjk2Y2I1YzFhMjVmMC4uMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0
L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvR3JhcGhpY3NMYXllckNBUmVtb3RlLmNwcAorKysgL2Rl
di9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Ci0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
LSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NMYXll
ckNBUmVtb3RlLmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5oIgotI2lu
Y2x1ZGUgIlBsYXRmb3JtQ0FMYXllclJlbW90ZS5oIgotI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZv
cm1TY3JlZW4uaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJL
aXQgewotCi1HcmFwaGljc0xheWVyQ0FSZW1vdGU6On5HcmFwaGljc0xheWVyQ0FSZW1vdGUoKQot
ewotfQotCi1ib29sIEdyYXBoaWNzTGF5ZXJDQVJlbW90ZTo6ZmlsdGVyc0NhbkJlQ29tcG9zaXRl
ZChjb25zdCBGaWx0ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKQotewotICAgIHJldHVybiBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6OmZpbHRlcnNDYW5CZUNvbXBvc2l0ZWQoZmlsdGVycyk7Ci19Ci0KLVJl
ZjxQbGF0Zm9ybUNBTGF5ZXI+IEdyYXBoaWNzTGF5ZXJDQVJlbW90ZTo6Y3JlYXRlUGxhdGZvcm1D
QUxheWVyKFBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlIGxheWVyVHlwZSwgUGxhdGZvcm1DQUxh
eWVyQ2xpZW50KiBvd25lcikKLXsKLSAgICBhdXRvIHJlc3VsdCA9IFBsYXRmb3JtQ0FMYXllclJl
bW90ZTo6Y3JlYXRlKGxheWVyVHlwZSwgb3duZXIsIG1fY29udGV4dCk7Ci0KLSAgICBpZiAocmVz
dWx0LT5jYW5IYXZlQmFja2luZ1N0b3JlKCkpCi0gICAgICAgIHJlc3VsdC0+c2V0V2FudHNEZWVw
Q29sb3JCYWNraW5nU3RvcmUoc2NyZWVuU3VwcG9ydHNFeHRlbmRlZENvbG9yKCkpOwotCi0gICAg
cmV0dXJuIFdURk1vdmUocmVzdWx0KTsKLX0KLQotUmVmPFBsYXRmb3JtQ0FMYXllcj4gR3JhcGhp
Y3NMYXllckNBUmVtb3RlOjpjcmVhdGVQbGF0Zm9ybUNBTGF5ZXIoUGxhdGZvcm1MYXllciogcGxh
dGZvcm1MYXllciwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikKLXsKLSAgICByZXR1cm4g
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjcmVhdGUocGxhdGZvcm1MYXllciwgb3duZXIsIG1fY29u
dGV4dCk7Ci19Ci0KLVJlZjxQbGF0Zm9ybUNBQW5pbWF0aW9uPiBHcmFwaGljc0xheWVyQ0FSZW1v
dGU6OmNyZWF0ZVBsYXRmb3JtQ0FBbmltYXRpb24oUGxhdGZvcm1DQUFuaW1hdGlvbjo6QW5pbWF0
aW9uVHlwZSB0eXBlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgpCi17Ci0gICAgcmV0dXJuIFBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGU6OmNyZWF0ZSh0eXBlLCBrZXlQYXRoKTsKLX0KLQotfSAvLyBu
YW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2Vi
UGFnZS9tYWMvR3JhcGhpY3NMYXllckNBUmVtb3RlLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nl
c3MvV2ViUGFnZS9tYWMvR3JhcGhpY3NMYXllckNBUmVtb3RlLmgKZGVsZXRlZCBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IGU0YTkyNTdhNjlhYjJhZWZkMWVhODZkMGM4YmM1NmM4NTY3OGE3NmIuLjAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL0dyYXBoaWNzTGF5ZXJDQVJlbW90ZS5oCisrKyAvZGV2
L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQot
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8V2ViQ29yZS9HcmFwaGljc0xh
eWVyQ0EuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtTGF5ZXIuaD4KLQotbmFtZXNwYWNl
IFdlYktpdCB7Ci0KLWNsYXNzIFJlbW90ZUxheWVyVHJlZUNvbnRleHQ7Ci0KLWNsYXNzIEdyYXBo
aWNzTGF5ZXJDQVJlbW90ZSBmaW5hbCA6IHB1YmxpYyBXZWJDb3JlOjpHcmFwaGljc0xheWVyQ0Eg
ewotcHVibGljOgotICAgIEdyYXBoaWNzTGF5ZXJDQVJlbW90ZShUeXBlIGxheWVyVHlwZSwgV2Vi
Q29yZTo6R3JhcGhpY3NMYXllckNsaWVudCYgY2xpZW50LCBSZW1vdGVMYXllclRyZWVDb250ZXh0
JiBjb250ZXh0KQotICAgICAgICA6IEdyYXBoaWNzTGF5ZXJDQShsYXllclR5cGUsIGNsaWVudCkK
LSAgICAgICAgLCBtX2NvbnRleHQoY29udGV4dCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVh
bCB+R3JhcGhpY3NMYXllckNBUmVtb3RlKCk7Ci0KLSAgICBib29sIGZpbHRlcnNDYW5CZUNvbXBv
c2l0ZWQoY29uc3QgV2ViQ29yZTo6RmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycykgb3ZlcnJpZGU7
Ci0KLXByaXZhdGU6Ci0gICAgYm9vbCBpc0dyYXBoaWNzTGF5ZXJDQVJlbW90ZSgpIGNvbnN0IG92
ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KLQotICAgIFJlZjxXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5
ZXI+IGNyZWF0ZVBsYXRmb3JtQ0FMYXllcihXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVy
VHlwZSwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikgb3ZlcnJpZGU7Ci0g
ICAgUmVmPFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcj4gY3JlYXRlUGxhdGZvcm1DQUxheWVyKFBs
YXRmb3JtTGF5ZXIqLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyKSBvdmVy
cmlkZTsKLSAgICBSZWY8V2ViQ29yZTo6UGxhdGZvcm1DQUFuaW1hdGlvbj4gY3JlYXRlUGxhdGZv
cm1DQUFuaW1hdGlvbihXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uOjpBbmltYXRpb25UeXBl
LCBjb25zdCBTdHJpbmcmIGtleVBhdGgpIG92ZXJyaWRlOwotCi0gICAgLy8gUGxhdGZvcm1DQUxh
eWVyUmVtb3RlIGNhbid0IGN1cnJlbnRseSBwcm94eSBkaXJlY3RseSBjb21wb3NpdGVkIGltYWdl
IGNvbnRlbnRzLCBzbyBvcHQgb3V0IG9mIHRoaXMgb3B0aW1pemF0aW9uLgotICAgIGJvb2wgc2hv
dWxkRGlyZWN0bHlDb21wb3NpdGVJbWFnZShXZWJDb3JlOjpJbWFnZSopIGNvbnN0IG92ZXJyaWRl
IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgCi0gICAgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgbV9j
b250ZXh0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0KLVNQRUNJQUxJWkVfVFlQRV9U
UkFJVFNfR1JBUEhJQ1NMQVlFUihXZWJLaXQ6OkdyYXBoaWNzTGF5ZXJDQVJlbW90ZSwgaXNHcmFw
aGljc0xheWVyQ0FSZW1vdGUoKSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLmggYi9Tb3VyY2UvV2ViS2l0
L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5oCmRlbGV0
ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmQ2OGRlODUyNDFhMzJlNTgyMWQ4ZTdmM2JjZDBk
ZTczNWE4NzlmLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBh
L1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgot
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgot
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgUGxhdGZvcm1DQUFuaW1hdGlv
blJlbW90ZV9oCi0jZGVmaW5lIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGVfaAotCi0jaW5jbHVk
ZSA8V2ViQ29yZS9QbGF0Zm9ybUNBQW5pbWF0aW9uLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hNYXAu
aD4KLSNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgotCi1uYW1lc3BhY2UgSVBDIHsKLWNsYXNzIEVu
Y29kZXI7Ci1jbGFzcyBEZWNvZGVyOwotfTsKLQotbmFtZXNwYWNlIFdURiB7Ci1jbGFzcyBUZXh0
U3RyZWFtOwotfTsKLQotT0JKQ19DTEFTUyBDQUxheWVyOwotCi1uYW1lc3BhY2UgV2ViS2l0IHsK
LQotY2xhc3MgUmVtb3RlTGF5ZXJUcmVlSG9zdDsKLQotY2xhc3MgUGxhdGZvcm1DQUFuaW1hdGlv
blJlbW90ZSBmaW5hbCA6IHB1YmxpYyBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uIHsKLXB1
YmxpYzoKLSAgICBzdGF0aWMgUmVmPFBsYXRmb3JtQ0FBbmltYXRpb24+IGNyZWF0ZShBbmltYXRp
b25UeXBlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgpOwotCi0gICAgdmlydHVhbCB+UGxhdGZvcm1D
QUFuaW1hdGlvblJlbW90ZSgpIHsgfQotCi0gICAgYm9vbCBpc1BsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBSZWY8UGxhdGZv
cm1DQUFuaW1hdGlvbj4gY29weSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgU3RyaW5nIGtleVBh
dGgoKSBjb25zdCBvdmVycmlkZTsKLQotICAgIENGVGltZUludGVydmFsIGJlZ2luVGltZSgpIGNv
bnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0QmVnaW5UaW1lKENGVGltZUludGVydmFsKSBvdmVy
cmlkZTsKLQotICAgIENGVGltZUludGVydmFsIGR1cmF0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7Ci0g
ICAgdm9pZCBzZXREdXJhdGlvbihDRlRpbWVJbnRlcnZhbCkgb3ZlcnJpZGU7Ci0KLSAgICBmbG9h
dCBzcGVlZCgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0U3BlZWQoZmxvYXQpIG92ZXJy
aWRlOwotCi0gICAgQ0ZUaW1lSW50ZXJ2YWwgdGltZU9mZnNldCgpIGNvbnN0IG92ZXJyaWRlOwot
ICAgIHZvaWQgc2V0VGltZU9mZnNldChDRlRpbWVJbnRlcnZhbCkgb3ZlcnJpZGU7Ci0KLSAgICBm
bG9hdCByZXBlYXRDb3VudCgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0UmVwZWF0Q291
bnQoZmxvYXQpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBhdXRvcmV2ZXJzZXMoKSBjb25zdCBvdmVy
cmlkZTsKLSAgICB2b2lkIHNldEF1dG9yZXZlcnNlcyhib29sKSBvdmVycmlkZTsKLQotICAgIEZp
bGxNb2RlVHlwZSBmaWxsTW9kZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0RmlsbE1v
ZGUoRmlsbE1vZGVUeXBlKSBvdmVycmlkZTsKLQotICAgIHZvaWQgc2V0VGltaW5nRnVuY3Rpb24o
Y29uc3QgV2ViQ29yZTo6VGltaW5nRnVuY3Rpb24qLCBib29sIHJldmVyc2UgPSBmYWxzZSkgb3Zl
cnJpZGU7Ci0gICAgdm9pZCBjb3B5VGltaW5nRnVuY3Rpb25Gcm9tKGNvbnN0IFdlYkNvcmU6OlBs
YXRmb3JtQ0FBbmltYXRpb24mKSBvdmVycmlkZTsKLQotICAgIGJvb2wgaXNSZW1vdmVkT25Db21w
bGV0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRSZW1vdmVkT25Db21wbGV0aW9u
KGJvb2wpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBpc0FkZGl0aXZlKCkgY29uc3Qgb3ZlcnJpZGU7
Ci0gICAgdm9pZCBzZXRBZGRpdGl2ZShib29sKSBvdmVycmlkZTsKLQotICAgIFZhbHVlRnVuY3Rp
b25UeXBlIHZhbHVlRnVuY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldFZhbHVl
RnVuY3Rpb24oVmFsdWVGdW5jdGlvblR5cGUpIG92ZXJyaWRlOwotCi0gICAgLy8gQmFzaWMtYW5p
bWF0aW9uIHByb3BlcnRpZXMuCi0gICAgdm9pZCBzZXRGcm9tVmFsdWUoZmxvYXQpIG92ZXJyaWRl
OwotICAgIHZvaWQgc2V0RnJvbVZhbHVlKGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0
cml4Jikgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRGcm9tVmFsdWUoY29uc3QgV2ViQ29yZTo6Rmxv
YXRQb2ludDNEJikgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRGcm9tVmFsdWUoY29uc3QgV2ViQ29y
ZTo6Q29sb3ImKSBvdmVycmlkZTsKLSAgICB2b2lkIHNldEZyb21WYWx1ZShjb25zdCBXZWJDb3Jl
OjpGaWx0ZXJPcGVyYXRpb24qLCBpbnQgaW50ZXJuYWxGaWx0ZXJQcm9wZXJ0eUluZGV4KSBvdmVy
cmlkZTsKLSAgICB2b2lkIGNvcHlGcm9tVmFsdWVGcm9tKGNvbnN0IFdlYkNvcmU6OlBsYXRmb3Jt
Q0FBbmltYXRpb24mKSBvdmVycmlkZTsKLQotICAgIHZvaWQgc2V0VG9WYWx1ZShmbG9hdCkgb3Zl
cnJpZGU7Ci0gICAgdm9pZCBzZXRUb1ZhbHVlKGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9u
TWF0cml4Jikgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRUb1ZhbHVlKGNvbnN0IFdlYkNvcmU6OkZs
b2F0UG9pbnQzRCYpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0VG9WYWx1ZShjb25zdCBXZWJDb3Jl
OjpDb2xvciYpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0VG9WYWx1ZShjb25zdCBXZWJDb3JlOjpG
aWx0ZXJPcGVyYXRpb24qLCBpbnQgaW50ZXJuYWxGaWx0ZXJQcm9wZXJ0eUluZGV4KSBvdmVycmlk
ZTsKLSAgICB2b2lkIGNvcHlUb1ZhbHVlRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5p
bWF0aW9uJikgb3ZlcnJpZGU7Ci0KLSAgICAvLyBLZXlmcmFtZS1hbmltYXRpb24gcHJvcGVydGll
cy4KLSAgICB2b2lkIHNldFZhbHVlcyhjb25zdCBWZWN0b3I8ZmxvYXQ+Jikgb3ZlcnJpZGU7Ci0g
ICAgdm9pZCBzZXRWYWx1ZXMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0
cml4PiYpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxXZWJDb3Jl
OjpGbG9hdFBvaW50M0Q+Jikgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRWYWx1ZXMoY29uc3QgVmVj
dG9yPFdlYkNvcmU6OkNvbG9yPiYpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0VmFsdWVzKGNvbnN0
IFZlY3RvcjxSZWZQdHI8V2ViQ29yZTo6RmlsdGVyT3BlcmF0aW9uPj4mLCBpbnQgaW50ZXJuYWxG
aWx0ZXJQcm9wZXJ0eUluZGV4KSBvdmVycmlkZTsKLSAgICB2b2lkIGNvcHlWYWx1ZXNGcm9tKGNv
bnN0IFdlYkNvcmU6OlBsYXRmb3JtQ0FBbmltYXRpb24mKSBvdmVycmlkZTsKLQotICAgIHZvaWQg
c2V0S2V5VGltZXMoY29uc3QgVmVjdG9yPGZsb2F0PiYpIG92ZXJyaWRlOwotICAgIHZvaWQgY29w
eUtleVRpbWVzRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uJikgb3ZlcnJp
ZGU7Ci0KLSAgICB2b2lkIHNldFRpbWluZ0Z1bmN0aW9ucyhjb25zdCBWZWN0b3I8Y29uc3QgV2Vi
Q29yZTo6VGltaW5nRnVuY3Rpb24qPiYsIGJvb2wgcmV2ZXJzZSA9IGZhbHNlKSBvdmVycmlkZTsK
LSAgICB2b2lkIGNvcHlUaW1pbmdGdW5jdGlvbnNGcm9tKGNvbnN0IFdlYkNvcmU6OlBsYXRmb3Jt
Q0FBbmltYXRpb24mKSBvdmVycmlkZTsKLQotICAgIEFuaW1hdGlvblR5cGUgYW5pbWF0aW9uVHlw
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvcGVydGllcy5hbmltYXRpb25UeXBlOyB9Ci0gICAgdm9p
ZCBzZXRIYXNFeHBsaWNpdEJlZ2luVGltZShib29sIGhhc0V4cGxpY2l0QmVnaW5UaW1lKSB7IG1f
cHJvcGVydGllcy5oYXNFeHBsaWNpdEJlZ2luVGltZSA9IGhhc0V4cGxpY2l0QmVnaW5UaW1lOyB9
Ci0gICAgYm9vbCBoYXNFeHBsaWNpdEJlZ2luVGltZSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvcGVy
dGllcy5oYXNFeHBsaWNpdEJlZ2luVGltZTsgfQotCi0gICAgdm9pZCBkaWRTdGFydChDRlRpbWVJ
bnRlcnZhbCBiZWdpblRpbWUpIHsgbV9wcm9wZXJ0aWVzLmJlZ2luVGltZSA9IGJlZ2luVGltZTsg
fQotCi0gICAgY2xhc3MgS2V5ZnJhbWVWYWx1ZSB7Ci0gICAgcHVibGljOgotICAgICAgICBlbnVt
IEtleWZyYW1lVHlwZSB7Ci0gICAgICAgICAgICBOdW1iZXJLZXlUeXBlLAotICAgICAgICAgICAg
Q29sb3JLZXlUeXBlLAotICAgICAgICAgICAgUG9pbnRLZXlUeXBlLAotICAgICAgICAgICAgVHJh
bnNmb3JtS2V5VHlwZSwKLSAgICAgICAgICAgIEZpbHRlcktleVR5cGUsCi0gICAgICAgIH07Ci0K
LSAgICAgICAgfktleWZyYW1lVmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAg
ICBLZXlmcmFtZVZhbHVlKGZsb2F0IHZhbHVlID0gMCkKLSAgICAgICAgICAgIDoga2V5VHlwZShO
dW1iZXJLZXlUeXBlKQotICAgICAgICAgICAgLCBudW1iZXIodmFsdWUpCi0gICAgICAgIHsKLSAg
ICAgICAgfQotCi0gICAgICAgIEtleWZyYW1lVmFsdWUoV2ViQ29yZTo6Q29sb3IgdmFsdWUpCi0g
ICAgICAgICAgICA6IGtleVR5cGUoQ29sb3JLZXlUeXBlKQotICAgICAgICAgICAgLCBjb2xvcih2
YWx1ZSkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgS2V5ZnJhbWVWYWx1ZShjb25z
dCBXZWJDb3JlOjpGbG9hdFBvaW50M0QmIHZhbHVlKQotICAgICAgICAgICAgOiBrZXlUeXBlKFBv
aW50S2V5VHlwZSkKLSAgICAgICAgICAgICwgcG9pbnQodmFsdWUpCi0gICAgICAgIHsKLSAgICAg
ICAgfQotCi0gICAgICAgIEtleWZyYW1lVmFsdWUoY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRp
b25NYXRyaXgmIHZhbHVlKQotICAgICAgICAgICAgOiBrZXlUeXBlKFRyYW5zZm9ybUtleVR5cGUp
Ci0gICAgICAgICAgICAsIHRyYW5zZm9ybSh2YWx1ZSkKLSAgICAgICAgewotICAgICAgICB9Ci0K
LSAgICAgICAgS2V5ZnJhbWVWYWx1ZShSZWZQdHI8V2ViQ29yZTo6RmlsdGVyT3BlcmF0aW9uPiYm
IHZhbHVlKQotICAgICAgICAgICAgOiBrZXlUeXBlKEZpbHRlcktleVR5cGUpCi0gICAgICAgICAg
ICAsIGZpbHRlcihXVEZNb3ZlKHZhbHVlKSkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAg
ICAgS2V5ZnJhbWVWYWx1ZShjb25zdCBLZXlmcmFtZVZhbHVlJiBvdGhlcikKLSAgICAgICAgewot
ICAgICAgICAgICAgKnRoaXMgPSBvdGhlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEtleWZyYW1l
VmFsdWUmIG9wZXJhdG9yPShjb25zdCBLZXlmcmFtZVZhbHVlJiBvdGhlcikKLSAgICAgICAgewot
ICAgICAgICAgICAga2V5VHlwZSA9IG90aGVyLmtleVR5cGU7Ci0gICAgICAgICAgICBzd2l0Y2gg
KGtleVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTnVtYmVyS2V5VHlwZToKLSAgICAgICAgICAg
ICAgICBudW1iZXIgPSBvdGhlci5udW1iZXI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICBjYXNlIENvbG9yS2V5VHlwZToKLSAgICAgICAgICAgICAgICBjb2xvciA9IG90aGVy
LmNvbG9yOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQb2ludEtl
eVR5cGU6Ci0gICAgICAgICAgICAgICAgcG9pbnQgPSBvdGhlci5wb2ludDsKLSAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVHJhbnNmb3JtS2V5VHlwZToKLSAgICAgICAg
ICAgICAgICB0cmFuc2Zvcm0gPSBvdGhlci50cmFuc2Zvcm07Ci0gICAgICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICBjYXNlIEZpbHRlcktleVR5cGU6Ci0gICAgICAgICAgICAgICAgZmls
dGVyID0gb3RoZXIuZmlsdGVyOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICByZXR1cm4gKnRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBLZXlm
cmFtZVR5cGUga2V5ZnJhbWVUeXBlKCkgY29uc3QgeyByZXR1cm4ga2V5VHlwZTsgfQotCi0gICAg
ICAgIGZsb2F0IG51bWJlclZhbHVlKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgQVNT
RVJUKGtleVR5cGUgPT0gTnVtYmVyS2V5VHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gbnVtYmVy
OwotICAgICAgICB9Ci0KLSAgICAgICAgV2ViQ29yZTo6Q29sb3IgY29sb3JWYWx1ZSgpIGNvbnN0
Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVChrZXlUeXBlID09IENvbG9yS2V5VHlwZSk7
Ci0gICAgICAgICAgICByZXR1cm4gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBX
ZWJDb3JlOjpGbG9hdFBvaW50M0QmIHBvaW50VmFsdWUoKSBjb25zdAotICAgICAgICB7Ci0gICAg
ICAgICAgICBBU1NFUlQoa2V5VHlwZSA9PSBQb2ludEtleVR5cGUpOwotICAgICAgICAgICAgcmV0
dXJuIHBvaW50OwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgV2ViQ29yZTo6VHJhbnNmb3Jt
YXRpb25NYXRyaXgmIHRyYW5zZm9ybVZhbHVlKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAg
ICAgQVNTRVJUKGtleVR5cGUgPT0gVHJhbnNmb3JtS2V5VHlwZSk7Ci0gICAgICAgICAgICByZXR1
cm4gdHJhbnNmb3JtOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgV2ViQ29yZTo6RmlsdGVy
T3BlcmF0aW9uKiBmaWx0ZXJWYWx1ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFT
U0VSVChrZXlUeXBlID09IEZpbHRlcktleVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIGZpbHRl
ci5nZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZW5jb2RlKElQQzo6RW5jb2RlciYp
IGNvbnN0OwotICAgICAgICBzdGF0aWMgYm9vbCBkZWNvZGUoSVBDOjpEZWNvZGVyJiwgS2V5ZnJh
bWVWYWx1ZSYpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgS2V5ZnJhbWVUeXBlIGtleVR5cGU7
Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgIGZsb2F0IG51bWJlcjsKLSAgICAgICAgICAg
IFdlYkNvcmU6OkNvbG9yIGNvbG9yOwotICAgICAgICAgICAgV2ViQ29yZTo6RmxvYXRQb2ludDNE
IHBvaW50OwotICAgICAgICAgICAgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNm
b3JtOwotICAgICAgICB9OwotICAgICAgICBSZWZQdHI8V2ViQ29yZTo6RmlsdGVyT3BlcmF0aW9u
PiBmaWx0ZXI7Ci0gICAgfTsKLQotICAgIHN0cnVjdCBQcm9wZXJ0aWVzIHsKLSAgICAgICAgUHJv
cGVydGllcygpCi0gICAgICAgICAgICA6IGFuaW1hdGlvblR5cGUoQmFzaWMpCi0gICAgICAgICAg
ICAsIGJlZ2luVGltZSgwKQotICAgICAgICAgICAgLCBkdXJhdGlvbigwKQotICAgICAgICAgICAg
LCB0aW1lT2Zmc2V0KDApCi0gICAgICAgICAgICAsIHJlcGVhdENvdW50KDEpCi0gICAgICAgICAg
ICAsIHNwZWVkKDEpCi0gICAgICAgICAgICAsIGZpbGxNb2RlKE5vRmlsbE1vZGUpCi0gICAgICAg
ICAgICAsIHZhbHVlRnVuY3Rpb24oTm9WYWx1ZUZ1bmN0aW9uKQotICAgICAgICAgICAgLCBhdXRv
UmV2ZXJzZXMoZmFsc2UpCi0gICAgICAgICAgICAsIHJlbW92ZWRPbkNvbXBsZXRpb24odHJ1ZSkK
LSAgICAgICAgICAgICwgYWRkaXRpdmUoZmFsc2UpCi0gICAgICAgICAgICAsIHJldmVyc2VUaW1p
bmdGdW5jdGlvbnMoZmFsc2UpCi0gICAgICAgICAgICAsIGhhc0V4cGxpY2l0QmVnaW5UaW1lKGZh
bHNlKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGVuY29kZShJUEM6OkVu
Y29kZXImKSBjb25zdDsKLSAgICAgICAgc3RhdGljIGJvb2wgZGVjb2RlKElQQzo6RGVjb2RlciYs
IFByb3BlcnRpZXMmKTsKLQotICAgICAgICBTdHJpbmcga2V5UGF0aDsKLSAgICAgICAgUGxhdGZv
cm1DQUFuaW1hdGlvbjo6QW5pbWF0aW9uVHlwZSBhbmltYXRpb25UeXBlOwotCi0gICAgICAgIGRv
dWJsZSBiZWdpblRpbWU7Ci0gICAgICAgIGRvdWJsZSBkdXJhdGlvbjsKLSAgICAgICAgZG91Ymxl
IHRpbWVPZmZzZXQ7Ci0gICAgICAgIGZsb2F0IHJlcGVhdENvdW50OwotICAgICAgICBmbG9hdCBz
cGVlZDsKLQotICAgICAgICBQbGF0Zm9ybUNBQW5pbWF0aW9uOjpGaWxsTW9kZVR5cGUgZmlsbE1v
ZGU7Ci0gICAgICAgIFBsYXRmb3JtQ0FBbmltYXRpb246OlZhbHVlRnVuY3Rpb25UeXBlIHZhbHVl
RnVuY3Rpb247Ci0KLSAgICAgICAgYm9vbCBhdXRvUmV2ZXJzZXM7Ci0gICAgICAgIGJvb2wgcmVt
b3ZlZE9uQ29tcGxldGlvbjsKLSAgICAgICAgYm9vbCBhZGRpdGl2ZTsKLSAgICAgICAgYm9vbCBy
ZXZlcnNlVGltaW5nRnVuY3Rpb25zOwotICAgICAgICBib29sIGhhc0V4cGxpY2l0QmVnaW5UaW1l
OwotCi0gICAgICAgIC8vIEZvciBiYXNpYyBhbmltYXRpb25zLCB0aGVzZSB2ZWN0b3JzIGhhdmUg
dHdvIGVudHJpZXMuIEZvciBrZXlmcmFtZSBhbmltYXRpb25zLCB0d28gb3IgbW9yZS4KLSAgICAg
ICAgLy8gdGltaW5nRnVuY3Rpb25zIGhhcyBuLTEgZW50cmllcy4KLSAgICAgICAgVmVjdG9yPEtl
eWZyYW1lVmFsdWU+IGtleVZhbHVlczsKLSAgICAgICAgVmVjdG9yPGZsb2F0PiBrZXlUaW1lczsK
LSAgICAgICAgVmVjdG9yPFJlZlB0cjxXZWJDb3JlOjpUaW1pbmdGdW5jdGlvbj4+IHRpbWluZ0Z1
bmN0aW9uczsKLSAgICB9OwotCi0gICAgY29uc3QgUHJvcGVydGllcyYgcHJvcGVydGllcygpIGNv
bnN0IHsgcmV0dXJuIG1fcHJvcGVydGllczsgfQotCi0gICAgdHlwZWRlZiBWZWN0b3I8c3RkOjpw
YWlyPFN0cmluZywgUHJvcGVydGllcz4+IEFuaW1hdGlvbnNMaXN0OwotICAgIHN0YXRpYyB2b2lk
IHVwZGF0ZUxheWVyQW5pbWF0aW9ucyhDQUxheWVyICosIFJlbW90ZUxheWVyVHJlZUhvc3QqLCBj
b25zdCBBbmltYXRpb25zTGlzdCYgYW5pbWF0aW9uc1RvQWRkLCBjb25zdCBIYXNoU2V0PFN0cmlu
Zz4mIGFuaW1hdGlvbnNUb1JlbW92ZSk7Ci0KLXByaXZhdGU6Ci0gICAgUGxhdGZvcm1DQUFuaW1h
dGlvblJlbW90ZShBbmltYXRpb25UeXBlLCBjb25zdCBTdHJpbmcmIGtleVBhdGgpOwotCi0gICAg
UHJvcGVydGllcyBtX3Byb3BlcnRpZXM7Ci19OwotCi1XVEY6OlRleHRTdHJlYW0mIG9wZXJhdG9y
PDwoV1RGOjpUZXh0U3RyZWFtJiwgY29uc3QgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5
ZnJhbWVWYWx1ZSYpOwotV1RGOjpUZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFdURjo6VGV4dFN0cmVh
bSYsIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXMmKTsKLQotfSAv
LyBuYW1lc3BhY2UgV2ViS2l0Ci0KLVNQRUNJQUxJWkVfVFlQRV9UUkFJVFNfQ0FBTklNQVRJT04o
V2ViS2l0OjpQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlLCBpc1BsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGUoKSkKLQotI2VuZGlmIC8vIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGVfaApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FBbmlt
YXRpb25SZW1vdGUubW0gYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxh
dGZvcm1DQUFuaW1hdGlvblJlbW90ZS5tbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDZlMjczYzNhNzE5ZTY5MTAwZDE1ZjVhMzFhMWEyZDQ1ZmY2ZmY0Mi4uMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3Mv
V2ViUGFnZS9tYWMvUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZS5tbQorKysgL2Rldi9udWxsCkBA
IC0xLDkzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgot
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0g
Ki8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2ltcG9ydCAiUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZS5oIgotCi0jaW1wb3J0ICJBcmd1bWVudENvZGVycy5oIgotI2ltcG9ydCAiUmVtb3RlTGF5
ZXJUcmVlSG9zdC5oIgotI2ltcG9ydCAiV2ViQ29yZUFyZ3VtZW50Q29kZXJzLmgiCi0jaW1wb3J0
IDxRdWFydHpDb3JlL1F1YXJ0ekNvcmUuaD4KLSNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NMYXll
ci5oPgotI2ltcG9ydCA8V2ViQ29yZS9QbGF0Zm9ybUNBQW5pbWF0aW9uQ29jb2EuaD4KLSNpbXBv
cnQgPFdlYkNvcmUvUGxhdGZvcm1DQUZpbHRlcnMuaD4KLSNpbXBvcnQgPFdlYkNvcmUvVGltaW5n
RnVuY3Rpb24uaD4KLSNpbXBvcnQgPHBhbC9zcGkvY29jb2EvUXVhcnR6Q29yZVNQSS5oPgotI2lt
cG9ydCA8d3RmL0Jsb2NrT2JqQ0V4Y2VwdGlvbnMuaD4KLSNpbXBvcnQgPHd0Zi9DdXJyZW50VGlt
ZS5oPgotI2ltcG9ydCA8d3RmL1JldGFpblB0ci5oPgotI2ltcG9ydCA8d3RmL3RleHQvVGV4dFN0
cmVhbS5oPgotCi11c2luZyBuYW1lc3BhY2UgV1RGOwotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7
Ci0KLXN0YXRpYyBkb3VibGUgbWVkaWFUaW1lVG9DdXJyZW50VGltZShDRlRpbWVJbnRlcnZhbCB0
KQotewotICAgIHJldHVybiBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKSArIHQgLSBDQUN1
cnJlbnRNZWRpYVRpbWUoKTsKLX0KLQotc3RhdGljIE5TU3RyaW5nICogY29uc3QgV0tFeHBsaWNp
dEJlZ2luVGltZUZsYWcgPSBAIldLUGxhdGZvcm1DQUFuaW1hdGlvbkV4cGxpY2l0QmVnaW5UaW1l
RmxhZyI7Ci0KLUBpbnRlcmZhY2UgV0tBbmltYXRpb25EZWxlZ2F0ZSA6IE5TT2JqZWN0IDxDQUFu
aW1hdGlvbkRlbGVnYXRlPiB7Ci0gICAgR3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklEIF9s
YXllcklEOwotICAgIFdlYktpdDo6UmVtb3RlTGF5ZXJUcmVlSG9zdCogX2xheWVyVHJlZUhvc3Q7
Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aExheWVySUQ6KEdyYXBoaWNzTGF5ZXI6OlBs
YXRmb3JtTGF5ZXJJRClsYXllcklEIGxheWVyVHJlZUhvc3Q6KFdlYktpdDo6UmVtb3RlTGF5ZXJU
cmVlSG9zdCopbGF5ZXJUcmVlSG9zdDsKLS0gKHZvaWQpaW52YWxpZGF0ZTsKLUBlbmQKLQotQGlt
cGxlbWVudGF0aW9uIFdLQW5pbWF0aW9uRGVsZWdhdGUKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRX
aXRoTGF5ZXJJRDooR3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklEKWxheWVySUQgbGF5ZXJU
cmVlSG9zdDooV2ViS2l0OjpSZW1vdGVMYXllclRyZWVIb3N0KilsYXllclRyZWVIb3N0Ci17Ci0g
ICAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSkgewotICAgICAgICBfbGF5ZXJJRCA9IGxheWVy
SUQ7Ci0gICAgICAgIF9sYXllclRyZWVIb3N0ID0gbGF5ZXJUcmVlSG9zdDsKLSAgICB9Ci0gICAg
cmV0dXJuIHNlbGY7Ci19Ci0KLS0gKHZvaWQpaW52YWxpZGF0ZQotewotICAgIF9sYXllclRyZWVI
b3N0ID0gbnVsbHB0cjsKLX0KLQotLSAodm9pZClhbmltYXRpb25EaWRTdGFydDooQ0FBbmltYXRp
b24gKilhbmltYXRpb24KLXsKLSAgICBpZiAoIV9sYXllclRyZWVIb3N0KQotICAgICAgICByZXR1
cm47Ci0KLSAgICBib29sIGhhc0V4cGxpY2l0QmVnaW5UaW1lID0gW1thbmltYXRpb24gdmFsdWVG
b3JLZXk6V0tFeHBsaWNpdEJlZ2luVGltZUZsYWddIGJvb2xWYWx1ZV07Ci0gICAgQ0ZUaW1lSW50
ZXJ2YWwgc3RhcnRUaW1lOwotCi0gICAgaWYgKGhhc0V4cGxpY2l0QmVnaW5UaW1lKSB7Ci0gICAg
ICAgIC8vIFdlIGRvbid0IGtub3cgd2hhdCB0aW1lIENBIHVzZWQgdG8gY29tbWl0IHRoZSBhbmlt
YXRpb24sIHNvIGp1c3QgdXNlIHRoZSBjdXJyZW50IHRpbWUKLSAgICAgICAgLy8gKGV2ZW4gdGhv
dWdoIHRoaXMgd2lsbCBiZSBzbGlnaHRseSBvZmYpLgotICAgICAgICBzdGFydFRpbWUgPSBtZWRp
YVRpbWVUb0N1cnJlbnRUaW1lKENBQ3VycmVudE1lZGlhVGltZSgpKTsKLSAgICB9IGVsc2UKLSAg
ICAgICAgc3RhcnRUaW1lID0gbWVkaWFUaW1lVG9DdXJyZW50VGltZShbYW5pbWF0aW9uIGJlZ2lu
VGltZV0pOwotCi0gICAgX2xheWVyVHJlZUhvc3QtPmFuaW1hdGlvbkRpZFN0YXJ0KF9sYXllcklE
LCBhbmltYXRpb24sIHN0YXJ0VGltZSk7Ci19Ci0KLS0gKHZvaWQpYW5pbWF0aW9uRGlkU3RvcDoo
Q0FBbmltYXRpb24gKilhbmltYXRpb24gZmluaXNoZWQ6KEJPT0wpZmluaXNoZWQKLXsKLSAgICBp
ZiAoIV9sYXllclRyZWVIb3N0KQotICAgICAgICByZXR1cm47Ci0KLSAgICBfbGF5ZXJUcmVlSG9z
dC0+YW5pbWF0aW9uRGlkRW5kKF9sYXllcklELCBhbmltYXRpb24pOwotfQotCi1AZW5kCi0KLW5h
bWVzcGFjZSBXZWJLaXQgewotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZy
YW1lVmFsdWU6OmVuY29kZShJUEM6OkVuY29kZXImIGVuY29kZXIpIGNvbnN0Ci17Ci0gICAgZW5j
b2Rlci5lbmNvZGVFbnVtKGtleVR5cGUpOwotCi0gICAgc3dpdGNoIChrZXlUeXBlKSB7Ci0gICAg
Y2FzZSBOdW1iZXJLZXlUeXBlOgotICAgICAgICBlbmNvZGVyIDw8IG51bWJlcjsKLSAgICAgICAg
YnJlYWs7Ci0gICAgY2FzZSBDb2xvcktleVR5cGU6Ci0gICAgICAgIGVuY29kZXIgPDwgY29sb3I7
Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUG9pbnRLZXlUeXBlOgotICAgICAgICBlbmNvZGVy
IDw8IHBvaW50OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFRyYW5zZm9ybUtleVR5cGU6Ci0g
ICAgICAgIGVuY29kZXIgPDwgdHJhbnNmb3JtOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZp
bHRlcktleVR5cGU6Ci0gICAgICAgIGVuY29kZXIgPDwgKmZpbHRlci5nZXQoKTsKLSAgICAgICAg
YnJlYWs7Ci0gICAgfQotfQotCi1ib29sIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZy
YW1lVmFsdWU6OmRlY29kZShJUEM6OkRlY29kZXImIGRlY29kZXIsIFBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGU6OktleWZyYW1lVmFsdWUmIHZhbHVlKQotewotICAgIGlmICghZGVjb2Rlci5kZWNv
ZGVFbnVtKHZhbHVlLmtleVR5cGUpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBzd2l0
Y2ggKHZhbHVlLmtleVR5cGUpIHsKLSAgICBjYXNlIE51bWJlcktleVR5cGU6Ci0gICAgICAgIGlm
ICghZGVjb2Rlci5kZWNvZGUodmFsdWUubnVtYmVyKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDb2xvcktleVR5cGU6Ci0gICAgICAgIGlmICgh
ZGVjb2Rlci5kZWNvZGUodmFsdWUuY29sb3IpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICBicmVhazsKLSAgICBjYXNlIFBvaW50S2V5VHlwZToKLSAgICAgICAgaWYgKCFkZWNv
ZGVyLmRlY29kZSh2YWx1ZS5wb2ludCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIGJyZWFrOwotICAgIGNhc2UgVHJhbnNmb3JtS2V5VHlwZToKLSAgICAgICAgaWYgKCFkZWNv
ZGVyLmRlY29kZSh2YWx1ZS50cmFuc2Zvcm0pKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICBicmVhazsKLSAgICBjYXNlIEZpbHRlcktleVR5cGU6Ci0gICAgICAgIGlmICghZGVj
b2RlRmlsdGVyT3BlcmF0aW9uKGRlY29kZXIsIHZhbHVlLmZpbHRlcikpCi0gICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwot
fQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXM6OmVuY29kZShJ
UEM6OkVuY29kZXImIGVuY29kZXIpIGNvbnN0Ci17Ci0gICAgZW5jb2RlciA8PCBrZXlQYXRoOwot
ICAgIGVuY29kZXIuZW5jb2RlRW51bShhbmltYXRpb25UeXBlKTsKLQotICAgIGVuY29kZXIgPDwg
YmVnaW5UaW1lOwotICAgIGVuY29kZXIgPDwgZHVyYXRpb247Ci0gICAgZW5jb2RlciA8PCB0aW1l
T2Zmc2V0OwotICAgIGVuY29kZXIgPDwgcmVwZWF0Q291bnQ7Ci0gICAgZW5jb2RlciA8PCBzcGVl
ZDsKLQotICAgIGVuY29kZXIuZW5jb2RlRW51bShmaWxsTW9kZSk7Ci0gICAgZW5jb2Rlci5lbmNv
ZGVFbnVtKHZhbHVlRnVuY3Rpb24pOwotCi0gICAgZW5jb2RlciA8PCBhdXRvUmV2ZXJzZXM7Ci0g
ICAgZW5jb2RlciA8PCByZW1vdmVkT25Db21wbGV0aW9uOwotICAgIGVuY29kZXIgPDwgYWRkaXRp
dmU7Ci0gICAgZW5jb2RlciA8PCByZXZlcnNlVGltaW5nRnVuY3Rpb25zOwotICAgIGVuY29kZXIg
PDwgaGFzRXhwbGljaXRCZWdpblRpbWU7Ci0gICAgCi0gICAgZW5jb2RlciA8PCBrZXlWYWx1ZXM7
Ci0gICAgZW5jb2RlciA8PCBrZXlUaW1lczsKLSAgICAKLSAgICBlbmNvZGVyIDw8IHN0YXRpY19j
YXN0PHVpbnQ2NF90Pih0aW1pbmdGdW5jdGlvbnMuc2l6ZSgpKTsKLSAgICBmb3IgKGNvbnN0IGF1
dG8mIHRpbWluZ0Z1bmN0aW9uIDogdGltaW5nRnVuY3Rpb25zKSB7Ci0gICAgICAgIHN3aXRjaCAo
dGltaW5nRnVuY3Rpb24tPnR5cGUoKSkgewotICAgICAgICBjYXNlIFRpbWluZ0Z1bmN0aW9uOjpM
aW5lYXJGdW5jdGlvbjoKLSAgICAgICAgICAgIGVuY29kZXIgPDwgKnN0YXRpY19jYXN0PExpbmVh
clRpbWluZ0Z1bmN0aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgY2FzZSBUaW1pbmdGdW5jdGlvbjo6Q3ViaWNCZXpp
ZXJGdW5jdGlvbjoKLSAgICAgICAgICAgIGVuY29kZXIgPDwgKnN0YXRpY19jYXN0PEN1YmljQmV6
aWVyVGltaW5nRnVuY3Rpb24qPih0aW1pbmdGdW5jdGlvbi5nZXQoKSk7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgCi0gICAgICAgIGNhc2UgVGltaW5nRnVuY3Rpb246OlN0ZXBzRnVuY3Rp
b246Ci0gICAgICAgICAgICBlbmNvZGVyIDw8ICpzdGF0aWNfY2FzdDxTdGVwc1RpbWluZ0Z1bmN0
aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAg
ICAgY2FzZSBUaW1pbmdGdW5jdGlvbjo6U3ByaW5nRnVuY3Rpb246Ci0gICAgICAgICAgICBlbmNv
ZGVyIDw8ICpzdGF0aWNfY2FzdDxTcHJpbmdUaW1pbmdGdW5jdGlvbio+KHRpbWluZ0Z1bmN0aW9u
LmdldCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi1ib29s
IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXM6OmRlY29kZShJUEM6OkRlY29k
ZXImIGRlY29kZXIsIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXMmIHByb3Bl
cnRpZXMpCi17Ci0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmtleVBhdGgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIWRlY29kZXIuZGVjb2RlRW51bShwcm9w
ZXJ0aWVzLmFuaW1hdGlvblR5cGUpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAo
IWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMuYmVnaW5UaW1lKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmR1cmF0aW9uKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVz
LnRpbWVPZmZzZXQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIWRlY29kZXIu
ZGVjb2RlKHByb3BlcnRpZXMucmVwZWF0Q291bnQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMuc3BlZWQpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICBpZiAoIWRlY29kZXIuZGVjb2RlRW51bShwcm9wZXJ0aWVzLmZpbGxN
b2RlKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZUVu
dW0ocHJvcGVydGllcy52YWx1ZUZ1bmN0aW9uKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmF1dG9SZXZlcnNlcykpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIGlmICghZGVjb2Rlci5kZWNvZGUocHJvcGVydGllcy5yZW1v
dmVkT25Db21wbGV0aW9uKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNv
ZGVyLmRlY29kZShwcm9wZXJ0aWVzLmFkZGl0aXZlKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLnJldmVyc2VUaW1pbmdGdW5jdGlv
bnMpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHBy
b3BlcnRpZXMuaGFzRXhwbGljaXRCZWdpblRpbWUpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBpZiAoIWRlY29kZXIuZGVjb2RlKHByb3BlcnRpZXMua2V5VmFsdWVzKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCFkZWNvZGVyLmRlY29kZShwcm9wZXJ0aWVzLmtleVRp
bWVzKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgdWludDY0X3QgbnVtVGltaW5nRnVu
Y3Rpb25zOwotICAgIGlmICghZGVjb2Rlci5kZWNvZGUobnVtVGltaW5nRnVuY3Rpb25zKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGlmIChudW1UaW1pbmdGdW5jdGlvbnMpIHsK
LSAgICAgICAgcHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0
eShudW1UaW1pbmdGdW5jdGlvbnMpOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
bnVtVGltaW5nRnVuY3Rpb25zOyArK2kpIHsKLSAgICAgICAgCi0gICAgICAgICAgICBUaW1pbmdG
dW5jdGlvbjo6VGltaW5nRnVuY3Rpb25UeXBlIHR5cGU7Ci0gICAgICAgICAgICBpZiAoIWRlY29k
ZXIuZGVjb2RlRW51bSh0eXBlKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICAgICAgICAgIFJlZlB0cjxUaW1pbmdGdW5jdGlvbj4gdGltaW5nRnVuY3Rpb247Ci0gICAgICAg
ICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVGltaW5nRnVuY3Rpb246Okxp
bmVhckZ1bmN0aW9uOgotICAgICAgICAgICAgICAgIHRpbWluZ0Z1bmN0aW9uID0gTGluZWFyVGlt
aW5nRnVuY3Rpb246OmNyZWF0ZSgpOwotICAgICAgICAgICAgICAgIGlmICghZGVjb2Rlci5kZWNv
ZGUoKnN0YXRpY19jYXN0PExpbmVhclRpbWluZ0Z1bmN0aW9uKj4odGltaW5nRnVuY3Rpb24uZ2V0
KCkpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY2FzZSBUaW1pbmdGdW5jdGlv
bjo6Q3ViaWNCZXppZXJGdW5jdGlvbjoKLSAgICAgICAgICAgICAgICB0aW1pbmdGdW5jdGlvbiA9
IEN1YmljQmV6aWVyVGltaW5nRnVuY3Rpb246OmNyZWF0ZSgpOwotICAgICAgICAgICAgICAgIGlm
ICghZGVjb2Rlci5kZWNvZGUoKnN0YXRpY19jYXN0PEN1YmljQmV6aWVyVGltaW5nRnVuY3Rpb24q
Pih0aW1pbmdGdW5jdGlvbi5nZXQoKSkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGNh
c2UgVGltaW5nRnVuY3Rpb246OlN0ZXBzRnVuY3Rpb246Ci0gICAgICAgICAgICAgICAgdGltaW5n
RnVuY3Rpb24gPSBTdGVwc1RpbWluZ0Z1bmN0aW9uOjpjcmVhdGUoKTsKLSAgICAgICAgICAgICAg
ICBpZiAoIWRlY29kZXIuZGVjb2RlKCpzdGF0aWNfY2FzdDxTdGVwc1RpbWluZ0Z1bmN0aW9uKj4o
dGltaW5nRnVuY3Rpb24uZ2V0KCkpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFRpbWluZ0Z1bmN0
aW9uOjpTcHJpbmdGdW5jdGlvbjoKLSAgICAgICAgICAgICAgICB0aW1pbmdGdW5jdGlvbiA9IFNw
cmluZ1RpbWluZ0Z1bmN0aW9uOjpjcmVhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRlY29k
ZXIuZGVjb2RlKCpzdGF0aWNfY2FzdDxTcHJpbmdUaW1pbmdGdW5jdGlvbio+KHRpbWluZ0Z1bmN0
aW9uLmdldCgpKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAg
cHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMudW5jaGVja2VkQXBwZW5kKFdURk1vdmUodGltaW5n
RnVuY3Rpb24pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotICAg
IAotUmVmPFBsYXRmb3JtQ0FBbmltYXRpb24+IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNy
ZWF0ZShQbGF0Zm9ybUNBQW5pbWF0aW9uOjpBbmltYXRpb25UeXBlIHR5cGUsIGNvbnN0IFN0cmlu
ZyYga2V5UGF0aCkKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBQbGF0Zm9ybUNBQW5pbWF0
aW9uUmVtb3RlKHR5cGUsIGtleVBhdGgpKTsKLX0KLQotUmVmPFBsYXRmb3JtQ0FBbmltYXRpb24+
IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNvcHkoKSBjb25zdAotewotICAgIGF1dG8gYW5p
bWF0aW9uID0gY3JlYXRlKGFuaW1hdGlvblR5cGUoKSwga2V5UGF0aCgpKTsKLSAgICAKLSAgICBh
bmltYXRpb24tPnNldEJlZ2luVGltZShiZWdpblRpbWUoKSk7Ci0gICAgYW5pbWF0aW9uLT5zZXRE
dXJhdGlvbihkdXJhdGlvbigpKTsKLSAgICBhbmltYXRpb24tPnNldFNwZWVkKHNwZWVkKCkpOwot
ICAgIGFuaW1hdGlvbi0+c2V0VGltZU9mZnNldCh0aW1lT2Zmc2V0KCkpOwotICAgIGFuaW1hdGlv
bi0+c2V0UmVwZWF0Q291bnQocmVwZWF0Q291bnQoKSk7Ci0gICAgYW5pbWF0aW9uLT5zZXRBdXRv
cmV2ZXJzZXMoYXV0b3JldmVyc2VzKCkpOwotICAgIGFuaW1hdGlvbi0+c2V0RmlsbE1vZGUoZmls
bE1vZGUoKSk7Ci0gICAgYW5pbWF0aW9uLT5zZXRSZW1vdmVkT25Db21wbGV0aW9uKGlzUmVtb3Zl
ZE9uQ29tcGxldGlvbigpKTsKLSAgICBhbmltYXRpb24tPnNldEFkZGl0aXZlKGlzQWRkaXRpdmUo
KSk7Ci0gICAgYW5pbWF0aW9uLT5jb3B5VGltaW5nRnVuY3Rpb25Gcm9tKCp0aGlzKTsKLSAgICBh
bmltYXRpb24tPnNldFZhbHVlRnVuY3Rpb24odmFsdWVGdW5jdGlvbigpKTsKLQotICAgIGRvd25j
YXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KGFuaW1hdGlvbi5nZXQoKSkuc2V0SGFzRXhw
bGljaXRCZWdpblRpbWUoaGFzRXhwbGljaXRCZWdpblRpbWUoKSk7Ci0gICAgCi0gICAgLy8gQ29w
eSB0aGUgc3BlY2lmaWMgQmFzaWMgb3IgS2V5ZnJhbWUgdmFsdWVzLgotICAgIGlmIChhbmltYXRp
b25UeXBlKCkgPT0gS2V5ZnJhbWUpIHsKLSAgICAgICAgYW5pbWF0aW9uLT5jb3B5VmFsdWVzRnJv
bSgqdGhpcyk7Ci0gICAgICAgIGFuaW1hdGlvbi0+Y29weUtleVRpbWVzRnJvbSgqdGhpcyk7Ci0g
ICAgICAgIGFuaW1hdGlvbi0+Y29weVRpbWluZ0Z1bmN0aW9uc0Zyb20oKnRoaXMpOwotICAgIH0g
ZWxzZSB7Ci0gICAgICAgIGFuaW1hdGlvbi0+Y29weUZyb21WYWx1ZUZyb20oKnRoaXMpOwotICAg
ICAgICBhbmltYXRpb24tPmNvcHlUb1ZhbHVlRnJvbSgqdGhpcyk7Ci0gICAgfQotICAgIAotICAg
IHJldHVybiBhbmltYXRpb247Ci19Ci0KLVBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlBsYXRm
b3JtQ0FBbmltYXRpb25SZW1vdGUoQW5pbWF0aW9uVHlwZSB0eXBlLCBjb25zdCBTdHJpbmcmIGtl
eVBhdGgpCi0gICAgOiBQbGF0Zm9ybUNBQW5pbWF0aW9uKHR5cGUpCi17Ci0gICAgbV9wcm9wZXJ0
aWVzLmtleVBhdGggPSBrZXlQYXRoOwotICAgIG1fcHJvcGVydGllcy5hbmltYXRpb25UeXBlID0g
dHlwZTsKLX0KLQotU3RyaW5nIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmtleVBhdGgoKSBj
b25zdAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMua2V5UGF0aDsKLX0KLQotQ0ZUaW1lSW50
ZXJ2YWwgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6YmVnaW5UaW1lKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gbV9wcm9wZXJ0aWVzLmJlZ2luVGltZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5p
bWF0aW9uUmVtb3RlOjpzZXRCZWdpblRpbWUoQ0ZUaW1lSW50ZXJ2YWwgdmFsdWUpCi17Ci0gICAg
bV9wcm9wZXJ0aWVzLmJlZ2luVGltZSA9IHZhbHVlOwotICAgIAotICAgIC8vIEFsc28gc2V0IGEg
ZmxhZyB0byB0ZWxsIHVzIGlmIHdlJ3ZlIHBhc3NlZCBpbiBhIDAgdmFsdWUuIAotICAgIC8vIFRo
ZSBmbGFnIGlzIG5lZWRlZCBiZWNhdXNlIGxhdGVyIGJlZ2luVGltZSB3aWxsIGdldCBjaGFuZ2Vk
Ci0gICAgLy8gdG8gdGhlIHRpbWUgYXQgd2hpY2ggaXQgZmlyZWQgYW5kIHdlIG5lZWQgdG8ga25v
dyB3aGV0aGVyCi0gICAgLy8gb3Igbm90IGl0IHdhcyAwIHRvIGJlZ2luIHdpdGguCi0gICAgaWYg
KHZhbHVlKQotICAgICAgICBtX3Byb3BlcnRpZXMuaGFzRXhwbGljaXRCZWdpblRpbWUgPSB2YWx1
ZTsKLX0KLQotQ0ZUaW1lSW50ZXJ2YWwgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6ZHVyYXRp
b24oKSBjb25zdAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMuZHVyYXRpb247Ci19Ci0KLXZv
aWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0RHVyYXRpb24oQ0ZUaW1lSW50ZXJ2YWwg
dmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLmR1cmF0aW9uID0gdmFsdWU7Ci19Ci0KLWZsb2F0
IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNwZWVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bV9wcm9wZXJ0aWVzLnNwZWVkOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6
OnNldFNwZWVkKGZsb2F0IHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5zcGVlZCA9IHZhbHVl
OwotfQotCi1DRlRpbWVJbnRlcnZhbCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjp0aW1lT2Zm
c2V0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnRpbWVPZmZzZXQ7Ci19Ci0K
LXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VGltZU9mZnNldChDRlRpbWVJbnRl
cnZhbCB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMudGltZU9mZnNldCA9IHZhbHVlOwotfQot
Ci1mbG9hdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpyZXBlYXRDb3VudCgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5yZXBlYXRDb3VudDsKLX0KLQotdm9pZCBQbGF0Zm9y
bUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRSZXBlYXRDb3VudChmbG9hdCB2YWx1ZSkKLXsKLSAgICBt
X3Byb3BlcnRpZXMucmVwZWF0Q291bnQgPSB2YWx1ZTsKLX0KLQotYm9vbCBQbGF0Zm9ybUNBQW5p
bWF0aW9uUmVtb3RlOjphdXRvcmV2ZXJzZXMoKSBjb25zdAotewotICAgIHJldHVybiBtX3Byb3Bl
cnRpZXMuYXV0b1JldmVyc2VzOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6
OnNldEF1dG9yZXZlcnNlcyhib29sIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5hdXRvUmV2
ZXJzZXMgPSB2YWx1ZTsKLX0KLQotUGxhdGZvcm1DQUFuaW1hdGlvbjo6RmlsbE1vZGVUeXBlIFBs
YXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmZpbGxNb2RlKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
bV9wcm9wZXJ0aWVzLmZpbGxNb2RlOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU6OnNldEZpbGxNb2RlKEZpbGxNb2RlVHlwZSB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMu
ZmlsbE1vZGUgPSB2YWx1ZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpz
ZXRUaW1pbmdGdW5jdGlvbihjb25zdCBUaW1pbmdGdW5jdGlvbiogdmFsdWUsIGJvb2wgcmV2ZXJz
ZSkKLXsKLSAgICBWZWN0b3I8UmVmUHRyPFRpbWluZ0Z1bmN0aW9uPj4gdGltaW5nRnVuY3Rpb25z
OwotICAgIHRpbWluZ0Z1bmN0aW9ucy5hcHBlbmQodmFsdWUtPmNsb25lKCkpOwotCi0gICAgbV9w
cm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucyA9IFdURk1vdmUodGltaW5nRnVuY3Rpb25zKTsKLSAg
ICBtX3Byb3BlcnRpZXMucmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyA9IHJldmVyc2U7Ci19Ci0KLXZv
aWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6Y29weVRpbWluZ0Z1bmN0aW9uRnJvbShjb25z
dCBQbGF0Zm9ybUNBQW5pbWF0aW9uJiB2YWx1ZSkKLXsKLSAgICBjb3B5VGltaW5nRnVuY3Rpb25z
RnJvbSh2YWx1ZSk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6aXNSZW1v
dmVkT25Db21wbGV0aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnJlbW92
ZWRPbkNvbXBsZXRpb247Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0
UmVtb3ZlZE9uQ29tcGxldGlvbihib29sIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5yZW1v
dmVkT25Db21wbGV0aW9uID0gdmFsdWU7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6aXNBZGRpdGl2ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5hZGRp
dGl2ZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRBZGRpdGl2ZShi
b29sIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5hZGRpdGl2ZSA9IHZhbHVlOwotfQotCi1Q
bGF0Zm9ybUNBQW5pbWF0aW9uOjpWYWx1ZUZ1bmN0aW9uVHlwZSBQbGF0Zm9ybUNBQW5pbWF0aW9u
UmVtb3RlOjp2YWx1ZUZ1bmN0aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVz
LnZhbHVlRnVuY3Rpb247Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0
VmFsdWVGdW5jdGlvbihWYWx1ZUZ1bmN0aW9uVHlwZSB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRp
ZXMudmFsdWVGdW5jdGlvbiA9IHZhbHVlOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OnNldEZyb21WYWx1ZShmbG9hdCB2YWx1ZSkKLXsKLSAgICBpZiAoYW5pbWF0aW9uVHlw
ZSgpICE9IEJhc2ljKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMua2V5VmFs
dWVzLnJlc2l6ZSgyKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzBdID0gS2V5ZnJhbWVW
YWx1ZSh2YWx1ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0RnJv
bVZhbHVlKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB2YWx1ZSkKLXsKLSAgICBpZiAoYW5p
bWF0aW9uVHlwZSgpICE9IEJhc2ljKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRp
ZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzBdID0g
S2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90
ZTo6c2V0RnJvbVZhbHVlKGNvbnN0IEZsb2F0UG9pbnQzRCYgdmFsdWUpCi17Ci0gICAgaWYgKGFu
aW1hdGlvblR5cGUoKSAhPSBCYXNpYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0
aWVzLmtleVZhbHVlcy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1swXSA9
IEtleWZyYW1lVmFsdWUodmFsdWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1v
dGU6OnNldEZyb21WYWx1ZShjb25zdCBDb2xvciYgdmFsdWUpCi17Ci0gICAgaWYgKGFuaW1hdGlv
blR5cGUoKSAhPSBCYXNpYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVzLmtl
eVZhbHVlcy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1swXSA9IEtleWZy
YW1lVmFsdWUodmFsdWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNl
dEZyb21WYWx1ZShjb25zdCBGaWx0ZXJPcGVyYXRpb24qIG9wZXJhdGlvbiwgaW50IGludGVybmFs
RmlsdGVyUHJvcGVydHlJbmRleCkKLXsKLSAgICBpZiAoYW5pbWF0aW9uVHlwZSgpICE9IEJhc2lj
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgy
KTsKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzBdID0gS2V5ZnJhbWVWYWx1ZShvcGVyYXRp
b24tPmNsb25lKCkpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OmNvcHlG
cm9tVmFsdWVGcm9tKGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb24mIHZhbHVlKQotewotICAgIGNv
bnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUmIG90aGVyID0gZG93bmNhc3Q8UGxhdGZvcm1D
QUFuaW1hdGlvblJlbW90ZT4odmFsdWUpOwotCi0gICAgaWYgKG90aGVyLm1fcHJvcGVydGllcy5r
ZXlWYWx1ZXMuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgbV9wcm9wZXJ0
aWVzLmtleVZhbHVlcy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1swXSA9
IG90aGVyLm1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMF07Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZTo6c2V0VG9WYWx1ZShmbG9hdCB2YWx1ZSkKLXsKLSAgICBpZiAoYW5pbWF0
aW9uVHlwZSgpICE9IEJhc2ljKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMu
a2V5VmFsdWVzLnJlc2l6ZSgyKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzFdID0gS2V5
ZnJhbWVWYWx1ZSh2YWx1ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6
c2V0VG9WYWx1ZShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdmFsdWUpCi17Ci0gICAgaWYg
KGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9w
ZXJ0aWVzLmtleVZhbHVlcy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1sx
XSA9IEtleWZyYW1lVmFsdWUodmFsdWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25S
ZW1vdGU6OnNldFRvVmFsdWUoY29uc3QgRmxvYXRQb2ludDNEJiB2YWx1ZSkKLXsKLSAgICBpZiAo
YW5pbWF0aW9uVHlwZSgpICE9IEJhc2ljKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb3Bl
cnRpZXMua2V5VmFsdWVzLnJlc2l6ZSgyKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5VmFsdWVzWzFd
ID0gS2V5ZnJhbWVWYWx1ZSh2YWx1ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJl
bW90ZTo6c2V0VG9WYWx1ZShjb25zdCBDb2xvciYgdmFsdWUpCi17Ci0gICAgaWYgKGFuaW1hdGlv
blR5cGUoKSAhPSBCYXNpYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVzLmtl
eVZhbHVlcy5yZXNpemUoMik7Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlc1sxXSA9IEtleWZy
YW1lVmFsdWUodmFsdWUpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OnNl
dFRvVmFsdWUoY29uc3QgRmlsdGVyT3BlcmF0aW9uKiBvcGVyYXRpb24sIGludCBpbnRlcm5hbEZp
bHRlclByb3BlcnR5SW5kZXgpCi17Ci0gICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBCYXNpYykK
LSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIFVOVVNFRF9QQVJBTShpbnRlcm5hbEZpbHRlclBy
b3BlcnR5SW5kZXgpOwotICAgIEFTU0VSVChvcGVyYXRpb24pOwotICAgIG1fcHJvcGVydGllcy5r
ZXlWYWx1ZXMucmVzaXplKDIpOwotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXNbMV0gPSBLZXlm
cmFtZVZhbHVlKG9wZXJhdGlvbi0+Y2xvbmUoKSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1h
dGlvblJlbW90ZTo6Y29weVRvVmFsdWVGcm9tKGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb24mIHZh
bHVlKQotewotICAgIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGUmIG90aGVyID0gZG93
bmNhc3Q8UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4odmFsdWUpOwotCi0gICAgaWYgKG90aGVy
Lm1fcHJvcGVydGllcy5rZXlWYWx1ZXMuc2l6ZSgpIDwgMikKLSAgICAgICAgcmV0dXJuOwotICAg
IG1fcHJvcGVydGllcy5rZXlWYWx1ZXMucmVzaXplKDIpOwotICAgIG1fcHJvcGVydGllcy5rZXlW
YWx1ZXNbMV0gPSBvdGhlci5tX3Byb3BlcnRpZXMua2V5VmFsdWVzWzFdOwotfQotCi0vLyBLZXlm
cmFtZS1hbmltYXRpb24gcHJvcGVydGllcy4KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90
ZTo6c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxmbG9hdD4mIHZhbHVlcykKLXsKLSAgICBpZiAoYW5p
bWF0aW9uVHlwZSgpICE9IEtleWZyYW1lKQotICAgICAgICByZXR1cm47Ci0KLSAgICBWZWN0b3I8
S2V5ZnJhbWVWYWx1ZT4ga2V5ZnJhbWVzOwotICAgIGtleWZyYW1lcy5yZXNlcnZlSW5pdGlhbENh
cGFjaXR5KHZhbHVlcy5zaXplKCkpOwotICAgIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
dmFsdWVzLnNpemUoKTsgKytpKQotICAgICAgICBrZXlmcmFtZXMudW5jaGVja2VkQXBwZW5kKEtl
eWZyYW1lVmFsdWUodmFsdWVzW2ldKSk7Ci0gICAgCi0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVl
cyA9IFdURk1vdmUoa2V5ZnJhbWVzKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVt
b3RlOjpzZXRWYWx1ZXMoY29uc3QgVmVjdG9yPFRyYW5zZm9ybWF0aW9uTWF0cml4PiYgdmFsdWVz
KQotewotICAgIGlmIChhbmltYXRpb25UeXBlKCkgIT0gS2V5ZnJhbWUpCi0gICAgICAgIHJldHVy
bjsKLSAgICAgICAgCi0gICAgVmVjdG9yPEtleWZyYW1lVmFsdWU+IGtleWZyYW1lczsKLSAgICBr
ZXlmcmFtZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0eSh2YWx1ZXMuc2l6ZSgpKTsKLSAgICAKLSAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7ICsraSkKLSAgICAgICAga2V5
ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlmcmFtZVZhbHVlKHZhbHVlc1tpXSkpOwotICAgIAot
ICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMgPSBXVEZNb3ZlKGtleWZyYW1lcyk7Ci19Ci0KLXZv
aWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxGbG9h
dFBvaW50M0Q+JiB2YWx1ZXMpCi17Ci0gICAgaWYgKGFuaW1hdGlvblR5cGUoKSAhPSBLZXlmcmFt
ZSkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBWZWN0b3I8S2V5ZnJhbWVWYWx1ZT4g
a2V5ZnJhbWVzOwotICAgIGtleWZyYW1lcy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KHZhbHVlcy5z
aXplKCkpOwotICAgIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKTsg
KytpKQotICAgICAgICBrZXlmcmFtZXMudW5jaGVja2VkQXBwZW5kKEtleWZyYW1lVmFsdWUodmFs
dWVzW2ldKSk7Ci0gICAgCi0gICAgbV9wcm9wZXJ0aWVzLmtleVZhbHVlcyA9IFdURk1vdmUoa2V5
ZnJhbWVzKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRWYWx1ZXMo
Y29uc3QgVmVjdG9yPENvbG9yPiYgdmFsdWVzKQotewotICAgIGlmIChhbmltYXRpb25UeXBlKCkg
IT0gS2V5ZnJhbWUpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgVmVjdG9yPEtleWZy
YW1lVmFsdWU+IGtleWZyYW1lczsKLSAgICBrZXlmcmFtZXMucmVzZXJ2ZUluaXRpYWxDYXBhY2l0
eSh2YWx1ZXMuc2l6ZSgpKTsKLSAgICAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVl
cy5zaXplKCk7ICsraSkKLSAgICAgICAga2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlmcmFt
ZVZhbHVlKHZhbHVlc1tpXSkpOwotICAgIAotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMgPSBX
VEZNb3ZlKGtleWZyYW1lcyk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6
c2V0VmFsdWVzKGNvbnN0IFZlY3RvcjxSZWZQdHI8RmlsdGVyT3BlcmF0aW9uPj4mIHZhbHVlcywg
aW50IGludGVybmFsRmlsdGVyUHJvcGVydHlJbmRleCkKLXsKLSAgICBVTlVTRURfUEFSQU0oaW50
ZXJuYWxGaWx0ZXJQcm9wZXJ0eUluZGV4KTsKLSAgICAKLSAgICBpZiAoYW5pbWF0aW9uVHlwZSgp
ICE9IEtleWZyYW1lKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIFZlY3RvcjxLZXlm
cmFtZVZhbHVlPiBrZXlmcmFtZXM7Ci0gICAga2V5ZnJhbWVzLnJlc2VydmVJbml0aWFsQ2FwYWNp
dHkodmFsdWVzLnNpemUoKSk7Ci0gICAgCi0gICAgZm9yIChhdXRvJiB2YWx1ZSA6IHZhbHVlcykK
LSAgICAgICAga2V5ZnJhbWVzLnVuY2hlY2tlZEFwcGVuZChLZXlmcmFtZVZhbHVlIHsgdmFsdWUu
Y29weVJlZigpIH0pOwotICAgIAotICAgIG1fcHJvcGVydGllcy5rZXlWYWx1ZXMgPSBXVEZNb3Zl
KGtleWZyYW1lcyk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6Y29weVZh
bHVlc0Zyb20oY29uc3QgUGxhdGZvcm1DQUFuaW1hdGlvbiYgdmFsdWUpCi17Ci0gICAgbV9wcm9w
ZXJ0aWVzLmtleVZhbHVlcyA9IGRvd25jYXN0PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KHZh
bHVlKS5tX3Byb3BlcnRpZXMua2V5VmFsdWVzOwotfQotCi12b2lkIFBsYXRmb3JtQ0FBbmltYXRp
b25SZW1vdGU6OnNldEtleVRpbWVzKGNvbnN0IFZlY3RvcjxmbG9hdD4mIGtleVRpbWVzKQotewot
ICAgIG1fcHJvcGVydGllcy5rZXlUaW1lcyA9IGtleVRpbWVzOwotfQotCi12b2lkIFBsYXRmb3Jt
Q0FBbmltYXRpb25SZW1vdGU6OmNvcHlLZXlUaW1lc0Zyb20oY29uc3QgUGxhdGZvcm1DQUFuaW1h
dGlvbiYgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLmtleVRpbWVzID0gZG93bmNhc3Q8UGxh
dGZvcm1DQUFuaW1hdGlvblJlbW90ZT4odmFsdWUpLm1fcHJvcGVydGllcy5rZXlUaW1lczsKLX0K
LQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpzZXRUaW1pbmdGdW5jdGlvbnMoY29u
c3QgVmVjdG9yPGNvbnN0IFRpbWluZ0Z1bmN0aW9uKj4mIHZhbHVlcywgYm9vbCByZXZlcnNlKQot
ewotICAgIFZlY3RvcjxSZWZQdHI8V2ViQ29yZTo6VGltaW5nRnVuY3Rpb24+PiB0aW1pbmdGdW5j
dGlvbnM7Ci0gICAgdGltaW5nRnVuY3Rpb25zLnJlc2VydmVJbml0aWFsQ2FwYWNpdHkodmFsdWVz
LnNpemUoKSk7Ci0gICAgCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgp
OyArK2kpCi0gICAgICAgIHRpbWluZ0Z1bmN0aW9ucy51bmNoZWNrZWRBcHBlbmQodmFsdWVzW2ld
LT5jbG9uZSgpKTsKLSAgICAKLSAgICBtX3Byb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zID0gV1RG
TW92ZSh0aW1pbmdGdW5jdGlvbnMpOwotICAgIG1fcHJvcGVydGllcy5yZXZlcnNlVGltaW5nRnVu
Y3Rpb25zID0gcmV2ZXJzZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpj
b3B5VGltaW5nRnVuY3Rpb25zRnJvbShjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uJiB2YWx1ZSkK
LXsKLSAgICBjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlJiBvdGhlciA9IGRvd25jYXN0
PFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU+KHZhbHVlKTsKLQotICAgIG1fcHJvcGVydGllcy50
aW1pbmdGdW5jdGlvbnMgPSBvdGhlci5tX3Byb3BlcnRpZXMudGltaW5nRnVuY3Rpb25zOwotICAg
IG1fcHJvcGVydGllcy5yZXZlcnNlVGltaW5nRnVuY3Rpb25zID0gb3RoZXIubV9wcm9wZXJ0aWVz
LnJldmVyc2VUaW1pbmdGdW5jdGlvbnM7Ci19Ci0KLXN0YXRpYyBOU09iamVjdCogYW5pbWF0aW9u
VmFsdWVGcm9tS2V5ZnJhbWVWYWx1ZShjb25zdCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjpL
ZXlmcmFtZVZhbHVlJiBrZXlmcmFtZVZhbHVlKQotewotICAgIHN3aXRjaCAoa2V5ZnJhbWVWYWx1
ZS5rZXlmcmFtZVR5cGUoKSkgewotICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6
S2V5ZnJhbWVWYWx1ZTo6TnVtYmVyS2V5VHlwZToKLSAgICAgICAgcmV0dXJuIEAoa2V5ZnJhbWVW
YWx1ZS5udW1iZXJWYWx1ZSgpKTsKLSAgICAgICAgICAgIAotICAgIGNhc2UgUGxhdGZvcm1DQUFu
aW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6Q29sb3JLZXlUeXBlOiB7Ci0gICAgICAgIENv
bG9yIGNvbG9yID0ga2V5ZnJhbWVWYWx1ZS5jb2xvclZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBA
WyBAKGNvbG9yLnJlZCgpKSwgQChjb2xvci5ncmVlbigpKSwgQChjb2xvci5ibHVlKCkpLCBAKGNv
bG9yLmFscGhhKCkpIF07Ci0gICAgfQotCi0gICAgY2FzZSBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVt
b3RlOjpLZXlmcmFtZVZhbHVlOjpQb2ludEtleVR5cGU6IHsKLSAgICAgICAgRmxvYXRQb2ludDNE
IHBvaW50ID0ga2V5ZnJhbWVWYWx1ZS5wb2ludFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBAWyBA
KHBvaW50LngoKSksIEAocG9pbnQueSgpKSwgQChwb2ludC56KCkpIF07Ci0gICAgfQotICAgIGNh
c2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6VHJhbnNmb3JtS2V5
VHlwZToKLSAgICAgICAgcmV0dXJuIFtOU1ZhbHVlIHZhbHVlV2l0aENBVHJhbnNmb3JtM0Q6a2V5
ZnJhbWVWYWx1ZS50cmFuc2Zvcm1WYWx1ZSgpXTsKLSAgICAgICAgICAgIAotICAgIGNhc2UgUGxh
dGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6RmlsdGVyS2V5VHlwZToKLSAg
ICAgICAgcmV0dXJuIFBsYXRmb3JtQ0FGaWx0ZXJzOjpmaWx0ZXJWYWx1ZUZvck9wZXJhdGlvbihr
ZXlmcmFtZVZhbHVlLmZpbHRlclZhbHVlKCksIDAgLyogdW51c2VkICovKS5hdXRvcmVsZWFzZSgp
OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYWRkQW5pbWF0aW9uVG9MYXllcihDQUxheWVyICps
YXllciwgUmVtb3RlTGF5ZXJUcmVlSG9zdCogbGF5ZXJUcmVlSG9zdCwgY29uc3QgU3RyaW5nJiBr
ZXksIGNvbnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXMmIHByb3BlcnRp
ZXMpCi17Ci0gICAgUmV0YWluUHRyPENBUHJvcGVydHlBbmltYXRpb24+IGNhQW5pbWF0aW9uOwot
ICAgIHN3aXRjaCAocHJvcGVydGllcy5hbmltYXRpb25UeXBlKSB7Ci0gICAgY2FzZSBQbGF0Zm9y
bUNBQW5pbWF0aW9uOjpCYXNpYzogewotICAgICAgICBSZXRhaW5QdHI8Q0FCYXNpY0FuaW1hdGlv
bj4gYmFzaWNBbmltYXRpb247Ci0gICAgICAgIGJhc2ljQW5pbWF0aW9uID0gW0NBQmFzaWNBbmlt
YXRpb24gYW5pbWF0aW9uV2l0aEtleVBhdGg6cHJvcGVydGllcy5rZXlQYXRoXTsKLSAgICAgICAg
Ci0gICAgICAgIGlmIChwcm9wZXJ0aWVzLmtleVZhbHVlcy5zaXplKCkgPiAxKSB7Ci0gICAgICAg
ICAgICBbYmFzaWNBbmltYXRpb24gc2V0RnJvbVZhbHVlOmFuaW1hdGlvblZhbHVlRnJvbUtleWZy
YW1lVmFsdWUocHJvcGVydGllcy5rZXlWYWx1ZXNbMF0pXTsKLSAgICAgICAgICAgIFtiYXNpY0Fu
aW1hdGlvbiBzZXRUb1ZhbHVlOmFuaW1hdGlvblZhbHVlRnJvbUtleWZyYW1lVmFsdWUocHJvcGVy
dGllcy5rZXlWYWx1ZXNbMV0pXTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHBy
b3BlcnRpZXMudGltaW5nRnVuY3Rpb25zLnNpemUoKSkKLSAgICAgICAgICAgIFtiYXNpY0FuaW1h
dGlvbiBzZXRUaW1pbmdGdW5jdGlvbjp0b0NBTWVkaWFUaW1pbmdGdW5jdGlvbihwcm9wZXJ0aWVz
LnRpbWluZ0Z1bmN0aW9uc1swXS5nZXQoKSwgcHJvcGVydGllcy5yZXZlcnNlVGltaW5nRnVuY3Rp
b25zKV07Ci0gICAgICAgIAotICAgICAgICBjYUFuaW1hdGlvbiA9IGJhc2ljQW5pbWF0aW9uOwot
ICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBQbGF0Zm9ybUNBQW5pbWF0aW9uOjpLZXlm
cmFtZTogewotICAgICAgICBSZXRhaW5QdHI8Q0FLZXlmcmFtZUFuaW1hdGlvbj4ga2V5ZnJhbWVB
bmltYXRpb247Ci0gICAgICAgIGtleWZyYW1lQW5pbWF0aW9uID0gW0NBS2V5ZnJhbWVBbmltYXRp
b24gYW5pbWF0aW9uV2l0aEtleVBhdGg6cHJvcGVydGllcy5rZXlQYXRoXTsKLQotICAgICAgICBp
ZiAocHJvcGVydGllcy5rZXlWYWx1ZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBSZXRhaW5QdHI8
TlNNdXRhYmxlQXJyYXk+IGtleWZyYW1lcyA9IGFkb3B0TlMoW1tOU011dGFibGVBcnJheSBhbGxv
Y10gaW5pdFdpdGhDYXBhY2l0eTpwcm9wZXJ0aWVzLmtleVZhbHVlcy5zaXplKCldKTsKLSAgICAg
ICAgICAgIGZvciAoY29uc3QgYXV0byYgdmFsdWUgOiBwcm9wZXJ0aWVzLmtleVZhbHVlcykKLSAg
ICAgICAgICAgICAgICBba2V5ZnJhbWVzIGFkZE9iamVjdDphbmltYXRpb25WYWx1ZUZyb21LZXlm
cmFtZVZhbHVlKHZhbHVlKV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFtrZXlmcmFtZUFu
aW1hdGlvbiBzZXRWYWx1ZXM6a2V5ZnJhbWVzLmdldCgpXTsKLSAgICAgICAgfQotCi0gICAgICAg
IGlmIChwcm9wZXJ0aWVzLmtleVRpbWVzLnNpemUoKSkgewotICAgICAgICAgICAgUmV0YWluUHRy
PE5TTXV0YWJsZUFycmF5PiBrZXlUaW1lcyA9IGFkb3B0TlMoW1tOU011dGFibGVBcnJheSBhbGxv
Y10gaW5pdFdpdGhDYXBhY2l0eTpwcm9wZXJ0aWVzLmtleVRpbWVzLnNpemUoKV0pOwotICAgICAg
ICAgICAgZm9yIChhdXRvIGtleVRpbWUgOiBwcm9wZXJ0aWVzLmtleVRpbWVzKQotICAgICAgICAg
ICAgICAgIFtrZXlUaW1lcyBhZGRPYmplY3Q6QChrZXlUaW1lKV07Ci0gICAgICAgICAgICAKLSAg
ICAgICAgICAgIFtrZXlmcmFtZUFuaW1hdGlvbiBzZXRLZXlUaW1lczprZXlUaW1lcy5nZXQoKV07
Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvcGVydGllcy50aW1pbmdGdW5jdGlvbnMuc2l6
ZSgpKSB7Ci0gICAgICAgICAgICBSZXRhaW5QdHI8TlNNdXRhYmxlQXJyYXk+IHRpbWluZ0Z1bmN0
aW9ucyA9IGFkb3B0TlMoW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpw
cm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucy5zaXplKCldKTsKLSAgICAgICAgICAgIGZvciAoY29u
c3QgYXV0byYgdGltaW5nRnVuY3Rpb24gOiBwcm9wZXJ0aWVzLnRpbWluZ0Z1bmN0aW9ucykKLSAg
ICAgICAgICAgICAgICBbdGltaW5nRnVuY3Rpb25zIGFkZE9iamVjdDp0b0NBTWVkaWFUaW1pbmdG
dW5jdGlvbih0aW1pbmdGdW5jdGlvbi5nZXQoKSwgcHJvcGVydGllcy5yZXZlcnNlVGltaW5nRnVu
Y3Rpb25zKV07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFtrZXlmcmFtZUFuaW1hdGlvbiBz
ZXRUaW1pbmdGdW5jdGlvbnM6dGltaW5nRnVuY3Rpb25zLmdldCgpXTsKLSAgICAgICAgfQotICAg
ICAgICAKLSAgICAgICAgY2FBbmltYXRpb24gPSBrZXlmcmFtZUFuaW1hdGlvbjsKLSAgICAgICAg
YnJlYWs7Ci0gICAgfQotICAgIGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvbjo6U3ByaW5nOiB7Ci0g
ICAgICAgIFJldGFpblB0cjxDQVNwcmluZ0FuaW1hdGlvbj4gc3ByaW5nQW5pbWF0aW9uOwotICAg
ICAgICBzcHJpbmdBbmltYXRpb24gPSBbQ0FTcHJpbmdBbmltYXRpb24gYW5pbWF0aW9uV2l0aEtl
eVBhdGg6cHJvcGVydGllcy5rZXlQYXRoXTsKLSAgICAgICAgCi0gICAgICAgIGlmIChwcm9wZXJ0
aWVzLmtleVZhbHVlcy5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICBbc3ByaW5nQW5pbWF0aW9u
IHNldEZyb21WYWx1ZTphbmltYXRpb25WYWx1ZUZyb21LZXlmcmFtZVZhbHVlKHByb3BlcnRpZXMu
a2V5VmFsdWVzWzBdKV07Ci0gICAgICAgICAgICBbc3ByaW5nQW5pbWF0aW9uIHNldFRvVmFsdWU6
YW5pbWF0aW9uVmFsdWVGcm9tS2V5ZnJhbWVWYWx1ZShwcm9wZXJ0aWVzLmtleVZhbHVlc1sxXSld
OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocHJvcGVydGllcy50aW1pbmdGdW5j
dGlvbnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBhdXRvJiB0aW1pbmdGdW5jdGlvbiA9IHByb3Bl
cnRpZXMudGltaW5nRnVuY3Rpb25zWzBdOwotICAgICAgICAgICAgaWYgKHRpbWluZ0Z1bmN0aW9u
LT5pc1NwcmluZ1RpbWluZ0Z1bmN0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBhdXRvJiBmdW5j
dGlvbiA9ICpzdGF0aWNfY2FzdDxjb25zdCBTcHJpbmdUaW1pbmdGdW5jdGlvbio+KHRpbWluZ0Z1
bmN0aW9uLmdldCgpKTsKLSAgICAgICAgICAgICAgICBbc3ByaW5nQW5pbWF0aW9uIHNldE1hc3M6
ZnVuY3Rpb24ubWFzcygpXTsKLSAgICAgICAgICAgICAgICBbc3ByaW5nQW5pbWF0aW9uIHNldFN0
aWZmbmVzczpmdW5jdGlvbi5zdGlmZm5lc3MoKV07Ci0gICAgICAgICAgICAgICAgW3NwcmluZ0Fu
aW1hdGlvbiBzZXREYW1waW5nOmZ1bmN0aW9uLmRhbXBpbmcoKV07Ci0gICAgICAgICAgICAgICAg
W3NwcmluZ0FuaW1hdGlvbiBzZXRJbml0aWFsVmVsb2NpdHk6ZnVuY3Rpb24uaW5pdGlhbFZlbG9j
aXR5KCldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhQW5pbWF0aW9uID0g
c3ByaW5nQW5pbWF0aW9uOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgfQotICAgIAotICAg
IFtjYUFuaW1hdGlvbiBzZXRCZWdpblRpbWU6cHJvcGVydGllcy5iZWdpblRpbWVdOwotICAgIFtj
YUFuaW1hdGlvbiBzZXREdXJhdGlvbjpwcm9wZXJ0aWVzLmR1cmF0aW9uXTsKLSAgICBbY2FBbmlt
YXRpb24gc2V0VGltZU9mZnNldDpwcm9wZXJ0aWVzLnRpbWVPZmZzZXRdOwotICAgIFtjYUFuaW1h
dGlvbiBzZXRSZXBlYXRDb3VudDpwcm9wZXJ0aWVzLnJlcGVhdENvdW50XTsKLSAgICBbY2FBbmlt
YXRpb24gc2V0U3BlZWQ6cHJvcGVydGllcy5zcGVlZF07Ci0gICAgW2NhQW5pbWF0aW9uIHNldEF1
dG9yZXZlcnNlczpwcm9wZXJ0aWVzLmF1dG9SZXZlcnNlc107Ci0gICAgW2NhQW5pbWF0aW9uIHNl
dFJlbW92ZWRPbkNvbXBsZXRpb246cHJvcGVydGllcy5yZW1vdmVkT25Db21wbGV0aW9uXTsKLSAg
ICBbY2FBbmltYXRpb24gc2V0QWRkaXRpdmU6cHJvcGVydGllcy5hZGRpdGl2ZV07Ci0gICAgCi0g
ICAgaWYgKHByb3BlcnRpZXMuZmlsbE1vZGUgIT0gUGxhdGZvcm1DQUFuaW1hdGlvbjo6Tm9GaWxs
TW9kZSkKLSAgICAgICAgW2NhQW5pbWF0aW9uIHNldEZpbGxNb2RlOnRvQ0FGaWxsTW9kZVR5cGUo
cHJvcGVydGllcy5maWxsTW9kZSldOwotCi0gICAgaWYgKHByb3BlcnRpZXMudmFsdWVGdW5jdGlv
biAhPSBQbGF0Zm9ybUNBQW5pbWF0aW9uOjpOb1ZhbHVlRnVuY3Rpb24pCi0gICAgICAgIFtjYUFu
aW1hdGlvbiBzZXRWYWx1ZUZ1bmN0aW9uOltDQVZhbHVlRnVuY3Rpb24gZnVuY3Rpb25XaXRoTmFt
ZTp0b0NBVmFsdWVGdW5jdGlvblR5cGUocHJvcGVydGllcy52YWx1ZUZ1bmN0aW9uKV1dOwotICAg
IAotICAgIGlmIChwcm9wZXJ0aWVzLmhhc0V4cGxpY2l0QmVnaW5UaW1lKQotICAgICAgICBbY2FB
bmltYXRpb24gc2V0VmFsdWU6QFlFUyBmb3JLZXk6V0tFeHBsaWNpdEJlZ2luVGltZUZsYWddOwot
ICAgIAotICAgIGlmIChsYXllclRyZWVIb3N0KSB7Ci0gICAgICAgIEdyYXBoaWNzTGF5ZXI6OlBs
YXRmb3JtTGF5ZXJJRCBsYXllcklEID0gUmVtb3RlTGF5ZXJUcmVlSG9zdDo6bGF5ZXJJRChsYXll
cik7Ci0gICAgCi0gICAgICAgIFJldGFpblB0cjxXS0FuaW1hdGlvbkRlbGVnYXRlPiYgZGVsZWdh
dGUgPSBsYXllclRyZWVIb3N0LT5hbmltYXRpb25EZWxlZ2F0ZXMoKS5hZGQobGF5ZXJJRCwgbnVs
bHB0cikuaXRlcmF0b3ItPnZhbHVlOwotICAgICAgICBpZiAoIWRlbGVnYXRlKQotICAgICAgICAg
ICAgZGVsZWdhdGUgPSBhZG9wdE5TKFtbV0tBbmltYXRpb25EZWxlZ2F0ZSBhbGxvY10gaW5pdFdp
dGhMYXllcklEOmxheWVySUQgbGF5ZXJUcmVlSG9zdDpsYXllclRyZWVIb3N0XSk7Ci0KLSAgICAg
ICAgW2NhQW5pbWF0aW9uIHNldERlbGVnYXRlOmRlbGVnYXRlLmdldCgpXTsKLSAgICB9Ci0gICAg
Ci0gICAgW2xheWVyIGFkZEFuaW1hdGlvbjpjYUFuaW1hdGlvbi5nZXQoKSBmb3JLZXk6a2V5XTsK
LX0KLQotdm9pZCBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlOjp1cGRhdGVMYXllckFuaW1hdGlv
bnMoQ0FMYXllciAqbGF5ZXIsIFJlbW90ZUxheWVyVHJlZUhvc3QqIGxheWVyVHJlZUhvc3QsIGNv
bnN0IEFuaW1hdGlvbnNMaXN0JiBhbmltYXRpb25zVG9BZGQsIGNvbnN0IEhhc2hTZXQ8U3RyaW5n
PiYgYW5pbWF0aW9uc1RvUmVtb3ZlKQotewotICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9O
UzsKLQotICAgIGZvciAoY29uc3QgYXV0byYgdmFsdWUgOiBhbmltYXRpb25zVG9SZW1vdmUpCi0g
ICAgICAgIFtsYXllciByZW1vdmVBbmltYXRpb25Gb3JLZXk6dmFsdWVdOwotCi0gICAgZm9yIChj
b25zdCBhdXRvJiBrZXlBbmltYXRpb25QYWlyIDogYW5pbWF0aW9uc1RvQWRkKQotICAgICAgICBh
ZGRBbmltYXRpb25Ub0xheWVyKGxheWVyLCBsYXllclRyZWVIb3N0LCBrZXlBbmltYXRpb25QYWly
LmZpcnN0LCBrZXlBbmltYXRpb25QYWlyLnNlY29uZCk7Ci0KLSAgICBFTkRfQkxPQ0tfT0JKQ19F
WENFUFRJT05TOwotfQotCi1UZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFRleHRTdHJlYW0mdHMsIGNv
bnN0IFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWUmIHZhbHVlKQotewot
ICAgIHN3aXRjaCAodmFsdWUua2V5ZnJhbWVUeXBlKCkpIHsKLSAgICBjYXNlIFBsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6Ok51bWJlcktleVR5cGU6Ci0gICAgICAgIHRz
IDw8ICJudW1iZXI9IiA8PCB2YWx1ZS5udW1iZXJWYWx1ZSgpOwotICAgICAgICBicmVhazsKLSAg
ICBjYXNlIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6OkNvbG9yS2V5
VHlwZToKLSAgICAgICAgdHMgPDwgImNvbG9yPSI7Ci0gICAgICAgIHRzIDw8IHZhbHVlLmNvbG9y
VmFsdWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQbGF0Zm9ybUNBQW5pbWF0aW9uUmVt
b3RlOjpLZXlmcmFtZVZhbHVlOjpQb2ludEtleVR5cGU6Ci0gICAgICAgIHRzIDw8ICJwb2ludD0i
OwotICAgICAgICB0cyA8PCB2YWx1ZS5wb2ludFZhbHVlKCk7Ci0gICAgICAgIGJyZWFrOwotICAg
IGNhc2UgUGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZTo6S2V5ZnJhbWVWYWx1ZTo6VHJhbnNmb3Jt
S2V5VHlwZToKLSAgICAgICAgdHMgPDwgInRyYW5zZm9ybT0iOwotICAgICAgICB0cyA8PCB2YWx1
ZS50cmFuc2Zvcm1WYWx1ZSgpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFBsYXRmb3JtQ0FB
bmltYXRpb25SZW1vdGU6OktleWZyYW1lVmFsdWU6OkZpbHRlcktleVR5cGU6Ci0gICAgICAgIHRz
IDw8ICJmaWx0ZXI9IjsKLSAgICAgICAgaWYgKHZhbHVlLmZpbHRlclZhbHVlKCkpCi0gICAgICAg
ICAgICB0cyA8PCAqdmFsdWUuZmlsdGVyVmFsdWUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgdHMgPDwgIm51bGwiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHRzOwot
fQotCi1UZXh0U3RyZWFtJiBvcGVyYXRvcjw8KFRleHRTdHJlYW0mIHRzLCBjb25zdCBQbGF0Zm9y
bUNBQW5pbWF0aW9uUmVtb3RlOjpQcm9wZXJ0aWVzJiBhbmltYXRpb24pCi17Ci0gICAgdHMgPDwg
InR5cGU9IjsKLSAgICB0cyA8PCBhbmltYXRpb24uYW5pbWF0aW9uVHlwZTsKLSAgICB0cyA8PCAi
IGtleVBhdGg9IjsKLSAgICB0cyA8PCBhbmltYXRpb24ua2V5UGF0aDsKLQotICAgIGlmIChhbmlt
YXRpb24uYmVnaW5UaW1lKQotICAgICAgICB0cy5kdW1wUHJvcGVydHkoImJlZ2luVGltZSIsIGFu
aW1hdGlvbi5iZWdpblRpbWUpOwotCi0gICAgaWYgKGFuaW1hdGlvbi5kdXJhdGlvbikKLSAgICAg
ICAgdHMuZHVtcFByb3BlcnR5KCJkdXJhdGlvbiIsIGFuaW1hdGlvbi5kdXJhdGlvbik7Ci0KLSAg
ICBpZiAoYW5pbWF0aW9uLnRpbWVPZmZzZXQpCi0gICAgICAgIHRzLmR1bXBQcm9wZXJ0eSgidGlt
ZU9mZnNldCIsIGFuaW1hdGlvbi50aW1lT2Zmc2V0KTsKLQotICAgIHRzLmR1bXBQcm9wZXJ0eSgi
cmVwZWF0Q291bnQiLCBhbmltYXRpb24ucmVwZWF0Q291bnQpOwotCi0gICAgaWYgKGFuaW1hdGlv
bi5zcGVlZCAhPSAxKQotICAgICAgICB0cy5kdW1wUHJvcGVydHkoInNwZWVkIiwgYW5pbWF0aW9u
LnNwZWVkKTsKLQotICAgIHRzLmR1bXBQcm9wZXJ0eSgiZmlsbE1vZGUiLCBhbmltYXRpb24uZmls
bE1vZGUpOwotICAgIHRzLmR1bXBQcm9wZXJ0eSgidmFsdWVGdW5jdGlvbiIsIGFuaW1hdGlvbi52
YWx1ZUZ1bmN0aW9uKTsKLQotICAgIGlmIChhbmltYXRpb24uYXV0b1JldmVyc2VzKQotICAgICAg
ICB0cy5kdW1wUHJvcGVydHkoImF1dG9SZXZlcnNlcyIsIGFuaW1hdGlvbi5hdXRvUmV2ZXJzZXMp
OwotCi0gICAgaWYgKCFhbmltYXRpb24ucmVtb3ZlZE9uQ29tcGxldGlvbikKLSAgICAgICAgdHMu
ZHVtcFByb3BlcnR5KCJyZW1vdmVkT25Db21wbGV0aW9uIiwgYW5pbWF0aW9uLnJlbW92ZWRPbkNv
bXBsZXRpb24pOwotCi0gICAgaWYgKGFuaW1hdGlvbi5hZGRpdGl2ZSkKLSAgICAgICAgdHMuZHVt
cFByb3BlcnR5KCJhZGRpdGl2ZSIsIGFuaW1hdGlvbi5hZGRpdGl2ZSk7Ci0KLSAgICBpZiAoYW5p
bWF0aW9uLnJldmVyc2VUaW1pbmdGdW5jdGlvbnMpCi0gICAgICAgIHRzLmR1bXBQcm9wZXJ0eSgi
cmV2ZXJzZVRpbWluZ0Z1bmN0aW9ucyIsIGFuaW1hdGlvbi5yZXZlcnNlVGltaW5nRnVuY3Rpb25z
KTsKLQotICAgIGlmIChhbmltYXRpb24uaGFzRXhwbGljaXRCZWdpblRpbWUpCi0gICAgICAgIHRz
LmR1bXBQcm9wZXJ0eSgiaGFzRXhwbGljaXRCZWdpblRpbWUiLCBhbmltYXRpb24uaGFzRXhwbGlj
aXRCZWdpblRpbWUpOwotCi0gICAgdHMgPDwgIlxuIjsKLSAgICB0cy5pbmNyZWFzZUluZGVudCgp
OwotICAgIHRzLndyaXRlSW5kZW50KCk7Ci0gICAgdHMgPDwgIigiIDw8ICJrZXlmcmFtZXMiOwot
ICAgIHRzLmluY3JlYXNlSW5kZW50KCk7Ci0KLSAgICBzaXplX3QgbWF4RnJhbWVzID0gc3RkOjpt
YXgoYW5pbWF0aW9uLmtleVZhbHVlcy5zaXplKCksIGFuaW1hdGlvbi5rZXlUaW1lcy5zaXplKCkp
OwotICAgIG1heEZyYW1lcyA9IHN0ZDo6bWF4KG1heEZyYW1lcywgYW5pbWF0aW9uLnRpbWluZ0Z1
bmN0aW9ucy5zaXplKCkpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXhGcmFtZXM7
ICsraSkgewotICAgICAgICB0cyA8PCAiXG4iOwotICAgICAgICB0cy53cml0ZUluZGVudCgpOwot
ICAgICAgICB0cyA8PCAiKGtleWZyYW1lICIgPDwgdW5zaWduZWQoaSk7Ci0gICAgICAgIGlmIChp
IDwgYW5pbWF0aW9uLmtleVRpbWVzLnNpemUoKSkKLSAgICAgICAgICAgIHRzLmR1bXBQcm9wZXJ0
eSgidGltZSIsIGFuaW1hdGlvbi5rZXlUaW1lc1tpXSk7Ci0KLSAgICAgICAgaWYgKGkgPCBhbmlt
YXRpb24udGltaW5nRnVuY3Rpb25zLnNpemUoKSAmJiBhbmltYXRpb24udGltaW5nRnVuY3Rpb25z
W2ldKQotICAgICAgICAgICAgdHMuZHVtcFByb3BlcnR5PGNvbnN0IFRpbWluZ0Z1bmN0aW9uJj4o
InRpbWluZyBmdW5jdGlvbiIsICphbmltYXRpb24udGltaW5nRnVuY3Rpb25zW2ldKTsKLQotICAg
ICAgICBpZiAoaSA8IGFuaW1hdGlvbi5rZXlWYWx1ZXMuc2l6ZSgpKQotICAgICAgICAgICAgdHMu
ZHVtcFByb3BlcnR5KCJ2YWx1ZSIsIGFuaW1hdGlvbi5rZXlWYWx1ZXNbaV0pOwotCi0gICAgICAg
IHRzIDw8ICIpIjsKLSAgICB9Ci0KLSAgICB0cy5kZWNyZWFzZUluZGVudCgpOwotICAgIHRzLmRl
Y3JlYXNlSW5kZW50KCk7Ci0KLSAgICByZXR1cm4gdHM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdl
YktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1Bs
YXRmb3JtQ0FMYXllclJlbW90ZS5jcHAgYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFn
ZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMGQxNGVlZDgxMTc3MGZmZDA0OTUxZTkyYjAxMjEzNTY2YzVlMGJkZi4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlBy
b2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlLmNwcAorKysgL2Rldi9udWxs
CkBAIC0xLDg1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICog
YXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
Ci0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVyUmVt
b3RlLmgiCi0KLSNpbXBvcnQgIlBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5oIgotI2ltcG9y
dCAiUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nLmgiCi0jaW1wb3J0ICJSZW1vdGVM
YXllckJhY2tpbmdTdG9yZS5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlQ29udGV4dC5oIgot
I2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlUHJvcGVydHlBcHBsaWVyLmgiCi0jaW1wb3J0IDxXZWJD
b3JlL0FuaW1hdGlvblV0aWxpdGllcy5oPgotI2ltcG9ydCA8V2ViQ29yZS9HcmFwaGljc0NvbnRl
eHQuaD4KLSNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NMYXllckNBLmg+Ci0jaW1wb3J0IDxXZWJD
b3JlL0xlbmd0aEZ1bmN0aW9ucy5oPgotI2ltcG9ydCA8V2ViQ29yZS9QbGF0Zm9ybUNBRmlsdGVy
cy5oPgotI2ltcG9ydCA8V2ViQ29yZS9QbGF0Zm9ybUNBTGF5ZXJDb2NvYS5oPgotI2ltcG9ydCA8
V2ViQ29yZS9UaWxlZEJhY2tpbmcuaD4KLSNpbXBvcnQgPHd0Zi9DdXJyZW50VGltZS5oPgotCi11
c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLVJlZjxQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU+IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y3JlYXRlKExheWVyVHlw
ZSBsYXllclR5cGUsIFBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIsIFJlbW90ZUxheWVyVHJl
ZUNvbnRleHQmIGNvbnRleHQpCi17Ci0gICAgUmVmUHRyPFBsYXRmb3JtQ0FMYXllclJlbW90ZT4g
bGF5ZXI7Ci0KLSAgICBpZiAobGF5ZXJUeXBlID09IExheWVyVHlwZVRpbGVkQmFja2luZ0xheWVy
IHx8ICBsYXllclR5cGUgPT0gTGF5ZXJUeXBlUGFnZVRpbGVkQmFja2luZ0xheWVyKQotICAgICAg
ICBsYXllciA9IGFkb3B0UmVmKG5ldyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmco
bGF5ZXJUeXBlLCBvd25lciwgY29udGV4dCkpOwotICAgIGVsc2UKLSAgICAgICAgbGF5ZXIgPSBh
ZG9wdFJlZihuZXcgUGxhdGZvcm1DQUxheWVyUmVtb3RlKGxheWVyVHlwZSwgb3duZXIsIGNvbnRl
eHQpKTsKLQotICAgIGNvbnRleHQubGF5ZXJXYXNDcmVhdGVkKCpsYXllciwgbGF5ZXJUeXBlKTsK
LQotICAgIHJldHVybiBsYXllci5yZWxlYXNlTm9uTnVsbCgpOwotfQotCi1SZWY8UGxhdGZvcm1D
QUxheWVyUmVtb3RlPiBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNyZWF0ZShQbGF0Zm9ybUxheWVy
ICpwbGF0Zm9ybUxheWVyLCBQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXll
clRyZWVDb250ZXh0JiBjb250ZXh0KQotewotICAgIHJldHVybiBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGVDdXN0b206OmNyZWF0ZShwbGF0Zm9ybUxheWVyLCBvd25lciwgY29udGV4dCk7Ci19Ci0KLVJl
ZjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y3JlYXRlKGNv
bnN0IFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgb3RoZXIsIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXll
ckNsaWVudCogb3duZXIsIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmIGNvbnRleHQpCi17Ci0gICAg
YXV0byBsYXllciA9IGFkb3B0UmVmKCpuZXcgUGxhdGZvcm1DQUxheWVyUmVtb3RlKG90aGVyLCBv
d25lciwgY29udGV4dCkpOwotCi0gICAgY29udGV4dC5sYXllcldhc0NyZWF0ZWQobGF5ZXIuZ2V0
KCksIG90aGVyLmxheWVyVHlwZSgpKTsKLQotICAgIHJldHVybiBsYXllcjsKLX0KLQotUGxhdGZv
cm1DQUxheWVyUmVtb3RlOjpQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUoTGF5ZXJUeXBlIGxheWVyVHlw
ZSwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25lciwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYg
Y29udGV4dCkKLSAgICA6IFBsYXRmb3JtQ0FMYXllcihsYXllclR5cGUsIG93bmVyKQotICAgICwg
bV9jb250ZXh0KCZjb250ZXh0KQotewotICAgIGlmIChvd25lciAmJiBsYXllclR5cGUgIT0gTGF5
ZXJUeXBlQ29udGVudHNQcm92aWRlZExheWVyICYmIGxheWVyVHlwZSAhPSBMYXllclR5cGVUcmFu
c2Zvcm1MYXllcikgewotICAgICAgICBtX3Byb3BlcnRpZXMuY29udGVudHNTY2FsZSA9IG93bmVy
LT5wbGF0Zm9ybUNBTGF5ZXJEZXZpY2VTY2FsZUZhY3RvcigpOwotICAgICAgICBtX3Byb3BlcnRp
ZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDb250
ZW50c1NjYWxlQ2hhbmdlZCk7Ci0gICAgfQotfQotCi1QbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OlBs
YXRmb3JtQ0FMYXllclJlbW90ZShjb25zdCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmIG90aGVyLCBQ
bGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250
ZXh0KQotICAgIDogUGxhdGZvcm1DQUxheWVyKG90aGVyLmxheWVyVHlwZSgpLCBvd25lcikKLSAg
ICAsIG1fYWNjZWxlcmF0ZXNEcmF3aW5nKG90aGVyLmFjY2VsZXJhdGVzRHJhd2luZygpKQotICAg
ICwgbV9jb250ZXh0KCZjb250ZXh0KQotewotfQotCi1SZWY8UGxhdGZvcm1DQUxheWVyPiBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6OmNsb25lKFBsYXRmb3JtQ0FMYXllckNsaWVudCogb3duZXIpIGNv
bnN0Ci17Ci0gICAgYXV0byBjbG9uZSA9IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y3JlYXRlKCp0
aGlzLCBvd25lciwgKm1fY29udGV4dCk7Ci0KLSAgICB1cGRhdGVDbG9uZWRMYXllclByb3BlcnRp
ZXMoY2xvbmUpOwotCi0gICAgY2xvbmUtPnNldENsb25lZExheWVyKHRoaXMpOwotICAgIHJldHVy
biBXVEZNb3ZlKGNsb25lKTsKLX0KLQotUGxhdGZvcm1DQUxheWVyUmVtb3RlOjp+UGxhdGZvcm1D
QUxheWVyUmVtb3RlKCkKLXsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGxheWVyIDogbV9jaGlsZHJl
bikKLSAgICAgICAgZG93bmNhc3Q8UGxhdGZvcm1DQUxheWVyUmVtb3RlPigqbGF5ZXIpLm1fc3Vw
ZXJsYXllciA9IG51bGxwdHI7Ci0KLSAgICBpZiAobV9jb250ZXh0KQotICAgICAgICBtX2NvbnRl
eHQtPmxheWVyV2lsbEJlRGVzdHJveWVkKCp0aGlzKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGU6OnVwZGF0ZUNsb25lZExheWVyUHJvcGVydGllcyhQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGUmIGNsb25lLCBib29sIGNvcHlDb250ZW50cykgY29uc3QKLXsKLSAgICBjbG9uZS5zZXRQb3Np
dGlvbihwb3NpdGlvbigpKTsKLSAgICBjbG9uZS5zZXRCb3VuZHMoYm91bmRzKCkpOwotICAgIGNs
b25lLnNldEFuY2hvclBvaW50KGFuY2hvclBvaW50KCkpOwotCi0gICAgaWYgKG1fcHJvcGVydGll
cy50cmFuc2Zvcm0pCi0gICAgICAgIGNsb25lLnNldFRyYW5zZm9ybSgqbV9wcm9wZXJ0aWVzLnRy
YW5zZm9ybSk7Ci0KLSAgICBpZiAobV9wcm9wZXJ0aWVzLnN1YmxheWVyVHJhbnNmb3JtKQotICAg
ICAgICBjbG9uZS5zZXRTdWJsYXllclRyYW5zZm9ybSgqbV9wcm9wZXJ0aWVzLnN1YmxheWVyVHJh
bnNmb3JtKTsKLQotICAgIGlmIChjb3B5Q29udGVudHMpCi0gICAgICAgIGNsb25lLnNldENvbnRl
bnRzKGNvbnRlbnRzKCkpOwotCi0gICAgY2xvbmUuc2V0TWFza3NUb0JvdW5kcyhtYXNrc1RvQm91
bmRzKCkpOwotICAgIGNsb25lLnNldERvdWJsZVNpZGVkKGlzRG91YmxlU2lkZWQoKSk7Ci0gICAg
Y2xvbmUuc2V0T3BhcXVlKGlzT3BhcXVlKCkpOwotICAgIGNsb25lLnNldEJhY2tncm91bmRDb2xv
cihiYWNrZ3JvdW5kQ29sb3IoKSk7Ci0gICAgY2xvbmUuc2V0Q29udGVudHNTY2FsZShjb250ZW50
c1NjYWxlKCkpOwotICAgIGNsb25lLnNldENvcm5lclJhZGl1cyhjb3JuZXJSYWRpdXMoKSk7Ci0K
LSAgICBpZiAoIW1fcHJvcGVydGllcy5zaGFwZVBhdGguaXNOdWxsKCkpCi0gICAgICAgIGNsb25l
LnNldFNoYXBlUGF0aChtX3Byb3BlcnRpZXMuc2hhcGVQYXRoKTsKLQotICAgIGlmIChtX3Byb3Bl
cnRpZXMuc2hhcGVSb3VuZGVkUmVjdCkKLSAgICAgICAgY2xvbmUuc2V0U2hhcGVSb3VuZGVkUmVj
dCgqbV9wcm9wZXJ0aWVzLnNoYXBlUm91bmRlZFJlY3QpOwotCi0gICAgaWYgKG1fcHJvcGVydGll
cy5maWx0ZXJzKQotICAgICAgICBjbG9uZS5jb3B5RmlsdGVyc0Zyb20oKnRoaXMpOwotCi0gICAg
Y2xvbmUudXBkYXRlQ3VzdG9tQXBwZWFyYW5jZShjdXN0b21BcHBlYXJhbmNlKCkpOwotfQotCi12
b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVjdXJzaXZlQnVpbGRUcmFuc2FjdGlvbihSZW1v
dGVMYXllclRyZWVDb250ZXh0JiBjb250ZXh0LCBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbiYg
dHJhbnNhY3Rpb24pCi17Ci0gICAgQVNTRVJUKCFtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlIHx8
IG93bmVyKCkpOwotICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lNUExJQ0FUSU9OKCZjb250ZXh0
ID09IG1fY29udGV4dCk7Ci0gICAgCi0gICAgaWYgKG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUg
JiYgKCFvd25lcigpIHx8ICFvd25lcigpLT5wbGF0Zm9ybUNBTGF5ZXJEcmF3c0NvbnRlbnQoKSkp
IHsKLSAgICAgICAgbV9wcm9wZXJ0aWVzLmJhY2tpbmdTdG9yZSA9IG51bGxwdHI7Ci0gICAgICAg
IG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNh
Y3Rpb246OkJhY2tpbmdTdG9yZUNoYW5nZWQpOwotICAgIH0KLQotICAgIGlmIChtX3Byb3BlcnRp
ZXMuYmFja2luZ1N0b3JlICYmIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmVBdHRhY2hlZCAmJiBt
X3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlLT5kaXNwbGF5KCkpCi0gICAgICAgIG1fcHJvcGVydGll
cy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkJhY2tp
bmdTdG9yZUNoYW5nZWQpOwotCi0gICAgaWYgKG1fcHJvcGVydGllcy5jaGFuZ2VkUHJvcGVydGll
cyAhPSBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Tm9DaGFuZ2UpIHsKLSAgICAgICAgaWYg
KG1fcHJvcGVydGllcy5jaGFuZ2VkUHJvcGVydGllcyAmIFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0
aW9uOjpDaGlsZHJlbkNoYW5nZWQpIHsKLSAgICAgICAgICAgIG1fcHJvcGVydGllcy5jaGlsZHJl
bi5yZXNpemUobV9jaGlsZHJlbi5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgKytpKQotICAgICAgICAgICAgICAgIG1fcHJvcGVy
dGllcy5jaGlsZHJlbltpXSA9IG1fY2hpbGRyZW5baV0tPmxheWVySUQoKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIGlmIChpc1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbSgpKSB7Ci0gICAgICAg
ICAgICBSZW1vdGVMYXllclRyZWVQcm9wZXJ0eUFwcGxpZXI6OmFwcGx5UHJvcGVydGllcyhwbGF0
Zm9ybUxheWVyKCksIG51bGxwdHIsIG1fcHJvcGVydGllcywgUmVtb3RlTGF5ZXJUcmVlUHJvcGVy
dHlBcHBsaWVyOjpSZWxhdGVkTGF5ZXJNYXAoKSwgUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmU6Okxh
eWVyQ29udGVudHNUeXBlOjpDQU1hY2hQb3J0KTsKLSAgICAgICAgICAgIGRpZENvbW1pdCgpOwot
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJhbnNhY3Rpb24ubGF5
ZXJQcm9wZXJ0aWVzQ2hhbmdlZCgqdGhpcyk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBtX2NoaWxkcmVuLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFBsYXRmb3JtQ0FMYXll
clJlbW90ZSYgY2hpbGQgPSBkb3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+KCptX2NoaWxk
cmVuW2ldKTsKLSAgICAgICAgQVNTRVJUKGNoaWxkLnN1cGVybGF5ZXIoKSA9PSB0aGlzKTsKLSAg
ICAgICAgY2hpbGQucmVjdXJzaXZlQnVpbGRUcmFuc2FjdGlvbihjb250ZXh0LCB0cmFuc2FjdGlv
bik7Ci0gICAgfQotCi0gICAgaWYgKG1fbWFza0xheWVyKQotICAgICAgICBtX21hc2tMYXllci0+
cmVjdXJzaXZlQnVpbGRUcmFuc2FjdGlvbihjb250ZXh0LCB0cmFuc2FjdGlvbik7Ci19Ci0KLXZv
aWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpkaWRDb21taXQoKQotewotICAgIG1fcHJvcGVydGll
cy5hZGRlZEFuaW1hdGlvbnMuY2xlYXIoKTsKLSAgICBtX3Byb3BlcnRpZXMua2V5UGF0aHNPZkFu
aW1hdGlvbnNUb1JlbW92ZS5jbGVhcigpOwotICAgIG1fcHJvcGVydGllcy5yZXNldENoYW5nZWRQ
cm9wZXJ0aWVzKCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjplbnN1cmVCYWNr
aW5nU3RvcmUoKQotewotICAgIEFTU0VSVChvd25lcigpKTsKLSAgICAKLSAgICBpZiAoIW1fcHJv
cGVydGllcy5iYWNraW5nU3RvcmUpCi0gICAgICAgIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUg
PSBzdGQ6Om1ha2VfdW5pcXVlPFJlbW90ZUxheWVyQmFja2luZ1N0b3JlPih0aGlzKTsKLQotICAg
IHVwZGF0ZUJhY2tpbmdTdG9yZSgpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
dXBkYXRlQmFja2luZ1N0b3JlKCkKLXsKLSAgICBpZiAoIW1fcHJvcGVydGllcy5iYWNraW5nU3Rv
cmUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUtPmVu
c3VyZUJhY2tpbmdTdG9yZShtX3Byb3BlcnRpZXMuYm91bmRzLnNpemUoKSwgbV9wcm9wZXJ0aWVz
LmNvbnRlbnRzU2NhbGUsIG1fYWNjZWxlcmF0ZXNEcmF3aW5nLCBtX3dhbnRzRGVlcENvbG9yQmFj
a2luZ1N0b3JlLCBtX3Byb3BlcnRpZXMub3BhcXVlKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGU6OnNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCi17
Ci0gICAgZW5zdXJlQmFja2luZ1N0b3JlKCk7Ci0KLSAgICAvLyBGSVhNRTogTmVlZCB0byBtYXAg
dGhpcyB0aHJvdWdoIGNvbnRlbnRzUmVjdC9ldGMuCi0gICAgbV9wcm9wZXJ0aWVzLmJhY2tpbmdT
dG9yZS0+c2V0TmVlZHNEaXNwbGF5KGVuY2xvc2luZ0ludFJlY3QocmVjdCkpOwotfQotCi12b2lk
IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TmVlZHNEaXNwbGF5KCkKLXsKLSAgICBlbnN1cmVC
YWNraW5nU3RvcmUoKTsKLQotICAgIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUtPnNldE5lZWRz
RGlzcGxheSgpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y29weUNvbnRlbnRz
RnJvbUxheWVyKFBsYXRmb3JtQ0FMYXllciogbGF5ZXIpCi17Ci0gICAgQVNTRVJUKG1fcHJvcGVy
dGllcy5jbG9uZWRMYXllcklEID09IGxheWVyLT5sYXllcklEKCkpOwotICAgIAotICAgIGlmICgh
bV9wcm9wZXJ0aWVzLmNoYW5nZWRQcm9wZXJ0aWVzKQotICAgICAgICBtX2NvbnRleHQtPmxheWVy
UHJvcGVydHlDaGFuZ2VkV2hpbGVCdWlsZGluZ1RyYW5zYWN0aW9uKCp0aGlzKTsKLQotICAgIG1f
cHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rp
b246OkNsb25lZENvbnRlbnRzQ2hhbmdlZCk7Ci19Ci0KLVBsYXRmb3JtQ0FMYXllciogUGxhdGZv
cm1DQUxheWVyUmVtb3RlOjpzdXBlcmxheWVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9zdXBl
cmxheWVyOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVtb3ZlRnJvbVN1cGVy
bGF5ZXIoKQotewotICAgIGlmICghbV9zdXBlcmxheWVyKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBtX3N1cGVybGF5ZXItPnJlbW92ZVN1YmxheWVyKHRoaXMpOwotfQotCi12b2lkIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6cmVtb3ZlU3VibGF5ZXIoUGxhdGZvcm1DQUxheWVyUmVtb3RlKiBsYXll
cikKLXsKLSAgICBzaXplX3QgY2hpbGRJbmRleCA9IG1fY2hpbGRyZW4uZmluZChsYXllcik7Ci0g
ICAgaWYgKGNoaWxkSW5kZXggIT0gbm90Rm91bmQpCi0gICAgICAgIG1fY2hpbGRyZW4ucmVtb3Zl
KGNoaWxkSW5kZXgpOwotICAgIGxheWVyLT5tX3N1cGVybGF5ZXIgPSBudWxscHRyOwotICAgIG1f
cHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rp
b246OkNoaWxkcmVuQ2hhbmdlZCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpz
ZXRTdWJsYXllcnMoY29uc3QgUGxhdGZvcm1DQUxheWVyTGlzdCYgbGlzdCkKLXsKLSAgICByZW1v
dmVBbGxTdWJsYXllcnMoKTsKLSAgICBtX2NoaWxkcmVuID0gbGlzdDsKLQotICAgIGZvciAoY29u
c3QgYXV0byYgbGF5ZXIgOiBsaXN0KSB7Ci0gICAgICAgIGxheWVyLT5yZW1vdmVGcm9tU3VwZXJs
YXllcigpOwotICAgICAgICBkb3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+KCpsYXllciku
bV9zdXBlcmxheWVyID0gdGhpczsKLSAgICB9Ci0KLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3Bl
cnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDaGlsZHJlbkNoYW5nZWQp
OwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVtb3ZlQWxsU3VibGF5ZXJzKCkK
LXsKLSAgICBQbGF0Zm9ybUNBTGF5ZXJMaXN0IGxheWVyc1RvUmVtb3ZlID0gbV9jaGlsZHJlbjsK
LSAgICBmb3IgKGNvbnN0IGF1dG8mIGxheWVyIDogbGF5ZXJzVG9SZW1vdmUpCi0gICAgICAgIGxh
eWVyLT5yZW1vdmVGcm9tU3VwZXJsYXllcigpOwotICAgIEFTU0VSVChtX2NoaWxkcmVuLmlzRW1w
dHkoKSk7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXll
clRyZWVUcmFuc2FjdGlvbjo6Q2hpbGRyZW5DaGFuZ2VkKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU6OmFwcGVuZFN1YmxheWVyKFBsYXRmb3JtQ0FMYXllciYgbGF5ZXIpCi17Ci0g
ICAgUmVmPFBsYXRmb3JtQ0FMYXllcj4gbGF5ZXJQcm90ZWN0b3IobGF5ZXIpOwotCi0gICAgbGF5
ZXIucmVtb3ZlRnJvbVN1cGVybGF5ZXIoKTsKLSAgICBtX2NoaWxkcmVuLmFwcGVuZCgmbGF5ZXIp
OwotICAgIGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4obGF5ZXIpLm1fc3VwZXJsYXll
ciA9IHRoaXM7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVM
YXllclRyZWVUcmFuc2FjdGlvbjo6Q2hpbGRyZW5DaGFuZ2VkKTsKLX0KLQotdm9pZCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6Omluc2VydFN1YmxheWVyKFBsYXRmb3JtQ0FMYXllciYgbGF5ZXIsIHNp
emVfdCBpbmRleCkKLXsKLSAgICBSZWY8UGxhdGZvcm1DQUxheWVyPiBsYXllclByb3RlY3Rvcihs
YXllcik7Ci0KLSAgICBsYXllci5yZW1vdmVGcm9tU3VwZXJsYXllcigpOwotICAgIG1fY2hpbGRy
ZW4uaW5zZXJ0KGluZGV4LCAmbGF5ZXIpOwotICAgIGRvd25jYXN0PFBsYXRmb3JtQ0FMYXllclJl
bW90ZT4obGF5ZXIpLm1fc3VwZXJsYXllciA9IHRoaXM7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQ
cm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Q2hpbGRyZW5DaGFu
Z2VkKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnJlcGxhY2VTdWJsYXllcihQ
bGF0Zm9ybUNBTGF5ZXImIHJlZmVyZW5jZSwgUGxhdGZvcm1DQUxheWVyJiBsYXllcikKLXsKLSAg
ICBBU1NFUlQocmVmZXJlbmNlLnN1cGVybGF5ZXIoKSA9PSB0aGlzKTsKLSAgICBSZWY8UGxhdGZv
cm1DQUxheWVyPiBsYXllclByb3RlY3RvcihsYXllcik7Ci0KLSAgICBsYXllci5yZW1vdmVGcm9t
U3VwZXJsYXllcigpOwotICAgIHNpemVfdCByZWZlcmVuY2VJbmRleCA9IG1fY2hpbGRyZW4uZmlu
ZCgmcmVmZXJlbmNlKTsKLSAgICBpZiAocmVmZXJlbmNlSW5kZXggIT0gbm90Rm91bmQpIHsKLSAg
ICAgICAgbV9jaGlsZHJlbltyZWZlcmVuY2VJbmRleF0tPnJlbW92ZUZyb21TdXBlcmxheWVyKCk7
Ci0gICAgICAgIG1fY2hpbGRyZW4uaW5zZXJ0KHJlZmVyZW5jZUluZGV4LCAmbGF5ZXIpOwotICAg
ICAgICBkb3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+KGxheWVyKS5tX3N1cGVybGF5ZXIg
PSB0aGlzOwotICAgIH0KLQotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQo
UmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNoaWxkcmVuQ2hhbmdlZCk7Ci19Ci0KLXZvaWQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjphZG9wdFN1YmxheWVycyhQbGF0Zm9ybUNBTGF5ZXImIHNv
dXJjZSkKLXsKLSAgICBQbGF0Zm9ybUNBTGF5ZXJMaXN0IGxheWVyc1RvTW92ZSA9IGRvd25jYXN0
PFBsYXRmb3JtQ0FMYXllclJlbW90ZT4oc291cmNlKS5tX2NoaWxkcmVuOwotCi0gICAgaWYgKGNv
bnN0IFBsYXRmb3JtQ0FMYXllckxpc3QqIGN1c3RvbUxheWVycyA9IHNvdXJjZS5jdXN0b21TdWJs
YXllcnMoKSkgewotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGxheWVyIDogKmN1c3RvbUxheWVy
cykgewotICAgICAgICAgICAgc2l6ZV90IGxheWVySW5kZXggPSBsYXllcnNUb01vdmUuZmluZChs
YXllcik7Ci0gICAgICAgICAgICBpZiAobGF5ZXJJbmRleCAhPSBub3RGb3VuZCkKLSAgICAgICAg
ICAgICAgICBsYXllcnNUb01vdmUucmVtb3ZlKGxheWVySW5kZXgpOwotICAgICAgICB9Ci0gICAg
fQotCi0gICAgc2V0U3VibGF5ZXJzKGxheWVyc1RvTW92ZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjphZGRBbmltYXRpb25Gb3JLZXkoY29uc3QgU3RyaW5nJiBrZXksIFBsYXRm
b3JtQ0FBbmltYXRpb24mIGFuaW1hdGlvbikKLXsKLSAgICBhdXRvIGFkZFJlc3VsdCA9IG1fYW5p
bWF0aW9ucy5zZXQoa2V5LCAmYW5pbWF0aW9uKTsKLSAgICBpZiAoYWRkUmVzdWx0LmlzTmV3RW50
cnkpCi0gICAgICAgIG1fcHJvcGVydGllcy5hZGRlZEFuaW1hdGlvbnMuYXBwZW5kKHN0ZDo6cGFp
cjxTdHJpbmcsIFBsYXRmb3JtQ0FBbmltYXRpb25SZW1vdGU6OlByb3BlcnRpZXM+KGtleSwgZG93
bmNhc3Q8UGxhdGZvcm1DQUFuaW1hdGlvblJlbW90ZT4oYW5pbWF0aW9uKS5wcm9wZXJ0aWVzKCkp
KTsKLSAgICBlbHNlIHsKLSAgICAgICAgZm9yIChhdXRvJiBrZXlBbmltYXRpb25QYWlyIDogbV9w
cm9wZXJ0aWVzLmFkZGVkQW5pbWF0aW9ucykgewotICAgICAgICAgICAgaWYgKGtleUFuaW1hdGlv
blBhaXIuZmlyc3QgPT0ga2V5KSB7Ci0gICAgICAgICAgICAgICAga2V5QW5pbWF0aW9uUGFpci5z
ZWNvbmQgPSBkb3duY2FzdDxQbGF0Zm9ybUNBQW5pbWF0aW9uUmVtb3RlPihhbmltYXRpb24pLnBy
b3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgIH0KLSAgICAKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2Vk
KFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpBbmltYXRpb25zQ2hhbmdlZCk7Ci0KLSAgICBp
ZiAobV9jb250ZXh0KQotICAgICAgICBtX2NvbnRleHQtPndpbGxTdGFydEFuaW1hdGlvbk9uTGF5
ZXIoKnRoaXMpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6cmVtb3ZlQW5pbWF0
aW9uRm9yS2V5KGNvbnN0IFN0cmluZyYga2V5KQotewotICAgIGlmIChtX2FuaW1hdGlvbnMucmVt
b3ZlKGtleSkpIHsKLSAgICAgICAgbV9wcm9wZXJ0aWVzLmFkZGVkQW5pbWF0aW9ucy5yZW1vdmVG
aXJzdE1hdGNoaW5nKFsma2V5XShhdXRvJiBwYWlyKSB7Ci0gICAgICAgICAgICByZXR1cm4gcGFp
ci5maXJzdCA9PSBrZXk7Ci0gICAgICAgIH0pOwotICAgIH0KLSAgICBtX3Byb3BlcnRpZXMua2V5
UGF0aHNPZkFuaW1hdGlvbnNUb1JlbW92ZS5hZGQoa2V5KTsKLSAgICBtX3Byb3BlcnRpZXMubm90
ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpBbmltYXRpb25z
Q2hhbmdlZCk7Ci19Ci0KLVJlZlB0cjxQbGF0Zm9ybUNBQW5pbWF0aW9uPiBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGU6OmFuaW1hdGlvbkZvcktleShjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICByZXR1
cm4gbV9hbmltYXRpb25zLmdldChrZXkpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNFcXVp
dmFsZW50TGF5ZXIoY29uc3QgUGxhdGZvcm1DQUxheWVyKiBsYXllciwgR3JhcGhpY3NMYXllcjo6
UGxhdGZvcm1MYXllcklEIGxheWVySUQpCi17Ci0gICAgR3JhcGhpY3NMYXllcjo6UGxhdGZvcm1M
YXllcklEIG5ld0xheWVySUQgPSBsYXllciA/IGxheWVyLT5sYXllcklEKCkgOiAwOwotICAgIHJl
dHVybiBsYXllcklEID09IG5ld0xheWVySUQ7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjphbmltYXRpb25TdGFydGVkKGNvbnN0IFN0cmluZyYga2V5LCBDRlRpbWVJbnRlcnZhbCBi
ZWdpblRpbWUpCi17Ci0gICAgYXV0byBpdCA9IG1fYW5pbWF0aW9ucy5maW5kKGtleSk7Ci0gICAg
aWYgKGl0ICE9IG1fYW5pbWF0aW9ucy5lbmQoKSkKLSAgICAgICAgZG93bmNhc3Q8UGxhdGZvcm1D
QUFuaW1hdGlvblJlbW90ZT4oKml0LT52YWx1ZSkuZGlkU3RhcnQoYmVnaW5UaW1lKTsKLSAgICAK
LSAgICBpZiAobV9vd25lcikKLSAgICAgICAgbV9vd25lci0+cGxhdGZvcm1DQUxheWVyQW5pbWF0
aW9uU3RhcnRlZChrZXksIGJlZ2luVGltZSk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjphbmltYXRpb25FbmRlZChjb25zdCBTdHJpbmcmIGtleSkKLXsKLSAgICBpZiAobV9vd25l
cikKLSAgICAgICAgbV9vd25lci0+cGxhdGZvcm1DQUxheWVyQW5pbWF0aW9uRW5kZWQoa2V5KTsK
LX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldE1hc2soUGxhdGZvcm1DQUxheWVy
KiBsYXllcikKLXsKLSAgICBpZiAoaXNFcXVpdmFsZW50TGF5ZXIobGF5ZXIsIG1fcHJvcGVydGll
cy5tYXNrTGF5ZXJJRCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBpZiAobGF5ZXIpIHsK
LSAgICAgICAgbV9tYXNrTGF5ZXIgPSBkb3duY2FzdDxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+KGxh
eWVyKTsKLSAgICAgICAgbV9wcm9wZXJ0aWVzLm1hc2tMYXllcklEID0gbV9tYXNrTGF5ZXItPmxh
eWVySUQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtX21hc2tMYXllciA9IG51bGxwdHI7Ci0g
ICAgICAgIG1fcHJvcGVydGllcy5tYXNrTGF5ZXJJRCA9IDA7Ci0gICAgfQotCi0gICAgbV9wcm9w
ZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6
TWFza0xheWVyQ2hhbmdlZCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRD
bG9uZWRMYXllcihjb25zdCBQbGF0Zm9ybUNBTGF5ZXIqIGxheWVyKQotewotICAgIGlmIChpc0Vx
dWl2YWxlbnRMYXllcihsYXllciwgbV9wcm9wZXJ0aWVzLmNsb25lZExheWVySUQpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBpZiAobGF5ZXIpCi0gICAgICAgIG1fcHJvcGVydGllcy5jbG9uZWRM
YXllcklEID0gbGF5ZXItPmxheWVySUQoKTsKLSAgICBlbHNlCi0gICAgICAgIG1fcHJvcGVydGll
cy5jbG9uZWRMYXllcklEID0gMDsKLQotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0No
YW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNsb25lZENvbnRlbnRzQ2hhbmdlZCk7
Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjppc09wYXF1ZSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIG1fcHJvcGVydGllcy5vcGFxdWU7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjpzZXRPcGFxdWUoYm9vbCB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMub3BhcXVl
ID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVM
YXllclRyZWVUcmFuc2FjdGlvbjo6T3BhcXVlQ2hhbmdlZCk7Ci0KLSAgICB1cGRhdGVCYWNraW5n
U3RvcmUoKTsKLX0KLQotRmxvYXRSZWN0IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Ym91bmRzKCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmJvdW5kczsKLX0KLQotdm9pZCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEJvdW5kcyhjb25zdCBGbG9hdFJlY3QmIHZhbHVlKQotewot
ICAgIGlmICh2YWx1ZSA9PSBtX3Byb3BlcnRpZXMuYm91bmRzKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBtX3Byb3BlcnRpZXMuYm91bmRzID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQ
cm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6Qm91bmRzQ2hhbmdl
ZCk7Ci0gICAgCi0gICAgaWYgKHJlcXVpcmVzQ3VzdG9tQXBwZWFyYW5jZVVwZGF0ZU9uQm91bmRz
Q2hhbmdlKCkpCi0gICAgICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkN1c3RvbUFwcGVhcmFuY2VDaGFuZ2VkKTsKLQotICAg
IHVwZGF0ZUJhY2tpbmdTdG9yZSgpOwotfQotCi1GbG9hdFBvaW50M0QgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjpwb3NpdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5wb3Np
dGlvbjsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFBvc2l0aW9uKGNvbnN0
IEZsb2F0UG9pbnQzRCYgdmFsdWUpCi17Ci0gICAgLy8gV2UgY2FuJ3QgZWFybHkgcmV0dXJuIGhl
cmUgaWYgdGhlIHBvc2l0aW9uIGhhcyBub3QgY2hhbmdlZCwgc2luY2UgR3JhcGhpY3NMYXllckNB
OjpzeW5jUG9zaXRpb24oKSBtYXkgaGF2ZSBjaGFuZ2VkCi0gICAgLy8gdGhlIEdyYXBoaWNzTGF5
ZXIgcG9zaXRpb24gKHdoaWNoIGRvZXNuJ3QgZm9yY2UgYSBnZW9tZXRyeSB1cGRhdGUpIGJ1dCB3
ZSB3YW50IGEgc3Vic2VxdWVudCBHcmFwaGljc0xheWVyQ0E6OnNldFBvc2l0aW9uKCkKLSAgICAv
LyB0byBwdXNoIGEgbmV3IHBvc2l0aW9uIHRvIHRoZSBVSSBwcm9jZXNzLCBldmVuIHRob3VnaCBv
dXIgbV9wcm9wZXJ0aWVzLnBvc2l0aW9uIGhhc24ndCBjaGFuZ2VkLgotICAgIG1fcHJvcGVydGll
cy5wb3NpdGlvbiA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5n
ZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlBvc2l0aW9uQ2hhbmdlZCk7Ci19Ci0KLUZs
b2F0UG9pbnQzRCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmFuY2hvclBvaW50KCkgY29uc3QKLXsK
LSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmFuY2hvclBvaW50OwotfQotCi12b2lkIFBsYXRmb3Jt
Q0FMYXllclJlbW90ZTo6c2V0QW5jaG9yUG9pbnQoY29uc3QgRmxvYXRQb2ludDNEJiB2YWx1ZSkK
LXsKLSAgICBpZiAodmFsdWUgPT0gbV9wcm9wZXJ0aWVzLmFuY2hvclBvaW50KQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMuYW5jaG9yUG9pbnQgPSB2YWx1ZTsKLSAgICBtX3By
b3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9u
OjpBbmNob3JQb2ludENoYW5nZWQpOwotfQotCi1UcmFuc2Zvcm1hdGlvbk1hdHJpeCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6OnRyYW5zZm9ybSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVy
dGllcy50cmFuc2Zvcm0gPyAqbV9wcm9wZXJ0aWVzLnRyYW5zZm9ybSA6IFRyYW5zZm9ybWF0aW9u
TWF0cml4KCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRUcmFuc2Zvcm0o
Y29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy50
cmFuc2Zvcm0gPSBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zZm9ybWF0aW9uTWF0cml4Pih2YWx1ZSk7
Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6VHJhbnNmb3JtQ2hhbmdlZCk7Ci19Ci0KLVRyYW5zZm9ybWF0aW9uTWF0cml4
IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c3VibGF5ZXJUcmFuc2Zvcm0oKSBjb25zdAotewotICAg
IHJldHVybiBtX3Byb3BlcnRpZXMuc3VibGF5ZXJUcmFuc2Zvcm0gPyAqbV9wcm9wZXJ0aWVzLnN1
YmxheWVyVHJhbnNmb3JtIDogVHJhbnNmb3JtYXRpb25NYXRyaXgoKTsKLX0KLQotdm9pZCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFN1YmxheWVyVHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4JiB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMuc3VibGF5ZXJUcmFuc2Zvcm0g
PSBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zZm9ybWF0aW9uTWF0cml4Pih2YWx1ZSk7Ci0gICAgbV9w
cm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlv
bjo6U3VibGF5ZXJUcmFuc2Zvcm1DaGFuZ2VkKTsKLX0KLQotYm9vbCBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGU6OmlzSGlkZGVuKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLmhpZGRl
bjsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEhpZGRlbihib29sIHZhbHVl
KQotewotICAgIGlmIChtX3Byb3BlcnRpZXMuaGlkZGVuID09IHZhbHVlKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBtX3Byb3BlcnRpZXMuaGlkZGVuID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVz
Lm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6SGlkZGVu
Q2hhbmdlZCk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjb250ZW50c0hpZGRl
bigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5jb250ZW50c0hpZGRlbjsKLX0K
LQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldENvbnRlbnRzSGlkZGVuKGJvb2wgdmFs
dWUpCi17Ci0gICAgaWYgKG1fcHJvcGVydGllcy5jb250ZW50c0hpZGRlbiA9PSB2YWx1ZSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVzLmNvbnRlbnRzSGlkZGVuID0gdmFsdWU7
Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6Q29udGVudHNIaWRkZW5DaGFuZ2VkKTsKLX0KLQotYm9vbCBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU6OnVzZXJJbnRlcmFjdGlvbkVuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVy
biBtX3Byb3BlcnRpZXMudXNlckludGVyYWN0aW9uRW5hYmxlZDsKLX0KLQotdm9pZCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6OnNldFVzZXJJbnRlcmFjdGlvbkVuYWJsZWQoYm9vbCB2YWx1ZSkKLXsK
LSAgICBpZiAobV9wcm9wZXJ0aWVzLnVzZXJJbnRlcmFjdGlvbkVuYWJsZWQgPT0gdmFsdWUpCi0g
ICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX3Byb3BlcnRpZXMudXNlckludGVyYWN0aW9uRW5h
YmxlZCA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OlVzZXJJbnRlcmFjdGlvbkVuYWJsZWRDaGFuZ2VkKTsK
LX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEJhY2tpbmdTdG9yZUF0dGFjaGVk
KGJvb2wgdmFsdWUpCi17Ci0gICAgaWYgKG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmVBdHRhY2hl
ZCA9PSB2YWx1ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVzLmJhY2tpbmdT
dG9yZUF0dGFjaGVkID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hh
bmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6QmFja2luZ1N0b3JlQXR0YWNobWVudENo
YW5nZWQpOwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6YmFja2luZ1N0b3JlQXR0
YWNoZWQoKSBjb25zdAotewotICAgIHJldHVybiBtX3Byb3BlcnRpZXMuYmFja2luZ1N0b3JlQXR0
YWNoZWQ7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRHZW9tZXRyeUZsaXBw
ZWQoYm9vbCB2YWx1ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMuZ2VvbWV0cnlGbGlwcGVkID0gdmFs
dWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRy
ZWVUcmFuc2FjdGlvbjo6R2VvbWV0cnlGbGlwcGVkQ2hhbmdlZCk7Ci19Ci0KLWJvb2wgUGxhdGZv
cm1DQUxheWVyUmVtb3RlOjpnZW9tZXRyeUZsaXBwZWQoKSBjb25zdAotewotICAgIHJldHVybiBt
X3Byb3BlcnRpZXMuZ2VvbWV0cnlGbGlwcGVkOwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJl
bW90ZTo6aXNEb3VibGVTaWRlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5k
b3VibGVTaWRlZDsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldERvdWJsZVNp
ZGVkKGJvb2wgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLmRvdWJsZVNpZGVkID0gdmFsdWU7
Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6RG91YmxlU2lkZWRDaGFuZ2VkKTsKLX0KLQotYm9vbCBQbGF0Zm9ybUNBTGF5
ZXJSZW1vdGU6Om1hc2tzVG9Cb3VuZHMoKSBjb25zdAotewotICAgIHJldHVybiBtX3Byb3BlcnRp
ZXMubWFza3NUb0JvdW5kczsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldE1h
c2tzVG9Cb3VuZHMoYm9vbCB2YWx1ZSkKLXsKLSAgICBpZiAodmFsdWUgPT0gbV9wcm9wZXJ0aWVz
Lm1hc2tzVG9Cb3VuZHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVydGllcy5tYXNr
c1RvQm91bmRzID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdl
ZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6TWFza3NUb0JvdW5kc0NoYW5nZWQpOwotfQot
Ci1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6YWNjZWxlcmF0ZXNEcmF3aW5nKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gbV9hY2NlbGVyYXRlc0RyYXdpbmc7Ci19Ci0KLXZvaWQgUGxhdGZvcm1D
QUxheWVyUmVtb3RlOjpzZXRBY2NlbGVyYXRlc0RyYXdpbmcoYm9vbCBhY2NlbGVyYXRlc0RyYXdp
bmcpCi17Ci0gICAgbV9hY2NlbGVyYXRlc0RyYXdpbmcgPSBhY2NlbGVyYXRlc0RyYXdpbmc7Ci0g
ICAgdXBkYXRlQmFja2luZ1N0b3JlKCk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
Ojp3YW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fd2Fu
dHNEZWVwQ29sb3JCYWNraW5nU3RvcmU7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
OjpzZXRXYW50c0RlZXBDb2xvckJhY2tpbmdTdG9yZShib29sIHdhbnRzRGVlcENvbG9yQmFja2lu
Z1N0b3JlKQotewotICAgIG1fd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUgPSB3YW50c0RlZXBD
b2xvckJhY2tpbmdTdG9yZTsKLSAgICB1cGRhdGVCYWNraW5nU3RvcmUoKTsKLX0KLQotYm9vbCBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnN1cHBvcnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRleHQoKSBj
b25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGU6OnNldFN1cHBvcnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRleHQoYm9vbCkKLXsKLX0KLQotQ0ZU
eXBlUmVmIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y29udGVudHMoKSBjb25zdAotewotICAgIHJl
dHVybiBudWxscHRyOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0Q29udGVu
dHMoQ0ZUeXBlUmVmIHZhbHVlKQotewotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
c2V0Q29udGVudHNSZWN0KGNvbnN0IEZsb2F0UmVjdCYgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0
aWVzLmNvbnRlbnRzUmVjdCA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGll
c0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNvbnRlbnRzUmVjdENoYW5nZWQp
OwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TWluaWZpY2F0aW9uRmlsdGVy
KEZpbHRlclR5cGUgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLm1pbmlmaWNhdGlvbkZpbHRl
ciA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3Rl
TGF5ZXJUcmVlVHJhbnNhY3Rpb246Ok1pbmlmaWNhdGlvbkZpbHRlckNoYW5nZWQpOwotfQotCi12
b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TWFnbmlmaWNhdGlvbkZpbHRlcihGaWx0ZXJU
eXBlIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5tYWduaWZpY2F0aW9uRmlsdGVyID0gdmFs
dWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRy
ZWVUcmFuc2FjdGlvbjo6TWFnbmlmaWNhdGlvbkZpbHRlckNoYW5nZWQpOwotfQotCi1Db2xvciBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmJhY2tncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIG1fcHJvcGVydGllcy5iYWNrZ3JvdW5kQ29sb3I7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjpzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ29sb3ImIHZhbHVlKQotewotICAg
IG1fcHJvcGVydGllcy5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTsKLSAgICBtX3Byb3BlcnRpZXMu
bm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpCYWNrZ3Jv
dW5kQ29sb3JDaGFuZ2VkKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEJv
cmRlcldpZHRoKGZsb2F0IHZhbHVlKQotewotICAgIGlmICh2YWx1ZSA9PSBtX3Byb3BlcnRpZXMu
Ym9yZGVyV2lkdGgpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVydGllcy5ib3JkZXJX
aWR0aCA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkJvcmRlcldpZHRoQ2hhbmdlZCk7Ci19Ci0KLXZvaWQg
UGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCb3JkZXJDb2xvcihjb25zdCBDb2xvciYgdmFsdWUp
Ci17Ci0gICAgaWYgKHZhbHVlID09IG1fcHJvcGVydGllcy5ib3JkZXJDb2xvcikKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVzLmJvcmRlckNvbG9yID0gdmFsdWU7Ci0gICAgbV9w
cm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlv
bjo6Qm9yZGVyQ29sb3JDaGFuZ2VkKTsKLX0KLQotZmxvYXQgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
OjpvcGFjaXR5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLm9wYWNpdHk7Ci19
Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRPcGFjaXR5KGZsb2F0IHZhbHVlKQot
ewotICAgIG1fcHJvcGVydGllcy5vcGFjaXR5ID0gdmFsdWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5v
dGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbjo6T3BhY2l0eUNo
YW5nZWQpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0RmlsdGVycyhjb25z
dCBGaWx0ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKQotewotICAgIG1fcHJvcGVydGllcy5maWx0ZXJz
ID0gc3RkOjptYWtlX3VuaXF1ZTxGaWx0ZXJPcGVyYXRpb25zPihmaWx0ZXJzKTsKLSAgICBtX3By
b3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9u
OjpGaWx0ZXJzQ2hhbmdlZCk7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpjb3B5
RmlsdGVyc0Zyb20oY29uc3QgUGxhdGZvcm1DQUxheWVyJiBzb3VyY2VMYXllcikKLXsKLSAgICBp
ZiAoY29uc3QgRmlsdGVyT3BlcmF0aW9ucyogZmlsdGVycyA9IGRvd25jYXN0PFBsYXRmb3JtQ0FM
YXllclJlbW90ZT4oc291cmNlTGF5ZXIpLm1fcHJvcGVydGllcy5maWx0ZXJzLmdldCgpKQotICAg
ICAgICBzZXRGaWx0ZXJzKCpmaWx0ZXJzKTsKLSAgICBlbHNlIGlmIChtX3Byb3BlcnRpZXMuZmls
dGVycykKLSAgICAgICAgbV9wcm9wZXJ0aWVzLmZpbHRlcnMgPSBudWxscHRyOwotCi0gICAgbV9w
cm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlv
bjo6RmlsdGVyc0NoYW5nZWQpOwotfQotCi0jaWYgRU5BQkxFKENTU19DT01QT1NJVElORykKLXZv
aWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXRCbGVuZE1vZGUoQmxlbmRNb2RlIGJsZW5kTW9k
ZSkKLXsKLSAgICBtX3Byb3BlcnRpZXMuYmxlbmRNb2RlID0gYmxlbmRNb2RlOwotICAgIG1fcHJv
cGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246
OkJsZW5kTW9kZUNoYW5nZWQpOwotfQotI2VuZGlmCi0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjpmaWx0ZXJzQ2FuQmVDb21wb3NpdGVkKGNvbnN0IEZpbHRlck9wZXJhdGlvbnMmIGZpbHRl
cnMpCi17Ci0gICAgcmV0dXJuIFBsYXRmb3JtQ0FMYXllckNvY29hOjpmaWx0ZXJzQ2FuQmVDb21w
b3NpdGVkKGZpbHRlcnMpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0TmFt
ZShjb25zdCBTdHJpbmcmIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5uYW1lID0gdmFsdWU7
Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRyZWVU
cmFuc2FjdGlvbjo6TmFtZUNoYW5nZWQpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90
ZTo6c2V0U3BlZWQoZmxvYXQgdmFsdWUpCi17Ci0gICAgbV9wcm9wZXJ0aWVzLnNwZWVkID0gdmFs
dWU7Ci0gICAgbV9wcm9wZXJ0aWVzLm5vdGVQcm9wZXJ0aWVzQ2hhbmdlZChSZW1vdGVMYXllclRy
ZWVUcmFuc2FjdGlvbjo6U3BlZWRDaGFuZ2VkKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGU6OnNldFRpbWVPZmZzZXQoQ0ZUaW1lSW50ZXJ2YWwgdmFsdWUpCi17Ci0gICAgbV9wcm9w
ZXJ0aWVzLnRpbWVPZmZzZXQgPSB2YWx1ZTsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRp
ZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpUaW1lT2Zmc2V0Q2hhbmdlZCk7
Ci19Ci0KLWZsb2F0IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y29udGVudHNTY2FsZSgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5jb250ZW50c1NjYWxlOwotfQotCi12b2lkIFBs
YXRmb3JtQ0FMYXllclJlbW90ZTo6c2V0Q29udGVudHNTY2FsZShmbG9hdCB2YWx1ZSkKLXsKLSAg
ICBtX3Byb3BlcnRpZXMuY29udGVudHNTY2FsZSA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5u
b3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkNvbnRlbnRz
U2NhbGVDaGFuZ2VkKTsKLQotICAgIHVwZGF0ZUJhY2tpbmdTdG9yZSgpOwotfQotCi1mbG9hdCBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmNvcm5lclJhZGl1cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1fcHJvcGVydGllcy5jb3JuZXJSYWRpdXM7Ci19Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVt
b3RlOjpzZXRDb3JuZXJSYWRpdXMoZmxvYXQgdmFsdWUpCi17Ci0gICAgaWYgKG1fcHJvcGVydGll
cy5jb3JuZXJSYWRpdXMgPT0gdmFsdWUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fcHJvcGVy
dGllcy5jb3JuZXJSYWRpdXMgPSB2YWx1ZTsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRp
ZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDb3JuZXJSYWRpdXNDaGFuZ2Vk
KTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEVkZ2VBbnRpYWxpYXNpbmdN
YXNrKHVuc2lnbmVkIHZhbHVlKQotewotICAgIG1fcHJvcGVydGllcy5lZGdlQW50aWFsaWFzaW5n
TWFzayA9IHZhbHVlOwotICAgIG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkVkZ2VBbnRpYWxpYXNpbmdNYXNrQ2hhbmdlZCk7Ci19
Ci0KLUZsb2F0Um91bmRlZFJlY3QgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzaGFwZVJvdW5kZWRS
ZWN0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wcm9wZXJ0aWVzLnNoYXBlUm91bmRlZFJlY3Qg
PyAqbV9wcm9wZXJ0aWVzLnNoYXBlUm91bmRlZFJlY3QgOiBGbG9hdFJvdW5kZWRSZWN0KEZsb2F0
UmVjdCgpKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFNoYXBlUm91bmRl
ZFJlY3QoY29uc3QgRmxvYXRSb3VuZGVkUmVjdCYgcm91bmRlZFJlY3QpCi17Ci0gICAgaWYgKG1f
cHJvcGVydGllcy5zaGFwZVJvdW5kZWRSZWN0ICYmICptX3Byb3BlcnRpZXMuc2hhcGVSb3VuZGVk
UmVjdCA9PSByb3VuZGVkUmVjdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9wZXJ0aWVz
LnNoYXBlUm91bmRlZFJlY3QgPSBzdGQ6Om1ha2VfdW5pcXVlPEZsb2F0Um91bmRlZFJlY3Q+KHJv
dW5kZWRSZWN0KTsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90
ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpTaGFwZVJvdW5kZWRSZWN0Q2hhbmdlZCk7Ci19Ci0KLVBh
dGggUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzaGFwZVBhdGgoKSBjb25zdAotewotICAgIEFTU0VS
VChtX2xheWVyVHlwZSA9PSBMYXllclR5cGVTaGFwZUxheWVyKTsKLSAgICByZXR1cm4gbV9wcm9w
ZXJ0aWVzLnNoYXBlUGF0aDsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFNo
YXBlUGF0aChjb25zdCBQYXRoJiBwYXRoKQotewotICAgIEFTU0VSVChtX2xheWVyVHlwZSA9PSBM
YXllclR5cGVTaGFwZUxheWVyKTsKLSAgICBtX3Byb3BlcnRpZXMuc2hhcGVQYXRoID0gcGF0aDsK
LSAgICBtX3Byb3BlcnRpZXMubm90ZVByb3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRy
YW5zYWN0aW9uOjpTaGFwZVBhdGhDaGFuZ2VkKTsKLX0KLQotV2luZFJ1bGUgUGxhdGZvcm1DQUxh
eWVyUmVtb3RlOjpzaGFwZVdpbmRSdWxlKCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9sYXllclR5
cGUgPT0gTGF5ZXJUeXBlU2hhcGVMYXllcik7Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy53aW5k
UnVsZTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldFNoYXBlV2luZFJ1bGUo
V2luZFJ1bGUgd2luZFJ1bGUpCi17Ci0gICAgQVNTRVJUKG1fbGF5ZXJUeXBlID09IExheWVyVHlw
ZVNoYXBlTGF5ZXIpOwotICAgIG1fcHJvcGVydGllcy53aW5kUnVsZSA9IHdpbmRSdWxlOwotICAg
IG1fcHJvcGVydGllcy5ub3RlUHJvcGVydGllc0NoYW5nZWQoUmVtb3RlTGF5ZXJUcmVlVHJhbnNh
Y3Rpb246OldpbmRSdWxlQ2hhbmdlZCk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3Rl
OjpyZXF1aXJlc0N1c3RvbUFwcGVhcmFuY2VVcGRhdGVPbkJvdW5kc0NoYW5nZSgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIG1fcHJvcGVydGllcy5jdXN0b21BcHBlYXJhbmNlID09IEdyYXBoaWNzTGF5
ZXI6OlNjcm9sbGluZ1NoYWRvdzsKLX0KLQotR3JhcGhpY3NMYXllcjo6Q3VzdG9tQXBwZWFyYW5j
ZSBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmN1c3RvbUFwcGVhcmFuY2UoKSBjb25zdAotewotICAg
IHJldHVybiBtX3Byb3BlcnRpZXMuY3VzdG9tQXBwZWFyYW5jZTsKLX0KLQotdm9pZCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGU6OnVwZGF0ZUN1c3RvbUFwcGVhcmFuY2UoR3JhcGhpY3NMYXllcjo6Q3Vz
dG9tQXBwZWFyYW5jZSBjdXN0b21BcHBlYXJhbmNlKQotewotICAgIG1fcHJvcGVydGllcy5jdXN0
b21BcHBlYXJhbmNlID0gY3VzdG9tQXBwZWFyYW5jZTsKLSAgICBtX3Byb3BlcnRpZXMubm90ZVBy
b3BlcnRpZXNDaGFuZ2VkKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpDdXN0b21BcHBlYXJh
bmNlQ2hhbmdlZCk7Ci19Ci0KLVJlZjxQbGF0Zm9ybUNBTGF5ZXI+IFBsYXRmb3JtQ0FMYXllclJl
bW90ZTo6Y3JlYXRlQ29tcGF0aWJsZUxheWVyKFBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBlIGxh
eWVyVHlwZSwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBjbGllbnQpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6Y3JlYXRlKGxheWVyVHlwZSwgY2xpZW50LCAqbV9j
b250ZXh0KTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OmVudW1lcmF0ZVJlY3Rz
QmVpbmdEcmF3bihDR0NvbnRleHRSZWYgY29udGV4dCwgdm9pZCAoXmJsb2NrKShDR1JlY3QpKQot
ewotICAgIG1fcHJvcGVydGllcy5iYWNraW5nU3RvcmUtPmVudW1lcmF0ZVJlY3RzQmVpbmdEcmF3
bihjb250ZXh0LCBibG9jayk7Ci19Ci0KLXVpbnQzMl90IFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6
aG9zdGluZ0NvbnRleHRJRCgpCi17Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0
dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIFBsYXRmb3JtQ0FMYXllclJlbW90ZTo6YmFja2luZ1N0b3Jl
Qnl0ZXNQZXJQaXhlbCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3Byb3BlcnRpZXMuYmFja2luZ1N0
b3JlKQotICAgICAgICByZXR1cm4gNDsKLQotICAgIHJldHVybiBtX3Byb3BlcnRpZXMuYmFja2lu
Z1N0b3JlLT5ieXRlc1BlclBpeGVsKCk7Ci19Ci0KLUxheWVyUG9vbCYgUGxhdGZvcm1DQUxheWVy
UmVtb3RlOjpsYXllclBvb2woKQotewotICAgIHJldHVybiBtX2NvbnRleHQtPmxheWVyUG9vbCgp
OwotfQotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
V2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaCBiL1NvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGUuaApkZWxl
dGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2MzVlZjkxZjMxOWM3MjdkZWNjMjJjYjFhODhm
YzA3NjgwMDgwZC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0g
YS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVt
b3RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAo
QykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
Ci0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24uaCIKLSNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtQ0FM
YXllci5oPgotI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1MYXllci5oPgotCi1uYW1lc3BhY2Ug
V2ViQ29yZSB7Ci1jbGFzcyBMYXllclBvb2w7Ci19Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1j
bGFzcyBSZW1vdGVMYXllclRyZWVDb250ZXh0OwotCi1jbGFzcyBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGUgOiBwdWJsaWMgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyIHsKLXB1YmxpYzoKLSAgICBzdGF0
aWMgUmVmPFBsYXRmb3JtQ0FMYXllclJlbW90ZT4gY3JlYXRlKFdlYkNvcmU6OlBsYXRmb3JtQ0FM
YXllcjo6TGF5ZXJUeXBlLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqLCBSZW1vdGVM
YXllclRyZWVDb250ZXh0Jik7Ci0gICAgc3RhdGljIFJlZjxQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU+
IGNyZWF0ZShQbGF0Zm9ybUxheWVyICosIFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllckNsaWVudCos
IFJlbW90ZUxheWVyVHJlZUNvbnRleHQmKTsKLSAgICBzdGF0aWMgUmVmPFBsYXRmb3JtQ0FMYXll
clJlbW90ZT4gY3JlYXRlKGNvbnN0IFBsYXRmb3JtQ0FMYXllclJlbW90ZSYsIFdlYkNvcmU6OlBs
YXRmb3JtQ0FMYXllckNsaWVudCosIFJlbW90ZUxheWVyVHJlZUNvbnRleHQmKTsKLQotICAgIHZp
cnR1YWwgflBsYXRmb3JtQ0FMYXllclJlbW90ZSgpOwotCi0gICAgUGxhdGZvcm1MYXllciogcGxh
dGZvcm1MYXllcigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG51bGxwdHI7IH0KLQotICAgIHZv
aWQgcmVjdXJzaXZlQnVpbGRUcmFuc2FjdGlvbihSZW1vdGVMYXllclRyZWVDb250ZXh0JiwgUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24mKTsKLQotICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5S
ZWN0KGNvbnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYgZGlydHlSZWN0KSBvdmVycmlkZTsKLSAgICB2
b2lkIHNldE5lZWRzRGlzcGxheSgpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBjb3B5Q29udGVudHNG
cm9tTGF5ZXIoUGxhdGZvcm1DQUxheWVyKikgb3ZlcnJpZGU7Ci0KLSAgICBXZWJDb3JlOjpQbGF0
Zm9ybUNBTGF5ZXIqIHN1cGVybGF5ZXIoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHJlbW92
ZUZyb21TdXBlcmxheWVyKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRTdWJsYXllcnMoY29uc3Qg
V2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyTGlzdCYpIG92ZXJyaWRlOwotICAgIHZvaWQgcmVtb3Zl
QWxsU3VibGF5ZXJzKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBhcHBlbmRTdWJsYXllcihXZWJDb3Jl
OjpQbGF0Zm9ybUNBTGF5ZXImKSBvdmVycmlkZTsKLSAgICB2b2lkIGluc2VydFN1YmxheWVyKFdl
YkNvcmU6OlBsYXRmb3JtQ0FMYXllciYsIHNpemVfdCBpbmRleCkgb3ZlcnJpZGU7Ci0gICAgdm9p
ZCByZXBsYWNlU3VibGF5ZXIoV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyJiByZWZlcmVuY2UsIFdl
YkNvcmU6OlBsYXRmb3JtQ0FMYXllciYpIG92ZXJyaWRlOwotICAgIGNvbnN0IFdlYkNvcmU6OlBs
YXRmb3JtQ0FMYXllckxpc3QqIGN1c3RvbVN1YmxheWVycygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0
dXJuIG51bGxwdHI7IH0KLSAgICB2b2lkIGFkb3B0U3VibGF5ZXJzKFdlYkNvcmU6OlBsYXRmb3Jt
Q0FMYXllciYgc291cmNlKSBvdmVycmlkZTsKLQotICAgIHZvaWQgYWRkQW5pbWF0aW9uRm9yS2V5
KGNvbnN0IFN0cmluZyYga2V5LCBXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uJikgb3ZlcnJp
ZGU7Ci0gICAgdm9pZCByZW1vdmVBbmltYXRpb25Gb3JLZXkoY29uc3QgU3RyaW5nJiBrZXkpIG92
ZXJyaWRlOwotICAgIFJlZlB0cjxXZWJDb3JlOjpQbGF0Zm9ybUNBQW5pbWF0aW9uPiBhbmltYXRp
b25Gb3JLZXkoY29uc3QgU3RyaW5nJiBrZXkpIG92ZXJyaWRlOwotICAgIHZvaWQgYW5pbWF0aW9u
U3RhcnRlZChjb25zdCBTdHJpbmcmIGtleSwgQ0ZUaW1lSW50ZXJ2YWwgYmVnaW5UaW1lKSBvdmVy
cmlkZTsKLSAgICB2b2lkIGFuaW1hdGlvbkVuZGVkKGNvbnN0IFN0cmluZyYga2V5KSBvdmVycmlk
ZTsKLQotICAgIHZvaWQgc2V0TWFzayhXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXIqKSBvdmVycmlk
ZTsKLQotICAgIGJvb2wgaXNPcGFxdWUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldE9w
YXF1ZShib29sKSBvdmVycmlkZTsKLQotICAgIFdlYkNvcmU6OkZsb2F0UmVjdCBib3VuZHMoKSBj
b25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldEJvdW5kcyhjb25zdCBXZWJDb3JlOjpGbG9hdFJl
Y3QmKSBvdmVycmlkZTsKLQotICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQzRCBwb3NpdGlvbigpIGNv
bnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0UG9zaXRpb24oY29uc3QgV2ViQ29yZTo6RmxvYXRQ
b2ludDNEJikgb3ZlcnJpZGU7Ci0KLSAgICBXZWJDb3JlOjpGbG9hdFBvaW50M0QgYW5jaG9yUG9p
bnQoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldEFuY2hvclBvaW50KGNvbnN0IFdlYkNv
cmU6OkZsb2F0UG9pbnQzRCYpIG92ZXJyaWRlOwotCi0gICAgV2ViQ29yZTo6VHJhbnNmb3JtYXRp
b25NYXRyaXggdHJhbnNmb3JtKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRUcmFuc2Zv
cm0oY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgmKSBvdmVycmlkZTsKLQotICAg
IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4IHN1YmxheWVyVHJhbnNmb3JtKCkgY29uc3Qg
b3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRTdWJsYXllclRyYW5zZm9ybShjb25zdCBXZWJDb3JlOjpU
cmFuc2Zvcm1hdGlvbk1hdHJpeCYpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBpc0hpZGRlbigpIGNv
bnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0SGlkZGVuKGJvb2wpIG92ZXJyaWRlOwotCi0gICAg
Ym9vbCBjb250ZW50c0hpZGRlbigpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0Q29udGVu
dHNIaWRkZW4oYm9vbCkgb3ZlcnJpZGU7Ci0KLSAgICBib29sIHVzZXJJbnRlcmFjdGlvbkVuYWJs
ZWQoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldFVzZXJJbnRlcmFjdGlvbkVuYWJsZWQo
Ym9vbCkgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldEJhY2tpbmdTdG9yZUF0dGFjaGVkKGJvb2wp
IG92ZXJyaWRlOwotICAgIGJvb2wgYmFja2luZ1N0b3JlQXR0YWNoZWQoKSBjb25zdCBvdmVycmlk
ZTsKLQotICAgIGJvb2wgZ2VvbWV0cnlGbGlwcGVkKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9p
ZCBzZXRHZW9tZXRyeUZsaXBwZWQoYm9vbCkgb3ZlcnJpZGU7Ci0KLSAgICBib29sIGlzRG91Ymxl
U2lkZWQoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldERvdWJsZVNpZGVkKGJvb2wpIG92
ZXJyaWRlOwotCi0gICAgYm9vbCBtYXNrc1RvQm91bmRzKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAg
dm9pZCBzZXRNYXNrc1RvQm91bmRzKGJvb2wpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBhY2NlbGVy
YXRlc0RyYXdpbmcoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldEFjY2VsZXJhdGVzRHJh
d2luZyhib29sKSBvdmVycmlkZTsKLQotICAgIGJvb2wgd2FudHNEZWVwQ29sb3JCYWNraW5nU3Rv
cmUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldFdhbnRzRGVlcENvbG9yQmFja2luZ1N0
b3JlKGJvb2wpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBzdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFz
ZWRUZXh0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRTdXBwb3J0c1N1YnBpeGVsQW50
aWFsaWFzZWRUZXh0KGJvb2wpIG92ZXJyaWRlOwotCi0gICAgQ0ZUeXBlUmVmIGNvbnRlbnRzKCkg
Y29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRDb250ZW50cyhDRlR5cGVSZWYpIG92ZXJyaWRl
OwotCi0gICAgdm9pZCBzZXRDb250ZW50c1JlY3QoY29uc3QgV2ViQ29yZTo6RmxvYXRSZWN0Jikg
b3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldE1pbmlmaWNhdGlvbkZpbHRlcihXZWJDb3JlOjpQbGF0
Zm9ybUNBTGF5ZXI6OkZpbHRlclR5cGUpIG92ZXJyaWRlOwotICAgIHZvaWQgc2V0TWFnbmlmaWNh
dGlvbkZpbHRlcihXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkZpbHRlclR5cGUpIG92ZXJyaWRl
OwotCi0gICAgV2ViQ29yZTo6Q29sb3IgYmFja2dyb3VuZENvbG9yKCkgY29uc3Qgb3ZlcnJpZGU7
Ci0gICAgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgV2ViQ29yZTo6Q29sb3ImKSBvdmVy
cmlkZTsKLQotICAgIHZvaWQgc2V0Qm9yZGVyV2lkdGgoZmxvYXQpIG92ZXJyaWRlOwotICAgIHZv
aWQgc2V0Qm9yZGVyQ29sb3IoY29uc3QgV2ViQ29yZTo6Q29sb3ImKSBvdmVycmlkZTsKLQotICAg
IGZsb2F0IG9wYWNpdHkoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldE9wYWNpdHkoZmxv
YXQpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBzZXRGaWx0ZXJzKGNvbnN0IFdlYkNvcmU6OkZpbHRl
ck9wZXJhdGlvbnMmKSBvdmVycmlkZTsKLSAgICBzdGF0aWMgYm9vbCBmaWx0ZXJzQ2FuQmVDb21w
b3NpdGVkKGNvbnN0IFdlYkNvcmU6OkZpbHRlck9wZXJhdGlvbnMmKTsKLSAgICB2b2lkIGNvcHlG
aWx0ZXJzRnJvbShjb25zdCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXImKSBvdmVycmlkZTsKLQot
I2lmIEVOQUJMRShDU1NfQ09NUE9TSVRJTkcpCi0gICAgdm9pZCBzZXRCbGVuZE1vZGUoV2ViQ29y
ZTo6QmxlbmRNb2RlKSBvdmVycmlkZTsKLSNlbmRpZgotCi0gICAgdm9pZCBzZXROYW1lKGNvbnN0
IFN0cmluZyYpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBzZXRTcGVlZChmbG9hdCkgb3ZlcnJpZGU7
Ci0KLSAgICB2b2lkIHNldFRpbWVPZmZzZXQoQ0ZUaW1lSW50ZXJ2YWwpIG92ZXJyaWRlOwotCi0g
ICAgZmxvYXQgY29udGVudHNTY2FsZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0Q29u
dGVudHNTY2FsZShmbG9hdCkgb3ZlcnJpZGU7Ci0KLSAgICBmbG9hdCBjb3JuZXJSYWRpdXMoKSBj
b25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldENvcm5lclJhZGl1cyhmbG9hdCkgb3ZlcnJpZGU7
Ci0KLSAgICB2b2lkIHNldEVkZ2VBbnRpYWxpYXNpbmdNYXNrKHVuc2lnbmVkKSBvdmVycmlkZTsK
LQotICAgIC8vIEZJWE1FOiBIYXZpbmcgYm90aCBzaGFwZVJvdW5kZWRSZWN0IGFuZCBzaGFwZVBh
dGggaXMgcmVkdW5kYW50LiBXZSBjb3VsZCB1c2Ugc2hhcGVQYXRoIGZvciBldmVyeXRoaW5nLgot
ICAgIFdlYkNvcmU6OkZsb2F0Um91bmRlZFJlY3Qgc2hhcGVSb3VuZGVkUmVjdCgpIGNvbnN0IG92
ZXJyaWRlOwotICAgIHZvaWQgc2V0U2hhcGVSb3VuZGVkUmVjdChjb25zdCBXZWJDb3JlOjpGbG9h
dFJvdW5kZWRSZWN0Jikgb3ZlcnJpZGU7Ci0KLSAgICBXZWJDb3JlOjpQYXRoIHNoYXBlUGF0aCgp
IGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0U2hhcGVQYXRoKGNvbnN0IFdlYkNvcmU6OlBh
dGgmKSBvdmVycmlkZTsKLQotICAgIFdlYkNvcmU6OldpbmRSdWxlIHNoYXBlV2luZFJ1bGUoKSBj
b25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldFNoYXBlV2luZFJ1bGUoV2ViQ29yZTo6V2luZFJ1
bGUpIG92ZXJyaWRlOwotCi0gICAgV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6Q3VzdG9tQXBwZWFy
YW5jZSBjdXN0b21BcHBlYXJhbmNlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCB1cGRhdGVD
dXN0b21BcHBlYXJhbmNlKFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OkN1c3RvbUFwcGVhcmFuY2Up
IG92ZXJyaWRlOwotCi0gICAgV2ViQ29yZTo6VGlsZWRCYWNraW5nKiB0aWxlZEJhY2tpbmcoKSBv
dmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9Ci0KLSAgICBSZWY8V2ViQ29yZTo6UGxhdGZvcm1D
QUxheWVyPiBjbG9uZShXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyKSBjb25z
dCBvdmVycmlkZTsKLQotICAgIFJlZjxQbGF0Zm9ybUNBTGF5ZXI+IGNyZWF0ZUNvbXBhdGlibGVM
YXllcihXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSwgV2ViQ29yZTo6UGxhdGZv
cm1DQUxheWVyQ2xpZW50KikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGVudW1lcmF0ZVJl
Y3RzQmVpbmdEcmF3bihDR0NvbnRleHRSZWYsIHZvaWQgKF5ibG9jaykoQ0dSZWN0KSkgb3ZlcnJp
ZGU7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGhvc3RpbmdDb250ZXh0SUQoKTsKLQotICAgIHVu
c2lnbmVkIGJhY2tpbmdTdG9yZUJ5dGVzUGVyUGl4ZWwoKSBjb25zdCBvdmVycmlkZTsKLQotICAg
IHZvaWQgc2V0Q2xvbmVkTGF5ZXIoY29uc3QgUGxhdGZvcm1DQUxheWVyKik7Ci0KLSAgICBSZW1v
dGVMYXllclRyZWVUcmFuc2FjdGlvbjo6TGF5ZXJQcm9wZXJ0aWVzJiBwcm9wZXJ0aWVzKCkgeyBy
ZXR1cm4gbV9wcm9wZXJ0aWVzOyB9Ci0gICAgY29uc3QgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rp
b246OkxheWVyUHJvcGVydGllcyYgcHJvcGVydGllcygpIGNvbnN0IHsgcmV0dXJuIG1fcHJvcGVy
dGllczsgfQotCi0gICAgdm9pZCBkaWRDb21taXQoKTsKLQotICAgIHZvaWQgY2xlYXJDb250ZXh0
KCkgeyBtX2NvbnRleHQgPSBudWxscHRyOyB9Ci0gICAgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCog
Y29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fY29udGV4dDsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAg
UGxhdGZvcm1DQUxheWVyUmVtb3RlKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllcjo6TGF5ZXJUeXBl
LCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVD
b250ZXh0JiBjb250ZXh0KTsKLSAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUoY29uc3QgUGxhdGZv
cm1DQUxheWVyUmVtb3RlJiwgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyQ2xpZW50KiwgUmVtb3Rl
TGF5ZXJUcmVlQ29udGV4dCYpOwotCi0gICAgdm9pZCB1cGRhdGVDbG9uZWRMYXllclByb3BlcnRp
ZXMoUGxhdGZvcm1DQUxheWVyUmVtb3RlJiBjbG9uZSwgYm9vbCBjb3B5Q29udGVudHMgPSB0cnVl
KSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBib29sIGlzUGxhdGZvcm1DQUxheWVyUmVtb3RlKCkg
Y29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZvaWQgZW5zdXJlQmFja2luZ1N0
b3JlKCk7Ci0gICAgdm9pZCB1cGRhdGVCYWNraW5nU3RvcmUoKTsKLSAgICB2b2lkIHJlbW92ZVN1
YmxheWVyKFBsYXRmb3JtQ0FMYXllclJlbW90ZSopOwotCi0gICAgYm9vbCByZXF1aXJlc0N1c3Rv
bUFwcGVhcmFuY2VVcGRhdGVPbkJvdW5kc0NoYW5nZSgpIGNvbnN0OwotCi0gICAgV2ViQ29yZTo6
TGF5ZXJQb29sJiBsYXllclBvb2woKSBvdmVycmlkZTsKLQotICAgIFJlbW90ZUxheWVyVHJlZVRy
YW5zYWN0aW9uOjpMYXllclByb3BlcnRpZXMgbV9wcm9wZXJ0aWVzOwotICAgIFdlYkNvcmU6OlBs
YXRmb3JtQ0FMYXllckxpc3QgbV9jaGlsZHJlbjsKLSAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUq
IG1fc3VwZXJsYXllciB7IG51bGxwdHIgfTsKLSAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUqIG1f
bWFza0xheWVyIHsgbnVsbHB0ciB9OwotICAgIEhhc2hNYXA8U3RyaW5nLCBSZWZQdHI8V2ViQ29y
ZTo6UGxhdGZvcm1DQUFuaW1hdGlvbj4+IG1fYW5pbWF0aW9uczsKLQotICAgIGJvb2wgbV9hY2Nl
bGVyYXRlc0RyYXdpbmcgeyBmYWxzZSB9OwotICAgIGJvb2wgbV93YW50c0RlZXBDb2xvckJhY2tp
bmdTdG9yZSB7IGZhbHNlIH07Ci0KLSAgICBSZW1vdGVMYXllclRyZWVDb250ZXh0KiBtX2NvbnRl
eHQ7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKLQotU1BFQ0lBTElaRV9UWVBFX1RSQUlU
U19QTEFURk9STV9DQUxBWUVSKFdlYktpdDo6UGxhdGZvcm1DQUxheWVyUmVtb3RlLCBpc1BsYXRm
b3JtQ0FMYXllclJlbW90ZSgpKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNz
L1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5oIGIvU291cmNlL1dlYktp
dC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5oCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQ2NGNmMGNmYjQwMWYwYjdjZTNmMTZiNGMw
YWI0ZDA4ZDI2NjQxLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGVDdXN0b20uaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgot
ICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAot
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1
ZGUgIlBsYXRmb3JtQ0FMYXllclJlbW90ZS5oIgotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotY2xh
c3MgTGF5ZXJIb3N0aW5nQ29udGV4dDsKLQotLy8gUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9t
IGlzIHVzZWQgZm9yIENBTGF5ZXJzIHRoYXQgbGl2ZSBpbiB0aGUgd2ViIHByb2Nlc3MgYW5kIGFy
ZSBob3N0ZWQgaW50byB0aGUgVUkgcHJvY2VzcyB2aWEgcmVtb3RlIGNvbnRleHQuCi1jbGFzcyBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20gZmluYWwgOiBwdWJsaWMgUGxhdGZvcm1DQUxheWVy
UmVtb3RlIHsKLSAgICBmcmllbmQgY2xhc3MgUGxhdGZvcm1DQUxheWVyUmVtb3RlOwotcHVibGlj
OgotICAgIHN0YXRpYyBSZWY8UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBjcmVhdGUoUGxhdGZvcm1M
YXllciAqLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqLCBSZW1vdGVMYXllclRyZWVD
b250ZXh0Jik7Ci0KLSAgICB2aXJ0dWFsIH5QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20oKTsK
LQotICAgIFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdCBvdmVycmlkZSB7IHJl
dHVybiBtX3BsYXRmb3JtTGF5ZXIuZ2V0KCk7IH0KLQotICAgIHVpbnQzMl90IGhvc3RpbmdDb250
ZXh0SUQoKSBvdmVycmlkZTsKLQotICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0
IFdlYkNvcmU6OkZsb2F0UmVjdCYgZGlydHlSZWN0KSBvdmVycmlkZTsKLSAgICB2b2lkIHNldE5l
ZWRzRGlzcGxheSgpIG92ZXJyaWRlOwotCi1wcml2YXRlOgotICAgIFBsYXRmb3JtQ0FMYXllclJl
bW90ZUN1c3RvbShXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSwgUGxhdGZvcm1M
YXllciAqLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXll
clRyZWVDb250ZXh0Jik7Ci0KLSAgICBSZWY8V2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyPiBjbG9u
ZShXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyKSBjb25zdCBvdmVycmlkZTsK
LQotICAgIGJvb2wgaXNQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b20oKSBjb25zdCBvdmVycmlk
ZSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICBDRlR5cGVSZWYgY29udGVudHMoKSBjb25zdCBvdmVy
cmlkZTsKLSAgICB2b2lkIHNldENvbnRlbnRzKENGVHlwZVJlZikgb3ZlcnJpZGU7Ci0KLSAgICBz
dGQ6OnVuaXF1ZV9wdHI8TGF5ZXJIb3N0aW5nQ29udGV4dD4gbV9sYXllckhvc3RpbmdDb250ZXh0
OwotICAgIFJldGFpblB0cjxQbGF0Zm9ybUxheWVyPiBtX3BsYXRmb3JtTGF5ZXI7Ci0gICAgYm9v
bCBtX3Byb3ZpZGVzQ29udGVudHM7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKLQotU1BF
Q0lBTElaRV9UWVBFX1RSQUlUU19QTEFURk9STV9DQUxBWUVSKFdlYktpdDo6UGxhdGZvcm1DQUxh
eWVyUmVtb3RlQ3VzdG9tLCBpc1BsYXRmb3JtQ0FMYXllclJlbW90ZSgpKQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90
ZUN1c3RvbS5tbSBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVDdXN0b20ubW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2
OWI5YjMxNWFjODNkYjZkNzg4YzhmMTM2MzIyZTg2Nzc2MmM2MDAuLjAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNzL1dl
YlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbS5tbQorKysgL2Rldi9udWxsCkBA
IC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgot
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0g
Ki8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVyUmVtb3Rl
Q3VzdG9tLmgiCi0KLSNpbXBvcnQgIkxheWVySG9zdGluZ0NvbnRleHQuaCIKLSNpbXBvcnQgIlJl
bW90ZUxheWVyVHJlZUNvbnRleHQuaCIKLSNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZVByb3BlcnR5
QXBwbGllci5oIgotI2ltcG9ydCAiV2ViUHJvY2Vzcy5oIgotI2ltcG9ydCA8QVZGb3VuZGF0aW9u
L0FWRm91bmRhdGlvbi5oPgotI2ltcG9ydCA8V2ViQ29yZS9HcmFwaGljc0xheWVyQ0EuaD4KLSNp
bXBvcnQgPFdlYkNvcmUvUGxhdGZvcm1DQUxheWVyQ29jb2EuaD4KLSNpbXBvcnQgPFdlYkNvcmUv
V2ViQ29yZUNBTGF5ZXJFeHRyYXMuaD4KLSNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KLSNpbXBv
cnQgPHd0Zi9Tb2Z0TGlua2luZy5oPgotCi1TT0ZUX0xJTktfRlJBTUVXT1JLX09QVElPTkFMKEFW
Rm91bmRhdGlvbikKLVNPRlRfTElOS19DTEFTU19PUFRJT05BTChBVkZvdW5kYXRpb24sIEFWUGxh
eWVyTGF5ZXIpCi0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotCi1uYW1lc3BhY2UgV2ViS2l0
IHsKLQotc3RhdGljIE5TU3RyaW5nICogY29uc3QgcGxhdGZvcm1DQUxheWVyUG9pbnRlciA9IEAi
V0tQbGF0Zm9ybUNBTGF5ZXIiOwotCi1SZWY8UGxhdGZvcm1DQUxheWVyUmVtb3RlPiBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVDdXN0b206OmNyZWF0ZShQbGF0Zm9ybUxheWVyICpwbGF0Zm9ybUxheWVy
LCBQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBj
b250ZXh0KQotewotICAgIGF1dG8gbGF5ZXIgPSBhZG9wdFJlZigqbmV3IFBsYXRmb3JtQ0FMYXll
clJlbW90ZUN1c3RvbShQbGF0Zm9ybUNBTGF5ZXJDb2NvYTo6bGF5ZXJUeXBlRm9yUGxhdGZvcm1M
YXllcihwbGF0Zm9ybUxheWVyKSwgcGxhdGZvcm1MYXllciwgb3duZXIsIGNvbnRleHQpKTsKLSAg
ICBjb250ZXh0LmxheWVyV2FzQ3JlYXRlZChsYXllci5nZXQoKSwgbGF5ZXItPmxheWVyVHlwZSgp
KTsKLSAgICByZXR1cm4gV1RGTW92ZShsYXllcik7Ci19Ci0KLVBsYXRmb3JtQ0FMYXllclJlbW90
ZUN1c3RvbTo6UGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKExheWVyVHlwZSBsYXllclR5cGUs
IFBsYXRmb3JtTGF5ZXIgKiBjdXN0b21MYXllciwgUGxhdGZvcm1DQUxheWVyQ2xpZW50KiBvd25l
ciwgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dCYgY29udGV4dCkKLSAgICA6IFBsYXRmb3JtQ0FMYXll
clJlbW90ZShsYXllclR5cGUsIG93bmVyLCBjb250ZXh0KQotewotICAgIHN3aXRjaCAoY29udGV4
dC5sYXllckhvc3RpbmdNb2RlKCkpIHsKLSAgICBjYXNlIExheWVySG9zdGluZ01vZGU6OkluUHJv
Y2VzczoKLSAgICAgICAgbV9sYXllckhvc3RpbmdDb250ZXh0ID0gTGF5ZXJIb3N0aW5nQ29udGV4
dDo6Y3JlYXRlRm9yUG9ydChXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS5jb21wb3NpdGluZ1JlbmRl
clNlcnZlclBvcnQoKSk7Ci0gICAgICAgIGJyZWFrOwotI2lmIEhBVkUoT1VUX09GX1BST0NFU1Nf
TEFZRVJfSE9TVElORykKLSAgICBjYXNlIExheWVySG9zdGluZ01vZGU6Ok91dE9mUHJvY2VzczoK
LSAgICAgICAgbV9sYXllckhvc3RpbmdDb250ZXh0ID0gTGF5ZXJIb3N0aW5nQ29udGV4dDo6Y3Jl
YXRlRm9yRXh0ZXJuYWxIb3N0aW5nUHJvY2VzcygpOwotI2lmIFBMQVRGT1JNKElPUykKLSAgICAg
ICAgaWYgKGxheWVyVHlwZSA9PSBMYXllclR5cGVBVlBsYXllckxheWVyKSB7Ci0gICAgICAgICAg
ICBmbG9hdCBzY2FsZUZhY3RvciA9IGNvbnRleHQuZGV2aWNlU2NhbGVGYWN0b3IoKTsKLSAgICAg
ICAgICAgIC8vIFNldCBhIHNjYWxlIGZhY3RvciBoZXJlIHRvIG1ha2UgY29udmVydFJlY3Q6dG9M
YXllcjpuaWwgdGFrZSBzY2FsZSBmYWN0b3IgaW50byBhY2NvdW50LiA8cmRhcjovL3Byb2JsZW0v
MTgzMTY1NDI+LgotICAgICAgICAgICAgLy8gVGhpcyBzY2FsZSBmYWN0b3IgaXMgaW52ZXJ0ZWQg
aW4gdGhlIGhvc3RpbmcgcHJvY2Vzcy4KLSAgICAgICAgICAgIFtjdXN0b21MYXllciBzZXRUcmFu
c2Zvcm06Q0FUcmFuc2Zvcm0zRE1ha2VTY2FsZShzY2FsZUZhY3Rvciwgc2NhbGVGYWN0b3IsIDEp
XTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgfQotCi0g
ICAgbV9sYXllckhvc3RpbmdDb250ZXh0LT5zZXRSb290TGF5ZXIoY3VzdG9tTGF5ZXIpOwotICAg
IFtjdXN0b21MYXllciBzZXRWYWx1ZTpbTlNWYWx1ZSB2YWx1ZVdpdGhQb2ludGVyOnRoaXNdIGZv
cktleTpwbGF0Zm9ybUNBTGF5ZXJQb2ludGVyXTsKLQotICAgIG1fcGxhdGZvcm1MYXllciA9IGN1
c3RvbUxheWVyOwotICAgIFtjdXN0b21MYXllciB3ZWJfZGlzYWJsZUFsbEFjdGlvbnNdOwotCi0g
ICAgbV9wcm92aWRlc0NvbnRlbnRzID0gbGF5ZXJUeXBlID09IExheWVyVHlwZUNvbnRlbnRzUHJv
dmlkZWRMYXllcjsKLQotICAgIHByb3BlcnRpZXMoKS5wb3NpdGlvbiA9IEZsb2F0UG9pbnQzRChj
dXN0b21MYXllci5wb3NpdGlvbi54LCBjdXN0b21MYXllci5wb3NpdGlvbi55LCBjdXN0b21MYXll
ci56UG9zaXRpb24pOwotICAgIHByb3BlcnRpZXMoKS5hbmNob3JQb2ludCA9IEZsb2F0UG9pbnQz
RChjdXN0b21MYXllci5hbmNob3JQb2ludC54LCBjdXN0b21MYXllci5hbmNob3JQb2ludC55LCBj
dXN0b21MYXllci5hbmNob3JQb2ludFopOwotICAgIHByb3BlcnRpZXMoKS5ib3VuZHMgPSBjdXN0
b21MYXllci5ib3VuZHM7Ci0gICAgcHJvcGVydGllcygpLmNvbnRlbnRzUmVjdCA9IGN1c3RvbUxh
eWVyLmNvbnRlbnRzUmVjdDsKLX0KLQotUGxhdGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tOjp+UGxh
dGZvcm1DQUxheWVyUmVtb3RlQ3VzdG9tKCkKLXsKLSAgICBbbV9wbGF0Zm9ybUxheWVyIHNldFZh
bHVlOm5pbCBmb3JLZXk6cGxhdGZvcm1DQUxheWVyUG9pbnRlcl07Ci19Ci0KLXVpbnQzMl90IFBs
YXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6aG9zdGluZ0NvbnRleHRJRCgpCi17Ci0gICAgcmV0
dXJuIG1fbGF5ZXJIb3N0aW5nQ29udGV4dC0+Y29udGV4dElEKCk7Ci19Ci0KLVJlZjxXZWJDb3Jl
OjpQbGF0Zm9ybUNBTGF5ZXI+IFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6Y2xvbmUoUGxh
dGZvcm1DQUxheWVyQ2xpZW50KiBvd25lcikgY29uc3QKLXsKLSAgICBSZXRhaW5QdHI8Q0FMYXll
ciAqPiBjbG9uZWRMYXllcjsKLSAgICBib29sIGNvcHlDb250ZW50cyA9IHRydWU7Ci0KLSAgICBp
ZiAobGF5ZXJUeXBlKCkgPT0gTGF5ZXJUeXBlQVZQbGF5ZXJMYXllcikgewotICAgICAgICAKLSAg
ICAgICAgaWYgKFtwbGF0Zm9ybUxheWVyKCkgaXNLaW5kT2ZDbGFzczpnZXRBVlBsYXllckxheWVy
Q2xhc3MoKV0pIHsKLSAgICAgICAgICAgIGNsb25lZExheWVyID0gYWRvcHROUyhbYWxsb2NBVlBs
YXllckxheWVySW5zdGFuY2UoKSBpbml0XSk7Ci0KLSAgICAgICAgICAgIEFWUGxheWVyTGF5ZXIq
IGRlc3RpbmF0aW9uUGxheWVyTGF5ZXIgPSBzdGF0aWNfY2FzdDxBVlBsYXllckxheWVyICo+KGNs
b25lZExheWVyLmdldCgpKTsKLSAgICAgICAgICAgIEFWUGxheWVyTGF5ZXIqIHNvdXJjZVBsYXll
ckxheWVyID0gc3RhdGljX2Nhc3Q8QVZQbGF5ZXJMYXllciAqPihwbGF0Zm9ybUxheWVyKCkpOwot
ICAgICAgICAgICAgZGlzcGF0Y2hfYXN5bmMoZGlzcGF0Y2hfZ2V0X21haW5fcXVldWUoKSwgXnsK
LSAgICAgICAgICAgICAgICBbZGVzdGluYXRpb25QbGF5ZXJMYXllciBzZXRQbGF5ZXI6W3NvdXJj
ZVBsYXllckxheWVyIHBsYXllcl1dOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICAvLyBPbiBpT1MsIHRoZSBBVlBsYXllckxheWVyIGlzIGluc2lkZSBhIFdl
YlZpZGVvQ29udGFpbmVyTGF5ZXIuIFRoaXMgY29kZSBuZWVkcyB0byBzaGFyZSBsb2dpYyB3aXRo
IE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbk9iakM6OmNyZWF0ZUFWUGxheWVyTGF5ZXIo
KS4KLSAgICAgICAgICAgIGNsb25lZExheWVyID0gYWRvcHROUyhbW0NBTGF5ZXIgYWxsb2NdIGlu
aXRdKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvcHlDb250ZW50cyA9IGZhbHNlOwotICAgIH0g
ZWxzZSBpZiAobGF5ZXJUeXBlKCkgPT0gTGF5ZXJUeXBlQ29udGVudHNQcm92aWRlZExheWVyKSB7
Ci0gICAgICAgIGNsb25lZExheWVyID0gYWRvcHROUyhbW0NBTGF5ZXIgYWxsb2NdIGluaXRdKTsK
LSAgICAgICAgLy8gRklYTUU6IGN1cnJlbnRseSBjb3B5aW5nIFdlYkdMIGNvbnRlbnRzIGJyZWFr
cyB0aGUgb3JpZ2luYWwgbGF5ZXIuCi0gICAgICAgIGNvcHlDb250ZW50cyA9IGZhbHNlOwotICAg
IH0KLQotICAgIGF1dG8gY2xvbmUgPSBhZG9wdFJlZigqbmV3IFBsYXRmb3JtQ0FMYXllclJlbW90
ZUN1c3RvbShsYXllclR5cGUoKSwgY2xvbmVkTGF5ZXIuZ2V0KCksIG93bmVyLCAqY29udGV4dCgp
KSk7Ci0gICAgY29udGV4dCgpLT5sYXllcldhc0NyZWF0ZWQoY2xvbmUuZ2V0KCksIGNsb25lLT5s
YXllclR5cGUoKSk7Ci0KLSAgICB1cGRhdGVDbG9uZWRMYXllclByb3BlcnRpZXMoY2xvbmUuZ2V0
KCksIGNvcHlDb250ZW50cyk7Ci0KLSAgICBjbG9uZS0+c2V0Q2xvbmVkTGF5ZXIodGhpcyk7Ci0g
ICAgcmV0dXJuIFdURk1vdmUoY2xvbmUpOwotfQotCi1DRlR5cGVSZWYgUGxhdGZvcm1DQUxheWVy
UmVtb3RlQ3VzdG9tOjpjb250ZW50cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFttX3BsYXRmb3Jt
TGF5ZXIgY29udGVudHNdOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZUN1c3RvbTo6
c2V0Q29udGVudHMoQ0ZUeXBlUmVmIGNvbnRlbnRzKQotewotICAgIFttX3BsYXRmb3JtTGF5ZXIg
c2V0Q29udGVudHM6KGlkKWNvbnRlbnRzXTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1v
dGVDdXN0b206OnNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCi17
Ci0gICAgaWYgKG1fcHJvdmlkZXNDb250ZW50cykKLSAgICAgICAgW21fcGxhdGZvcm1MYXllciBz
ZXROZWVkc0Rpc3BsYXlJblJlY3Q6cmVjdF07Ci0gICAgZWxzZQotICAgICAgICBQbGF0Zm9ybUNB
TGF5ZXJSZW1vdGU6OnNldE5lZWRzRGlzcGxheUluUmVjdChyZWN0KTsKLX0KLQotdm9pZCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0b206OnNldE5lZWRzRGlzcGxheSgpCi17Ci0gICAgaWYgKG1f
cHJvdmlkZXNDb250ZW50cykKLSAgICAgICAgW21fcGxhdGZvcm1MYXllciBzZXROZWVkc0Rpc3Bs
YXldOwotICAgIGVsc2UKLSAgICAgICAgUGxhdGZvcm1DQUxheWVyUmVtb3RlOjpzZXROZWVkc0Rp
c3BsYXkoKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRC
YWNraW5nLmNwcCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCBmZWMzMGMyZDIxNmU3YTQ5YjJjMmZmMTNlZTY5ZjA5ZWE3ODVhMjgxLi4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJv
Y2Vzcy9XZWJQYWdlL21hYy9QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuY3BwCisr
KyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAot
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW1wb3J0ICJQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmcuaCIKLQotI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVl
Q29udGV4dC5oIgotI2ltcG9ydCA8V2ViQ29yZS9HcmFwaGljc0xheWVyQ0EuaD4KLSNpbXBvcnQg
PFdlYkNvcmUvUGxhdGZvcm1DQUxheWVyQ29jb2EuaD4KLSNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIu
aD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1Q
bGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OlBsYXRmb3JtQ0FMYXllclJlbW90ZVRp
bGVkQmFja2luZyhMYXllclR5cGUgbGF5ZXJUeXBlLCBQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93
bmVyLCBSZW1vdGVMYXllclRyZWVDb250ZXh0JiBjb250ZXh0KQotICAgIDogUGxhdGZvcm1DQUxh
eWVyUmVtb3RlKGxheWVyVHlwZSwgb3duZXIsIGNvbnRleHQpCi0gICAgLCBtX3RpbGVDb250cm9s
bGVyKHN0ZDo6bWFrZV91bmlxdWU8VGlsZUNvbnRyb2xsZXI+KHRoaXMpKQotewotfQotCi1QbGF0
Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6On5QbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxl
ZEJhY2tpbmcoKQotewotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2lu
Zzo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYgZGlydHlSZWN0KQotewot
ICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldE5lZWRzRGlzcGxheUluUmVjdChlbmNsb3NpbmdJbnRS
ZWN0KGRpcnR5UmVjdCkpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFj
a2luZzo6c2V0TmVlZHNEaXNwbGF5KCkKLXsKLSAgICBtX3RpbGVDb250cm9sbGVyLT5zZXROZWVk
c0Rpc3BsYXkoKTsKLX0KLQotY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyTGlzdCogUGxh
dGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpjdXN0b21TdWJsYXllcnMoKSBjb25zdAot
ewotICAgIG1fY3VzdG9tU3VibGF5ZXJzID0gbV90aWxlQ29udHJvbGxlci0+Y29udGFpbmVyTGF5
ZXJzKCk7Ci0gICAgcmV0dXJuICZtX2N1c3RvbVN1YmxheWVyczsKLX0KLQotdm9pZCBQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldEJvdW5kcyhjb25zdCBXZWJDb3JlOjpGbG9h
dFJlY3QmIGJvdW5kcykKLXsKLSAgICBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU6OnNldEJvdW5kcyhi
b3VuZHMpOwotICAgIG1fdGlsZUNvbnRyb2xsZXItPnRpbGVDYWNoZUxheWVyQm91bmRzQ2hhbmdl
ZCgpOwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6aXNPcGFx
dWUoKSBjb25zdAotewotICAgIHJldHVybiBtX3RpbGVDb250cm9sbGVyLT50aWxlc0FyZU9wYXF1
ZSgpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6c2V0T3Bh
cXVlKGJvb2wgb3BhcXVlKQotewotICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldFRpbGVzT3BhcXVl
KG9wYXF1ZSk7Ci19Ci0KLWJvb2wgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjph
Y2NlbGVyYXRlc0RyYXdpbmcoKSBjb25zdAotewotICAgIHJldHVybiBtX3RpbGVDb250cm9sbGVy
LT5hY2NlbGVyYXRlc0RyYXdpbmcoKTsKLX0KLQotdm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVU
aWxlZEJhY2tpbmc6OnNldEFjY2VsZXJhdGVzRHJhd2luZyhib29sIGFjY2VsZXJhdGVzRHJhd2lu
ZykKLXsKLSAgICBtX3RpbGVDb250cm9sbGVyLT5zZXRBY2NlbGVyYXRlc0RyYXdpbmcoYWNjZWxl
cmF0ZXNEcmF3aW5nKTsKLX0KLQotYm9vbCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tp
bmc6OndhbnRzRGVlcENvbG9yQmFja2luZ1N0b3JlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV90
aWxlQ29udHJvbGxlci0+d2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUoKTsKLX0KLQotdm9pZCBQ
bGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldFdhbnRzRGVlcENvbG9yQmFja2lu
Z1N0b3JlKGJvb2wgd2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUpCi17Ci0gICAgbV90aWxlQ29u
dHJvbGxlci0+c2V0V2FudHNEZWVwQ29sb3JCYWNraW5nU3RvcmUod2FudHNEZWVwQ29sb3JCYWNr
aW5nU3RvcmUpOwotfQotCi1ib29sIFBsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6
c3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1f
dGlsZUNvbnRyb2xsZXItPnN1cHBvcnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRleHQoKTsKLX0KLQot
dm9pZCBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldFN1cHBvcnRzU3VicGl4
ZWxBbnRpYWxpYXNlZFRleHQoYm9vbCBzdXBwb3J0c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KQot
ewotICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldFN1cHBvcnRzU3VicGl4ZWxBbnRpYWxpYXNlZFRl
eHQoc3VwcG9ydHNTdWJwaXhlbEFudGlhbGlhc2VkVGV4dCk7Ci19Ci0KLWZsb2F0IFBsYXRmb3Jt
Q0FMYXllclJlbW90ZVRpbGVkQmFja2luZzo6Y29udGVudHNTY2FsZSgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1fdGlsZUNvbnRyb2xsZXItPmNvbnRlbnRzU2NhbGUoKTsKLX0KLQotdm9pZCBQbGF0
Zm9ybUNBTGF5ZXJSZW1vdGVUaWxlZEJhY2tpbmc6OnNldENvbnRlbnRzU2NhbGUoZmxvYXQgc2Nh
bGUpCi17Ci0gICAgbV90aWxlQ29udHJvbGxlci0+c2V0Q29udGVudHNTY2FsZShzY2FsZSk7Ci19
Ci0KLXZvaWQgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nOjpzZXRCb3JkZXJXaWR0
aChmbG9hdCBib3JkZXJXaWR0aCkKLXsKLSAgICBtX3RpbGVDb250cm9sbGVyLT5zZXRUaWxlRGVi
dWdCb3JkZXJXaWR0aChib3JkZXJXaWR0aCAvIDIpOwotfQotCi12b2lkIFBsYXRmb3JtQ0FMYXll
clJlbW90ZVRpbGVkQmFja2luZzo6c2V0Qm9yZGVyQ29sb3IoY29uc3QgV2ViQ29yZTo6Q29sb3Im
IGNvbG9yKQotewotICAgIG1fdGlsZUNvbnRyb2xsZXItPnNldFRpbGVEZWJ1Z0JvcmRlckNvbG9y
KGNvbG9yKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRC
YWNraW5nLmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUGxhdGZvcm1D
QUxheWVyUmVtb3RlVGlsZWRCYWNraW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDBkZGZjZTg1MmQ1MTI3MDNkMzRmNDM1MmEzOWY0NWEzZTVkMTVhNTkuLjAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9XZWJQcm9jZXNz
L1dlYlBhZ2UvbWFjL1BsYXRmb3JtQ0FMYXllclJlbW90ZVRpbGVkQmFja2luZy5oCisrKyAvZGV2
L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQot
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgotICovCi0KLSNpZm5kZWYgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nX2gK
LSNkZWZpbmUgUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nX2gKLQotI2luY2x1ZGUg
IlBsYXRmb3JtQ0FMYXllclJlbW90ZS5oIgotI2luY2x1ZGUgPFdlYkNvcmUvVGlsZUNvbnRyb2xs
ZXIuaD4KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFBsYXRmb3JtQ0FMYXllclJlbW90
ZVRpbGVkQmFja2luZyBmaW5hbCA6IHB1YmxpYyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUgewotICAg
IGZyaWVuZCBjbGFzcyBQbGF0Zm9ybUNBTGF5ZXJSZW1vdGU7Ci1wdWJsaWM6Ci0gICAgdmlydHVh
bCB+UGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nKCk7Ci0KLXByaXZhdGU6Ci0gICAg
UGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nKFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXll
cjo6TGF5ZXJUeXBlLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXJDbGllbnQqIG93bmVyLCBSZW1v
dGVMYXllclRyZWVDb250ZXh0Jik7Ci0KLSAgICBXZWJDb3JlOjpUaWxlZEJhY2tpbmcqIHRpbGVk
QmFja2luZygpIG92ZXJyaWRlIHsgcmV0dXJuIG1fdGlsZUNvbnRyb2xsZXIuZ2V0KCk7IH0KLQot
ICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYg
ZGlydHlSZWN0KSBvdmVycmlkZTsKLSAgICB2b2lkIHNldE5lZWRzRGlzcGxheSgpIG92ZXJyaWRl
OwotCi0gICAgY29uc3QgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyTGlzdCogY3VzdG9tU3VibGF5
ZXJzKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIHNldEJvdW5kcyhjb25zdCBXZWJDb3Jl
OjpGbG9hdFJlY3QmKSBvdmVycmlkZTsKLSAgICAKLSAgICBib29sIGlzT3BhcXVlKCkgY29uc3Qg
b3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRPcGFxdWUoYm9vbCkgb3ZlcnJpZGU7Ci0gICAgCi0gICAg
Ym9vbCBhY2NlbGVyYXRlc0RyYXdpbmcoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldEFj
Y2VsZXJhdGVzRHJhd2luZyhib29sKSBvdmVycmlkZTsKLQotICAgIGJvb2wgd2FudHNEZWVwQ29s
b3JCYWNraW5nU3RvcmUoKSBjb25zdCBvdmVycmlkZTsKLSAgICB2b2lkIHNldFdhbnRzRGVlcENv
bG9yQmFja2luZ1N0b3JlKGJvb2wpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBzdXBwb3J0c1N1YnBp
eGVsQW50aWFsaWFzZWRUZXh0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzZXRTdXBwb3J0
c1N1YnBpeGVsQW50aWFsaWFzZWRUZXh0KGJvb2wpIG92ZXJyaWRlOwotCi0gICAgZmxvYXQgY29u
dGVudHNTY2FsZSgpIGNvbnN0IG92ZXJyaWRlOwotICAgIHZvaWQgc2V0Q29udGVudHNTY2FsZShm
bG9hdCkgb3ZlcnJpZGU7Ci0gICAgCi0gICAgdm9pZCBzZXRCb3JkZXJXaWR0aChmbG9hdCkgb3Zl
cnJpZGU7Ci0gICAgdm9pZCBzZXRCb3JkZXJDb2xvcihjb25zdCBXZWJDb3JlOjpDb2xvciYpIG92
ZXJyaWRlOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlRpbGVDb250cm9sbGVyPiBt
X3RpbGVDb250cm9sbGVyOwotICAgIG11dGFibGUgV2ViQ29yZTo6UGxhdGZvcm1DQUxheWVyTGlz
dCBtX2N1c3RvbVN1YmxheWVyczsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdAotCi0jZW5k
aWYgLy8gUGxhdGZvcm1DQUxheWVyUmVtb3RlVGlsZWRCYWNraW5nX2gKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXllclRyZWVDb250ZXh0
LmggYi9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJUcmVl
Q29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTU0OGVhMWM5NDUwM2Fl
OWEwYjA1ZDM2MmI0NzFiMWQwMGEwY2I4Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1v
dGVMYXllclRyZWVDb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgot
ICogQ29weXJpZ2h0IChDKSAyMDEyIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAq
Ci0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5E
IElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
Ci0gKi8KLQotI2lmbmRlZiBSZW1vdGVMYXllclRyZWVDb250ZXh0X2gKLSNkZWZpbmUgUmVtb3Rl
TGF5ZXJUcmVlQ29udGV4dF9oCi0KLSNpbmNsdWRlICJMYXllclRyZWVDb250ZXh0LmgiCi0jaW5j
bHVkZSAiUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmVDb2xsZWN0aW9uLmgiCi0jaW5jbHVkZSAiUmVt
b3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24uaCIKLSNpbmNsdWRlIDxXZWJDb3JlL0dyYXBoaWNzTGF5
ZXJGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8V2ViQ29yZS9MYXllclBvb2wuaD4KLSNpbmNsdWRlIDxX
ZWJDb3JlL1BsYXRmb3JtQ0FMYXllci5oPgotI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KLQotbmFt
ZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFBsYXRmb3JtQ0FMYXllclJlbW90ZTsKLWNsYXNzIFdl
YlBhZ2U7Ci0KLS8vIEZJWE1FOiBUaGlzIGNsYXNzIGRvZXNuJ3QgZG8gbXVjaCBub3cuIFJvbGwg
aW50byBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYT8KLWNsYXNzIFJlbW90ZUxheWVyVHJlZUNv
bnRleHQgOiBwdWJsaWMgV2ViQ29yZTo6R3JhcGhpY3NMYXllckZhY3RvcnkgewotcHVibGljOgot
ICAgIGV4cGxpY2l0IFJlbW90ZUxheWVyVHJlZUNvbnRleHQoV2ViUGFnZSYpOwotICAgIH5SZW1v
dGVMYXllclRyZWVDb250ZXh0KCk7Ci0KLSAgICB2b2lkIGxheWVyV2FzQ3JlYXRlZChQbGF0Zm9y
bUNBTGF5ZXJSZW1vdGUmLCBXZWJDb3JlOjpQbGF0Zm9ybUNBTGF5ZXI6OkxheWVyVHlwZSk7Ci0g
ICAgdm9pZCBsYXllcldpbGxCZURlc3Ryb3llZChQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmKTsKLQot
ICAgIHZvaWQgYmFja2luZ1N0b3JlV2FzQ3JlYXRlZChSZW1vdGVMYXllckJhY2tpbmdTdG9yZSYp
OwotICAgIHZvaWQgYmFja2luZ1N0b3JlV2lsbEJlRGVzdHJveWVkKFJlbW90ZUxheWVyQmFja2lu
Z1N0b3JlJik7Ci0gICAgYm9vbCBiYWNraW5nU3RvcmVXaWxsQmVEaXNwbGF5ZWQoUmVtb3RlTGF5
ZXJCYWNraW5nU3RvcmUmKTsKLQotICAgIFdlYkNvcmU6OkxheWVyUG9vbCYgbGF5ZXJQb29sKCkg
eyByZXR1cm4gbV9sYXllclBvb2w7IH0KLQotICAgIGZsb2F0IGRldmljZVNjYWxlRmFjdG9yKCkg
Y29uc3Q7Ci0KLSAgICBMYXllckhvc3RpbmdNb2RlIGxheWVySG9zdGluZ01vZGUoKSBjb25zdDsK
LQotICAgIHZvaWQgYnVpbGRUcmFuc2FjdGlvbihSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbiYs
IFdlYkNvcmU6OlBsYXRmb3JtQ0FMYXllciYgcm9vdExheWVyKTsKLQotICAgIHZvaWQgbGF5ZXJQ
cm9wZXJ0eUNoYW5nZWRXaGlsZUJ1aWxkaW5nVHJhbnNhY3Rpb24oUGxhdGZvcm1DQUxheWVyUmVt
b3RlJik7Ci0KLSAgICAvLyBGcm9tIHRoZSBVSSBwcm9jZXNzCi0gICAgdm9pZCBhbmltYXRpb25E
aWRTdGFydChXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQsIGNvbnN0IFN0
cmluZyYga2V5LCBkb3VibGUgc3RhcnRUaW1lKTsKLSAgICB2b2lkIGFuaW1hdGlvbkRpZEVuZChX
ZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQsIGNvbnN0IFN0cmluZyYga2V5
KTsKLQotICAgIHZvaWQgd2lsbFN0YXJ0QW5pbWF0aW9uT25MYXllcihQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGUmKTsKLQotICAgIFJlbW90ZUxheWVyQmFja2luZ1N0b3JlQ29sbGVjdGlvbiYgYmFja2lu
Z1N0b3JlQ29sbGVjdGlvbigpIHsgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ29sbGVjdGlvbjsgfQot
ICAgIAotICAgIHZvaWQgc2V0TmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludChib29sIG5leHRG
bHVzaElzRm9ySW1tZWRpYXRlUGFpbnQpIHsgbV9uZXh0Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50
ID0gbmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQYWludDsgfQotICAgIGJvb2wgbmV4dEZsdXNoSXNG
b3JJbW1lZGlhdGVQYWludCgpIGNvbnN0IHsgcmV0dXJuIG1fbmV4dEZsdXNoSXNGb3JJbW1lZGlh
dGVQYWludDsgfQotCi1wcml2YXRlOgotICAgIC8vIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJGYWN0
b3J5Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI+IGNyZWF0ZUdy
YXBoaWNzTGF5ZXIoV2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6VHlwZSwgV2ViQ29yZTo6R3JhcGhp
Y3NMYXllckNsaWVudCYpIG92ZXJyaWRlOwotCi0gICAgV2ViUGFnZSYgbV93ZWJQYWdlOwotCi0g
ICAgSGFzaE1hcDxXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQsIFJlbW90
ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpMYXllckNyZWF0aW9uUHJvcGVydGllcz4gbV9jcmVhdGVk
TGF5ZXJzOwotICAgIFZlY3RvcjxXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVy
SUQ+IG1fZGVzdHJveWVkTGF5ZXJzOwotCi0gICAgSGFzaE1hcDxXZWJDb3JlOjpHcmFwaGljc0xh
eWVyOjpQbGF0Zm9ybUxheWVySUQsIFBsYXRmb3JtQ0FMYXllclJlbW90ZSo+IG1fbGl2ZUxheWVy
czsKLSAgICBIYXNoTWFwPFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCwg
UGxhdGZvcm1DQUxheWVyUmVtb3RlKj4gbV9sYXllcnNXaXRoQW5pbWF0aW9uczsKLQotICAgIFJl
bW90ZUxheWVyQmFja2luZ1N0b3JlQ29sbGVjdGlvbiBtX2JhY2tpbmdTdG9yZUNvbGxlY3Rpb247
Ci0gICAgCi0gICAgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24qIG1fY3VycmVudFRyYW5zYWN0
aW9uOwotCi0gICAgV2ViQ29yZTo6TGF5ZXJQb29sIG1fbGF5ZXJQb29sOwotICAgIAotICAgIGJv
b2wgbV9uZXh0Rmx1c2hJc0ZvckltbWVkaWF0ZVBhaW50IHsgZmFsc2UgfTsKLX07Ci0KLX0gLy8g
bmFtZXNwYWNlIFdlYktpdAotCi0jZW5kaWYgLy8gUmVtb3RlTGF5ZXJUcmVlQ29udGV4dF9oCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5
ZXJUcmVlQ29udGV4dC5tbSBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9S
ZW1vdGVMYXllclRyZWVDb250ZXh0Lm1tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5
MGM0ODZiNTgyYjBkMTU4NzA1NmE0OGQxODEyZGIzOWY3YjUyYjAyLi4wMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9X
ZWJQYWdlL21hYy9SZW1vdGVMYXllclRyZWVDb250ZXh0Lm1tCisrKyAvZGV2L251bGwKQEAgLTEs
MTYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0
OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW1wb3J0ICJjb25maWcuaCIKLSNpbXBvcnQgIlJl
bW90ZUxheWVyVHJlZUNvbnRleHQuaCIKLQotI2ltcG9ydCAiR2VuZXJpY0NhbGxiYWNrLmgiCi0j
aW1wb3J0ICJHcmFwaGljc0xheWVyQ0FSZW1vdGUuaCIKLSNpbXBvcnQgIlBsYXRmb3JtQ0FMYXll
clJlbW90ZS5oIgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmVDb2xsZWN0aW9uLmgi
Ci0jaW1wb3J0ICJSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlvbi5oIgotI2ltcG9ydCAiV2ViUGFn
ZS5oIgotI2ltcG9ydCA8V2ViQ29yZS9GcmFtZVZpZXcuaD4KLSNpbXBvcnQgPFdlYkNvcmUvTWFp
bkZyYW1lLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL1BhZ2UuaD4KLSNpbXBvcnQgPHd0Zi9TZXRGb3JT
Y29wZS5oPgotI2ltcG9ydCA8d3RmL1N5c3RlbVRyYWNpbmcuaD4KLQotdXNpbmcgbmFtZXNwYWNl
IFdlYkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1SZW1vdGVMYXllclRyZWVDb250ZXh0
OjpSZW1vdGVMYXllclRyZWVDb250ZXh0KFdlYlBhZ2UmIHdlYlBhZ2UpCi0gICAgOiBtX3dlYlBh
Z2Uod2ViUGFnZSkKLSAgICAsIG1fY3VycmVudFRyYW5zYWN0aW9uKG51bGxwdHIpCi17Ci19Ci0K
LVJlbW90ZUxheWVyVHJlZUNvbnRleHQ6On5SZW1vdGVMYXllclRyZWVDb250ZXh0KCkKLXsKLSAg
ICBmb3IgKGF1dG8mIGxheWVyIDogbV9saXZlTGF5ZXJzLnZhbHVlcygpKQotICAgICAgICBsYXll
ci0+Y2xlYXJDb250ZXh0KCk7Ci19Ci0KLWZsb2F0IFJlbW90ZUxheWVyVHJlZUNvbnRleHQ6OmRl
dmljZVNjYWxlRmFjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV93ZWJQYWdlLmRldmljZVNj
YWxlRmFjdG9yKCk7Ci19Ci0KLUxheWVySG9zdGluZ01vZGUgUmVtb3RlTGF5ZXJUcmVlQ29udGV4
dDo6bGF5ZXJIb3N0aW5nTW9kZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fd2ViUGFnZS5sYXll
ckhvc3RpbmdNb2RlKCk7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6bGF5ZXJX
YXNDcmVhdGVkKFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgbGF5ZXIsIFBsYXRmb3JtQ0FMYXllcjo6
TGF5ZXJUeXBlIHR5cGUpCi17Ci0gICAgR3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklEIGxh
eWVySUQgPSBsYXllci5sYXllcklEKCk7Ci0KLSAgICBSZW1vdGVMYXllclRyZWVUcmFuc2FjdGlv
bjo6TGF5ZXJDcmVhdGlvblByb3BlcnRpZXMgY3JlYXRpb25Qcm9wZXJ0aWVzOwotICAgIGNyZWF0
aW9uUHJvcGVydGllcy5sYXllcklEID0gbGF5ZXJJRDsKLSAgICBjcmVhdGlvblByb3BlcnRpZXMu
dHlwZSA9IHR5cGU7Ci0KLSAgICBpZiAobGF5ZXIuaXNQbGF0Zm9ybUNBTGF5ZXJSZW1vdGVDdXN0
b20oKSkgewotICAgICAgICBjcmVhdGlvblByb3BlcnRpZXMuaG9zdGluZ0NvbnRleHRJRCA9IGxh
eWVyLmhvc3RpbmdDb250ZXh0SUQoKTsKLSAgICAgICAgY3JlYXRpb25Qcm9wZXJ0aWVzLmhvc3Rp
bmdEZXZpY2VTY2FsZUZhY3RvciA9IGRldmljZVNjYWxlRmFjdG9yKCk7Ci0gICAgfQotCi0gICAg
bV9jcmVhdGVkTGF5ZXJzLmFkZChsYXllcklELCBXVEZNb3ZlKGNyZWF0aW9uUHJvcGVydGllcykp
OwotICAgIG1fbGl2ZUxheWVycy5hZGQobGF5ZXJJRCwgJmxheWVyKTsKLX0KLQotdm9pZCBSZW1v
dGVMYXllclRyZWVDb250ZXh0OjpsYXllcldpbGxCZURlc3Ryb3llZChQbGF0Zm9ybUNBTGF5ZXJS
ZW1vdGUmIGxheWVyKQotewotICAgIEFTU0VSVChsYXllci5sYXllcklEKCkpOwotICAgIEdyYXBo
aWNzTGF5ZXI6OlBsYXRmb3JtTGF5ZXJJRCBsYXllcklEID0gbGF5ZXIubGF5ZXJJRCgpOwotCi0g
ICAgbV9jcmVhdGVkTGF5ZXJzLnJlbW92ZShsYXllcklEKTsKLSAgICBtX2xpdmVMYXllcnMucmVt
b3ZlKGxheWVySUQpOwotCi0gICAgQVNTRVJUKCFtX2Rlc3Ryb3llZExheWVycy5jb250YWlucyhs
YXllcklEKSk7Ci0gICAgbV9kZXN0cm95ZWRMYXllcnMuYXBwZW5kKGxheWVySUQpOwotICAgIAot
ICAgIG1fbGF5ZXJzV2l0aEFuaW1hdGlvbnMucmVtb3ZlKGxheWVySUQpOwotfQotCi12b2lkIFJl
bW90ZUxheWVyVHJlZUNvbnRleHQ6OmJhY2tpbmdTdG9yZVdhc0NyZWF0ZWQoUmVtb3RlTGF5ZXJC
YWNraW5nU3RvcmUmIGJhY2tpbmdTdG9yZSkKLXsKLSAgICBtX2JhY2tpbmdTdG9yZUNvbGxlY3Rp
b24uYmFja2luZ1N0b3JlV2FzQ3JlYXRlZChiYWNraW5nU3RvcmUpOwotfQotCi12b2lkIFJlbW90
ZUxheWVyVHJlZUNvbnRleHQ6OmJhY2tpbmdTdG9yZVdpbGxCZURlc3Ryb3llZChSZW1vdGVMYXll
ckJhY2tpbmdTdG9yZSYgYmFja2luZ1N0b3JlKQotewotICAgIG1fYmFja2luZ1N0b3JlQ29sbGVj
dGlvbi5iYWNraW5nU3RvcmVXaWxsQmVEZXN0cm95ZWQoYmFja2luZ1N0b3JlKTsKLX0KLQotYm9v
bCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpiYWNraW5nU3RvcmVXaWxsQmVEaXNwbGF5ZWQoUmVt
b3RlTGF5ZXJCYWNraW5nU3RvcmUmIGJhY2tpbmdTdG9yZSkKLXsKLSAgICByZXR1cm4gbV9iYWNr
aW5nU3RvcmVDb2xsZWN0aW9uLmJhY2tpbmdTdG9yZVdpbGxCZURpc3BsYXllZChiYWNraW5nU3Rv
cmUpOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8R3JhcGhpY3NMYXllcj4gUmVtb3RlTGF5ZXJUcmVl
Q29udGV4dDo6Y3JlYXRlR3JhcGhpY3NMYXllcihXZWJDb3JlOjpHcmFwaGljc0xheWVyOjpUeXBl
IGxheWVyVHlwZSwgR3JhcGhpY3NMYXllckNsaWVudCYgY2xpZW50KQotewotICAgIHJldHVybiBz
dGQ6Om1ha2VfdW5pcXVlPEdyYXBoaWNzTGF5ZXJDQVJlbW90ZT4obGF5ZXJUeXBlLCBjbGllbnQs
ICp0aGlzKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjpidWlsZFRyYW5zYWN0
aW9uKFJlbW90ZUxheWVyVHJlZVRyYW5zYWN0aW9uJiB0cmFuc2FjdGlvbiwgUGxhdGZvcm1DQUxh
eWVyJiByb290TGF5ZXIpCi17Ci0gICAgVHJhY2VTY29wZSB0cmFjaW5nU2NvcGUoQnVpbGRUcmFu
c2FjdGlvblN0YXJ0LCBCdWlsZFRyYW5zYWN0aW9uRW5kKTsKLQotICAgIFBsYXRmb3JtQ0FMYXll
clJlbW90ZSYgcm9vdExheWVyUmVtb3RlID0gZG93bmNhc3Q8UGxhdGZvcm1DQUxheWVyUmVtb3Rl
Pihyb290TGF5ZXIpOwotICAgIHRyYW5zYWN0aW9uLnNldFJvb3RMYXllcklEKHJvb3RMYXllclJl
bW90ZS5sYXllcklEKCkpOwotCi0gICAgbV9jdXJyZW50VHJhbnNhY3Rpb24gPSAmdHJhbnNhY3Rp
b247Ci0gICAgcm9vdExheWVyUmVtb3RlLnJlY3Vyc2l2ZUJ1aWxkVHJhbnNhY3Rpb24oKnRoaXMs
IHRyYW5zYWN0aW9uKTsKLSAgICBtX2N1cnJlbnRUcmFuc2FjdGlvbiA9IG51bGxwdHI7Ci0KLSAg
ICBWZWN0b3I8UmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb246OkxheWVyQ3JlYXRpb25Qcm9wZXJ0
aWVzPiBjcmVhdGVkTGF5ZXJQcm9wZXJ0aWVzOwotICAgIGNvcHlWYWx1ZXNUb1ZlY3RvcihtX2Ny
ZWF0ZWRMYXllcnMsIGNyZWF0ZWRMYXllclByb3BlcnRpZXMpOwotICAgIHRyYW5zYWN0aW9uLnNl
dENyZWF0ZWRMYXllcnMoV1RGTW92ZShjcmVhdGVkTGF5ZXJQcm9wZXJ0aWVzKSk7Ci0gICAgdHJh
bnNhY3Rpb24uc2V0RGVzdHJveWVkTGF5ZXJJRHMoV1RGTW92ZShtX2Rlc3Ryb3llZExheWVycykp
OwotICAgIAotICAgIG1fY3JlYXRlZExheWVycy5jbGVhcigpOwotfQotCi12b2lkIFJlbW90ZUxh
eWVyVHJlZUNvbnRleHQ6OmxheWVyUHJvcGVydHlDaGFuZ2VkV2hpbGVCdWlsZGluZ1RyYW5zYWN0
aW9uKFBsYXRmb3JtQ0FMYXllclJlbW90ZSYgbGF5ZXIpCi17Ci0gICAgaWYgKG1fY3VycmVudFRy
YW5zYWN0aW9uKQotICAgICAgICBtX2N1cnJlbnRUcmFuc2FjdGlvbi0+bGF5ZXJQcm9wZXJ0aWVz
Q2hhbmdlZChsYXllcik7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlQ29udGV4dDo6d2lsbFN0
YXJ0QW5pbWF0aW9uT25MYXllcihQbGF0Zm9ybUNBTGF5ZXJSZW1vdGUmIGxheWVyKQotewotICAg
IG1fbGF5ZXJzV2l0aEFuaW1hdGlvbnMuYWRkKGxheWVyLmxheWVySUQoKSwgJmxheWVyKTsKLX0K
LQotdm9pZCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjphbmltYXRpb25EaWRTdGFydChXZWJDb3Jl
OjpHcmFwaGljc0xheWVyOjpQbGF0Zm9ybUxheWVySUQgbGF5ZXJJRCwgY29uc3QgU3RyaW5nJiBr
ZXksIGRvdWJsZSBzdGFydFRpbWUpCi17Ci0gICAgYXV0byBpdCA9IG1fbGF5ZXJzV2l0aEFuaW1h
dGlvbnMuZmluZChsYXllcklEKTsKLSAgICBpZiAoaXQgIT0gbV9sYXllcnNXaXRoQW5pbWF0aW9u
cy5lbmQoKSkKLSAgICAgICAgaXQtPnZhbHVlLT5hbmltYXRpb25TdGFydGVkKGtleSwgc3RhcnRU
aW1lKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVDb250ZXh0OjphbmltYXRpb25EaWRFbmQo
V2ViQ29yZTo6R3JhcGhpY3NMYXllcjo6UGxhdGZvcm1MYXllcklEIGxheWVySUQsIGNvbnN0IFN0
cmluZyYga2V5KQotewotICAgIGF1dG8gaXQgPSBtX2xheWVyc1dpdGhBbmltYXRpb25zLmZpbmQo
bGF5ZXJJRCk7Ci0gICAgaWYgKGl0ICE9IG1fbGF5ZXJzV2l0aEFuaW1hdGlvbnMuZW5kKCkpCi0g
ICAgICAgIGl0LT52YWx1ZS0+YW5pbWF0aW9uRW5kZWQoa2V5KTsKLX0KLQotfSAvLyBuYW1lc3Bh
Y2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYlByb2Nlc3MvV2ViUGFnZS9t
YWMvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEuaCBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vz
cy9XZWJQYWdlL21hYy9SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5oCmRlbGV0ZWQgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCA0Mjc1YWUzMTE1YTZkMjUxODRiYzJiZGRkODJkMDRhNTVhOTk5N2Jm
Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9X
ZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5o
CisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MTItMjAxNCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRgotICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNwcmFn
bWEgb25jZQotCi0jaW5jbHVkZSAiQ2FsbGJhY2tJRC5oIgotI2luY2x1ZGUgIkRyYXdpbmdBcmVh
LmgiCi0jaW5jbHVkZSAiR3JhcGhpY3NMYXllckNBUmVtb3RlLmgiCi0jaW5jbHVkZSAiUmVtb3Rl
TGF5ZXJUcmVlVHJhbnNhY3Rpb24uaCIKLSNpbmNsdWRlIDxXZWJDb3JlL0dyYXBoaWNzTGF5ZXJD
bGllbnQuaD4KLSNpbmNsdWRlIDxXZWJDb3JlL1RpbWVyLmg+Ci0jaW5jbHVkZSA8YXRvbWljPgot
I2luY2x1ZGUgPGRpc3BhdGNoL2Rpc3BhdGNoLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4K
LSNpbmNsdWRlIDx3dGYvV2Vha1B0ci5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1jbGFzcyBQ
bGF0Zm9ybUNBTGF5ZXI7Ci19Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1jbGFzcyBSZW1vdGVM
YXllclRyZWVDb250ZXh0OwotY2xhc3MgUmVtb3RlTGF5ZXJUcmVlRGlzcGxheVJlZnJlc2hNb25p
dG9yOwotCi1jbGFzcyBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYSA6IHB1YmxpYyBEcmF3aW5n
QXJlYSwgcHVibGljIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXJDbGllbnQgewotICAgIGZyaWVuZCBj
bGFzcyBSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3I7Ci1wdWJsaWM6Ci0gICAg
UmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEoV2ViUGFnZSYsIGNvbnN0IFdlYlBhZ2VDcmVhdGlv
blBhcmFtZXRlcnMmKTsKLSAgICB2aXJ0dWFsIH5SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYSgp
OwotCi0gICAgdWludDY0X3QgbmV4dFRyYW5zYWN0aW9uSUQoKSBjb25zdCB7IHJldHVybiBtX2N1
cnJlbnRUcmFuc2FjdGlvbklEICsgMTsgfQotICAgIHVpbnQ2NF90IGxhc3RDb21taXR0ZWRUcmFu
c2FjdGlvbklEKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50VHJhbnNhY3Rpb25JRDsgfQotCi0g
ICAgV2Vha1B0cjxSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYT4gY3JlYXRlV2Vha1B0cigpIHsg
cmV0dXJuIG1fd2Vha1B0ckZhY3RvcnkuY3JlYXRlV2Vha1B0cigpOyB9Ci0KLXByaXZhdGU6Ci0g
ICAgLy8gRHJhd2luZ0FyZWEKLSAgICB2b2lkIHNldE5lZWRzRGlzcGxheSgpIG92ZXJyaWRlOwot
ICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IFdlYkNvcmU6OkludFJlY3QmKSBv
dmVycmlkZTsKLSAgICB2b2lkIHNjcm9sbChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBzY3JvbGxS
ZWN0LCBjb25zdCBXZWJDb3JlOjpJbnRTaXplJiBzY3JvbGxEZWx0YSkgb3ZlcnJpZGU7Ci0gICAg
dm9pZCB1cGRhdGVHZW9tZXRyeShjb25zdCBXZWJDb3JlOjpJbnRTaXplJiB2aWV3U2l6ZSwgY29u
c3QgV2ViQ29yZTo6SW50U2l6ZSYgbGF5ZXJQb3NpdGlvbiwgYm9vbCBmbHVzaFN5bmNocm9ub3Vz
bHksIGNvbnN0IFdlYkNvcmU6Ok1hY2hTZW5kUmlnaHQmIGZlbmNlUG9ydCkgb3ZlcnJpZGU7Ci0K
LSAgICBXZWJDb3JlOjpHcmFwaGljc0xheWVyRmFjdG9yeSogZ3JhcGhpY3NMYXllckZhY3Rvcnko
KSBvdmVycmlkZTsKLSAgICB2b2lkIHNldFJvb3RDb21wb3NpdGluZ0xheWVyKFdlYkNvcmU6Okdy
YXBoaWNzTGF5ZXIqKSBvdmVycmlkZTsKLSAgICB2b2lkIHNjaGVkdWxlQ29tcG9zaXRpbmdMYXll
ckZsdXNoKCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVz
aEltbWVkaWF0ZWx5KCkgb3ZlcnJpZGU7Ci0gICAgdm9pZCBhdHRhY2hWaWV3T3ZlcmxheUdyYXBo
aWNzTGF5ZXIoV2ViQ29yZTo6RnJhbWUqLCBXZWJDb3JlOjpHcmFwaGljc0xheWVyKikgb3ZlcnJp
ZGU7Ci0KLSAgICB2b2lkIGFkZFRyYW5zYWN0aW9uQ2FsbGJhY2tJRChDYWxsYmFja0lEKSBvdmVy
cmlkZTsKLQotICAgIFJlZlB0cjxXZWJDb3JlOjpEaXNwbGF5UmVmcmVzaE1vbml0b3I+IGNyZWF0
ZURpc3BsYXlSZWZyZXNoTW9uaXRvcihXZWJDb3JlOjpQbGF0Zm9ybURpc3BsYXlJRCkgb3ZlcnJp
ZGU7Ci0gICAgdm9pZCB3aWxsRGVzdHJveURpc3BsYXlSZWZyZXNoTW9uaXRvcihXZWJDb3JlOjpE
aXNwbGF5UmVmcmVzaE1vbml0b3IqKTsKLQotICAgIGJvb2wgc2hvdWxkVXNlVGlsZWRCYWNraW5n
Rm9yRnJhbWVWaWV3KGNvbnN0IFdlYkNvcmU6OkZyYW1lVmlldyYpIG92ZXJyaWRlOwotCi0gICAg
dm9pZCB1cGRhdGVQcmVmZXJlbmNlcyhjb25zdCBXZWJQcmVmZXJlbmNlc1N0b3JlJikgb3ZlcnJp
ZGU7Ci0KLSAgICBib29sIHN1cHBvcnRzQXN5bmNTY3JvbGxpbmcoKSBvdmVycmlkZSB7IHJldHVy
biB0cnVlOyB9Ci0KLSAgICB2b2lkIHNldExheWVyVHJlZVN0YXRlSXNGcm96ZW4oYm9vbCkgb3Zl
cnJpZGU7Ci0KLSAgICB2b2lkIGZvcmNlUmVwYWludCgpIG92ZXJyaWRlOwotICAgIGJvb2wgZm9y
Y2VSZXBhaW50QXN5bmMoQ2FsbGJhY2tJRCkgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KLQot
ICAgIHZvaWQgc2V0Vmlld0V4cG9zZWRSZWN0KHN0ZDo6b3B0aW9uYWw8V2ViQ29yZTo6RmxvYXRS
ZWN0Pikgb3ZlcnJpZGU7Ci0gICAgc3RkOjpvcHRpb25hbDxXZWJDb3JlOjpGbG9hdFJlY3Q+IHZp
ZXdFeHBvc2VkUmVjdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1fc2Nyb2xsZWRWaWV3RXhw
b3NlZFJlY3Q7IH0KLQotICAgIHZvaWQgYWNjZWxlcmF0ZWRBbmltYXRpb25EaWRTdGFydCh1aW50
NjRfdCBsYXllcklELCBjb25zdCBTdHJpbmcmIGtleSwgZG91YmxlIHN0YXJ0VGltZSkgb3ZlcnJp
ZGU7Ci0gICAgdm9pZCBhY2NlbGVyYXRlZEFuaW1hdGlvbkRpZEVuZCh1aW50NjRfdCBsYXllcklE
LCBjb25zdCBTdHJpbmcmIGtleSkgb3ZlcnJpZGU7Ci0KLSNpZiBQTEFURk9STShJT1MpCi0gICAg
V2ViQ29yZTo6RmxvYXRSZWN0IGV4cG9zZWRDb250ZW50UmVjdCgpIGNvbnN0IG92ZXJyaWRlOwot
ICAgIHZvaWQgc2V0RXhwb3NlZENvbnRlbnRSZWN0KGNvbnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYp
IG92ZXJyaWRlOwotI2VuZGlmCi0KLSAgICB2b2lkIGRpZFVwZGF0ZSgpIG92ZXJyaWRlOwotCi0j
aWYgUExBVEZPUk0oSU9TKQotICAgIHZvaWQgc2V0RGV2aWNlU2NhbGVGYWN0b3IoZmxvYXQpIG92
ZXJyaWRlOwotI2VuZGlmCi0KLSAgICB2b2lkIG1haW5GcmFtZUNvbnRlbnRTaXplQ2hhbmdlZChj
b25zdCBXZWJDb3JlOjpJbnRTaXplJikgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIGFjdGl2aXR5U3Rh
dGVEaWRDaGFuZ2UoV2ViQ29yZTo6QWN0aXZpdHlTdGF0ZTo6RmxhZ3MgY2hhbmdlZCwgYm9vbCB3
YW50c0RpZFVwZGF0ZUFjdGl2aXR5U3RhdGUsIGNvbnN0IFZlY3RvcjxDYWxsYmFja0lEPiYgY2Fs
bGJhY2tJRHMpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBhZGp1c3RMYXllckZsdXNoVGhyb3R0bGlu
ZyhXZWJDb3JlOjpMYXllckZsdXNoVGhyb3R0bGVTdGF0ZTo6RmxhZ3MpIG92ZXJyaWRlOwotCi0g
ICAgYm9vbCBkaXNwYXRjaERpZFJlYWNoTGF5b3V0TWlsZXN0b25lKFdlYkNvcmU6OkxheW91dE1p
bGVzdG9uZXMpIG92ZXJyaWRlOwotCi0gICAgdm9pZCB1cGRhdGVTY3JvbGxlZEV4cG9zZWRSZWN0
KCk7Ci0gICAgdm9pZCB1cGRhdGVSb290TGF5ZXJzKCk7Ci0KLSAgICB2b2lkIGZsdXNoTGF5ZXJz
KCk7Ci0KLSAgICBXZWJDb3JlOjpUaWxlZEJhY2tpbmcqIG1haW5GcmFtZVRpbGVkQmFja2luZygp
IGNvbnN0OwotCi0gICAgdWludDY0X3QgdGFrZU5leHRUcmFuc2FjdGlvbklEKCkgeyByZXR1cm4g
KyttX2N1cnJlbnRUcmFuc2FjdGlvbklEOyB9Ci0KLSAgICBib29sIG1hcmtMYXllcnNWb2xhdGls
ZUltbWVkaWF0ZWx5SWZQb3NzaWJsZSgpIG92ZXJyaWRlOwotCi0gICAgY2xhc3MgQmFja2luZ1N0
b3JlRmx1c2hlciA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxCYWNraW5nU3RvcmVGbHVz
aGVyPiB7Ci0gICAgcHVibGljOgotICAgICAgICBzdGF0aWMgUmVmPEJhY2tpbmdTdG9yZUZsdXNo
ZXI+IGNyZWF0ZShJUEM6OkNvbm5lY3Rpb24qLCBzdGQ6OnVuaXF1ZV9wdHI8SVBDOjpFbmNvZGVy
PiwgVmVjdG9yPFJldGFpblB0cjxDR0NvbnRleHRSZWY+Pik7Ci0KLSAgICAgICAgdm9pZCBmbHVz
aCgpOwotICAgICAgICBib29sIGhhc0ZsdXNoZWQoKSBjb25zdCB7IHJldHVybiBtX2hhc0ZsdXNo
ZWQ7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIEJhY2tpbmdTdG9yZUZsdXNoZXIoSVBDOjpD
b25uZWN0aW9uKiwgc3RkOjp1bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4sIFZlY3RvcjxSZXRhaW5Q
dHI8Q0dDb250ZXh0UmVmPj4pOwotCi0gICAgICAgIFJlZlB0cjxJUEM6OkNvbm5lY3Rpb24+IG1f
Y29ubmVjdGlvbjsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4gbV9jb21t
aXRFbmNvZGVyOwotICAgICAgICBWZWN0b3I8UmV0YWluUHRyPENHQ29udGV4dFJlZj4+IG1fY29u
dGV4dHNUb0ZsdXNoOwotCi0gICAgICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1faGFzRmx1c2hlZDsK
LSAgICB9OwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFJlbW90ZUxheWVyVHJlZUNvbnRleHQ+IG1f
cmVtb3RlTGF5ZXJUcmVlQ29udGV4dDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6R3Jh
cGhpY3NMYXllcj4gbV9yb290TGF5ZXI7Ci0KLSAgICBXZWJDb3JlOjpJbnRTaXplIG1fdmlld1Np
emU7Ci0KLSAgICBzdGQ6Om9wdGlvbmFsPFdlYkNvcmU6OkZsb2F0UmVjdD4gbV92aWV3RXhwb3Nl
ZFJlY3Q7Ci0gICAgc3RkOjpvcHRpb25hbDxXZWJDb3JlOjpGbG9hdFJlY3Q+IG1fc2Nyb2xsZWRW
aWV3RXhwb3NlZFJlY3Q7Ci0KLSAgICBXZWJDb3JlOjpUaW1lciBtX2xheWVyRmx1c2hUaW1lcjsK
LSAgICBib29sIG1faXNGbHVzaGluZ1N1c3BlbmRlZCB7IGZhbHNlIH07Ci0gICAgYm9vbCBtX2hh
c0RlZmVycmVkRmx1c2ggeyBmYWxzZSB9OwotICAgIGJvb2wgbV9pc1Rocm90dGxpbmdMYXllckZs
dXNoZXMgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9pc0xheWVyRmx1c2hUaHJvdHRsaW5nVGVtcG9y
YXJpbHlEaXNhYmxlZEZvckludGVyYWN0aW9uIHsgZmFsc2UgfTsKLSAgICBib29sIG1faXNJbml0
aWFsVGhyb3R0bGVkTGF5ZXJGbHVzaCB7IGZhbHNlIH07Ci0KLSAgICBib29sIG1fd2FpdGluZ0Zv
ckJhY2tpbmdTdG9yZVN3YXAgeyBmYWxzZSB9OwotICAgIGJvb2wgbV9oYWRGbHVzaERlZmVycmVk
V2hpbGVXYWl0aW5nRm9yQmFja2luZ1N0b3JlU3dhcCB7IGZhbHNlIH07Ci0gICAgYm9vbCBtX25l
eHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQgeyBmYWxzZSB9OwotCi0gICAgZGlzcGF0Y2hfcXVl
dWVfdCBtX2NvbW1pdFF1ZXVlOwotICAgIFJlZlB0cjxCYWNraW5nU3RvcmVGbHVzaGVyPiBtX3Bl
bmRpbmdCYWNraW5nU3RvcmVGbHVzaGVyOwotCi0gICAgSGFzaFNldDxSZW1vdGVMYXllclRyZWVE
aXNwbGF5UmVmcmVzaE1vbml0b3IqPiBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnM7Ci0gICAgSGFz
aFNldDxSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1vbml0b3IqPiogbV9kaXNwbGF5UmVm
cmVzaE1vbml0b3JzVG9Ob3RpZnkgeyBudWxscHRyIH07Ci0KLSAgICB1aW50NjRfdCBtX2N1cnJl
bnRUcmFuc2FjdGlvbklEIHsgMCB9OwotICAgIFZlY3RvcjxSZW1vdGVMYXllclRyZWVUcmFuc2Fj
dGlvbjo6VHJhbnNhY3Rpb25DYWxsYmFja0lEPiBtX3BlbmRpbmdDYWxsYmFja0lEczsKLQotICAg
IFdlYkNvcmU6OkxheW91dE1pbGVzdG9uZXMgbV9wZW5kaW5nTmV3bHlSZWFjaGVkTGF5b3V0TWls
ZXN0b25lcyB7IDAgfTsKLQotICAgIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXIqIG1fY29udGVudExh
eWVyIHsgbnVsbHB0ciB9OwotICAgIFdlYkNvcmU6OkdyYXBoaWNzTGF5ZXIqIG1fdmlld092ZXJs
YXlSb290TGF5ZXIgeyBudWxscHRyIH07Ci0gICAgCi0gICAgV2Vha1B0ckZhY3Rvcnk8UmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWE+IG1fd2Vha1B0ckZhY3Rvcnk7Ci19OwotCi19IC8vIG5hbWVz
cGFjZSBXZWJLaXQKLQotU1BFQ0lBTElaRV9UWVBFX1RSQUlUU19EUkFXSU5HX0FSRUEoUmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWEsIERyYXdpbmdBcmVhVHlwZVJlbW90ZUxheWVyVHJlZSkKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21hYy9SZW1vdGVMYXll
clRyZWVEcmF3aW5nQXJlYS5tbSBiL1NvdXJjZS9XZWJLaXQvV2ViUHJvY2Vzcy9XZWJQYWdlL21h
Yy9SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5tbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggZjE0NmZhMGYwYjg2NjVjOWQyNDA2MDhkZWQ3MWVjYjgzNTYzYTE2My4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYlBy
b2Nlc3MvV2ViUGFnZS9tYWMvUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEubW0KKysrIC9kZXYv
bnVsbApAQCAtMSw1MTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMi0yMDE0IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9S
UwotICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwot
ICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0g
KiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2ltcG9ydCAiY29uZmln
LmgiCi0jaW1wb3J0ICJSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYS5oIgotCi0jaW1wb3J0ICJE
cmF3aW5nQXJlYVByb3h5TWVzc2FnZXMuaCIKLSNpbXBvcnQgIkdyYXBoaWNzTGF5ZXJDQVJlbW90
ZS5oIgotI2ltcG9ydCAiUGxhdGZvcm1DQUxheWVyUmVtb3RlLmgiCi0jaW1wb3J0ICJSZW1vdGVM
YXllckJhY2tpbmdTdG9yZUNvbGxlY3Rpb24uaCIKLSNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZUNv
bnRleHQuaCIKLSNpbXBvcnQgIlJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRvci5o
IgotI2ltcG9ydCAiUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWFQcm94eU1lc3NhZ2VzLmgiCi0j
aW1wb3J0ICJSZW1vdGVTY3JvbGxpbmdDb29yZGluYXRvci5oIgotI2ltcG9ydCAiUmVtb3RlU2Ny
b2xsaW5nQ29vcmRpbmF0b3JUcmFuc2FjdGlvbi5oIgotI2ltcG9ydCAiV2ViUGFnZS5oIgotI2lt
cG9ydCAiV2ViUHJvY2Vzcy5oIgotI2ltcG9ydCA8UXVhcnR6Q29yZS9RdWFydHpDb3JlLmg+Ci0j
aW1wb3J0IDxXZWJDb3JlL0RlYnVnUGFnZU92ZXJsYXlzLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL0Zy
YW1lLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL0ZyYW1lVmlldy5oPgotI2ltcG9ydCA8V2ViQ29yZS9J
bnNwZWN0b3JDb250cm9sbGVyLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL01haW5GcmFtZS5oPgotI2lt
cG9ydCA8V2ViQ29yZS9QYWdlT3ZlcmxheUNvbnRyb2xsZXIuaD4KLSNpbXBvcnQgPFdlYkNvcmUv
UmVuZGVyTGF5ZXJDb21wb3NpdG9yLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL1JlbmRlclZpZXcuaD4K
LSNpbXBvcnQgPFdlYkNvcmUvU2V0dGluZ3MuaD4KLSNpbXBvcnQgPFdlYkNvcmUvVGlsZWRCYWNr
aW5nLmg+Ci0jaW1wb3J0IDxwYWwvc3BpL2NvY29hL1F1YXJ0ekNvcmVTUEkuaD4KLSNpbXBvcnQg
PHd0Zi9TeXN0ZW1UcmFjaW5nLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotCi1uYW1l
c3BhY2UgV2ViS2l0IHsKLQotUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OlJlbW90ZUxheWVy
VHJlZURyYXdpbmdBcmVhKFdlYlBhZ2UmIHdlYlBhZ2UsIGNvbnN0IFdlYlBhZ2VDcmVhdGlvblBh
cmFtZXRlcnMmKQotICAgIDogRHJhd2luZ0FyZWEoRHJhd2luZ0FyZWFUeXBlUmVtb3RlTGF5ZXJU
cmVlLCB3ZWJQYWdlKQotICAgICwgbV9yZW1vdGVMYXllclRyZWVDb250ZXh0KHN0ZDo6bWFrZV91
bmlxdWU8UmVtb3RlTGF5ZXJUcmVlQ29udGV4dD4od2ViUGFnZSkpCi0gICAgLCBtX3Jvb3RMYXll
cihHcmFwaGljc0xheWVyOjpjcmVhdGUoZ3JhcGhpY3NMYXllckZhY3RvcnkoKSwgKnRoaXMpKQot
ICAgICwgbV9sYXllckZsdXNoVGltZXIoKnRoaXMsICZSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJl
YTo6Zmx1c2hMYXllcnMpCi0gICAgLCBtX3dlYWtQdHJGYWN0b3J5KHRoaXMpCi17Ci0gICAgd2Vi
UGFnZS5jb3JlUGFnZSgpLT5zZXR0aW5ncygpLnNldEZvcmNlQ29tcG9zaXRpbmdNb2RlKHRydWUp
OwotI2lmIFBMQVRGT1JNKElPUykKLSAgICB3ZWJQYWdlLmNvcmVQYWdlKCktPnNldHRpbmdzKCku
c2V0RGVsZWdhdGVzUGFnZVNjYWxpbmcodHJ1ZSk7Ci0jZW5kaWYKLSAgICBtX3Jvb3RMYXllci0+
c2V0TmFtZSgiZHJhd2luZyBhcmVhIHJvb3QiKTsKLQotICAgIG1fY29tbWl0UXVldWUgPSBkaXNw
YXRjaF9xdWV1ZV9jcmVhdGUoImNvbS5hcHBsZS5XZWJLaXQuV2ViQ29udGVudC5SZW1vdGVMYXll
clRyZWVEcmF3aW5nQXJlYS5Db21taXRRdWV1ZSIsIG51bGxwdHIpOwotCi0gICAgLy8gSW4gb3Jk
ZXIgdG8gZW5zdXJlIHRoYXQgd2UgZ2V0IGEgdW5pcXVlIERpc3BsYXlSZWZyZXNoTW9uaXRvciBw
ZXItRHJhd2luZ0FyZWEgKG5lY2Vzc2FyeSBiZWNhdXNlIERpc3BsYXlSZWZyZXNoTW9uaXRvcgot
ICAgIC8vIGlzIGRyaXZlbiBieSB0aGlzIGNsYXNzKSwgZ2l2ZSBlYWNoIHBhZ2UgYSB1bmlxdWUg
RGlzcGxheUlEIGRlcml2ZWQgZnJvbSBXZWJQYWdlJ3MgdW5pcXVlIElELgotICAgIC8vIEZJWE1F
OiBXaGlsZSB1c2luZyB0aGUgaGlnaCBlbmQgb2YgdGhlIHJhbmdlIG9mIERpc3BsYXlJRHMgbWFr
ZXMgYSBjb2xsaXNpb24gd2l0aCByZWFsLCBub24tUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEK
LSAgICAvLyBEaXNwbGF5SURzIGxlc3MgbGlrZWx5LCBpdCBpcyBub3QgZW50aXJlbHkgc2FmZSB0
byBoYXZlIGEgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWEgYW5kIFRpbGVkQ29yZUFuaW1hdGlv
bkRyYXdpbmdBcmVhCi0gICAgLy8gY29lZXhpc3QgaW4gdGhlIHNhbWUgcHJvY2Vzcy4KLSAgICB3
ZWJQYWdlLndpbmRvd1NjcmVlbkRpZENoYW5nZShzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90
Pjo6bWF4KCkgLSB3ZWJQYWdlLnBhZ2VJRCgpKTsKLX0KLQotUmVtb3RlTGF5ZXJUcmVlRHJhd2lu
Z0FyZWE6On5SZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYSgpCi17Ci0gICAgZGlzcGF0Y2hfcmVs
ZWFzZShtX2NvbW1pdFF1ZXVlKTsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJl
YTo6c2V0TmVlZHNEaXNwbGF5KCkKLXsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5n
QXJlYTo6c2V0TmVlZHNEaXNwbGF5SW5SZWN0KGNvbnN0IEludFJlY3QmKQotewotfQotCi12b2lk
IFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzY3JvbGwoY29uc3QgSW50UmVjdCYgc2Nyb2xs
UmVjdCwgY29uc3QgSW50U2l6ZSYgc2Nyb2xsRGVsdGEpCi17Ci19Ci0KLUdyYXBoaWNzTGF5ZXJG
YWN0b3J5KiBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6Z3JhcGhpY3NMYXllckZhY3Rvcnko
KQotewotICAgIHJldHVybiBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQuZ2V0KCk7Ci19Ci0KLVJl
ZlB0cjxEaXNwbGF5UmVmcmVzaE1vbml0b3I+IFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpj
cmVhdGVEaXNwbGF5UmVmcmVzaE1vbml0b3IoUGxhdGZvcm1EaXNwbGF5SUQgZGlzcGxheUlEKQot
ewotICAgIGF1dG8gbW9uaXRvciA9IFJlbW90ZUxheWVyVHJlZURpc3BsYXlSZWZyZXNoTW9uaXRv
cjo6Y3JlYXRlKGRpc3BsYXlJRCwgKnRoaXMpOwotICAgIG1fZGlzcGxheVJlZnJlc2hNb25pdG9y
cy5hZGQobW9uaXRvci5wdHIoKSk7Ci0gICAgcmV0dXJuIFdURk1vdmUobW9uaXRvcik7Ci19Ci0K
LXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OndpbGxEZXN0cm95RGlzcGxheVJlZnJl
c2hNb25pdG9yKERpc3BsYXlSZWZyZXNoTW9uaXRvciogbW9uaXRvcikKLXsKLSAgICBhdXRvIHJl
bW90ZU1vbml0b3IgPSBzdGF0aWNfY2FzdDxSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVzaE1v
bml0b3IqPihtb25pdG9yKTsKLSAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnMucmVtb3ZlKHJl
bW90ZU1vbml0b3IpOwotCi0gICAgaWYgKG1fZGlzcGxheVJlZnJlc2hNb25pdG9yc1RvTm90aWZ5
KQotICAgICAgICBtX2Rpc3BsYXlSZWZyZXNoTW9uaXRvcnNUb05vdGlmeS0+cmVtb3ZlKHJlbW90
ZU1vbml0b3IpOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjp1cGRhdGVS
b290TGF5ZXJzKCkKLXsKLSAgICBWZWN0b3I8R3JhcGhpY3NMYXllcio+IGNoaWxkcmVuOwotICAg
IGlmIChtX2NvbnRlbnRMYXllcikgewotICAgICAgICBjaGlsZHJlbi5hcHBlbmQobV9jb250ZW50
TGF5ZXIpOwotICAgICAgICBpZiAobV92aWV3T3ZlcmxheVJvb3RMYXllcikKLSAgICAgICAgICAg
IGNoaWxkcmVuLmFwcGVuZChtX3ZpZXdPdmVybGF5Um9vdExheWVyKTsKLSAgICB9Ci0KLSAgICBt
X3Jvb3RMYXllci0+c2V0Q2hpbGRyZW4oY2hpbGRyZW4pOwotfQotCi12b2lkIFJlbW90ZUxheWVy
VHJlZURyYXdpbmdBcmVhOjphdHRhY2hWaWV3T3ZlcmxheUdyYXBoaWNzTGF5ZXIoRnJhbWUqIGZy
YW1lLCBHcmFwaGljc0xheWVyKiB2aWV3T3ZlcmxheVJvb3RMYXllcikKLXsKLSAgICBpZiAoIWZy
YW1lLT5pc01haW5GcmFtZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3ZpZXdPdmVybGF5
Um9vdExheWVyID0gdmlld092ZXJsYXlSb290TGF5ZXI7Ci0gICAgdXBkYXRlUm9vdExheWVycygp
OwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzZXRSb290Q29tcG9zaXRp
bmdMYXllcihHcmFwaGljc0xheWVyKiByb290TGF5ZXIpCi17Ci0gICAgbV9jb250ZW50TGF5ZXIg
PSByb290TGF5ZXI7Ci0gICAgdXBkYXRlUm9vdExheWVycygpOwotICAgIHNjaGVkdWxlQ29tcG9z
aXRpbmdMYXllckZsdXNoKCk7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6
OnVwZGF0ZUdlb21ldHJ5KGNvbnN0IEludFNpemUmIHZpZXdTaXplLCBjb25zdCBJbnRTaXplJiBs
YXllclBvc2l0aW9uLCBib29sIGZsdXNoU3luY2hyb25vdXNseSwgY29uc3QgV2ViQ29yZTo6TWFj
aFNlbmRSaWdodCYpCi17Ci0gICAgbV92aWV3U2l6ZSA9IHZpZXdTaXplOwotICAgIG1fd2ViUGFn
ZS5zZXRTaXplKHZpZXdTaXplKTsKLQotICAgIHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllckZsdXNo
KCk7Ci0KLSAgICBtX3dlYlBhZ2Uuc2VuZChNZXNzYWdlczo6RHJhd2luZ0FyZWFQcm94eTo6RGlk
VXBkYXRlR2VvbWV0cnkoKSk7Ci19Ci0KLWJvb2wgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6
OnNob3VsZFVzZVRpbGVkQmFja2luZ0ZvckZyYW1lVmlldyhjb25zdCBGcmFtZVZpZXcmIGZyYW1l
VmlldykKLXsKLSAgICByZXR1cm4gZnJhbWVWaWV3LmZyYW1lKCkuaXNNYWluRnJhbWUoKTsKLX0K
LQotdm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6dXBkYXRlUHJlZmVyZW5jZXMoY29u
c3QgV2ViUHJlZmVyZW5jZXNTdG9yZSYpCi17Ci0gICAgU2V0dGluZ3MmIHNldHRpbmdzID0gbV93
ZWJQYWdlLmNvcmVQYWdlKCktPnNldHRpbmdzKCk7Ci0KLSAgICAvLyBGaXhlZCBwb3NpdGlvbiBl
bGVtZW50cyBuZWVkIHRvIGJlIGNvbXBvc2l0ZWQgYW5kIGNyZWF0ZSBzdGFja2luZyBjb250ZXh0
cwotICAgIC8vIGluIG9yZGVyIHRvIGJlIHNjcm9sbGVkIGJ5IHRoZSBTY3JvbGxpbmdDb29yZGlu
YXRvci4KLSAgICBzZXR0aW5ncy5zZXRBY2NlbGVyYXRlZENvbXBvc2l0aW5nRm9yRml4ZWRQb3Np
dGlvbkVuYWJsZWQodHJ1ZSk7Ci0KLSAgICBtX3Jvb3RMYXllci0+c2V0U2hvd0RlYnVnQm9yZGVy
KHNldHRpbmdzLnNob3dEZWJ1Z0JvcmRlcnMoKSk7Ci0KLSAgICBpZiAoTWFpbkZyYW1lKiBtYWlu
RnJhbWUgPSBtX3dlYlBhZ2UubWFpbkZyYW1lKCkpCi0gICAgICAgIERlYnVnUGFnZU92ZXJsYXlz
OjpzZXR0aW5nc0NoYW5nZWQoKm1haW5GcmFtZSk7Ci19Ci0KLSNpZiBQTEFURk9STShJT1MpCi12
b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzZXREZXZpY2VTY2FsZUZhY3RvcihmbG9h
dCBkZXZpY2VTY2FsZUZhY3RvcikKLXsKLSAgICBtX3dlYlBhZ2Uuc2V0RGV2aWNlU2NhbGVGYWN0
b3IoZGV2aWNlU2NhbGVGYWN0b3IpOwotfQotI2VuZGlmCi0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVl
RHJhd2luZ0FyZWE6OnNldExheWVyVHJlZVN0YXRlSXNGcm96ZW4oYm9vbCBpc0Zyb3plbikKLXsK
LSAgICBpZiAobV9pc0ZsdXNoaW5nU3VzcGVuZGVkID09IGlzRnJvemVuKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBtX2lzRmx1c2hpbmdTdXNwZW5kZWQgPSBpc0Zyb3plbjsKLQotICAgIGlmICgh
bV9pc0ZsdXNoaW5nU3VzcGVuZGVkICYmIG1faGFzRGVmZXJyZWRGbHVzaCkgewotICAgICAgICBt
X2hhc0RlZmVycmVkRmx1c2ggPSBmYWxzZTsKLSAgICAgICAgc2NoZWR1bGVDb21wb3NpdGluZ0xh
eWVyRmx1c2goKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6
OmZvcmNlUmVwYWludCgpCi17Ci0gICAgaWYgKG1faXNGbHVzaGluZ1N1c3BlbmRlZCkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgZm9yIChGcmFtZSogZnJhbWUgPSAmbV93ZWJQYWdlLmNvcmVQYWdl
KCktPm1haW5GcmFtZSgpOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLnRyYXZlcnNlTmV4
dCgpKSB7Ci0gICAgICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gZnJhbWUtPnZpZXcoKTsKLSAg
ICAgICAgaWYgKCFmcmFtZVZpZXcgfHwgIWZyYW1lVmlldy0+dGlsZWRCYWNraW5nKCkpCi0gICAg
ICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBmcmFtZVZpZXctPnRpbGVkQmFja2luZygpLT5m
b3JjZVJlcGFpbnQoKTsKLSAgICB9Ci0KLSAgICBmbHVzaExheWVycygpOwotfQotCi12b2lkIFJl
bW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjphY2NlbGVyYXRlZEFuaW1hdGlvbkRpZFN0YXJ0KHVp
bnQ2NF90IGxheWVySUQsIGNvbnN0IFN0cmluZyYga2V5LCBkb3VibGUgc3RhcnRUaW1lKQotewot
ICAgIG1fcmVtb3RlTGF5ZXJUcmVlQ29udGV4dC0+YW5pbWF0aW9uRGlkU3RhcnQobGF5ZXJJRCwg
a2V5LCBzdGFydFRpbWUpOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjph
Y2NlbGVyYXRlZEFuaW1hdGlvbkRpZEVuZCh1aW50NjRfdCBsYXllcklELCBjb25zdCBTdHJpbmcm
IGtleSkKLXsKLSAgICBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQtPmFuaW1hdGlvbkRpZEVuZChs
YXllcklELCBrZXkpOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpzZXRW
aWV3RXhwb3NlZFJlY3Qoc3RkOjpvcHRpb25hbDxXZWJDb3JlOjpGbG9hdFJlY3Q+IHZpZXdFeHBv
c2VkUmVjdCkKLXsKLSAgICBtX3ZpZXdFeHBvc2VkUmVjdCA9IHZpZXdFeHBvc2VkUmVjdDsKLSAg
ICB1cGRhdGVTY3JvbGxlZEV4cG9zZWRSZWN0KCk7Ci19Ci0KLSNpZiBQTEFURk9STShJT1MpCi1X
ZWJDb3JlOjpGbG9hdFJlY3QgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmV4cG9zZWRDb250
ZW50UmVjdCgpIGNvbnN0Ci17Ci0gICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBtX3dlYlBhZ2Uu
bWFpbkZyYW1lVmlldygpOwotICAgIGlmICghZnJhbWVWaWV3KQotICAgICAgICByZXR1cm4gRmxv
YXRSZWN0KCk7Ci0KLSAgICByZXR1cm4gZnJhbWVWaWV3LT5leHBvc2VkQ29udGVudFJlY3QoKTsK
LX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6c2V0RXhwb3NlZENvbnRlbnRS
ZWN0KGNvbnN0IEZsb2F0UmVjdCYgZXhwb3NlZENvbnRlbnRSZWN0KQotewotICAgIEZyYW1lVmll
dyogZnJhbWVWaWV3ID0gbV93ZWJQYWdlLm1haW5GcmFtZVZpZXcoKTsKLSAgICBpZiAoIWZyYW1l
VmlldykKLSAgICAgICAgcmV0dXJuOwotICAgIGlmIChmcmFtZVZpZXctPmV4cG9zZWRDb250ZW50
UmVjdCgpID09IGV4cG9zZWRDb250ZW50UmVjdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZnJh
bWVWaWV3LT5zZXRFeHBvc2VkQ29udGVudFJlY3QoZXhwb3NlZENvbnRlbnRSZWN0KTsKLSAgICBz
Y2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOwotfQotI2VuZGlmCi0KLXZvaWQgUmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnVwZGF0ZVNjcm9sbGVkRXhwb3NlZFJlY3QoKQotewotICAg
IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gbV93ZWJQYWdlLm1haW5GcmFtZVZpZXcoKTsKLSAgICBp
ZiAoIWZyYW1lVmlldykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9zY3JvbGxlZFZpZXdFeHBv
c2VkUmVjdCA9IG1fdmlld0V4cG9zZWRSZWN0OwotCi0jaWYgIVBMQVRGT1JNKElPUykKLSAgICBp
ZiAobV92aWV3RXhwb3NlZFJlY3QpIHsKLSAgICAgICAgU2Nyb2xsT2Zmc2V0IHNjcm9sbE9mZnNl
dCA9IGZyYW1lVmlldy0+c2Nyb2xsT2Zmc2V0RnJvbVBvc2l0aW9uKGZyYW1lVmlldy0+c2Nyb2xs
UG9zaXRpb24oKSk7Ci0gICAgICAgIG1fc2Nyb2xsZWRWaWV3RXhwb3NlZFJlY3QudmFsdWUoKS5t
b3ZlQnkoc2Nyb2xsT2Zmc2V0KTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGZyYW1lVmlldy0+c2V0
Vmlld0V4cG9zZWRSZWN0KG1fc2Nyb2xsZWRWaWV3RXhwb3NlZFJlY3QpOwotfQotCi1UaWxlZEJh
Y2tpbmcqIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjptYWluRnJhbWVUaWxlZEJhY2tpbmco
KSBjb25zdAotewotICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gbV93ZWJQYWdlLm1haW5GcmFt
ZVZpZXcoKTsKLSAgICByZXR1cm4gZnJhbWVWaWV3ID8gZnJhbWVWaWV3LT50aWxlZEJhY2tpbmco
KSA6IG51bGxwdHI7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OnNjaGVk
dWxlQ29tcG9zaXRpbmdMYXllckZsdXNoSW1tZWRpYXRlbHkoKQotewotICAgIG1fbGF5ZXJGbHVz
aFRpbWVyLnN0YXJ0T25lU2hvdCgwX3MpOwotfQotCi12b2lkIFJlbW90ZUxheWVyVHJlZURyYXdp
bmdBcmVhOjpzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpCi17Ci0gICAgaWYgKG1faXNG
bHVzaGluZ1N1c3BlbmRlZCkgewotICAgICAgICBtX2lzTGF5ZXJGbHVzaFRocm90dGxpbmdUZW1w
b3JhcmlseURpc2FibGVkRm9ySW50ZXJhY3Rpb24gPSBmYWxzZTsKLSAgICAgICAgbV9oYXNEZWZl
cnJlZEZsdXNoID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAobV9pc0xh
eWVyRmx1c2hUaHJvdHRsaW5nVGVtcG9yYXJpbHlEaXNhYmxlZEZvckludGVyYWN0aW9uKSB7Ci0g
ICAgICAgIG1faXNMYXllckZsdXNoVGhyb3R0bGluZ1RlbXBvcmFyaWx5RGlzYWJsZWRGb3JJbnRl
cmFjdGlvbiA9IGZhbHNlOwotICAgICAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaElt
bWVkaWF0ZWx5KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobV9sYXllckZs
dXNoVGltZXIuaXNBY3RpdmUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgU2Vjb25k
cyBpbml0aWFsRmx1c2hEZWxheSA9IDUwMF9tczsKLSAgICBjb25zdCBTZWNvbmRzIGZsdXNoRGVs
YXkgPSAxNTAwX21zOwotICAgIFNlY29uZHMgdGhyb3R0bGVEZWxheSA9IG1faXNUaHJvdHRsaW5n
TGF5ZXJGbHVzaGVzID8gKG1faXNJbml0aWFsVGhyb3R0bGVkTGF5ZXJGbHVzaCA/IGluaXRpYWxG
bHVzaERlbGF5IDogZmx1c2hEZWxheSkgOiAwX3M7Ci0gICAgbV9pc0luaXRpYWxUaHJvdHRsZWRM
YXllckZsdXNoID0gZmFsc2U7Ci0KLSAgICBtX2xheWVyRmx1c2hUaW1lci5zdGFydE9uZVNob3Qo
dGhyb3R0bGVEZWxheSk7Ci19Ci0KLWJvb2wgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmFk
anVzdExheWVyRmx1c2hUaHJvdHRsaW5nKFdlYkNvcmU6OkxheWVyRmx1c2hUaHJvdHRsZVN0YXRl
OjpGbGFncyBmbGFncykKLXsKLSAgICBpZiAoZmxhZ3MgJiBXZWJDb3JlOjpMYXllckZsdXNoVGhy
b3R0bGVTdGF0ZTo6VXNlcklzSW50ZXJhY3RpbmcpCi0gICAgICAgIG1faXNMYXllckZsdXNoVGhy
b3R0bGluZ1RlbXBvcmFyaWx5RGlzYWJsZWRGb3JJbnRlcmFjdGlvbiA9IHRydWU7Ci0KLSAgICBi
b29sIHdhc1Rocm90dGxpbmdMYXllckZsdXNoZXMgPSBtX2lzVGhyb3R0bGluZ0xheWVyRmx1c2hl
czsKLSAgICBtX2lzVGhyb3R0bGluZ0xheWVyRmx1c2hlcyA9IGZsYWdzICYgV2ViQ29yZTo6TGF5
ZXJGbHVzaFRocm90dGxlU3RhdGU6OkVuYWJsZWQ7Ci0KLSAgICBpZiAoIXdhc1Rocm90dGxpbmdM
YXllckZsdXNoZXMgJiYgbV9pc1Rocm90dGxpbmdMYXllckZsdXNoZXMpCi0gICAgICAgIG1faXNJ
bml0aWFsVGhyb3R0bGVkTGF5ZXJGbHVzaCA9IHRydWU7Ci0KLSAgICAvLyBSZS1zY2hlZHVsZSB0
aGUgZmx1c2ggaWYgd2Ugc3RvcHBlZCB0aHJvdHRsaW5nLgotICAgIGlmICh3YXNUaHJvdHRsaW5n
TGF5ZXJGbHVzaGVzICYmICFtX2lzVGhyb3R0bGluZ0xheWVyRmx1c2hlcyAmJiBtX2xheWVyRmx1
c2hUaW1lci5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgIG1fbGF5ZXJGbHVzaFRpbWVyLnN0b3AoKTsK
LSAgICAgICAgc2NoZWR1bGVDb21wb3NpdGluZ0xheWVyRmx1c2goKTsKLSAgICB9Ci0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmZsdXNoTGF5
ZXJzKCkKLXsKLSAgICBpZiAoIW1fcm9vdExheWVyKQotICAgICAgICByZXR1cm47Ci0KLSAgICBp
ZiAobV9pc0ZsdXNoaW5nU3VzcGVuZGVkKSB7Ci0gICAgICAgIG1faGFzRGVmZXJyZWRGbHVzaCA9
IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobV93YWl0aW5nRm9yQmFj
a2luZ1N0b3JlU3dhcCkgewotICAgICAgICBtX2hhZEZsdXNoRGVmZXJyZWRXaGlsZVdhaXRpbmdG
b3JCYWNraW5nU3RvcmVTd2FwID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAg
IFJFTEVBU0VfQVNTRVJUKCFtX3BlbmRpbmdCYWNraW5nU3RvcmVGbHVzaGVyIHx8IG1fcGVuZGlu
Z0JhY2tpbmdTdG9yZUZsdXNoZXItPmhhc0ZsdXNoZWQoKSk7Ci0KLSAgICBSZW1vdGVMYXllckJh
Y2tpbmdTdG9yZUNvbGxlY3Rpb24mIGJhY2tpbmdTdG9yZUNvbGxlY3Rpb24gPSBtX3JlbW90ZUxh
eWVyVHJlZUNvbnRleHQtPmJhY2tpbmdTdG9yZUNvbGxlY3Rpb24oKTsKLSAgICBiYWNraW5nU3Rv
cmVDb2xsZWN0aW9uLndpbGxGbHVzaExheWVycygpOwotCi0gICAgbV93ZWJQYWdlLmxheW91dElm
TmVlZGVkKCk7Ci0KLSAgICBGbG9hdFJlY3QgdmlzaWJsZVJlY3QoRmxvYXRQb2ludCgpLCBtX3Zp
ZXdTaXplKTsKLSAgICBpZiAobV9zY3JvbGxlZFZpZXdFeHBvc2VkUmVjdCkKLSAgICAgICAgdmlz
aWJsZVJlY3QuaW50ZXJzZWN0KG1fc2Nyb2xsZWRWaWV3RXhwb3NlZFJlY3QudmFsdWUoKSk7Ci0K
LSAgICBSZWZQdHI8V2ViUGFnZT4gcmV0YWluZWRQYWdlID0gJm1fd2ViUGFnZTsKLSAgICBbQ0FU
cmFuc2FjdGlvbiBhZGRDb21taXRIYW5kbGVyOltyZXRhaW5lZFBhZ2VdIHsKLSAgICAgICAgaWYg
KFBhZ2UqIGNvcmVQYWdlID0gcmV0YWluZWRQYWdlLT5jb3JlUGFnZSgpKSB7Ci0gICAgICAgICAg
ICBpZiAoRnJhbWUqIGNvcmVGcmFtZSA9IHJldGFpbmVkUGFnZS0+bWFpbkZyYW1lKCkpCi0gICAg
ICAgICAgICAgICAgY29yZVBhZ2UtPmluc3BlY3RvckNvbnRyb2xsZXIoKS5kaWRDb21wb3NpdGUo
KmNvcmVGcmFtZSk7Ci0gICAgICAgIH0KLSAgICB9IGZvclBoYXNlOmtDQVRyYW5zYWN0aW9uUGhh
c2VQb3N0Q29tbWl0XTsKLQotICAgIG1fd2ViUGFnZS5tYWluRnJhbWVWaWV3KCktPmZsdXNoQ29t
cG9zaXRpbmdTdGF0ZUluY2x1ZGluZ1N1YmZyYW1lcygpOwotCi0gICAgLy8gQmVjYXVzZSBvdXIg
dmlldy1yZWxhdGl2ZSBvdmVybGF5IHJvb3QgbGF5ZXIgaXMgbm90IGF0dGFjaGVkIHRvIHRoZSBG
cmFtZVZpZXcncyBHcmFwaGljc0xheWVyIHRyZWUsIHdlIG5lZWQgdG8gZmx1c2ggaXQgbWFudWFs
bHkuCi0gICAgaWYgKG1fdmlld092ZXJsYXlSb290TGF5ZXIpCi0gICAgICAgIG1fdmlld092ZXJs
YXlSb290TGF5ZXItPmZsdXNoQ29tcG9zaXRpbmdTdGF0ZSh2aXNpYmxlUmVjdCk7Ci0KLSAgICBt
X3Jvb3RMYXllci0+Zmx1c2hDb21wb3NpdGluZ1N0YXRlRm9yVGhpc0xheWVyT25seSgpOwotCi0g
ICAgLy8gRklYTUU6IE1pbmltaXplIHRoZXNlIHRyYW5zYWN0aW9ucyBpZiBub3RoaW5nIGNoYW5n
ZWQuCi0gICAgUmVtb3RlTGF5ZXJUcmVlVHJhbnNhY3Rpb24gbGF5ZXJUcmFuc2FjdGlvbjsKLSAg
ICBsYXllclRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uSUQodGFrZU5leHRUcmFuc2FjdGlvbklE
KCkpOwotICAgIGxheWVyVHJhbnNhY3Rpb24uc2V0Q2FsbGJhY2tJRHMoV1RGTW92ZShtX3BlbmRp
bmdDYWxsYmFja0lEcykpOwotICAgIG1fcmVtb3RlTGF5ZXJUcmVlQ29udGV4dC0+c2V0TmV4dEZs
dXNoSXNGb3JJbW1lZGlhdGVQYWludChtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQpOwot
ICAgIG1fcmVtb3RlTGF5ZXJUcmVlQ29udGV4dC0+YnVpbGRUcmFuc2FjdGlvbihsYXllclRyYW5z
YWN0aW9uLCAqZG93bmNhc3Q8R3JhcGhpY3NMYXllckNBUmVtb3RlPigqbV9yb290TGF5ZXIpLnBs
YXRmb3JtQ0FMYXllcigpKTsKLSAgICBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQtPnNldE5leHRG
bHVzaElzRm9ySW1tZWRpYXRlUGFpbnQoZmFsc2UpOwotICAgIGJhY2tpbmdTdG9yZUNvbGxlY3Rp
b24ud2lsbENvbW1pdExheWVyVHJlZShsYXllclRyYW5zYWN0aW9uKTsKLSAgICBtX3dlYlBhZ2Uu
d2lsbENvbW1pdExheWVyVHJlZShsYXllclRyYW5zYWN0aW9uKTsKLQotICAgIGxheWVyVHJhbnNh
Y3Rpb24uc2V0TmV3bHlSZWFjaGVkTGF5b3V0TWlsZXN0b25lcyhtX3BlbmRpbmdOZXdseVJlYWNo
ZWRMYXlvdXRNaWxlc3RvbmVzKTsKLSAgICBtX3BlbmRpbmdOZXdseVJlYWNoZWRMYXlvdXRNaWxl
c3RvbmVzID0gMDsKLQotICAgIFJlbW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yVHJhbnNhY3Rpb24g
c2Nyb2xsaW5nVHJhbnNhY3Rpb247Ci0jaWYgRU5BQkxFKEFTWU5DX1NDUk9MTElORykKLSAgICBp
ZiAobV93ZWJQYWdlLnNjcm9sbGluZ0Nvb3JkaW5hdG9yKCkpCi0gICAgICAgIGRvd25jYXN0PFJl
bW90ZVNjcm9sbGluZ0Nvb3JkaW5hdG9yPigqbV93ZWJQYWdlLnNjcm9sbGluZ0Nvb3JkaW5hdG9y
KCkpLmJ1aWxkVHJhbnNhY3Rpb24oc2Nyb2xsaW5nVHJhbnNhY3Rpb24pOwotI2VuZGlmCi0KLSAg
ICBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQgPSBmYWxzZTsKLSAgICBtX3dhaXRpbmdG
b3JCYWNraW5nU3RvcmVTd2FwID0gdHJ1ZTsKLQotICAgIG1fd2ViUGFnZS5zZW5kKE1lc3NhZ2Vz
OjpSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYVByb3h5OjpXaWxsQ29tbWl0TGF5ZXJUcmVlKGxh
eWVyVHJhbnNhY3Rpb24udHJhbnNhY3Rpb25JRCgpKSk7Ci0KLSAgICBNZXNzYWdlczo6UmVtb3Rl
TGF5ZXJUcmVlRHJhd2luZ0FyZWFQcm94eTo6Q29tbWl0TGF5ZXJUcmVlIG1lc3NhZ2UobGF5ZXJU
cmFuc2FjdGlvbiwgc2Nyb2xsaW5nVHJhbnNhY3Rpb24pOwotICAgIGF1dG8gY29tbWl0RW5jb2Rl
ciA9IHN0ZDo6bWFrZV91bmlxdWU8SVBDOjpFbmNvZGVyPihNZXNzYWdlczo6UmVtb3RlTGF5ZXJU
cmVlRHJhd2luZ0FyZWFQcm94eTo6Q29tbWl0TGF5ZXJUcmVlOjpyZWNlaXZlck5hbWUoKSwgTWVz
c2FnZXM6OlJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhUHJveHk6OkNvbW1pdExheWVyVHJlZTo6
bmFtZSgpLCBtX3dlYlBhZ2UucGFnZUlEKCkpOwotICAgIGNvbW1pdEVuY29kZXItPmVuY29kZSht
ZXNzYWdlLmFyZ3VtZW50cygpKTsKLQotICAgIC8vIEZJWE1FOiBNb3ZlIGFsbCBiYWNraW5nIHN0
b3JlIGZsdXNoaW5nIG1hbmFnZW1lbnQgdG8gUmVtb3RlTGF5ZXJCYWNraW5nU3RvcmVDb2xsZWN0
aW9uLgotICAgIGJvb2wgaGFkQW55Q2hhbmdlZEJhY2tpbmdTdG9yZSA9IGZhbHNlOwotICAgIFZl
Y3RvcjxSZXRhaW5QdHI8Q0dDb250ZXh0UmVmPj4gY29udGV4dHNUb0ZsdXNoOwotICAgIGZvciAo
YXV0byYgbGF5ZXIgOiBsYXllclRyYW5zYWN0aW9uLmNoYW5nZWRMYXllcnMoKSkgewotICAgICAg
ICBpZiAobGF5ZXItPnByb3BlcnRpZXMoKS5jaGFuZ2VkUHJvcGVydGllcyAmIFJlbW90ZUxheWVy
VHJlZVRyYW5zYWN0aW9uOjpMYXllckNoYW5nZXM6OkJhY2tpbmdTdG9yZUNoYW5nZWQpIHsKLSAg
ICAgICAgICAgIGhhZEFueUNoYW5nZWRCYWNraW5nU3RvcmUgPSB0cnVlOwotICAgICAgICAgICAg
aWYgKGxheWVyLT5wcm9wZXJ0aWVzKCkuYmFja2luZ1N0b3JlKSB7Ci0gICAgICAgICAgICAgICAg
aWYgKGF1dG8gY29udGV4dFBlbmRpbmdGbHVzaCA9IGxheWVyLT5wcm9wZXJ0aWVzKCkuYmFja2lu
Z1N0b3JlLT50YWtlRnJvbnRDb250ZXh0UGVuZGluZ0ZsdXNoKCkpCi0gICAgICAgICAgICAgICAg
ICAgIGNvbnRleHRzVG9GbHVzaC5hcHBlbmQoY29udGV4dFBlbmRpbmdGbHVzaCk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsYXllci0+ZGlkQ29tbWl0KCk7Ci0gICAgfQot
Ci0gICAgYmFja2luZ1N0b3JlQ29sbGVjdGlvbi5kaWRGbHVzaExheWVycygpOwotCi0gICAgaWYg
KGhhZEFueUNoYW5nZWRCYWNraW5nU3RvcmUpCi0gICAgICAgIGJhY2tpbmdTdG9yZUNvbGxlY3Rp
b24uc2NoZWR1bGVWb2xhdGlsaXR5VGltZXIoKTsKLQotICAgIFJlZlB0cjxCYWNraW5nU3RvcmVG
bHVzaGVyPiBiYWNraW5nU3RvcmVGbHVzaGVyID0gQmFja2luZ1N0b3JlRmx1c2hlcjo6Y3JlYXRl
KFdlYlByb2Nlc3M6OnNpbmdsZXRvbigpLnBhcmVudFByb2Nlc3NDb25uZWN0aW9uKCksIFdURk1v
dmUoY29tbWl0RW5jb2RlciksIFdURk1vdmUoY29udGV4dHNUb0ZsdXNoKSk7Ci0gICAgbV9wZW5k
aW5nQmFja2luZ1N0b3JlRmx1c2hlciA9IGJhY2tpbmdTdG9yZUZsdXNoZXI7Ci0KLSAgICB1aW50
NjRfdCBwYWdlSUQgPSBtX3dlYlBhZ2UucGFnZUlEKCk7Ci0gICAgZGlzcGF0Y2hfYXN5bmMobV9j
b21taXRRdWV1ZSwgW2JhY2tpbmdTdG9yZUZsdXNoZXIsIHBhZ2VJRF0gewotICAgICAgICBiYWNr
aW5nU3RvcmVGbHVzaGVyLT5mbHVzaCgpOwotCi0gICAgICAgIE1vbm90b25pY1RpbWUgdGltZXN0
YW1wID0gTW9ub3RvbmljVGltZTo6bm93KCk7Ci0gICAgICAgIGRpc3BhdGNoX2FzeW5jKGRpc3Bh
dGNoX2dldF9tYWluX3F1ZXVlKCksIFtwYWdlSUQsIHRpbWVzdGFtcF0gewotICAgICAgICAgICAg
aWYgKFdlYlBhZ2UqIHdlYlBhZ2UgPSBXZWJQcm9jZXNzOjpzaW5nbGV0b24oKS53ZWJQYWdlKHBh
Z2VJRCkpCi0gICAgICAgICAgICAgICAgd2ViUGFnZS0+ZGlkRmx1c2hMYXllclRyZWVBdFRpbWUo
dGltZXN0YW1wKTsKLSAgICAgICAgfSk7Ci0gICAgfSk7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJU
cmVlRHJhd2luZ0FyZWE6OmRpZFVwZGF0ZSgpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxk
IHVzZSBhIGNvdW50ZWQgcmVwbGFjZW1lbnQgZm9yIHNldExheWVyVHJlZVN0YXRlSXNGcm96ZW4s
IGJ1dAotICAgIC8vIHRoZSBjYWxsZXJzIG9mIHRoYXQgZnVuY3Rpb24gYXJlIG5vdCBzdHJpY3Rs
eSBwYWlyZWQuCi0KLSAgICBtX3dhaXRpbmdGb3JCYWNraW5nU3RvcmVTd2FwID0gZmFsc2U7Ci0K
LSAgICBpZiAobV9oYWRGbHVzaERlZmVycmVkV2hpbGVXYWl0aW5nRm9yQmFja2luZ1N0b3JlU3dh
cCkgewotICAgICAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOwotICAgICAgICBt
X2hhZEZsdXNoRGVmZXJyZWRXaGlsZVdhaXRpbmdGb3JCYWNraW5nU3RvcmVTd2FwID0gZmFsc2U7
Ci0gICAgfQotCi0gICAgLy8gVGhpcyBlbXB0eSB0cmFuc2FjdGlvbiBzZXJ2ZXMgdG8gdHJpZ2dl
ciBDQSdzIGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBJT1N1cmZhY2VzLiBTZWUgPHJkYXI6Ly9wcm9i
bGVtLzE2MTEwNjg3PgotICAgIFtDQVRyYW5zYWN0aW9uIGJlZ2luXTsKLSAgICBbQ0FUcmFuc2Fj
dGlvbiBjb21taXRdOwotCi0gICAgSGFzaFNldDxSZW1vdGVMYXllclRyZWVEaXNwbGF5UmVmcmVz
aE1vbml0b3IqPiBtb25pdG9yc1RvTm90aWZ5ID0gbV9kaXNwbGF5UmVmcmVzaE1vbml0b3JzOwot
ICAgIEFTU0VSVCghbV9kaXNwbGF5UmVmcmVzaE1vbml0b3JzVG9Ob3RpZnkpOwotICAgIG1fZGlz
cGxheVJlZnJlc2hNb25pdG9yc1RvTm90aWZ5ID0gJm1vbml0b3JzVG9Ob3RpZnk7Ci0gICAgd2hp
bGUgKCFtb25pdG9yc1RvTm90aWZ5LmlzRW1wdHkoKSkKLSAgICAgICAgbW9uaXRvcnNUb05vdGlm
eS50YWtlQW55KCktPmRpZFVwZGF0ZUxheWVycygpOwotICAgIG1fZGlzcGxheVJlZnJlc2hNb25p
dG9yc1RvTm90aWZ5ID0gbnVsbHB0cjsKLX0KLQotdm9pZCBSZW1vdGVMYXllclRyZWVEcmF3aW5n
QXJlYTo6bWFpbkZyYW1lQ29udGVudFNpemVDaGFuZ2VkKGNvbnN0IEludFNpemUmIGNvbnRlbnRz
U2l6ZSkKLXsKLSAgICBtX3Jvb3RMYXllci0+c2V0U2l6ZShjb250ZW50c1NpemUpOwotfQotCi1i
b29sIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjptYXJrTGF5ZXJzVm9sYXRpbGVJbW1lZGlh
dGVseUlmUG9zc2libGUoKQotewotICAgIHJldHVybiBtX3JlbW90ZUxheWVyVHJlZUNvbnRleHQt
PmJhY2tpbmdTdG9yZUNvbGxlY3Rpb24oKS5tYXJrQWxsQmFja2luZ1N0b3JlVm9sYXRpbGVJbW1l
ZGlhdGVseUlmUG9zc2libGUoKTsKLX0KLQotUmVmPFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVh
OjpCYWNraW5nU3RvcmVGbHVzaGVyPiBSZW1vdGVMYXllclRyZWVEcmF3aW5nQXJlYTo6QmFja2lu
Z1N0b3JlRmx1c2hlcjo6Y3JlYXRlKElQQzo6Q29ubmVjdGlvbiogY29ubmVjdGlvbiwgc3RkOjp1
bmlxdWVfcHRyPElQQzo6RW5jb2Rlcj4gZW5jb2RlciwgVmVjdG9yPFJldGFpblB0cjxDR0NvbnRl
eHRSZWY+PiBjb250ZXh0c1RvRmx1c2gpCi17Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgUmVt
b3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OkJhY2tpbmdTdG9yZUZsdXNoZXIoY29ubmVjdGlvbiwg
V1RGTW92ZShlbmNvZGVyKSwgV1RGTW92ZShjb250ZXh0c1RvRmx1c2gpKSk7Ci19Ci0KLVJlbW90
ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpCYWNraW5nU3RvcmVGbHVzaGVyOjpCYWNraW5nU3RvcmVG
bHVzaGVyKElQQzo6Q29ubmVjdGlvbiogY29ubmVjdGlvbiwgc3RkOjp1bmlxdWVfcHRyPElQQzo6
RW5jb2Rlcj4gZW5jb2RlciwgVmVjdG9yPFJldGFpblB0cjxDR0NvbnRleHRSZWY+PiBjb250ZXh0
c1RvRmx1c2gpCi0gICAgOiBtX2Nvbm5lY3Rpb24oY29ubmVjdGlvbikKLSAgICAsIG1fY29tbWl0
RW5jb2RlcihXVEZNb3ZlKGVuY29kZXIpKQotICAgICwgbV9jb250ZXh0c1RvRmx1c2goV1RGTW92
ZShjb250ZXh0c1RvRmx1c2gpKQotICAgICwgbV9oYXNGbHVzaGVkKGZhbHNlKQotewotfQotCi12
b2lkIFJlbW90ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpCYWNraW5nU3RvcmVGbHVzaGVyOjpmbHVz
aCgpCi17Ci0gICAgQVNTRVJUKCFtX2hhc0ZsdXNoZWQpOwotCi0gICAgVHJhY2VTY29wZSB0cmFj
aW5nU2NvcGUoQmFja2luZ1N0b3JlRmx1c2hTdGFydCwgQmFja2luZ1N0b3JlRmx1c2hFbmQpOwot
ICAgIAotICAgIGZvciAoYXV0byYgY29udGV4dCA6IG1fY29udGV4dHNUb0ZsdXNoKQotICAgICAg
ICBDR0NvbnRleHRGbHVzaChjb250ZXh0LmdldCgpKTsKLSAgICBtX2hhc0ZsdXNoZWQgPSB0cnVl
OwotCi0gICAgbV9jb25uZWN0aW9uLT5zZW5kTWVzc2FnZShXVEZNb3ZlKG1fY29tbWl0RW5jb2Rl
ciksIHsgfSk7Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmFjdGl2aXR5
U3RhdGVEaWRDaGFuZ2UoQWN0aXZpdHlTdGF0ZTo6RmxhZ3MsIGJvb2wgd2FudHNEaWRVcGRhdGVB
Y3Rpdml0eVN0YXRlLCBjb25zdCBWZWN0b3I8Q2FsbGJhY2tJRD4mKQotewotICAgIC8vIEZJWE1F
OiBTaG91bGQgd2Ugc3VzcGVuZCBwYWludGluZyB3aGlsZSBub3QgdmlzaWJsZSwgbGlrZSBUaWxl
ZENvcmVBbmltYXRpb25EcmF3aW5nQXJlYT8gUHJvYmFibHkuCi0KLSAgICBpZiAod2FudHNEaWRV
cGRhdGVBY3Rpdml0eVN0YXRlKSB7Ci0gICAgICAgIG1fbmV4dEZsdXNoSXNGb3JJbW1lZGlhdGVQ
YWludCA9IHRydWU7Ci0gICAgICAgIHNjaGVkdWxlQ29tcG9zaXRpbmdMYXllckZsdXNoSW1tZWRp
YXRlbHkoKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVtb3RlTGF5ZXJUcmVlRHJhd2luZ0FyZWE6OmFk
ZFRyYW5zYWN0aW9uQ2FsbGJhY2tJRChDYWxsYmFja0lEIGNhbGxiYWNrSUQpCi17Ci0gICAgLy8g
QXNzdW1lIHRoYXQgaWYgc29tZW9uZSBpcyBsaXN0ZW5pbmcgZm9yIHRoaXMgdHJhbnNhY3Rpb24n
cyBjb21wbGV0aW9uLCB0aGF0IHRoZXkgd2FudCBpdCB0bwotICAgIC8vIGJlIGEgImNvbXBsZXRl
IiBwYWludCAoaW5jbHVkaW5nIGltYWdlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIGFzeW5jaHJv
bm91c2x5IGRlY29kaW5nKS4KLSAgICBtX25leHRGbHVzaElzRm9ySW1tZWRpYXRlUGFpbnQgPSB0
cnVlOwotCi0gICAgbV9wZW5kaW5nQ2FsbGJhY2tJRHMuYXBwZW5kKHN0YXRpY19jYXN0PFJlbW90
ZUxheWVyVHJlZVRyYW5zYWN0aW9uOjpUcmFuc2FjdGlvbkNhbGxiYWNrSUQ+KGNhbGxiYWNrSUQp
KTsKLSAgICBzY2hlZHVsZUNvbXBvc2l0aW5nTGF5ZXJGbHVzaCgpOwotfQotCi1ib29sIFJlbW90
ZUxheWVyVHJlZURyYXdpbmdBcmVhOjpkaXNwYXRjaERpZFJlYWNoTGF5b3V0TWlsZXN0b25lKFdl
YkNvcmU6OkxheW91dE1pbGVzdG9uZXMgbGF5b3V0TWlsZXN0b25lcykKLXsKLSAgICBtX3BlbmRp
bmdOZXdseVJlYWNoZWRMYXlvdXRNaWxlc3RvbmVzIHw9IGxheW91dE1pbGVzdG9uZXM7Ci0gICAg
cmV0dXJuIHRydWU7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>