<?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>124336</bug_id>
          
          <creation_ts>2013-11-14 00:43:56 -0800</creation_ts>
          <short_desc>Move BreakingContext and LineBreaker into their own files</short_desc>
          <delta_ts>2013-11-15 13:38:49 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>121261</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Zoltan Horvath">zoltan</reporter>
          <assigned_to name="Zoltan Horvath">zoltan</assigned_to>
          <cc>buildbot</cc>
    
    <cc>commit-queue</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>glenn</cc>
    
    <cc>gtk-ews</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>rakuco</cc>
    
    <cc>rniwa</cc>
    
    <cc>xan.lopez</cc>
    
    <cc>zan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>950540</commentid>
    <comment_count>0</comment_count>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2013-11-14 00:43:56 -0800</bug_when>
    <thetext>Move out classes from RenderBlockLineLayout.cpp into their own files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950541</commentid>
    <comment_count>1</comment_count>
      <attachid>216904</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2013-11-14 00:57:16 -0800</bug_when>
    <thetext>Created attachment 216904
EWS bullet - style won&apos;t make it (expected)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950542</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-11-14 00:59:56 -0800</bug_when>
    <thetext>Attachment 216904 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/CMakeLists.txt&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/GNUmakefile.list.am&apos;, u&apos;Source/WebCore/WebCore.vcxproj/WebCore.vcxproj&apos;, u&apos;Source/WebCore/WebCore.xcodeproj/project.pbxproj&apos;, u&apos;Source/WebCore/rendering/LineInfo.h&apos;, u&apos;Source/WebCore/rendering/RenderBlockLineLayout.cpp&apos;, u&apos;Source/WebCore/rendering/line/BreakingContextInlineHeaders.h&apos;, u&apos;Source/WebCore/rendering/line/LineBreaker.cpp&apos;, u&apos;Source/WebCore/rendering/line/LineBreaker.h&apos;, u&apos;Source/WebCore/rendering/line/LineInfo.cpp&apos;, u&apos;Source/WebCore/rendering/line/LineInfo.h&apos;, u&apos;Source/WebCore/rendering/line/LineInlineHeaders.h&apos;]&quot; exit_code: 1
Source/WebCore/rendering/line/LineInfo.h:61:  The parameter name &quot;block&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/rendering/line/LineInfo.h:61:  The parameter name &quot;lineWidth&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 2 in 12 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>950545</commentid>
    <comment_count>3</comment_count>
      <attachid>216904</attachid>
    <who name="kov&apos;s GTK+ EWS bot">gtk-ews</who>
    <bug_when>2013-11-14 01:04:29 -0800</bug_when>
    <thetext>Comment on attachment 216904
EWS bullet - style won&apos;t make it (expected)

Attachment 216904 did not pass gtk-ews (gtk):
Output: http://webkit-queues.appspot.com/results/22700308</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950550</commentid>
    <comment_count>4</comment_count>
      <attachid>216906</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2013-11-14 01:11:49 -0800</bug_when>
    <thetext>Created attachment 216906
EWS bullet2 - style won&apos;t make it (expected)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950551</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-11-14 01:13:58 -0800</bug_when>
    <thetext>Attachment 216906 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/CMakeLists.txt&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/GNUmakefile.am&apos;, u&apos;Source/WebCore/GNUmakefile.list.am&apos;, u&apos;Source/WebCore/WebCore.vcxproj/WebCore.vcxproj&apos;, u&apos;Source/WebCore/WebCore.xcodeproj/project.pbxproj&apos;, u&apos;Source/WebCore/rendering/LineInfo.h&apos;, u&apos;Source/WebCore/rendering/RenderBlockLineLayout.cpp&apos;, u&apos;Source/WebCore/rendering/line/BreakingContextInlineHeaders.h&apos;, u&apos;Source/WebCore/rendering/line/LineBreaker.cpp&apos;, u&apos;Source/WebCore/rendering/line/LineBreaker.h&apos;, u&apos;Source/WebCore/rendering/line/LineInfo.cpp&apos;, u&apos;Source/WebCore/rendering/line/LineInfo.h&apos;, u&apos;Source/WebCore/rendering/line/LineInlineHeaders.h&apos;]&quot; exit_code: 1
Source/WebCore/rendering/line/LineInfo.h:61:  The parameter name &quot;block&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/rendering/line/LineInfo.h:61:  The parameter name &quot;lineWidth&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 2 in 13 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>950561</commentid>
    <comment_count>6</comment_count>
      <attachid>216906</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2013-11-14 01:44:38 -0800</bug_when>
    <thetext>Comment on attachment 216906
EWS bullet2 - style won&apos;t make it (expected)

Attachment 216906 did not pass mac-wk2-ews (mac-wk2):
Output: http://webkit-queues.appspot.com/results/22590168</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950564</commentid>
    <comment_count>7</comment_count>
      <attachid>216906</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2013-11-14 01:52:14 -0800</bug_when>
    <thetext>Comment on attachment 216906
EWS bullet2 - style won&apos;t make it (expected)

Attachment 216906 did not pass win-ews (win):
Output: http://webkit-queues.appspot.com/results/22889255</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950571</commentid>
    <comment_count>8</comment_count>
      <attachid>216906</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2013-11-14 02:22:45 -0800</bug_when>
    <thetext>Comment on attachment 216906
EWS bullet2 - style won&apos;t make it (expected)

Attachment 216906 did not pass mac-ews (mac):
Output: http://webkit-queues.appspot.com/results/22838003</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950572</commentid>
    <comment_count>9</comment_count>
      <attachid>216906</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2013-11-14 02:23:36 -0800</bug_when>
    <thetext>Comment on attachment 216906
EWS bullet2 - style won&apos;t make it (expected)

Attachment 216906 did not pass mac-ews (mac):
Output: http://webkit-queues.appspot.com/results/22720140</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950756</commentid>
    <comment_count>10</comment_count>
      <attachid>216959</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2013-11-14 10:42:54 -0800</bug_when>
    <thetext>Created attachment 216959
EWS bullet3 - style won&apos;t make it (expected)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950758</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-11-14 10:44:33 -0800</bug_when>
    <thetext>Attachment 216959 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/CMakeLists.txt&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/GNUmakefile.am&apos;, u&apos;Source/WebCore/GNUmakefile.list.am&apos;, u&apos;Source/WebCore/WebCore.vcxproj/WebCore.vcxproj&apos;, u&apos;Source/WebCore/WebCore.vcxproj/copyForwardingHeaders.cmd&apos;, u&apos;Source/WebCore/WebCore.xcodeproj/project.pbxproj&apos;, u&apos;Source/WebCore/rendering/LineInfo.h&apos;, u&apos;Source/WebCore/rendering/RenderBlockLineLayout.cpp&apos;, u&apos;Source/WebCore/rendering/line/BreakingContextInlineHeaders.h&apos;, u&apos;Source/WebCore/rendering/line/LineBreaker.cpp&apos;, u&apos;Source/WebCore/rendering/line/LineBreaker.h&apos;, u&apos;Source/WebCore/rendering/line/LineInfo.cpp&apos;, u&apos;Source/WebCore/rendering/line/LineInfo.h&apos;, u&apos;Source/WebCore/rendering/line/LineInlineHeaders.h&apos;]&quot; exit_code: 1
Source/WebCore/rendering/line/LineInfo.h:61:  The parameter name &quot;block&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/rendering/line/LineInfo.h:61:  The parameter name &quot;lineWidth&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 2 in 14 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>950778</commentid>
    <comment_count>12</comment_count>
      <attachid>216959</attachid>
    <who name="Build Bot">buildbot</who>
    <bug_when>2013-11-14 11:28:08 -0800</bug_when>
    <thetext>Comment on attachment 216959
EWS bullet3 - style won&apos;t make it (expected)

Attachment 216959 did not pass win-ews (win):
Output: http://webkit-queues.appspot.com/results/23638034</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950839</commentid>
    <comment_count>13</comment_count>
      <attachid>216959</attachid>
    <who name="Brent Fulgham">bfulgham</who>
    <bug_when>2013-11-14 14:10:22 -0800</bug_when>
    <thetext>Comment on attachment 216959
EWS bullet3 - style won&apos;t make it (expected)

Because we now need access to headers in the &quot;rendering/line&quot; directory, we need to update the WebCoreCommon.props file&apos;s &lt;AdditionalIncludeDirectories&gt; stanza. Look for &quot;mathml&quot; on that line, and make a similar entry for the new &quot;lines&quot; section.

It&apos;s possible you will need to update the &quot;WebCore/WebCore.vcxproj/copyForwardingHeaders.cmd&quot; to also copy the header files from &quot;lines&quot;, but I think these are not exposed outside of WebCore, so just changing the include path (above) is all that&apos;s necessary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950841</commentid>
    <comment_count>14</comment_count>
      <attachid>216979</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2013-11-14 14:15:07 -0800</bug_when>
    <thetext>Created attachment 216979
EWS bullet4 - style won&apos;t make it (expected)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950843</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-11-14 14:16:40 -0800</bug_when>
    <thetext>Attachment 216979 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/CMakeLists.txt&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/GNUmakefile.am&apos;, u&apos;Source/WebCore/GNUmakefile.list.am&apos;, u&apos;Source/WebCore/WebCore.vcxproj/WebCore.vcxproj&apos;, u&apos;Source/WebCore/WebCore.vcxproj/WebCoreCommon.props&apos;, u&apos;Source/WebCore/WebCore.xcodeproj/project.pbxproj&apos;, u&apos;Source/WebCore/rendering/LineInfo.h&apos;, u&apos;Source/WebCore/rendering/RenderBlockLineLayout.cpp&apos;, u&apos;Source/WebCore/rendering/line/BreakingContextInlineHeaders.h&apos;, u&apos;Source/WebCore/rendering/line/LineBreaker.cpp&apos;, u&apos;Source/WebCore/rendering/line/LineBreaker.h&apos;, u&apos;Source/WebCore/rendering/line/LineInfo.cpp&apos;, u&apos;Source/WebCore/rendering/line/LineInfo.h&apos;, u&apos;Source/WebCore/rendering/line/LineInlineHeaders.h&apos;]&quot; exit_code: 1
Source/WebCore/rendering/line/LineInfo.h:61:  The parameter name &quot;block&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/rendering/line/LineInfo.h:61:  The parameter name &quot;lineWidth&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 2 in 14 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>950903</commentid>
    <comment_count>16</comment_count>
      <attachid>216999</attachid>
    <who name="Zoltan Horvath">zoltan</who>
    <bug_when>2013-11-14 16:46:14 -0800</bug_when>
    <thetext>Created attachment 216999
EWS bullet5 for windows - style won&apos;t make it (expected)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>950904</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-11-14 16:48:50 -0800</bug_when>
    <thetext>Attachment 216999 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/CMakeLists.txt&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/GNUmakefile.am&apos;, u&apos;Source/WebCore/GNUmakefile.list.am&apos;, u&apos;Source/WebCore/WebCore.vcxproj/WebCore.vcxproj&apos;, u&apos;Source/WebCore/WebCore.vcxproj/WebCoreCommon.props&apos;, u&apos;Source/WebCore/WebCore.xcodeproj/project.pbxproj&apos;, u&apos;Source/WebCore/rendering/LineInfo.h&apos;, u&apos;Source/WebCore/rendering/RenderBlockLineLayout.cpp&apos;, u&apos;Source/WebCore/rendering/line/BreakingContextInlineHeaders.h&apos;, u&apos;Source/WebCore/rendering/line/LineBreaker.cpp&apos;, u&apos;Source/WebCore/rendering/line/LineBreaker.h&apos;, u&apos;Source/WebCore/rendering/line/LineInfo.cpp&apos;, u&apos;Source/WebCore/rendering/line/LineInfo.h&apos;, u&apos;Source/WebCore/rendering/line/LineInlineHeaders.h&apos;]&quot; exit_code: 1
Source/WebCore/rendering/line/LineInfo.h:61:  The parameter name &quot;block&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/rendering/line/LineInfo.h:61:  The parameter name &quot;lineWidth&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 2 in 14 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>951089</commentid>
    <comment_count>18</comment_count>
      <attachid>216999</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2013-11-15 09:31:46 -0800</bug_when>
    <thetext>Comment on attachment 216999
EWS bullet5 for windows - style won&apos;t make it (expected)

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>951182</commentid>
    <comment_count>19</comment_count>
      <attachid>216999</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-11-15 13:38:46 -0800</bug_when>
    <thetext>Comment on attachment 216999
EWS bullet5 for windows - style won&apos;t make it (expected)

Clearing flags on attachment: 216999

Committed r159354: &lt;http://trac.webkit.org/changeset/159354&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>951183</commentid>
    <comment_count>20</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-11-15 13:38:49 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>216904</attachid>
            <date>2013-11-14 00:57:16 -0800</date>
            <delta_ts>2013-11-14 01:11:49 -0800</delta_ts>
            <desc>EWS bullet - style won&apos;t make it (expected)</desc>
            <filename>refactorLB.patch</filename>
            <type>text/plain</type>
            <size>173257</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNv
cmUvQ01ha2VMaXN0cy50eHQKaW5kZXggOGUxNDczMC4uYjM3Y2QxZiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0
cy50eHQKQEAgLTc2LDYgKzc2LDcgQEAgc2V0KFdlYkNvcmVfSU5DTFVERV9ESVJFQ1RPUklFUwog
ICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS90ZXh0IgogICAgICIke1dFQkNPUkVfRElSfS9w
bHVnaW5zIgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmciCisgICAgIiR7V0VCQ09SRV9E
SVJ9L3JlbmRlcmluZy9saW5lIgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmcvbWF0aG1s
IgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmcvc2hhcGVzIgogICAgICIke1dFQkNPUkVf
RElSfS9yZW5kZXJpbmcvc3R5bGUiCkBAIC0yMjA4LDYgKzIyMDksOSBAQCBzZXQoV2ViQ29yZV9T
T1VSQ0VTCiAgICAgcmVuZGVyaW5nL1RleHRQYWludGVyLmNwcAogICAgIHJlbmRlcmluZy9icmVh
a19saW5lcy5jcHAKIAorICAgIHJlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcAorICAgIHJl
bmRlcmluZy9saW5lL0xpbmVJbmZvLmNwcAorCiAgICAgcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJN
YXRoTUxCbG9jay5jcHAKICAgICByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTEZlbmNlZC5j
cHAKICAgICByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTEZyYWN0aW9uLmNwcApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9n
CmluZGV4IDNhM2M2ZGUuLjc1ODhiY2UgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMDcgQEAKKzIw
MTMtMTEtMTQgIFpvbHRhbiBIb3J2YXRoICA8em9sdGFuQHdlYmtpdC5vcmc+CisKKyAgICAgICAg
TW92ZSBCcmVha2luZ0NvbnRleHQgYW5kIExpbmVCcmVha2VyIGludG8gdGhlaXIgb3duIGZpbGVz
CisgICAgICAgIDxodHRwczovL3dlYmtpdC5vcmcvYi8xMjQzMzY+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW4gdGhpcyBjaGFuZ2UgSSBpbnRyb2R1
Y2VkICdsaW5lJyBzdWJkaXJlY3RvcnkgaW5zaWRlICdyZW5kZXJpbmcnLCB0aGlzIGRpcmVjdG9y
eSB3aWxsIGNvbnRhaW4gYWxsIHRoZSBjbGFzc2VzCisgICAgICAgIHdoaWNoIGhhdmUgYmVlbiBy
ZWZhY3RvcmVkIGZyb20gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4gVGhpcyBjaGFuZ2UgY29u
dGFpbnMgdGhlIHNlcGFyYXRpb24gb2YgQnJlYWtpbmdDb250ZXh0LAorICAgICAgICBhbmQgdGhl
IHNlcGFyYXRpb24gb2YgTGluZUJyZWFrZXIgY2xhc3Nlcy4gU2luY2UgSSB3YW50ZWQgdG8ga2Vl
cCB0aGUgaGVscGVyIGZ1bmN0aW9ucyBvcmdhbml6ZWQsIEkgYWxzbyBhZGRlZCBhCisgICAgICAg
IG5ldyBmaWxlIGNhbGxlZCBMaW5lSW5saW5lSGVhZGVycy5oLCB3aGljaCBjb250YWlucyB0aGUg
ZnVuY3Rpb25zIHdoaWNoIHVzZWQgaW4gTGluZUJyZWFrZXIuaCBhbmQgQnJlYWtpbmdDb250ZXh0
LmguCisgICAgICAgIEkgbW92ZWQgTGluZUluZm8gY2xhc3MgaW50byBsaW5lIGRpcmVjdG9yeS4g
SXQgd2FzIG5lY2Vzc2FyeSB0aGlzIHRpbWUsIHNpbmNlIEkgYWRkZWQgYSBjcHAgZm9yIGl0LiBJ
J2xsIG1vdmUgdGhlCisgICAgICAgIHJlc3Qgb2YgdGhlIGxpbmUgbGF5b3V0IHJlbGF0ZWQgaGVs
cGVyIGNsYXNzZXMgbGF0ZXIuIChJIHdhbnRlZCB0byBtaW5pbWl6ZSBtZXJnZSBjb25mbGljdHMu
KQorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgbm8gYmVoYXZpb3IgY2hhbmdlLgorCisgICAgICAg
ICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogR05VbWFrZWZpbGUubGlzdC5hbToKKyAgICAg
ICAgKiBXZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qOgorICAgICAgICAqIFdlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQmxv
Y2tMaW5lTGF5b3V0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNyZWF0ZVJ1bik6CisgICAgICAg
ICogcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OldvcmRNZWFzdXJlbWVudDo6V29yZE1lYXN1cmVtZW50KToKKyAg
ICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6VHJhaWxpbmdPYmplY3RzKToKKyAgICAg
ICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6c2V0VHJhaWxpbmdXaGl0ZXNwYWNlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29y
ZTo6VHJhaWxpbmdPYmplY3RzOjphcHBlbmRCb3hJZk5lZWRlZCk6CisgICAgICAgIChXZWJDb3Jl
OjpkZXByZWNhdGVkQWRkTWlkcG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6c3RhcnRJZ25vcmlu
Z1NwYWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpzdG9wSWdub3JpbmdTcGFjZXMpOgorICAgICAg
ICAoV2ViQ29yZTo6ZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMpOgorICAgICAgICAo
V2ViQ29yZTo6VHJhaWxpbmdPYmplY3RzOjp1cGRhdGVNaWRwb2ludHNGb3JUcmFpbGluZ0JveGVz
KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6QnJlYWtpbmdDb250ZXh0KToK
KyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6Y3VycmVudE9iamVjdCk6CisgICAg
ICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVCcmVhayk6CisgICAgICAgIChXZWJD
b3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVCcmVha1JlZik6CisgICAgICAgIChXZWJDb3JlOjpC
cmVha2luZ0NvbnRleHQ6OmxpbmVXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0Nv
bnRleHQ6OmF0RW5kKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6Y2xlYXJM
aW5lQnJlYWtJZkZpdHNPbkxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0
Ojpjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVh
a2luZ0NvbnRleHQ6OmluaXRpYWxpemVGb3JDdXJyZW50T2JqZWN0KToKKyAgICAgICAgKFdlYkNv
cmU6OkJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFr
aW5nQ29udGV4dDo6aGFuZGxlQlIpOgorICAgICAgICAoV2ViQ29yZTo6Ym9yZGVyUGFkZGluZ01h
cmdpblN0YXJ0KToKKyAgICAgICAgKFdlYkNvcmU6OmJvcmRlclBhZGRpbmdNYXJnaW5FbmQpOgor
ICAgICAgICAoV2ViQ29yZTo6c2hvdWxkQWRkQm9yZGVyUGFkZGluZ01hcmdpbik6CisgICAgICAg
IChXZWJDb3JlOjpwcmV2aW91c0luRmxvd1NpYmxpbmcpOgorICAgICAgICAoV2ViQ29yZTo6aW5s
aW5lTG9naWNhbFdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aGFu
ZGxlT3V0T2ZGbG93UG9zaXRpb25lZCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRl
eHQ6OmhhbmRsZUZsb2F0KToKKyAgICAgICAgKFdlYkNvcmU6OnNob3VsZFNraXBXaGl0ZXNwYWNl
QWZ0ZXJTdGFydE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6Omhh
bmRsZUVtcHR5SW5saW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aGFu
ZGxlUmVwbGFjZWQpOgorICAgICAgICAoV2ViQ29yZTo6Zmlyc3RQb3NpdGl2ZVdpZHRoKToKKyAg
ICAgICAgKFdlYkNvcmU6OnVwZGF0ZVNlZ21lbnRzRm9yU2hhcGVzKToKKyAgICAgICAgKFdlYkNv
cmU6Oml0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KToKKyAgICAgICAgKFdl
YkNvcmU6Om5leHRDaGFyYWN0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6dXBkYXRlQ291bnRlcklm
TmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6Om1lYXN1cmVIeXBoZW5XaWR0aCk6CisgICAgICAg
IChXZWJDb3JlOjp0ZXh0V2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6ZW5zdXJlQ2hhcmFjdGVy
R2V0c0xpbmVCb3gpOgorICAgICAgICAoV2ViQ29yZTo6dHJ5SHlwaGVuYXRpbmcpOgorICAgICAg
ICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KToKKyAgICAgICAgKFdlYkNv
cmU6OnRleHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6
QnJlYWtpbmdDb250ZXh0OjpjYW5CcmVha0F0VGhpc1Bvc2l0aW9uKToKKyAgICAgICAgKFdlYkNv
cmU6OkJyZWFraW5nQ29udGV4dDo6Y29tbWl0QW5kVXBkYXRlTGluZUJyZWFrSWZOZWVkZWQpOgor
ICAgICAgICAoV2ViQ29yZTo6Y2hlY2tNaWRwb2ludHMpOgorICAgICAgICAoV2ViQ29yZTo6QnJl
YWtpbmdDb250ZXh0OjpoYW5kbGVFbmRPZkxpbmUpOgorICAgICAgICAqIHJlbmRlcmluZy9saW5l
L0xpbmVCcmVha2VyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6
cmVzZXQpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJyZWFrZXI6OnNraXBUcmFpbGluZ1doaXRl
c3BhY2UpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJyZWFrZXI6OnNraXBMZWFkaW5nV2hpdGVz
cGFjZSk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIuaDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6TGluZUJyZWFrZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6TGluZUJyZWFrZXI6OmxpbmVXYXNIeXBoZW5hdGVkKToKKyAgICAgICAgKFdlYkNvcmU6
OkxpbmVCcmVha2VyOjpwb3NpdGlvbmVkT2JqZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpMaW5l
QnJlYWtlcjo6Y2xlYXIpOgorICAgICAgICAqIHJlbmRlcmluZy9saW5lL0xpbmVJbmZvLmNwcDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6c2V0RW1wdHkpOgorICAgICAgICAq
IHJlbmRlcmluZy9saW5lL0xpbmVJbmZvLmg6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvTGluZUluZm8uaC4KKyAgICAgICAgKFdlYkNvcmU6OkxpbmVJbmZvOjpMaW5lSW5m
byk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6aXNGaXJzdExpbmUpOgorICAgICAgICAo
V2ViQ29yZTo6TGluZUluZm86OmlzTGFzdExpbmUpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUlu
Zm86OmlzRW1wdHkpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OnByZXZpb3VzTGluZUJy
b2tlQ2xlYW5seSk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6ZmxvYXRQYWdpbmF0aW9u
U3RydXQpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OnJ1bnNGcm9tTGVhZGluZ1doaXRl
c3BhY2UpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OnJlc2V0UnVuc0Zyb21MZWFkaW5n
V2hpdGVzcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6aW5jcmVtZW50UnVuc0Zy
b21MZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6c2V0Rmly
c3RMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVJbmZvOjpzZXRMYXN0TGluZSk6CisgICAg
ICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6c2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KToKKyAg
ICAgICAgKFdlYkNvcmU6OkxpbmVJbmZvOjpzZXRGbG9hdFBhZ2luYXRpb25TdHJ1dCk6CisgICAg
ICAgICogcmVuZGVyaW5nL2xpbmUvTGluZUlubGluZUhlYWRlcnMuaDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpoYXNJbmxpbmVEaXJlY3Rpb25Cb3JkZXJzUGFkZGluZ09yTWFyZ2luKToKKyAg
ICAgICAgKFdlYkNvcmU6OmxpbmVTdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpyZXF1aXJlc0xp
bmVCb3hGb3JDb250ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OnNob3VsZENvbGxhcHNlV2hpdGVT
cGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpza2lwTm9uQnJlYWtpbmdTcGFjZSk6CisgICAgICAg
IChXZWJDb3JlOjphbHdheXNSZXF1aXJlc0xpbmVCb3gpOgorICAgICAgICAoV2ViQ29yZTo6cmVx
dWlyZXNMaW5lQm94KToKKyAgICAgICAgKFdlYkNvcmU6OnNldFN0YXRpY1Bvc2l0aW9ucyk6CisK
IDIwMTMtMTEtMTMgIEpvc2VwaCBQZWNvcmFybyAgPHBlY29yYXJvQGFwcGxlLmNvbT4KIAogICAg
ICAgICBXZWIgSW5zcGVjdG9yOiBTcGxpdCBJbnNwZWN0b3IuanNvbiBpbnRvIGluZGl2aWR1YWwg
ZG9tYWluIGpzb24gZmlsZXMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxl
Lmxpc3QuYW0gYi9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCmluZGV4IGVmZWJl
ZmMuLjI0Y2NkODggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3Qu
YW0KKysrIGIvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQpAQCAtNDI5Niw3ICs0
Mjk2LDYgQEAgd2ViY29yZV9zb3VyY2VzICs9IFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
TG9naWNhbFNlbGVjdGlvbk9mZnNldENhY2hlcy5oIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvTGF5b3V0UmVwYWludGVyLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MYXlvdXRS
ZXBhaW50ZXIuY3BwIFwKLQlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvTGluZUluZm8uaCBcCiAJ
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xpbmVMYXlvdXRTdGF0ZS5oIFwKIAlTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvTGluZVdpZHRoLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9M
aW5lV2lkdGguY3BwIFwKQEAgLTQ1MDEsNiArNDUwMCwxMiBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0g
XAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0UGFpbnRlci5oIFwKIAlTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvVGV4dFBhaW50U3R5bGUuaCBcCiAJU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1ZlcnRpY2FsUG9zaXRpb25DYWNoZS5oIFwKKwlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
bGluZS9CcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmggXAorCVNvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9saW5lL0xpbmVJbmZvLmggXAorCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5l
L0xpbmVJbmZvLmNwcCBcCisJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFr
ZXIuaCBcCisJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIuY3BwIFwK
KwlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lSW5saW5lSGVhZGVycy5oIFwKIAlT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTEJsb2NrLmNwcCBcCiAJ
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxCbG9jay5oIFwKIAlT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTEZlbmNlZC5jcHAgXApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJv
aiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2oKaW5kZXgg
MWE2ZmY4MC4uMTY0MTZmNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hw
cm9qL1dlYkNvcmUudmN4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjeHByb2ov
V2ViQ29yZS52Y3hwcm9qCkBAIC0xMTA1MCw2ICsxMTA1MCw4IEBACiAgICAgPENsQ29tcGlsZSBJ
bmNsdWRlPSIuLlxyZW5kZXJpbmdcU2ltcGxlTGluZUxheW91dC5jcHAiIC8+CiAgICAgPENsQ29t
cGlsZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcU2ltcGxlTGluZUxheW91dEZ1bmN0aW9ucy5jcHAi
IC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcVGV4dFBhaW50U3R5bGUu
Y3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXGxpbmVcTGluZUJy
ZWFrZXIuY3BwIiAvPgorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXGxpbmVc
TGluZUluZm8uY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXHNo
YXBlc1xQb2x5Z29uU2hhcGUuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5ccmVu
ZGVyaW5nXHNoYXBlc1xSYXN0ZXJTaGFwZS5jcHAiIC8+CiAgICAgPENsQ29tcGlsZSBJbmNsdWRl
PSIuLlxyZW5kZXJpbmdcc2hhcGVzXFJlY3RhbmdsZVNoYXBlLmNwcCIgLz4KQEAgLTE5NzU3LDcg
KzE5NzU5LDYgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xJbmxpbmVU
ZXh0Qm94LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcTGF5b3V0
UmVwYWludGVyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcTGF5
b3V0U3RhdGUuaCIgLz4KLSAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xMaW5l
SW5mby5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXExpbmVMYXlv
dXRTdGF0ZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXExpbmVX
aWR0aC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXE9yZGVySXRl
cmF0b3IuaCIgLz4KQEAgLTE5ODMyLDYgKzE5ODMzLDEwIEBACiAgICAgPENsSW5jbHVkZSBJbmNs
dWRlPSIuLlxyZW5kZXJpbmdcUmVuZGVyU2VsZWN0aW9uSW5mby5oIiAvPgogICAgIDxDbEluY2x1
ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXFJlbmRlclNsaWRlci5oIiAvPgogICAgIDxDbEluY2x1
ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXFJlbmRlclNuYXBzaG90dGVkUGx1Z0luLmgiIC8+Cisg
ICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcbGluZVxCcmVha2luZ0NvbnRleHRJ
bmxpbmVIZWFkZXJzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdc
bGluZVxMaW5lQnJlYWtlci5oIiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVy
aW5nXGxpbmVcTGluZUluZm8uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRl
cmluZ1xsaW5lXExpbmVJbmxpbmVIZWFkZXJzLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRl
PSIuLlxyZW5kZXJpbmdcc2hhcGVzXFBvbHlnb25TaGFwZS5oIiAvPgogICAgIDxDbEluY2x1ZGUg
SW5jbHVkZT0iLi5ccmVuZGVyaW5nXHNoYXBlc1xSYXN0ZXJTaGFwZS5oIiAvPgogICAgIDxDbElu
Y2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXHNoYXBlc1xSZWN0YW5nbGVTaGFwZS5oIiAvPgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmlu
ZGV4IDQ2MjVkNmMuLjFlM2ZhN2EgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTM0MzYsNyArMzQzNiw2IEBACiAJCTlGQTM3RUZE
MTE3MkZEQTYwMEM0Q0Q1NSAvKiBKU1NjcmlwdFByb2ZpbGVOb2RlLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5RkEzN0VGOTExNzJGRDkzMDBDNENENTUg
LyogSlNTY3JpcHRQcm9maWxlTm9kZS5oICovOyB9OwogCQlBMDI0NTc1MTE2Q0VBQTI3MDAwRTU2
NzEgLyogRVhURHJhd0J1ZmZlcnMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gQTAyNDU3NEUxNkNFQUEyNzAwMEU1NjcxIC8qIEVYVERyYXdCdWZmZXJz
LmNwcCAqLzsgfTsKIAkJQTAyNDU3NTIxNkNFQUEyNzAwMEU1NjcxIC8qIEVYVERyYXdCdWZmZXJz
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBMDI0NTc0
RjE2Q0VBQTI3MDAwRTU2NzEgLyogRVhURHJhd0J1ZmZlcnMuaCAqLzsgfTsKLQkJQTA2QkZFMkUx
N0RGQjQzRjAwODMwMkJCIC8qIExpbmVJbmZvLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBBMDZCRkUyQzE3REZCNDMzMDA4MzAyQkIgLyogTGluZUluZm8u
aCAqLzsgfTsKIAkJQTA3RDMzNTUxNTJCNjMwRTAwMUI2MzkzIC8qIEpTV2ViR0xTaGFkZXJQcmVj
aXNpb25Gb3JtYXQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gQTA3RDMzNTMxNTJCNjMwRTAwMUI2MzkzIC8qIEpTV2ViR0xTaGFkZXJQcmVjaXNpb25G
b3JtYXQuY3BwICovOyB9OwogCQlBMDdEMzM1NjE1MkI2MzBFMDAxQjYzOTMgLyogSlNXZWJHTFNo
YWRlclByZWNpc2lvbkZvcm1hdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQTA3RDMzNTQxNTJCNjMwRTAwMUI2MzkzIC8qIEpTV2ViR0xTaGFkZXJQcmVj
aXNpb25Gb3JtYXQuaCAqLzsgfTsKIAkJQTA3RDMzNTgxNTJCNjMyRDAwMUI2MzkzIC8qIFdlYkdM
U2hhZGVyUHJlY2lzaW9uRm9ybWF0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBBMDdEMzM1NzE1MkI2MzJEMDAxQjYzOTMgLyogV2ViR0xTaGFkZXJQcmVj
aXNpb25Gb3JtYXQuaCAqLzsgfTsKQEAgLTYyOTksNiArNjI5OCw4IEBACiAJCUZFRTE4MTE0MTZD
MzE5RTgwMDA4NDg0OSAvKiBTUUxUcmFuc2FjdGlvbkJhY2tlbmQuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZFRTE4MTEyMTZDMzE5RTgwMDA4NDg0OSAv
KiBTUUxUcmFuc2FjdGlvbkJhY2tlbmQuaCAqLzsgfTsKIAkJRkY5NDVFQ0IxNjFGN0YzNjAwOTcx
QkM4IC8qIFBzZXVkb0VsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gRkY5NDVFQzkxNjFGN0YzNjAwOTcxQkM4IC8qIFBzZXVkb0VsZW1lbnQu
Y3BwICovOyB9OwogCQlGRjk0NUVDQzE2MUY3RjM2MDA5NzFCQzggLyogUHNldWRvRWxlbWVudC5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkY5NDVFQ0Ex
NjFGN0YzNjAwOTcxQkM4IC8qIFBzZXVkb0VsZW1lbnQuaCAqLzsgfTsKKwkJRkZCNjk4Q0MxODMz
RUUwRDAwMTU4QTMxIC8qIExpbmVCcmVha2VyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZGQjY5OENBMTgzM0VDMzgwMDE1OEEzMSAvKiBMaW5lQnJl
YWtlci5jcHAgKi87IH07CisJCUZGQjY5OENGMTgzNDAyQkIwMDE1OEEzMSAvKiBMaW5lSW5mby5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRkI2OThD
RDE4MzNGMTc2MDAxNThBMzEgLyogTGluZUluZm8uY3BwICovOyB9OwogCQlGRkQ1Qjk3QTEzNUND
OTc4MDBENUU5MkEgLyogUGFnZVZpc2liaWxpdHlTdGF0ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRkQ1Qjk3NzEzNUNDOTc4MDBENUU5MkEgLyog
UGFnZVZpc2liaWxpdHlTdGF0ZS5jcHAgKi87IH07CiAJCUZGRDVCOTdCMTM1Q0M5NzgwMEQ1RTky
QSAvKiBQYWdlVmlzaWJpbGl0eVN0YXRlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBGRkQ1Qjk3ODEzNUNDOTc4MDBENUU5MkEgLyogUGFnZVZpc2liaWxp
dHlTdGF0ZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07
CiAvKiBFbmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KQEAgLTEwMjA1LDcgKzEwMjA2LDYgQEAK
IAkJQTAyNDU3NEUxNkNFQUEyNzAwMEU1NjcxIC8qIEVYVERyYXdCdWZmZXJzLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IEVYVERyYXdCdWZmZXJzLmNwcDsgcGF0aCA9
IGNhbnZhcy9FWFREcmF3QnVmZmVycy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CUEwMjQ1NzRGMTZDRUFBMjcwMDBFNTY3MSAvKiBFWFREcmF3QnVmZmVycy5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IG5hbWUgPSBFWFREcmF3QnVmZmVycy5oOyBwYXRoID0gY2FudmFzL0VY
VERyYXdCdWZmZXJzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUEwMjQ1NzUwMTZD
RUFBMjcwMDBFNTY3MSAvKiBFWFREcmF3QnVmZmVycy5pZGwgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1l
ID0gRVhURHJhd0J1ZmZlcnMuaWRsOyBwYXRoID0gY2FudmFzL0VYVERyYXdCdWZmZXJzLmlkbDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJQTA2QkZFMkMxN0RGQjQzMzAwODMwMkJCIC8q
IExpbmVJbmZvLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IExpbmVJbmZvLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUEwNzE4QkU4MTdFMjZGMTYwMEY2QkY0NCAv
KiBMaW5lTGF5b3V0U3RhdGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTGlu
ZUxheW91dFN0YXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUEwN0QzMzUzMTUy
QjYzMEUwMDFCNjM5MyAvKiBKU1dlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0LmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTV2ViR0xTaGFkZXJQcmVjaXNpb25Gb3Jt
YXQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBMDdEMzM1NDE1MkI2MzBFMDAx
QjYzOTMgLyogSlNXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBKU1dlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0Lmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xMzQ3Miw2ICsxMzQ3MiwxMSBAQAogCQlGRUUxODExMjE2
QzMxOUU4MDAwODQ4NDkgLyogU1FMVHJhbnNhY3Rpb25CYWNrZW5kLmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgcGF0aCA9IFNRTFRyYW5zYWN0aW9uQmFja2VuZC5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlGRjk0NUVDOTE2MUY3RjM2MDA5NzFCQzggLyogUHNldWRvRWxlbWVu
dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBQc2V1ZG9FbGVtZW50
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkY5NDVFQ0ExNjFGN0YzNjAwOTcx
QkM4IC8qIFBzZXVkb0VsZW1lbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
UHNldWRvRWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGRkI2OThDOTE4
MzJGMTBCMDAxNThBMzEgLyogQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZGQjY5OENBMTgzM0VDMzgwMDE1OEEzMSAv
KiBMaW5lQnJlYWtlci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBM
aW5lQnJlYWtlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZGQjY5OENCMTgz
M0VDMzgwMDE1OEEzMSAvKiBMaW5lQnJlYWtlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBMaW5lQnJlYWtlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGRkI2
OThDRDE4MzNGMTc2MDAxNThBMzEgLyogTGluZUluZm8uY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gTGluZUluZm8uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OworCQlGRkI2OThDRTE4MzNGMTc2MDAxNThBMzEgLyogTGluZUluZm8uaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gTGluZUluZm8uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKIAkJRkZENUI5NzcxMzVDQzk3ODAwRDVFOTJBIC8qIFBhZ2VWaXNpYmlsaXR5U3RhdGUuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUGFnZVZpc2liaWxpdHlTdGF0
ZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZGRDVCOTc4MTM1Q0M5NzgwMEQ1
RTkyQSAvKiBQYWdlVmlzaWJpbGl0eVN0YXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IFBhZ2VWaXNpYmlsaXR5U3RhdGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IC8qIEVuZCBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KQEAgLTIwOTAxLDYgKzIwOTA2LDcg
QEAKIAkJRjUyM0QyRjMwMkRFNDQzQjAxODYzNUNBIC8qIHJlbmRlcmluZyAqLyA9IHsKIAkJCWlz
YSA9IFBCWEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCisJCQkJRkZCNjk4QzgxODMyRjEwQjAwMTU4
QTMxIC8qIGxpbmUgKi8sCiAJCQkJQ0RFN0ZDNDIxODE5MDRCMTAwMkJCQjc3IC8qIE9yZGVySXRl
cmF0b3IuY3BwICovLAogCQkJCUNERTdGQzQzMTgxOTA0QjEwMDJCQkI3NyAvKiBPcmRlckl0ZXJh
dG9yLmggKi8sCiAJCQkJNDM5MDQ2QzIxMkRBMjVDRTAwQUY4MEEyIC8qIG1hdGhtbCAqLywKQEAg
LTIwOTQ5LDcgKzIwOTU1LDYgQEAKIAkJCQlBMTIwQUNBMDEzRjk5ODM3MDBGRTRBQzcgLyogTGF5
b3V0UmVwYWludGVyLmggKi8sCiAJCQkJMkQ5MDY2MDQwQkUxNDFENDAwOTU2OTk4IC8qIExheW91
dFN0YXRlLmNwcCAqLywKIAkJCQkyRDkwNjYwNTBCRTE0MUQ0MDA5NTY5OTggLyogTGF5b3V0U3Rh
dGUuaCAqLywKLQkJCQlBMDZCRkUyQzE3REZCNDMzMDA4MzAyQkIgLyogTGluZUluZm8uaCAqLywK
IAkJCQlBMDcxOEJFODE3RTI2RjE2MDBGNkJGNDQgLyogTGluZUxheW91dFN0YXRlLmggKi8sCiAJ
CQkJQTBDQjAwMjMxN0RGODFBQzAwMTc4OTZCIC8qIExpbmVXaWR0aC5jcHAgKi8sCiAJCQkJQTBD
QjAwMjExN0RFOUNEMDAwMTc4OTZCIC8qIExpbmVXaWR0aC5oICovLApAQCAtMjE4ODksNiArMjE4
OTQsMTggQEAKIAkJCW5hbWUgPSBXZWJBdWRpbzsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
CiAJCX07CisJCUZGQjY5OEM4MTgzMkYxMEIwMDE1OEEzMSAvKiBsaW5lICovID0geworCQkJaXNh
ID0gUEJYR3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlGRkI2OThDRDE4MzNGMTc2MDAxNThB
MzEgLyogTGluZUluZm8uY3BwICovLAorCQkJCUZGQjY5OENFMTgzM0YxNzYwMDE1OEEzMSAvKiBM
aW5lSW5mby5oICovLAorCQkJCUZGQjY5OENBMTgzM0VDMzgwMDE1OEEzMSAvKiBMaW5lQnJlYWtl
ci5jcHAgKi8sCisJCQkJRkZCNjk4Q0IxODMzRUMzODAwMTU4QTMxIC8qIExpbmVCcmVha2VyLmgg
Ki8sCisJCQkJRkZCNjk4QzkxODMyRjEwQjAwMTU4QTMxIC8qIEJyZWFraW5nQ29udGV4dElubGlu
ZUhlYWRlcnMuaCAqLywKKwkJCSk7CisJCQlwYXRoID0gbGluZTsKKwkJCXNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7CisJCX07CiAvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLwogCiAvKiBCZWdpbiBQ
QlhIZWFkZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCkBAIC0yNTE4MCw3ICsyNTE5Nyw2IEBACiAJ
CQkJQkUxNkM1OTUxN0NGRTE3MjAwODUyQzA0IC8qIEluYmFuZFdlYlZUVFRleHRUcmFjay5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJQkMxMEQ3NjgxN0Q4RUU3MTAwNUUyNjI2IC8qIFJlbmRlckJsb2Nr
Rmxvdy5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTBDQjAwMjUxN0RGODI2QzAwMTc4OTZCIC8qIExp
bmVXaWR0aC5oIGluIEhlYWRlcnMgKi8sCi0JCQkJQTA2QkZFMkUxN0RGQjQzRjAwODMwMkJCIC8q
IExpbmVJbmZvLmggaW4gSGVhZGVycyAqLywKIAkJCQlDRDNFMjUxQzE4MDQ2QjA2MDBFMjdGNTYg
LyogR3JpZENvb3JkaW5hdGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUNEM0UyNTI0MTgwNDZCQ0Qw
MEUyN0Y1NiAvKiBDU1NHcmlkVGVtcGxhdGVWYWx1ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQ0RF
RjRGRDcxN0U4NUM4RjAwQUVFMjRCIC8qIEdyaWRMZW5ndGguaCBpbiBIZWFkZXJzICovLApAQCAt
MjU3NjUsNiArMjU3ODEsNyBAQAogCQkJCTk3N0IzODYyMTIyODgzRTkwMEI4MUZGOCAvKiBDU1NQ
cmVsb2FkU2Nhbm5lci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODBFNkQwNTBBMTk4OUNBMDA3
RkI4QzUgLyogQ1NTUHJpbWl0aXZlVmFsdWUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTgwRTZD
RjcwQTE5ODlDQTAwN0ZCOEM1IC8qIENTU1Byb3BlcnR5LmNwcCBpbiBTb3VyY2VzICovLAorCQkJ
CUZGQjY5OENDMTgzM0VFMEQwMDE1OEEzMSAvKiBMaW5lQnJlYWtlci5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQk3OEQwMkJDNTE1NEExOERGMDBCNjJEMDUgLyogQ1NTUHJvcGVydHlBbmltYXRpb24u
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMUFCQTc2Q0ExMUQyMEU1MDAwNEMyMDFDIC8qIENTU1By
b3BlcnR5TmFtZXMuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMDdDNTlCNTYxN0Y0QUMxNTAwMEZC
Q0JCIC8qIFZpZGVvU3RyZWFtVHJhY2suY3BwIGluIFNvdXJjZXMgKi8sCkBAIC0yNjU3MSw2ICsy
NjU4OCw3IEBACiAJCQkJMDcwMzYzRTUxODFBMUNEQzAwQzA3NEE1IC8qIEFWTWVkaWFDYXB0dXJl
U291cmNlLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJOTM5MjI2MkYxMDMyMTA4NDAwNkU3RDVEIC8q
IEpTQ1NTUnVsZUxpc3RDdXN0b20uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQyMDExQjYwQTAw
MzEzMzAwODMwM0Y5IC8qIEpTQ1NTU3R5bGVEZWNsYXJhdGlvbi5jcHAgaW4gU291cmNlcyAqLywK
KwkJCQlGRkI2OThDRjE4MzQwMkJCMDAxNThBMzEgLyogTGluZUluZm8uY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkJQkM1ODI1RjMwQzBCODkzODAwNTNGMUI1IC8qIEpTQ1NTU3R5bGVEZWNsYXJhdGlv
bkN1c3RvbS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQzQ2QzIwNjBDMEREQ0ExMDAyMENGQzMg
LyogSlNDU1NTdHlsZVJ1bGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNDNUJFMDAwQzBFOTMx
MTAwMTFDMkRCIC8qIEpTQ1NTU3R5bGVTaGVldC5jcHAgaW4gU291cmNlcyAqLywKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lSW5mby5oIGIvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL0xpbmVJbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2Fl
NjYuLjAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xpbmVJbmZvLmgKKysr
IC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFk
b2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKLSAqICAgIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAg
ICBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQotICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICogICAgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUKLSAqIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwKLSAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gKiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIExpbmVJbmZvX2gKLSNk
ZWZpbmUgTGluZUluZm9faAotCi0jaW5jbHVkZSAiTGluZVdpZHRoLmgiCi0KLW5hbWVzcGFjZSBX
ZWJDb3JlIHsKLQotY2xhc3MgTGluZUluZm8gewotcHVibGljOgotICAgIExpbmVJbmZvKCkKLSAg
ICAgICAgOiBtX2lzRmlyc3RMaW5lKHRydWUpCi0gICAgICAgICwgbV9pc0xhc3RMaW5lKGZhbHNl
KQotICAgICAgICAsIG1faXNFbXB0eSh0cnVlKQotICAgICAgICAsIG1fcHJldmlvdXNMaW5lQnJv
a2VDbGVhbmx5KHRydWUpCi0gICAgICAgICwgbV9mbG9hdFBhZ2luYXRpb25TdHJ1dCgwKQotICAg
ICAgICAsIG1fcnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgwKQotICAgIHsgfQotCi0gICAgYm9v
bCBpc0ZpcnN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNGaXJzdExpbmU7IH0KLSAgICBib29s
IGlzTGFzdExpbmUoKSBjb25zdCB7IHJldHVybiBtX2lzTGFzdExpbmU7IH0KLSAgICBib29sIGlz
RW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2lzRW1wdHk7IH0KLSAgICBib29sIHByZXZpb3VzTGlu
ZUJyb2tlQ2xlYW5seSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5
OyB9Ci0gICAgTGF5b3V0VW5pdCBmbG9hdFBhZ2luYXRpb25TdHJ1dCgpIGNvbnN0IHsgcmV0dXJu
IG1fZmxvYXRQYWdpbmF0aW9uU3RydXQ7IH0KLSAgICB1bnNpZ25lZCBydW5zRnJvbUxlYWRpbmdX
aGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4gbV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlOyB9
Ci0gICAgdm9pZCByZXNldFJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UoKSB7IG1fcnVuc0Zyb21M
ZWFkaW5nV2hpdGVzcGFjZSA9IDA7IH0KLSAgICB2b2lkIGluY3JlbWVudFJ1bnNGcm9tTGVhZGlu
Z1doaXRlc3BhY2UoKSB7IG1fcnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSsrOyB9Ci0KLSAgICB2
b2lkIHNldEZpcnN0TGluZShib29sIGZpcnN0TGluZSkgeyBtX2lzRmlyc3RMaW5lID0gZmlyc3RM
aW5lOyB9Ci0gICAgdm9pZCBzZXRMYXN0TGluZShib29sIGxhc3RMaW5lKSB7IG1faXNMYXN0TGlu
ZSA9IGxhc3RMaW5lOyB9Ci0gICAgdm9pZCBzZXRFbXB0eShib29sIGVtcHR5LCBSZW5kZXJCbG9j
ayogYmxvY2sgPSAwLCBMaW5lV2lkdGgqIGxpbmVXaWR0aCA9IDApCi0gICAgewotICAgICAgICBp
ZiAobV9pc0VtcHR5ID09IGVtcHR5KQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX2lz
RW1wdHkgPSBlbXB0eTsKLSAgICAgICAgaWYgKCFlbXB0eSAmJiBibG9jayAmJiBmbG9hdFBhZ2lu
YXRpb25TdHJ1dCgpKSB7Ci0gICAgICAgICAgICBibG9jay0+c2V0TG9naWNhbEhlaWdodChibG9j
ay0+bG9naWNhbEhlaWdodCgpICsgZmxvYXRQYWdpbmF0aW9uU3RydXQoKSk7Ci0gICAgICAgICAg
ICBzZXRGbG9hdFBhZ2luYXRpb25TdHJ1dCgwKTsKLSAgICAgICAgICAgIGxpbmVXaWR0aC0+dXBk
YXRlQXZhaWxhYmxlV2lkdGgoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0UHJl
dmlvdXNMaW5lQnJva2VDbGVhbmx5KGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KSB7IG1f
cHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ID0gcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5OyB9Ci0g
ICAgdm9pZCBzZXRGbG9hdFBhZ2luYXRpb25TdHJ1dChMYXlvdXRVbml0IHN0cnV0KSB7IG1fZmxv
YXRQYWdpbmF0aW9uU3RydXQgPSBzdHJ1dDsgfQotCi1wcml2YXRlOgotICAgIGJvb2wgbV9pc0Zp
cnN0TGluZTsKLSAgICBib29sIG1faXNMYXN0TGluZTsKLSAgICBib29sIG1faXNFbXB0eTsKLSAg
ICBib29sIG1fcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5OwotICAgIExheW91dFVuaXQgbV9mbG9h
dFBhZ2luYXRpb25TdHJ1dDsKLSAgICB1bnNpZ25lZCBtX3J1bnNGcm9tTGVhZGluZ1doaXRlc3Bh
Y2U7Ci19OwotCi19Ci0KLSNlbmRpZiAvLyBMaW5lSW5mb19oCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcCBiL1NvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCmluZGV4IGU1N2JjODUuLjIx
NTY2NTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xp
bmVMYXlvdXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xp
bmVMYXlvdXQuY3BwCkBAIC0zLDYgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0
LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0
IHJlc2VydmVkLgogICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hhbmdTZW9rIE9oIDxzaGl2YW1pZG93
QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluYy4gQWxs
IHJpZ2h0IHJlc2VydmVkLgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCkBAIC0yNSwxMzggKzI2LDMxIEBA
CiAKICNpbmNsdWRlICJBWE9iamVjdENhY2hlLmgiCiAjaW5jbHVkZSAiQmlkaVJlc29sdmVyLmgi
CisjaW5jbHVkZSAiQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oIgogI2luY2x1ZGUgIkZs
b2F0aW5nT2JqZWN0cy5oIgotI2luY2x1ZGUgIkh5cGhlbmF0aW9uLmgiCiAjaW5jbHVkZSAiSW5s
aW5lRWxlbWVudEJveC5oIgogI2luY2x1ZGUgIklubGluZUl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAi
SW5saW5lVGV4dEJveC5oIgotI2luY2x1ZGUgIkxpbmVJbmZvLmgiCiAjaW5jbHVkZSAiTGluZUxh
eW91dFN0YXRlLmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlJlbmRlckJsb2Nr
Rmxvdy5oIgotI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0LmgiCi0jaW5jbHVkZSAiUmVuZGVy
Q291bnRlci5oIgogI2luY2x1ZGUgIlJlbmRlckZsb3dUaHJlYWQuaCIKLSNpbmNsdWRlICJSZW5k
ZXJJbmxpbmUuaCIKLSNpbmNsdWRlICJSZW5kZXJMYXllci5oIgogI2luY2x1ZGUgIlJlbmRlckxp
bmVCcmVhay5oIgotI2luY2x1ZGUgIlJlbmRlckxpc3RNYXJrZXIuaCIKICNpbmNsdWRlICJSZW5k
ZXJSZWdpb24uaCIKLSNpbmNsdWRlICJSZW5kZXJSdWJ5UnVuLmgiCiAjaW5jbHVkZSAiUmVuZGVy
Vmlldy5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAjaW5jbHVkZSAiU2ltcGxlTGluZUxheW91
dEZ1bmN0aW9ucy5oIgogI2luY2x1ZGUgIlRyYWlsaW5nRmxvYXRzUm9vdElubGluZUJveC5oIgog
I2luY2x1ZGUgIlZlcnRpY2FsUG9zaXRpb25DYWNoZS5oIgotI2luY2x1ZGUgImJyZWFrX2xpbmVz
LmgiCiAjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWRMZWFrQ291bnRlci5oPgogI2luY2x1ZGUgPHd0
Zi9TdGRMaWJFeHRyYXMuaD4KLSNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8d3Rm
L3VuaWNvZGUvQ2hhcmFjdGVyTmFtZXMuaD4KLQotI2lmIEVOQUJMRShDU1NfU0hBUEVTKQotI2lu
Y2x1ZGUgIlNoYXBlSW5zaWRlSW5mby5oIgotI2VuZGlmCiAKICNpZiBFTkFCTEUoU1ZHKQotI2lu
Y2x1ZGUgIlJlbmRlclNWR0lubGluZVRleHQuaCIKICNpbmNsdWRlICJTVkdSb290SW5saW5lQm94
LmgiCiAjZW5kaWYKIAotdXNpbmcgbmFtZXNwYWNlIFdURjsKLXVzaW5nIG5hbWVzcGFjZSBVbmlj
b2RlOwotCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLS8vIFdlIGRvbid0IGxldCBvdXIgbGluZSBi
b3ggdHJlZSBmb3IgYSBzaW5nbGUgbGluZSBnZXQgYW55IGRlZXBlciB0aGFuIHRoaXMuCi1jb25z
dCB1bnNpZ25lZCBjTWF4TGluZURlcHRoID0gMjAwOwotCi1zdHJ1Y3QgUmVuZGVyVGV4dEluZm8g
ewotICAgIC8vIERlc3RydWN0aW9uIG9mIG1fbGF5b3V0IHJlcXVpcmVzIFRleHRMYXlvdXQgdG8g
YmUgYSBjb21wbGV0ZSB0eXBlLCBzbyB0aGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgYXJl
IG1hZGUgbm9uLWlubGluZSB0byBhdm9pZCBjb21waWxhdGlvbiBlcnJvcnMuCi0gICAgUmVuZGVy
VGV4dEluZm8oKTsKLSAgICB+UmVuZGVyVGV4dEluZm8oKTsKLQotICAgIFJlbmRlclRleHQqIG1f
dGV4dDsKLSAgICBPd25QdHI8VGV4dExheW91dD4gbV9sYXlvdXQ7Ci0gICAgTGF6eUxpbmVCcmVh
a0l0ZXJhdG9yIG1fbGluZUJyZWFrSXRlcmF0b3I7Ci0gICAgY29uc3QgRm9udCogbV9mb250Owot
fTsKLQotY2xhc3MgTGluZUJyZWFrZXIgewotcHVibGljOgotICAgIGZyaWVuZCBjbGFzcyBCcmVh
a2luZ0NvbnRleHQ7Ci0gICAgTGluZUJyZWFrZXIoUmVuZGVyQmxvY2tGbG93JiBibG9jaykKLSAg
ICAgICAgOiBtX2Jsb2NrKGJsb2NrKQotICAgIHsKLSAgICAgICAgcmVzZXQoKTsKLSAgICB9Ci0K
LSAgICBJbmxpbmVJdGVyYXRvciBuZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIExp
bmVJbmZvJiwgUmVuZGVyVGV4dEluZm8mLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVBy
ZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIFdvcmRNZWFz
dXJlbWVudHMmKTsKLQotICAgIGJvb2wgbGluZVdhc0h5cGhlbmF0ZWQoKSB7IHJldHVybiBtX2h5
cGhlbmF0ZWQ7IH0KLSAgICBjb25zdCBWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmpl
Y3RzKCkgeyByZXR1cm4gbV9wb3NpdGlvbmVkT2JqZWN0czsgfQotICAgIEVDbGVhciBjbGVhcigp
IHsgcmV0dXJuIG1fY2xlYXI7IH0KLQotcHJpdmF0ZToKLSAgICB2b2lkIHJlc2V0KCk7Ci0KLSAg
ICBJbmxpbmVJdGVyYXRvciBuZXh0U2VnbWVudEJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIExp
bmVJbmZvJiwgUmVuZGVyVGV4dEluZm8mLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVBy
ZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIFdvcmRNZWFz
dXJlbWVudHMmKTsKLSAgICB2b2lkIHNraXBUcmFpbGluZ1doaXRlc3BhY2UoSW5saW5lSXRlcmF0
b3ImLCBjb25zdCBMaW5lSW5mbyYpOwotICAgIHZvaWQgc2tpcExlYWRpbmdXaGl0ZXNwYWNlKElu
bGluZUJpZGlSZXNvbHZlciYsIExpbmVJbmZvJiwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZy
b21QcmV2aW91c0xpbmUsIExpbmVXaWR0aCYpOwotCi0gICAgUmVuZGVyQmxvY2tGbG93JiBtX2Js
b2NrOwotICAgIGJvb2wgbV9oeXBoZW5hdGVkOwotICAgIEVDbGVhciBtX2NsZWFyOwotICAgIFZl
Y3RvcjxSZW5kZXJCb3gqPiBtX3Bvc2l0aW9uZWRPYmplY3RzOwotfTsKLQotc3RhdGljIGlubGlu
ZSBMYXlvdXRVbml0IGJvcmRlclBhZGRpbmdNYXJnaW5TdGFydChjb25zdCBSZW5kZXJJbmxpbmUm
IGNoaWxkKQotewotICAgIHJldHVybiBjaGlsZC5tYXJnaW5TdGFydCgpICsgY2hpbGQucGFkZGlu
Z1N0YXJ0KCkgKyBjaGlsZC5ib3JkZXJTdGFydCgpOwotfQotCi1zdGF0aWMgaW5saW5lIExheW91
dFVuaXQgYm9yZGVyUGFkZGluZ01hcmdpbkVuZChjb25zdCBSZW5kZXJJbmxpbmUmIGNoaWxkKQot
ewotICAgIHJldHVybiBjaGlsZC5tYXJnaW5FbmQoKSArIGNoaWxkLnBhZGRpbmdFbmQoKSArIGNo
aWxkLmJvcmRlckVuZCgpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkQWRkQm9yZGVy
UGFkZGluZ01hcmdpbihSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIC8vIFdoZW4gZGVjaWRp
bmcgd2hldGhlciB3ZSdyZSBhdCB0aGUgZWRnZSBvZiBhbiBpbmxpbmUsIGFkamFjZW50IGNvbGxh
cHNlZCB3aGl0ZXNwYWNlIGlzIHRoZSBzYW1lIGFzIG5vIHNpYmxpbmcgYXQgYWxsLgotICAgIHJl
dHVybiAhY2hpbGQgfHwgKGNoaWxkLT5pc1RleHQoKSAmJiAhdG9SZW5kZXJUZXh0KGNoaWxkKS0+
dGV4dExlbmd0aCgpKTsKLX0KLQotc3RhdGljIFJlbmRlck9iamVjdCogcHJldmlvdXNJbkZsb3dT
aWJsaW5nKFJlbmRlck9iamVjdCogY2hpbGQpCi17Ci0gICAgY2hpbGQgPSBjaGlsZC0+cHJldmlv
dXNTaWJsaW5nKCk7Ci0gICAgd2hpbGUgKGNoaWxkICYmIGNoaWxkLT5pc091dE9mRmxvd1Bvc2l0
aW9uZWQoKSkKLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAg
cmV0dXJuIGNoaWxkOwotfQotCi1zdGF0aWMgTGF5b3V0VW5pdCBpbmxpbmVMb2dpY2FsV2lkdGgo
UmVuZGVyT2JqZWN0KiBjaGlsZCwgYm9vbCBjaGVja1N0YXJ0RWRnZSA9IHRydWUsIGJvb2wgY2hl
Y2tFbmRFZGdlID0gdHJ1ZSkKLXsKLSAgICB1bnNpZ25lZCBsaW5lRGVwdGggPSAxOwotICAgIExh
eW91dFVuaXQgZXh0cmFXaWR0aCA9IDA7Ci0gICAgUmVuZGVyRWxlbWVudCogcGFyZW50ID0gY2hp
bGQtPnBhcmVudCgpOwotICAgIHdoaWxlIChwYXJlbnQtPmlzUmVuZGVySW5saW5lKCkgJiYgbGlu
ZURlcHRoKysgPCBjTWF4TGluZURlcHRoKSB7Ci0gICAgICAgIGNvbnN0IFJlbmRlcklubGluZSYg
cGFyZW50QXNSZW5kZXJJbmxpbmUgPSB0b1JlbmRlcklubGluZSgqcGFyZW50KTsKLSAgICAgICAg
aWYgKCFpc0VtcHR5SW5saW5lKHBhcmVudEFzUmVuZGVySW5saW5lKSkgewotICAgICAgICAgICAg
Y2hlY2tTdGFydEVkZ2UgPSBjaGVja1N0YXJ0RWRnZSAmJiBzaG91bGRBZGRCb3JkZXJQYWRkaW5n
TWFyZ2luKHByZXZpb3VzSW5GbG93U2libGluZyhjaGlsZCkpOwotICAgICAgICAgICAgaWYgKGNo
ZWNrU3RhcnRFZGdlKQotICAgICAgICAgICAgICAgIGV4dHJhV2lkdGggKz0gYm9yZGVyUGFkZGlu
Z01hcmdpblN0YXJ0KHBhcmVudEFzUmVuZGVySW5saW5lKTsKLSAgICAgICAgICAgIGNoZWNrRW5k
RWRnZSA9IGNoZWNrRW5kRWRnZSAmJiBzaG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2luKGNoaWxk
LT5uZXh0U2libGluZygpKTsKLSAgICAgICAgICAgIGlmIChjaGVja0VuZEVkZ2UpCi0gICAgICAg
ICAgICAgICAgZXh0cmFXaWR0aCArPSBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKHBhcmVudEFzUmVu
ZGVySW5saW5lKTsKLSAgICAgICAgICAgIGlmICghY2hlY2tTdGFydEVkZ2UgJiYgIWNoZWNrRW5k
RWRnZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFXaWR0aDsKLSAgICAgICAgfQotICAg
ICAgICBjaGlsZCA9IHBhcmVudDsKLSAgICAgICAgcGFyZW50ID0gY2hpbGQtPnBhcmVudCgpOwot
ICAgIH0KLSAgICByZXR1cm4gZXh0cmFXaWR0aDsKLX0KLQogc3RhdGljIHZvaWQgZGV0ZXJtaW5l
RGlyZWN0aW9uYWxpdHkoVGV4dERpcmVjdGlvbiYgZGlyLCBJbmxpbmVJdGVyYXRvciBpdGVyKQog
ewogICAgIHdoaWxlICghaXRlci5hdEVuZCgpKSB7CkBAIC0xNzcsNjcgKzcxLDcgQEAgc3RhdGlj
IHZvaWQgZGV0ZXJtaW5lRGlyZWN0aW9uYWxpdHkoVGV4dERpcmVjdGlvbiYgZGlyLCBJbmxpbmVJ
dGVyYXRvciBpdGVyKQogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2hlY2tNaWRwb2ludHMoTGlu
ZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvciYgbEJyZWFr
KQotewotICAgIC8vIENoZWNrIHRvIHNlZSBpZiBvdXIgbGFzdCBtaWRwb2ludCBpcyBhIHN0YXJ0
IHBvaW50IGJleW9uZCB0aGUgbGluZSBicmVhay4gIElmIHNvLAotICAgIC8vIHNoYXZlIGl0IG9m
ZiB0aGUgbGlzdCwgYW5kIHNoYXZlIG9mZiBhIHRyYWlsaW5nIHNwYWNlIGlmIHRoZSBwcmV2aW91
cyBlbmQgcG9pbnQgZG9lc24ndAotICAgIC8vIHByZXNlcnZlIHdoaXRlc3BhY2UuCi0gICAgaWYg
KGxCcmVhay5tX29iaiAmJiBsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgJiYgIShsaW5l
TWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgJSAyKSkgewotICAgICAgICBJbmxpbmVJdGVyYXRv
ciogbWlkcG9pbnRzID0gbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmRhdGEoKTsKLSAgICAg
ICAgSW5saW5lSXRlcmF0b3ImIGVuZHBvaW50ID0gbWlkcG9pbnRzW2xpbmVNaWRwb2ludFN0YXRl
Lm51bU1pZHBvaW50cyAtIDJdOwotICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgc3RhcnRw
b2ludCA9IG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxXTsKLSAg
ICAgICAgSW5saW5lSXRlcmF0b3IgY3VycnBvaW50ID0gZW5kcG9pbnQ7Ci0gICAgICAgIHdoaWxl
ICghY3VycnBvaW50LmF0RW5kKCkgJiYgY3VycnBvaW50ICE9IHN0YXJ0cG9pbnQgJiYgY3VycnBv
aW50ICE9IGxCcmVhaykKLSAgICAgICAgICAgIGN1cnJwb2ludC5pbmNyZW1lbnQoKTsKLSAgICAg
ICAgaWYgKGN1cnJwb2ludCA9PSBsQnJlYWspIHsKLSAgICAgICAgICAgIC8vIFdlIGhpdCB0aGUg
bGluZSBicmVhayBiZWZvcmUgdGhlIHN0YXJ0IHBvaW50LiAgU2hhdmUgb2ZmIHRoZSBzdGFydCBw
b2ludC4KLSAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cy0tOwotICAg
ICAgICAgICAgaWYgKGVuZHBvaW50Lm1fb2JqLT5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgp
ICYmIGVuZHBvaW50Lm1fb2JqLT5pc1RleHQoKSkKLSAgICAgICAgICAgICAgICBlbmRwb2ludC5t
X3Bvcy0tOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBEb24ndCBjYWxsIHRoaXMgZGlyZWN0
bHkuIFVzZSBvbmUgb2YgdGhlIGRlc2NyaXB0aXZlIGhlbHBlciBmdW5jdGlvbnMgYmVsb3cuCi1z
dGF0aWMgdm9pZCBkZXByZWNhdGVkQWRkTWlkcG9pbnQoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVN
aWRwb2ludFN0YXRlLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbWlkcG9pbnQpCi17Ci0gICAgaWYg
KGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50cy5zaXplKCkgPD0gbGluZU1pZHBvaW50U3RhdGUu
bnVtTWlkcG9pbnRzKQotICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHMuZ3Jvdyhs
aW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgKyAxMCk7Ci0KLSAgICBJbmxpbmVJdGVyYXRv
ciogbWlkcG9pbnRzID0gbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmRhdGEoKTsKLSAgICBt
aWRwb2ludHNbbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKytdID0gbWlkcG9pbnQ7Ci19
Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdGFydElnbm9yaW5nU3BhY2VzKExpbmVNaWRwb2ludFN0
YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQot
ewotICAgIEFTU0VSVCghKGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAlIDIpKTsKLSAg
ICBkZXByZWNhdGVkQWRkTWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIG1pZHBvaW50KTsKLX0K
LQotc3RhdGljIGlubGluZSB2b2lkIHN0b3BJZ25vcmluZ1NwYWNlcyhMaW5lTWlkcG9pbnRTdGF0
ZSYgbGluZU1pZHBvaW50U3RhdGUsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBtaWRwb2ludCkKLXsK
LSAgICBBU1NFUlQobGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzICUgMik7Ci0gICAgZGVw
cmVjYXRlZEFkZE1pZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBtaWRwb2ludCk7Ci19Ci0KLS8v
IFdoZW4gaWdub3Jpbmcgc3BhY2VzLCB0aGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBmb3Igb2JqZWN0
cyB0aGF0IG5lZWQgbGluZSBib3hlcyBzdWNoIGFzIFJlbmRlcklubGluZXMgb3IKLS8vIGhhcmQg
bGluZSBicmVha3MgdG8gZW5zdXJlIHRoYXQgdGhleSdyZSBub3QgaWdub3JlZC4KLXN0YXRpYyBp
bmxpbmUgdm9pZCBlbnN1cmVMaW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcyhMaW5lTWlkcG9pbnRT
dGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIFJlbmRlck9iamVjdCogcmVuZGVyZXIpCi17Ci0gICAg
SW5saW5lSXRlcmF0b3IgbWlkcG9pbnQoMCwgcmVuZGVyZXIsIDApOwotICAgIHN0b3BJZ25vcmlu
Z1NwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwgbWlkcG9pbnQpOwotICAgIHN0YXJ0SWdub3JpbmdT
cGFjZXMobGluZU1pZHBvaW50U3RhdGUsIG1pZHBvaW50KTsKLX0KLQotLy8gQWRkaW5nIGEgcGFp
ciBvZiBtaWRwb2ludHMgYmVmb3JlIGEgY2hhcmFjdGVyIHdpbGwgc3BsaXQgaXQgb3V0IGludG8g
YSBuZXcgbGluZSBib3guCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5zdXJlQ2hhcmFjdGVyR2V0c0xp
bmVCb3goTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRv
ciYgdGV4dFBhcmFncmFwaFNlcGFyYXRvcikKLXsKLSAgICBJbmxpbmVJdGVyYXRvciBtaWRwb2lu
dCgwLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fb2JqLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9y
Lm1fcG9zKTsKLSAgICBzdGFydElnbm9yaW5nU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBJbmxp
bmVJdGVyYXRvcigwLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fb2JqLCB0ZXh0UGFyYWdyYXBo
U2VwYXJhdG9yLm1fcG9zIC0gMSkpOwotICAgIHN0b3BJZ25vcmluZ1NwYWNlcyhsaW5lTWlkcG9p
bnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX29iaiwg
dGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX3BvcykpOwotfQotCi1zdGF0aWMgaW5saW5lIEJpZGlS
dW4qIGNyZWF0ZVJ1bihpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCogb2JqLCBJbmxp
bmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyKQoraW5saW5lIEJpZGlSdW4qIGNyZWF0ZVJ1bihpbnQg
c3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCogb2JqLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJl
c29sdmVyKQogewogICAgIEFTU0VSVChvYmopOwogICAgIHJldHVybiBuZXcgQmlkaVJ1bihzdGFy
dCwgZW5kLCAqb2JqLCByZXNvbHZlci5jb250ZXh0KCksIHJlc29sdmVyLmRpcigpKTsKQEAgLTMw
Myw3ICsxMzcsNiBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUFuZEFw
cGVuZFJvb3RJbmxpbmVCb3goKQogICAgIHJldHVybiByb290Qm94OwogfQogCi0KIHN0YXRpYyBp
bmxpbmUgSW5saW5lQm94KiBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihSZW5kZXJPYmplY3Qq
IG9iaiwgYm9vbCBpc1Jvb3RMaW5lQm94LCBib29sIGlzT25seVJ1biA9IGZhbHNlKQogewogICAg
IGlmIChpc1Jvb3RMaW5lQm94KQpAQCAtMzI5LDE1ICsxNjIsNiBAQCBzdGF0aWMgaW5saW5lIElu
bGluZUJveCogY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGJv
b2wgaXNSbwogICAgIHJldHVybiB0b1JlbmRlcklubGluZShvYmopLT5jcmVhdGVBbmRBcHBlbmRJ
bmxpbmVGbG93Qm94KCk7CiB9CiAKLS8vIEZJWE1FOiBEb24ndCBsZXQgY291bnRlcnMgbWFyayB0
aGVtc2VsdmVzIGFzIG5lZWRpbmcgcHJlZiB3aWR0aCByZWNhbGNzIGR1cmluZyBsYXlvdXQKLS8v
IHNvIHdlIGRvbid0IG5lZWQgdGhpcyBoYWNrLgotc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZUNv
dW50ZXJJZk5lZWRlZChSZW5kZXJUZXh0JiByZW5kZXJUZXh0KQotewotICAgIGlmICghcmVuZGVy
VGV4dC5wcmVmZXJyZWRMb2dpY2FsV2lkdGhzRGlydHkoKSB8fCAhcmVuZGVyVGV4dC5pc0NvdW50
ZXIoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIHRvUmVuZGVyQ291bnRlcihyZW5kZXJUZXh0KS51
cGRhdGVDb3VudGVyKCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkaXJ0eUxpbmVCb3hlc0Zv
clJlbmRlcmVyKFJlbmRlck9iamVjdCYgcmVuZGVyZXIsIGJvb2wgZnVsbExheW91dCkKIHsKICAg
ICBpZiAocmVuZGVyZXIuaXNUZXh0KCkpIHsKQEAgLTYwNSwzNCArNDI5LDYgQEAgdm9pZCBSZW5k
ZXJCbG9ja0Zsb3c6OnNldE1hcmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4qIHJ1biwgUmVuZGVyUnVi
eVJ1biYgcmVuZGVyZXIKICAgICBzZXRNYXJnaW5FbmRGb3JDaGlsZChyZW5kZXJlciwgLWVuZE92
ZXJoYW5nKTsKIH0KIAotc3RhdGljIGlubGluZSBmbG9hdCBtZWFzdXJlSHlwaGVuV2lkdGgoUmVu
ZGVyVGV4dCogcmVuZGVyZXIsIGNvbnN0IEZvbnQmIGZvbnQsIEhhc2hTZXQ8Y29uc3QgU2ltcGxl
Rm9udERhdGEqPiogZmFsbGJhY2tGb250cyA9IDApCi17Ci0gICAgY29uc3QgUmVuZGVyU3R5bGUm
IHN0eWxlID0gcmVuZGVyZXItPnN0eWxlKCk7Ci0gICAgcmV0dXJuIGZvbnQud2lkdGgoUmVuZGVy
QmxvY2s6OmNvbnN0cnVjdFRleHRSdW4ocmVuZGVyZXIsIGZvbnQsIHN0eWxlLmh5cGhlblN0cmlu
ZygpLnN0cmluZygpLCBzdHlsZSksIGZhbGxiYWNrRm9udHMpOwotfQotCi1jbGFzcyBXb3JkTWVh
c3VyZW1lbnQgewotcHVibGljOgotICAgIFdvcmRNZWFzdXJlbWVudCgpCi0gICAgICAgIDogcmVu
ZGVyZXIoMCkKLSAgICAgICAgLCB3aWR0aCgwKQotICAgICAgICAsIHN0YXJ0T2Zmc2V0KDApCi0g
ICAgICAgICwgZW5kT2Zmc2V0KDApCi0gICAgewotICAgIH0KLSAgICAKLSAgICBSZW5kZXJUZXh0
KiByZW5kZXJlcjsKLSAgICBmbG9hdCB3aWR0aDsKLSAgICBpbnQgc3RhcnRPZmZzZXQ7Ci0gICAg
aW50IGVuZE9mZnNldDsKLSAgICBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4gZmFsbGJh
Y2tGb250czsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgY29uc3QgUmVuZGVyU3R5bGUmIGxpbmVTdHls
ZShjb25zdCBSZW5kZXJFbGVtZW50JiByZW5kZXJlciwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZv
KQotewotICAgIHJldHVybiBsaW5lSW5mby5pc0ZpcnN0TGluZSgpID8gcmVuZGVyZXIuZmlyc3RM
aW5lU3R5bGUoKSA6IHJlbmRlcmVyLnN0eWxlKCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBz
ZXRMb2dpY2FsV2lkdGhGb3JUZXh0UnVuKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4q
IHJ1biwgUmVuZGVyVGV4dCogcmVuZGVyZXIsIGZsb2F0IHhQb3MsIGNvbnN0IExpbmVJbmZvJiBs
aW5lSW5mbywKICAgICBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4dEJveERh
dGFNYXAsIFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlLCBXb3Jk
TWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewpAQCAtOTk3LDI0ICs3OTMsNiBAQCBz
dGF0aWMgaW5saW5lIGJvb2wgaXNDb2xsYXBzaWJsZVNwYWNlKFVDaGFyIGNoYXJhY3RlciwgY29u
c3QgUmVuZGVyVGV4dCYgcmVuZGVyZQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotCi1zdGF0aWMg
dm9pZCBzZXRTdGF0aWNQb3NpdGlvbnMoUmVuZGVyQmxvY2tGbG93JiBibG9jaywgUmVuZGVyQm94
JiBjaGlsZCkKLXsKLSAgICAvLyBGSVhNRTogVGhlIG1hdGggaGVyZSBpcyBhY3R1YWxseSBub3Qg
cmVhbGx5IHJpZ2h0LiBJdCdzIGEgYmVzdC1ndWVzcyBhcHByb3hpbWF0aW9uIHRoYXQKLSAgICAv
LyB3aWxsIHdvcmsgZm9yIHRoZSBjb21tb24gY2FzZXMKLSAgICBSZW5kZXJFbGVtZW50KiBjb250
YWluZXJCbG9jayA9IGNoaWxkLmNvbnRhaW5lcigpOwotICAgIExheW91dFVuaXQgYmxvY2tIZWln
aHQgPSBibG9jay5sb2dpY2FsSGVpZ2h0KCk7Ci0gICAgaWYgKGNvbnRhaW5lckJsb2NrLT5pc1Jl
bmRlcklubGluZSgpKSB7Ci0gICAgICAgIC8vIEEgcmVsYXRpdmUgcG9zaXRpb25lZCBpbmxpbmUg
ZW5jbG9zZXMgdXMuIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBoYXZlIHRvIGRldGVybWluZSBvdXIK
LSAgICAgICAgLy8gcG9zaXRpb24gYXMgdGhvdWdoIHdlIHdlcmUgYW4gaW5saW5lLiBTZXQgfHN0
YXRpY0lubGluZVBvc2l0aW9ufCBhbmQgfHN0YXRpY0Jsb2NrUG9zaXRpb258IG9uIHRoZSByZWxh
dGl2ZSBwb3NpdGlvbmVkCi0gICAgICAgIC8vIGlubGluZSBzbyB0aGF0IHdlIGNhbiBvYnRhaW4g
dGhlIHZhbHVlIGxhdGVyLgotICAgICAgICB0b1JlbmRlcklubGluZShjb250YWluZXJCbG9jaykt
PmxheWVyKCktPnNldFN0YXRpY0lubGluZVBvc2l0aW9uKGJsb2NrLnN0YXJ0QWxpZ25lZE9mZnNl
dEZvckxpbmUoYmxvY2tIZWlnaHQsIGZhbHNlKSk7Ci0gICAgICAgIHRvUmVuZGVySW5saW5lKGNv
bnRhaW5lckJsb2NrKS0+bGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlvbihibG9ja0hlaWdo
dCk7Ci0gICAgfQotICAgIGJsb2NrLnVwZGF0ZVN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hpbGQo
Y2hpbGQsIGJsb2NrSGVpZ2h0KTsKLSAgICBjaGlsZC5sYXllcigpLT5zZXRTdGF0aWNCbG9ja1Bv
c2l0aW9uKGJsb2NrSGVpZ2h0KTsKLX0KLQogdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJhY3RlclR5
cGU+CiBzdGF0aWMgaW5saW5lIGludCBmaW5kRmlyc3RUcmFpbGluZ1NwYWNlKGNvbnN0IFJlbmRl
clRleHQmIGxhc3RUZXh0LCBjb25zdCBDaGFyYWN0ZXJUeXBlKiBjaGFyYWN0ZXJzLCBpbnQgc3Rh
cnQsIGludCBzdG9wKQogewpAQCAtMTQ2NiwxNSArMTI0NCw2IEBAIHZvaWQgUmVuZGVyQmxvY2tG
bG93Ojp1cGRhdGVTaGFwZUFuZFNlZ21lbnRzRm9yQ3VycmVudExpbmVJbkZsb3dUaHJlYWQoU2hh
cGVJbnNpCiAgICAgICAgIHB1c2hTaGFwZUNvbnRlbnRPdmVyZmxvd0JlbG93VGhlQ29udGVudEJv
eCh0aGlzLCBzaGFwZUluc2lkZUluZm8sIGxpbmVUb3AsIGxpbmVIZWlnaHQpOwogfQogCi1zdGF0
aWMgaW5saW5lIGZsb2F0IGZpcnN0UG9zaXRpdmVXaWR0aChjb25zdCBXb3JkTWVhc3VyZW1lbnRz
JiB3b3JkTWVhc3VyZW1lbnRzKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd29yZE1l
YXN1cmVtZW50cy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAod29yZE1lYXN1cmVtZW50c1tp
XS53aWR0aCA+IDApCi0gICAgICAgICAgICByZXR1cm4gd29yZE1lYXN1cmVtZW50c1tpXS53aWR0
aDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgTGF5b3V0VW5pdCBh
ZGp1c3RMb2dpY2FsTGluZVRvcChTaGFwZUluc2lkZUluZm8qIHNoYXBlSW5zaWRlSW5mbywgSW5s
aW5lSXRlcmF0b3Igc3RhcnQsIElubGluZUl0ZXJhdG9yIGVuZCwgY29uc3QgV29yZE1lYXN1cmVt
ZW50cyYgd29yZE1lYXN1cmVtZW50cykKIHsKICAgICBpZiAoIXNoYXBlSW5zaWRlSW5mbyB8fCBl
bmQgIT0gc3RhcnQpCkBAIC0yMjI1LDkxICsxOTk0LDYgQEAgYm9vbCBSZW5kZXJCbG9ja0Zsb3c6
Om1hdGNoZWRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIGNvbnN0IElubGlu
ZUIKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBza2lwTm9uQnJl
YWtpbmdTcGFjZShjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQsIGNvbnN0IExpbmVJbmZvJiBsaW5l
SW5mbykKLXsKLSAgICBpZiAoaXQubV9vYmotPnN0eWxlKCkubmJzcE1vZGUoKSAhPSBTUEFDRSB8
fCBpdC5jdXJyZW50KCkgIT0gbm9CcmVha1NwYWNlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAvLyBGSVhNRTogVGhpcyBpcyBiYWQuICBJdCBtYWtlcyBuYnNwIGluY29uc2lzdGVudCB3
aXRoIHNwYWNlIGFuZCB3b24ndCB3b3JrIGNvcnJlY3RseQotICAgIC8vIHdpdGggbV9taW5XaWR0
aC9tX21heFdpZHRoLgotICAgIC8vIERvIG5vdCBza2lwIGEgbm9uLWJyZWFraW5nIHNwYWNlIGlm
IGl0IGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICAvLyBvbiBhIGxpbmUgYWZ0ZXIgYSBjbGVh
biBsaW5lIGJyZWFrIChvciBvbiB0aGUgZmlyc3QgbGluZSwgc2luY2UgcHJldmlvdXNMaW5lQnJv
a2VDbGVhbmx5IHN0YXJ0cyBvZmYKLSAgICAvLyB8dHJ1ZXwpLgotICAgIGlmIChsaW5lSW5mby5p
c0VtcHR5KCkgJiYgbGluZUluZm8ucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1lbnVtIFdoaXRlc3BhY2VQ
b3NpdGlvbiB7IExlYWRpbmdXaGl0ZXNwYWNlLCBUcmFpbGluZ1doaXRlc3BhY2UgfTsKLXN0YXRp
YyBpbmxpbmUgYm9vbCBzaG91bGRDb2xsYXBzZVdoaXRlU3BhY2UoY29uc3QgUmVuZGVyU3R5bGUq
IHN0eWxlLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIFdoaXRlc3BhY2VQb3NpdGlvbiB3aGl0
ZXNwYWNlUG9zaXRpb24pCi17Ci0gICAgLy8gQ1NTMiAxNi42LjEKLSAgICAvLyBJZiBhIHNwYWNl
IChVKzAwMjApIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGhhcyAnd2hpdGUtc3BhY2UnIHNl
dCB0byAnbm9ybWFsJywgJ25vd3JhcCcsIG9yICdwcmUtbGluZScsIGl0IGlzIHJlbW92ZWQuCi0g
ICAgLy8gSWYgYSBzcGFjZSAoVSswMDIwKSBhdCB0aGUgZW5kIG9mIGEgbGluZSBoYXMgJ3doaXRl
LXNwYWNlJyBzZXQgdG8gJ25vcm1hbCcsICdub3dyYXAnLCBvciAncHJlLWxpbmUnLCBpdCBpcyBh
bHNvIHJlbW92ZWQuCi0gICAgLy8gSWYgc3BhY2VzIChVKzAwMjApIG9yIHRhYnMgKFUrMDAwOSkg
YXQgdGhlIGVuZCBvZiBhIGxpbmUgaGF2ZSAnd2hpdGUtc3BhY2UnIHNldCB0byAncHJlLXdyYXAn
LCBVQXMgbWF5IHZpc3VhbGx5IGNvbGxhcHNlIHRoZW0uCi0gICAgcmV0dXJuIHN0eWxlLT5jb2xs
YXBzZVdoaXRlU3BhY2UoKQotICAgICAgICB8fCAod2hpdGVzcGFjZVBvc2l0aW9uID09IFRyYWls
aW5nV2hpdGVzcGFjZSAmJiBzdHlsZS0+d2hpdGVTcGFjZSgpID09IFBSRV9XUkFQICYmICghbGlu
ZUluZm8uaXNFbXB0eSgpIHx8ICFsaW5lSW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSkp
OwotfQotCi1zdGF0aWMgYm9vbCByZXF1aXJlc0xpbmVCb3hGb3JDb250ZW50KGNvbnN0IFJlbmRl
cklubGluZSYgZmxvdywgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQotewotICAgIFJlbmRlckVs
ZW1lbnQqIHBhcmVudCA9IGZsb3cucGFyZW50KCk7Ci0gICAgaWYgKGZsb3cuZG9jdW1lbnQoKS5p
bk5vUXVpcmtzTW9kZSgpKSB7Ci0gICAgICAgIGNvbnN0IFJlbmRlclN0eWxlJiBmbG93U3R5bGUg
PSBsaW5lU3R5bGUoZmxvdywgbGluZUluZm8pOwotICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYg
cGFyZW50U3R5bGUgPSBsaW5lU3R5bGUoKnBhcmVudCwgbGluZUluZm8pOwotICAgICAgICBpZiAo
Zmxvd1N0eWxlLmxpbmVIZWlnaHQoKSAhPSBwYXJlbnRTdHlsZS5saW5lSGVpZ2h0KCkKLSAgICAg
ICAgICAgIHx8IGZsb3dTdHlsZS52ZXJ0aWNhbEFsaWduKCkgIT0gcGFyZW50U3R5bGUudmVydGlj
YWxBbGlnbigpCi0gICAgICAgICAgICB8fCAhcGFyZW50U3R5bGUuZm9udCgpLmZvbnRNZXRyaWNz
KCkuaGFzSWRlbnRpY2FsQXNjZW50RGVzY2VudEFuZExpbmVHYXAoZmxvd1N0eWxlLmZvbnQoKS5m
b250TWV0cmljcygpKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotc3RhdGljIGJvb2wgaGFzSW5saW5lRGlyZWN0aW9uQm9yZGVyc1BhZGRpbmdP
ck1hcmdpbihjb25zdCBSZW5kZXJJbmxpbmUmIGZsb3cpCi17Ci0gICAgLy8gV2hlcmUgYW4gZW1w
dHkgaW5saW5lIGlzIHNwbGl0IGFjcm9zcyBhbm9ueW1vdXMgYmxvY2tzIHdlIHNob3VsZCBvbmx5
IGdpdmUgbGluZWJveGVzIHRvIHRoZSAnc2lkZXMnIG9mIHRoZQotICAgIC8vIGlubGluZSB0aGF0
IGhhdmUgYm9yZGVycywgcGFkZGluZyBvciBtYXJnaW4uCi0gICAgYm9vbCBzaG91bGRBcHBseVN0
YXJ0Qm9yZGVyUGFkZGluZ09yTWFyZ2luID0gIWZsb3cucGFyZW50KCktPmlzQW5vbnltb3VzQmxv
Y2soKSB8fCAhZmxvdy5pc0lubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsKLSAgICBpZiAoc2hv
dWxkQXBwbHlTdGFydEJvcmRlclBhZGRpbmdPck1hcmdpbiAmJiAoZmxvdy5ib3JkZXJTdGFydCgp
IHx8IGZsb3cubWFyZ2luU3RhcnQoKSB8fCBmbG93LnBhZGRpbmdTdGFydCgpKSkKLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0KLSAgICBib29sIHNob3VsZEFwcGx5RW5kQm9yZGVyUGFkZGluZ09yTWFy
Z2luID0gIWZsb3cucGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSB8fCBmbG93LmlzSW5saW5l
RWxlbWVudENvbnRpbnVhdGlvbigpIHx8ICFmbG93LmlubGluZUVsZW1lbnRDb250aW51YXRpb24o
KTsKLSAgICByZXR1cm4gc2hvdWxkQXBwbHlFbmRCb3JkZXJQYWRkaW5nT3JNYXJnaW4gJiYgKGZs
b3cuYm9yZGVyRW5kKCkgfHwgZmxvdy5tYXJnaW5FbmQoKSB8fCBmbG93LnBhZGRpbmdFbmQoKSk7
Ci19Ci0KLXN0YXRpYyBib29sIGFsd2F5c1JlcXVpcmVzTGluZUJveChjb25zdCBSZW5kZXJJbmxp
bmUmIGZsb3cpCi17Ci0gICAgLy8gRklYTUU6IFJpZ2h0IG5vdywgd2Ugb25seSBhbGxvdyBsaW5l
IGJveGVzIGZvciBpbmxpbmVzIHRoYXQgYXJlIHRydWx5IGVtcHR5LgotICAgIC8vIFdlIG5lZWQg
dG8gZml4IHRoaXMsIHRob3VnaCwgYmVjYXVzZSBhdCB0aGUgdmVyeSBsZWFzdCwgaW5saW5lcyBj
b250YWluaW5nIG9ubHkKLSAgICAvLyBpZ25vcmFibGUgd2hpdGVzcGFjZSBzaG91bGQgc2hvdWxk
IGFsc28gaGF2ZSBsaW5lIGJveGVzLgotICAgIHJldHVybiBpc0VtcHR5SW5saW5lKGZsb3cpICYm
IGhhc0lubGluZURpcmVjdGlvbkJvcmRlcnNQYWRkaW5nT3JNYXJnaW4oZmxvdyk7Ci19Ci0KLXN0
YXRpYyBib29sIHJlcXVpcmVzTGluZUJveChjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQsIGNvbnN0
IExpbmVJbmZvJiBsaW5lSW5mbyA9IExpbmVJbmZvKCksIFdoaXRlc3BhY2VQb3NpdGlvbiB3aGl0
ZXNwYWNlUG9zaXRpb24gPSBMZWFkaW5nV2hpdGVzcGFjZSkKLXsKLSAgICBpZiAoaXQubV9vYmot
PmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgaWYgKGl0Lm1fb2JqLT5pc0JSKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0g
ICAgYm9vbCByZW5kZXJlcklzRW1wdHlJbmxpbmUgPSBmYWxzZTsKLSAgICBpZiAoaXQubV9vYmot
PmlzUmVuZGVySW5saW5lKCkpIHsKLSAgICAgICAgY29uc3QgUmVuZGVySW5saW5lJiBpbmxpbmVS
ZW5kZXJlciA9IHRvUmVuZGVySW5saW5lKCppdC5tX29iaik7Ci0gICAgICAgIGlmICghYWx3YXlz
UmVxdWlyZXNMaW5lQm94KGlubGluZVJlbmRlcmVyKSAmJiAhcmVxdWlyZXNMaW5lQm94Rm9yQ29u
dGVudChpbmxpbmVSZW5kZXJlciwgbGluZUluZm8pKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgICAgICByZW5kZXJlcklzRW1wdHlJbmxpbmUgPSBpc0VtcHR5SW5saW5lKGlubGluZVJl
bmRlcmVyKTsKLSAgICB9Ci0KLSAgICBpZiAoIXNob3VsZENvbGxhcHNlV2hpdGVTcGFjZSgmaXQu
bV9vYmotPnN0eWxlKCksIGxpbmVJbmZvLCB3aGl0ZXNwYWNlUG9zaXRpb24pKQotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLQotICAgIFVDaGFyIGN1cnJlbnQgPSBpdC5jdXJyZW50KCk7Ci0gICAgYm9v
bCBub3RKdXN0V2hpdGVzcGFjZSA9IGN1cnJlbnQgIT0gJyAnICYmIGN1cnJlbnQgIT0gJ1x0JyAm
JiBjdXJyZW50ICE9IHNvZnRIeXBoZW4gJiYgKGN1cnJlbnQgIT0gJ1xuJyB8fCBpdC5tX29iai0+
cHJlc2VydmVzTmV3bGluZSgpKSAmJiAhc2tpcE5vbkJyZWFraW5nU3BhY2UoaXQsIGxpbmVJbmZv
KTsKLSAgICByZXR1cm4gbm90SnVzdFdoaXRlc3BhY2UgfHwgcmVuZGVyZXJJc0VtcHR5SW5saW5l
OwotfQotCiBib29sIFJlbmRlckJsb2NrOjpnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGls
ZChSZW5kZXJPYmplY3QqIGlubGluZU9iaikKIHsKICAgICBBU1NFUlQoaW5saW5lT2JqLT5wYXJl
bnQoKSA9PSB0aGlzKTsKQEAgLTIzMjIsMjQ5ICsyMDA2LDYgQEAgYm9vbCBSZW5kZXJCbG9jazo6
Z2VuZXJhdGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQoUmVuZGVyT2JqZWN0KiBpbmxpbmVPYmop
CiAgICAgcmV0dXJuICFpdC5hdEVuZCgpOwogfQogCi0vLyBGSVhNRTogVGhlIGVudGlyZSBjb25j
ZXB0IG9mIHRoZSBza2lwVHJhaWxpbmdXaGl0ZXNwYWNlIGZ1bmN0aW9uIGlzIGZsYXdlZCwgc2lu
Y2Ugd2UgcmVhbGx5IG5lZWQgdG8gYmUgYnVpbGRpbmcKLS8vIGxpbmUgYm94ZXMgZXZlbiBmb3Ig
Y29udGFpbmVycyB0aGF0IG1heSB1bHRpbWF0ZWx5IGNvbGxhcHNlIGF3YXkuIE90aGVyd2lzZSB3
ZSdsbCBuZXZlciBnZXQgcG9zaXRpb25lZAotLy8gZWxlbWVudHMgcXVpdGUgcmlnaHQuIEluIG90
aGVyIHdvcmRzLCB3ZSBuZWVkIHRvIGJ1aWxkIHRoaXMgZnVuY3Rpb24ncyB3b3JrIGludG8gdGhl
IG5vcm1hbCBsaW5lCi0vLyBvYmplY3QgaXRlcmF0aW9uIHByb2Nlc3MuCi0vLyBOQi4gdGhpcyBm
dW5jdGlvbiB3aWxsIGluc2VydCBhbnkgZmxvYXRpbmcgZWxlbWVudHMgdGhhdCB3b3VsZCBvdGhl
cndpc2UKLS8vIGJlIHNraXBwZWQgYnV0IGl0IHdpbGwgbm90IHBvc2l0aW9uIHRoZW0uCi12b2lk
IExpbmVCcmVha2VyOjpza2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiBpdGVy
YXRvciwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQotewotICAgIHdoaWxlICghaXRlcmF0b3Iu
YXRFbmQoKSAmJiAhcmVxdWlyZXNMaW5lQm94KGl0ZXJhdG9yLCBsaW5lSW5mbywgVHJhaWxpbmdX
aGl0ZXNwYWNlKSkgewotICAgICAgICBSZW5kZXJPYmplY3QmIG9iamVjdCA9ICppdGVyYXRvci5t
X29iajsKLSAgICAgICAgaWYgKG9iamVjdC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAg
ICAgICAgIHNldFN0YXRpY1Bvc2l0aW9ucyhtX2Jsb2NrLCB0b1JlbmRlckJveChvYmplY3QpKTsK
LSAgICAgICAgZWxzZSBpZiAob2JqZWN0LmlzRmxvYXRpbmcoKSkKLSAgICAgICAgICAgIG1fYmxv
Y2suaW5zZXJ0RmxvYXRpbmdPYmplY3QodG9SZW5kZXJCb3gob2JqZWN0KSk7Ci0gICAgICAgIGl0
ZXJhdG9yLmluY3JlbWVudCgpOwotICAgIH0KLX0KLQotdm9pZCBMaW5lQnJlYWtlcjo6c2tpcExl
YWRpbmdXaGl0ZXNwYWNlKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJbmZvJiBs
aW5lSW5mbywgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIExpbmVX
aWR0aCYgd2lkdGgpCi17Ci0gICAgd2hpbGUgKCFyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkg
JiYgIXJlcXVpcmVzTGluZUJveChyZXNvbHZlci5wb3NpdGlvbigpLCBsaW5lSW5mbywgTGVhZGlu
Z1doaXRlc3BhY2UpKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCYgb2JqZWN0ID0gKnJlc29sdmVy
LnBvc2l0aW9uKCkubV9vYmo7Ci0gICAgICAgIGlmIChvYmplY3QuaXNPdXRPZkZsb3dQb3NpdGlv
bmVkKCkpIHsKLSAgICAgICAgICAgIHNldFN0YXRpY1Bvc2l0aW9ucyhtX2Jsb2NrLCB0b1JlbmRl
ckJveChvYmplY3QpKTsKLSAgICAgICAgICAgIGlmIChvYmplY3Quc3R5bGUoKS5pc09yaWdpbmFs
RGlzcGxheUlubGluZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIHJlc29sdmVyLnJ1bnMoKS5h
ZGRSdW4oY3JlYXRlUnVuKDAsIDEsICZvYmplY3QsIHJlc29sdmVyKSk7Ci0gICAgICAgICAgICAg
ICAgbGluZUluZm8uaW5jcmVtZW50UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgpOwotICAgICAg
ICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdC5pc0Zsb2F0aW5nKCkpIHsKLSAgICAg
ICAgICAgIC8vIFRoZSB0b3AgbWFyZ2luIGVkZ2Ugb2YgYSBzZWxmLWNvbGxhcHNpbmcgYmxvY2sg
dGhhdCBjbGVhcnMgYSBmbG9hdCBpbnRydWRlcyB1cCBpbnRvIGl0IGJ5IHRoZSBoZWlnaHQgb2Yg
dGhlIG1hcmdpbiwKLSAgICAgICAgICAgIC8vIHNvIGluIG9yZGVyIHRvIHBsYWNlIHRoaXMgZmly
c3QgY2hpbGQgZmxvYXQgYXQgdGhlIHRvcCBjb250ZW50IGVkZ2Ugb2YgdGhlIHNlbGYtY29sbGFw
c2luZyBibG9jayBhZGQgdGhlIG1hcmdpbiBiYWNrIGluIGJlZm9yZSBwbGFjZW1lbnQuCi0gICAg
ICAgICAgICBMYXlvdXRVbml0IG1hcmdpbk9mZnNldCA9ICghb2JqZWN0LnByZXZpb3VzU2libGlu
ZygpICYmIG1fYmxvY2suaXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkgJiYgbV9ibG9jay5zdHlsZSgp
LmNsZWFyKCkgJiYgbV9ibG9jay5nZXRDbGVhckRlbHRhKG1fYmxvY2ssIExheW91dFVuaXQoKSkp
ID8gbV9ibG9jay5jb2xsYXBzZWRNYXJnaW5CZWZvcmVGb3JDaGlsZChtX2Jsb2NrKSA6IExheW91
dFVuaXQoKTsKLSAgICAgICAgICAgIExheW91dFVuaXQgb2xkTG9naWNhbEhlaWdodCA9IG1fYmxv
Y2subG9naWNhbEhlaWdodCgpOwotICAgICAgICAgICAgbV9ibG9jay5zZXRMb2dpY2FsSGVpZ2h0
KG9sZExvZ2ljYWxIZWlnaHQgKyBtYXJnaW5PZmZzZXQpOwotICAgICAgICAgICAgbV9ibG9jay5w
b3NpdGlvbk5ld0Zsb2F0T25MaW5lKG1fYmxvY2suaW5zZXJ0RmxvYXRpbmdPYmplY3QodG9SZW5k
ZXJCb3gob2JqZWN0KSksIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGxpbmVJbmZvLCB3aWR0
aCk7Ci0gICAgICAgICAgICBtX2Jsb2NrLnNldExvZ2ljYWxIZWlnaHQob2xkTG9naWNhbEhlaWdo
dCk7Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0LmlzVGV4dCgpICYmIG9iamVjdC5zdHlsZSgp
Lmhhc1RleHRDb21iaW5lKCkgJiYgb2JqZWN0LmlzQ29tYmluZVRleHQoKSAmJiAhdG9SZW5kZXJD
b21iaW5lVGV4dChvYmplY3QpLmlzQ29tYmluZWQoKSkgewotICAgICAgICAgICAgdG9SZW5kZXJD
b21iaW5lVGV4dChvYmplY3QpLmNvbWJpbmVUZXh0KCk7Ci0gICAgICAgICAgICBpZiAodG9SZW5k
ZXJDb21iaW5lVGV4dChvYmplY3QpLmlzQ29tYmluZWQoKSkKLSAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgfQotICAgICAgICByZXNvbHZlci5pbmNyZW1lbnQoKTsKLSAgICB9Ci0g
ICAgcmVzb2x2ZXIuY29tbWl0RXhwbGljaXRFbWJlZGRpbmcoKTsKLX0KLQotLy8gVGhpcyBpcyBj
dXJyZW50bHkganVzdCB1c2VkIGZvciBsaXN0IG1hcmtlcnMgYW5kIGlubGluZSBmbG93cyB0aGF0
IGhhdmUgbGluZSBib3hlcy4gTmVpdGhlciBzaG91bGQKLS8vIGhhdmUgYW4gZWZmZWN0IG9uIHdo
aXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgotc3RhdGljIGJvb2wgc2hvdWxkU2tp
cFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0KFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIFJlbmRl
ck9iamVjdCogbywgTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlKQotewotICAg
IFJlbmRlck9iamVjdCogbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ss
IG8pOwotICAgIHdoaWxlIChuZXh0ICYmIG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0
aW9uZWQoKSkKLSAgICAgICAgbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxv
Y2ssIG5leHQpOwotCi0gICAgaWYgKG5leHQgJiYgbmV4dC0+aXNUZXh0KCkgJiYgdG9SZW5kZXJU
ZXh0KG5leHQpLT50ZXh0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIFJlbmRlclRleHQqIG5leHRU
ZXh0ID0gdG9SZW5kZXJUZXh0KG5leHQpOwotICAgICAgICBVQ2hhciBuZXh0Q2hhciA9IG5leHRU
ZXh0LT5jaGFyYWN0ZXJBdCgwKTsKLSAgICAgICAgaWYgKG5leHRUZXh0LT5zdHlsZSgpLmlzQ29s
bGFwc2libGVXaGl0ZVNwYWNlKG5leHRDaGFyKSkgewotICAgICAgICAgICAgc3RhcnRJZ25vcmlu
Z1NwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgMCkpOwotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLXN0YXRpYyBBTFdBWVNfSU5MSU5FIGZsb2F0IHRleHRXaWR0aChSZW5kZXJUZXh0
KiB0ZXh0LCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4sIGNvbnN0IEZvbnQmIGZvbnQsIGZs
b2F0IHhQb3MsIGJvb2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgSGFz
aFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+JiBmYWxsYmFja0ZvbnRzLCBUZXh0TGF5b3V0KiBs
YXlvdXQgPSAwKQotewotICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IHRleHQtPnN0eWxl
KCk7Ci0KLSAgICBHbHlwaE92ZXJmbG93IGdseXBoT3ZlcmZsb3c7Ci0gICAgaWYgKGlzRml4ZWRQ
aXRjaCB8fCAoIWZyb20gJiYgbGVuID09IHRleHQtPnRleHRMZW5ndGgoKSkgfHwgc3R5bGUuaGFz
VGV4dENvbWJpbmUoKSkKLSAgICAgICAgcmV0dXJuIHRleHQtPndpZHRoKGZyb20sIGxlbiwgZm9u
dCwgeFBvcywgJmZhbGxiYWNrRm9udHMsICZnbHlwaE92ZXJmbG93KTsKLQotICAgIGlmIChsYXlv
dXQpCi0gICAgICAgIHJldHVybiBGb250Ojp3aWR0aCgqbGF5b3V0LCBmcm9tLCBsZW4sICZmYWxs
YmFja0ZvbnRzKTsKLQotICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRl
eHRSdW4odGV4dCwgZm9udCwgdGV4dCwgZnJvbSwgbGVuLCBzdHlsZSk7Ci0gICAgcnVuLnNldENo
YXJhY3RlcnNMZW5ndGgodGV4dC0+dGV4dExlbmd0aCgpIC0gZnJvbSk7Ci0gICAgQVNTRVJUKHJ1
bi5jaGFyYWN0ZXJzTGVuZ3RoKCkgPj0gcnVuLmxlbmd0aCgpKTsKLQotICAgIHJ1bi5zZXRDaGFy
YWN0ZXJTY2FuRm9yQ29kZVBhdGgoIXRleHQtPmNhblVzZVNpbXBsZUZvbnRDb2RlUGF0aCgpKTsK
LSAgICBydW4uc2V0VGFiU2l6ZSghY29sbGFwc2VXaGl0ZVNwYWNlLCBzdHlsZS50YWJTaXplKCkp
OwotICAgIHJ1bi5zZXRYUG9zKHhQb3MpOwotICAgIHJldHVybiBmb250LndpZHRoKHJ1biwgJmZh
bGxiYWNrRm9udHMsICZnbHlwaE92ZXJmbG93KTsKLX0KLQotc3RhdGljIHZvaWQgdHJ5SHlwaGVu
YXRpbmcoUmVuZGVyVGV4dCogdGV4dCwgY29uc3QgRm9udCYgZm9udCwgY29uc3QgQXRvbWljU3Ry
aW5nJiBsb2NhbGVJZGVudGlmaWVyLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5l
cywgaW50IGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzTGltaXQsIGludCBtaW5pbXVtUHJlZml4
TGltaXQsIGludCBtaW5pbXVtU3VmZml4TGltaXQsIHVuc2lnbmVkIGxhc3RTcGFjZSwgdW5zaWdu
ZWQgcG9zLCBmbG9hdCB4UG9zLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGJvb2wgaXNGaXhlZFBpdGNo
LCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgaW50IGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBJbmxp
bmVJdGVyYXRvciYgbGluZUJyZWFrLCBpbnQgbmV4dEJyZWFrYWJsZSwgYm9vbCYgaHlwaGVuYXRl
ZCkKLXsKLSAgICAvLyBNYXAgJ2h5cGhlbmF0ZS1saW1pdC17YmVmb3JlLGFmdGVyfTogYXV0bzsn
IHRvIDIuCi0gICAgdW5zaWduZWQgbWluaW11bVByZWZpeExlbmd0aDsKLSAgICB1bnNpZ25lZCBt
aW5pbXVtU3VmZml4TGVuZ3RoOwotCi0gICAgaWYgKG1pbmltdW1QcmVmaXhMaW1pdCA8IDApCi0g
ICAgICAgIG1pbmltdW1QcmVmaXhMZW5ndGggPSAyOwotICAgIGVsc2UKLSAgICAgICAgbWluaW11
bVByZWZpeExlbmd0aCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihtaW5pbXVtUHJlZml4TGltaXQp
OwotCi0gICAgaWYgKG1pbmltdW1TdWZmaXhMaW1pdCA8IDApCi0gICAgICAgIG1pbmltdW1TdWZm
aXhMZW5ndGggPSAyOwotICAgIGVsc2UKLSAgICAgICAgbWluaW11bVN1ZmZpeExlbmd0aCA9IHN0
YXRpY19jYXN0PHVuc2lnbmVkPihtaW5pbXVtU3VmZml4TGltaXQpOwotCi0gICAgaWYgKHBvcyAt
IGxhc3RTcGFjZSA8PSBtaW5pbXVtU3VmZml4TGVuZ3RoKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBpZiAoY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXNMaW1pdCA+PSAwICYmIGNvbnNlY3V0aXZl
SHlwaGVuYXRlZExpbmVzID49IHN0YXRpY19jYXN0PHVuc2lnbmVkPihjb25zZWN1dGl2ZUh5cGhl
bmF0ZWRMaW5lc0xpbWl0KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW50IGh5cGhlbldpZHRo
ID0gbWVhc3VyZUh5cGhlbldpZHRoKHRleHQsIGZvbnQpOwotCi0gICAgZmxvYXQgbWF4UHJlZml4
V2lkdGggPSBhdmFpbGFibGVXaWR0aCAtIHhQb3MgLSBoeXBoZW5XaWR0aCAtIGxhc3RTcGFjZVdv
cmRTcGFjaW5nOwotICAgIC8vIElmIHRoZSBtYXhpbXVtIHdpZHRoIGF2YWlsYWJsZSBmb3IgdGhl
IHByZWZpeCBiZWZvcmUgdGhlIGh5cGhlbiBpcyBzbWFsbCwgdGhlbiBpdCBpcyB2ZXJ5IHVubGlr
ZWx5Ci0gICAgLy8gdGhhdCBhbiBoeXBoZW5hdGlvbiBvcHBvcnR1bml0eSBleGlzdHMsIHNvIGRv
IG5vdCBib3RoZXIgdG8gbG9vayBmb3IgaXQuCi0gICAgaWYgKG1heFByZWZpeFdpZHRoIDw9IGZv
bnQucGl4ZWxTaXplKCkgKiA1IC8gNCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgUmVu
ZGVyU3R5bGUmIHN0eWxlID0gdGV4dC0+c3R5bGUoKTsKLSAgICBUZXh0UnVuIHJ1biA9IFJlbmRl
ckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHRleHQsIGxhc3RTcGFjZSwgcG9z
IC0gbGFzdFNwYWNlLCBzdHlsZSk7Ci0gICAgcnVuLnNldENoYXJhY3RlcnNMZW5ndGgodGV4dC0+
dGV4dExlbmd0aCgpIC0gbGFzdFNwYWNlKTsKLSAgICBBU1NFUlQocnVuLmNoYXJhY3RlcnNMZW5n
dGgoKSA+PSBydW4ubGVuZ3RoKCkpOwotCi0gICAgcnVuLnNldFRhYlNpemUoIWNvbGxhcHNlV2hp
dGVTcGFjZSwgc3R5bGUudGFiU2l6ZSgpKTsKLSAgICBydW4uc2V0WFBvcyh4UG9zICsgbGFzdFNw
YWNlV29yZFNwYWNpbmcpOwotCi0gICAgdW5zaWduZWQgcHJlZml4TGVuZ3RoID0gZm9udC5vZmZz
ZXRGb3JQb3NpdGlvbihydW4sIG1heFByZWZpeFdpZHRoLCBmYWxzZSk7Ci0gICAgaWYgKHByZWZp
eExlbmd0aCA8IG1pbmltdW1QcmVmaXhMZW5ndGgpCi0gICAgICAgIHJldHVybjsKLQotICAgIHBy
ZWZpeExlbmd0aCA9IGxhc3RIeXBoZW5Mb2NhdGlvbih0ZXh0LT5jaGFyYWN0ZXJzKCkgKyBsYXN0
U3BhY2UsIHBvcyAtIGxhc3RTcGFjZSwgc3RkOjptaW4ocHJlZml4TGVuZ3RoLCBwb3MgLSBsYXN0
U3BhY2UgLSBtaW5pbXVtU3VmZml4TGVuZ3RoKSArIDEsIGxvY2FsZUlkZW50aWZpZXIpOwotICAg
IGlmICghcHJlZml4TGVuZ3RoIHx8IHByZWZpeExlbmd0aCA8IG1pbmltdW1QcmVmaXhMZW5ndGgp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFdoZW4gbGFzdFNhcGNlIGlzIGEgc3BhY2UsIHdo
aWNoIGl0IGFsd2F5cyBpcyBleGNlcHQgc29tZXRpbWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBs
aW5lIG9yIGFmdGVyIGNvbGxhcHNlZAotICAgIC8vIHNwYWNlLCBpdCBzaG91bGQgbm90IGNvdW50
IHRvd2FyZHMgaHlwaGVuYXRlLWxpbWl0LWJlZm9yZS4KLSAgICBpZiAocHJlZml4TGVuZ3RoID09
IG1pbmltdW1QcmVmaXhMZW5ndGgpIHsKLSAgICAgICAgVUNoYXIgY2hhcmFjdGVyQXRMYXN0U3Bh
Y2UgPSB0ZXh0LT5jaGFyYWN0ZXJBdChsYXN0U3BhY2UpOwotICAgICAgICBpZiAoY2hhcmFjdGVy
QXRMYXN0U3BhY2UgPT0gJyAnIHx8IGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICdcbicgfHwgY2hh
cmFjdGVyQXRMYXN0U3BhY2UgPT0gJ1x0JyB8fCBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSBub0Jy
ZWFrU3BhY2UpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQVNTRVJUKHBvcyAt
IGxhc3RTcGFjZSAtIHByZWZpeExlbmd0aCA+PSBtaW5pbXVtU3VmZml4TGVuZ3RoKTsKLQotI2lm
ICFBU1NFUlRfRElTQUJMRUQKLSAgICBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4gZmFs
bGJhY2tGb250czsKLSAgICBmbG9hdCBwcmVmaXhXaWR0aCA9IGh5cGhlbldpZHRoICsgdGV4dFdp
ZHRoKHRleHQsIGxhc3RTcGFjZSwgcHJlZml4TGVuZ3RoLCBmb250LCB4UG9zLCBpc0ZpeGVkUGl0
Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgZmFsbGJhY2tGb250cykgKyBsYXN0U3BhY2VXb3JkU3Bh
Y2luZzsKLSAgICBBU1NFUlQoeFBvcyArIHByZWZpeFdpZHRoIDw9IGF2YWlsYWJsZVdpZHRoKTsK
LSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKGlzRml4ZWRQaXRjaCk7Ci0jZW5kaWYKLQotICAgIGxp
bmVCcmVhay5tb3ZlVG8odGV4dCwgbGFzdFNwYWNlICsgcHJlZml4TGVuZ3RoLCBuZXh0QnJlYWth
YmxlKTsKLSAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKLX0KLQotY2xhc3MgVHJhaWxpbmdPYmplY3Rz
IHsKLXB1YmxpYzoKLSAgICBUcmFpbGluZ09iamVjdHMoKTsKLSAgICB2b2lkIHNldFRyYWlsaW5n
V2hpdGVzcGFjZShSZW5kZXJUZXh0Kik7Ci0gICAgdm9pZCBjbGVhcigpOwotICAgIHZvaWQgYXBw
ZW5kQm94SWZOZWVkZWQoUmVuZGVyQm94TW9kZWxPYmplY3QqKTsKLQotICAgIGVudW0gQ29sbGFw
c2VGaXJzdFNwYWNlT3JOb3QgeyBEb05vdENvbGxhcHNlRmlyc3RTcGFjZSwgQ29sbGFwc2VGaXJz
dFNwYWNlIH07Ci0KLSAgICB2b2lkIHVwZGF0ZU1pZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMoTGlu
ZU1pZHBvaW50U3RhdGUmLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbEJyZWFrLCBDb2xsYXBzZUZp
cnN0U3BhY2VPck5vdCk7Ci0KLXByaXZhdGU6Ci0gICAgUmVuZGVyVGV4dCogbV93aGl0ZXNwYWNl
OwotICAgIFZlY3RvcjxSZW5kZXJCb3hNb2RlbE9iamVjdCosIDQ+IG1fYm94ZXM7Ci19OwotCi1U
cmFpbGluZ09iamVjdHM6OlRyYWlsaW5nT2JqZWN0cygpCi0gICAgOiBtX3doaXRlc3BhY2UoMCkK
LXsKLX0KLQotaW5saW5lIHZvaWQgVHJhaWxpbmdPYmplY3RzOjpzZXRUcmFpbGluZ1doaXRlc3Bh
Y2UoUmVuZGVyVGV4dCogd2hpdGVzcGFjZSkKLXsKLSAgICBBU1NFUlQod2hpdGVzcGFjZSk7Ci0g
ICAgbV93aGl0ZXNwYWNlID0gd2hpdGVzcGFjZTsKLX0KLQotaW5saW5lIHZvaWQgVHJhaWxpbmdP
YmplY3RzOjpjbGVhcigpCi17Ci0gICAgbV93aGl0ZXNwYWNlID0gMDsKLSAgICBtX2JveGVzLnNo
cmluaygwKTsgLy8gVXNlIHNocmluaygwKSBpbnN0ZWFkIG9mIGNsZWFyKCkgdG8gcmV0YWluIG91
ciBjYXBhY2l0eS4KLX0KLQotaW5saW5lIHZvaWQgVHJhaWxpbmdPYmplY3RzOjphcHBlbmRCb3hJ
Zk5lZWRlZChSZW5kZXJCb3hNb2RlbE9iamVjdCogYm94KQotewotICAgIGlmIChtX3doaXRlc3Bh
Y2UpCi0gICAgICAgIG1fYm94ZXMuYXBwZW5kKGJveCk7Ci19Ci0KLXZvaWQgVHJhaWxpbmdPYmpl
Y3RzOjp1cGRhdGVNaWRwb2ludHNGb3JUcmFpbGluZ0JveGVzKExpbmVNaWRwb2ludFN0YXRlJiBs
aW5lTWlkcG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGxCcmVhaywgQ29sbGFwc2VG
aXJzdFNwYWNlT3JOb3QgY29sbGFwc2VGaXJzdFNwYWNlKQotewotICAgIGlmICghbV93aGl0ZXNw
YWNlKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBUaGlzIG9iamVjdCBpcyBlaXRoZXIgZ29p
bmcgdG8gYmUgcGFydCBvZiB0aGUgbGFzdCBtaWRwb2ludCwgb3IgaXQgaXMgZ29pbmcgdG8gYmUg
dGhlIGFjdHVhbCBlbmRwb2ludC4KLSAgICAvLyBJbiBib3RoIGNhc2VzIHdlIGp1c3QgZGVjcmVh
c2Ugb3VyIHBvcyBieSAxIGxldmVsIHRvIGV4Y2x1ZGUgdGhlIHNwYWNlLCBhbGxvd2luZyBpdCB0
byAtIGluIGVmZmVjdCAtIGNvbGxhcHNlIGludG8gdGhlIG5ld2xpbmUuCi0gICAgaWYgKGxpbmVN
aWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAlIDIpIHsKLSAgICAgICAgLy8gRmluZCB0aGUgdHJh
aWxpbmcgc3BhY2Ugb2JqZWN0J3MgbWlkcG9pbnQuCi0gICAgICAgIGludCB0cmFpbGluZ1NwYWNl
TWlkcG9pbnQgPSBsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxOwotICAgICAgICBm
b3IgKCA7IHRyYWlsaW5nU3BhY2VNaWRwb2ludCA+IDAgJiYgbGluZU1pZHBvaW50U3RhdGUubWlk
cG9pbnRzW3RyYWlsaW5nU3BhY2VNaWRwb2ludF0ubV9vYmogIT0gbV93aGl0ZXNwYWNlOyAtLXRy
YWlsaW5nU3BhY2VNaWRwb2ludCkgeyB9Ci0gICAgICAgIEFTU0VSVCh0cmFpbGluZ1NwYWNlTWlk
cG9pbnQgPj0gMCk7Ci0gICAgICAgIGlmIChjb2xsYXBzZUZpcnN0U3BhY2UgPT0gQ29sbGFwc2VG
aXJzdFNwYWNlKQotICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzW3RyYWls
aW5nU3BhY2VNaWRwb2ludF0ubV9wb3MtLTsKLQotICAgICAgICAvLyBOb3cgbWFrZSBzdXJlIGV2
ZXJ5IHNpbmdsZSB0cmFpbGluZ1Bvc2l0aW9uZWRCb3ggZm9sbG93aW5nIHRoZSB0cmFpbGluZ1Nw
YWNlTWlkcG9pbnQgcHJvcGVybHkgc3RvcHMgYW5kIHN0YXJ0cwotICAgICAgICAvLyBpZ25vcmlu
ZyBzcGFjZXMuCi0gICAgICAgIHNpemVfdCBjdXJyZW50TWlkcG9pbnQgPSB0cmFpbGluZ1NwYWNl
TWlkcG9pbnQgKyAxOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fYm94ZXMuc2l6
ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TWlkcG9pbnQgPj0gbGluZU1pZHBv
aW50U3RhdGUubnVtTWlkcG9pbnRzKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2
ZSBhIG1pZHBvaW50IGZvciB0aGlzIGJveCB5ZXQuCi0gICAgICAgICAgICAgICAgZW5zdXJlTGlu
ZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobGluZU1pZHBvaW50U3RhdGUsIG1fYm94ZXNbaV0pOwot
ICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQobGluZU1pZHBvaW50
U3RhdGUubWlkcG9pbnRzW2N1cnJlbnRNaWRwb2ludF0ubV9vYmogPT0gbV9ib3hlc1tpXSk7Ci0g
ICAgICAgICAgICAgICAgQVNTRVJUKGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50c1tjdXJyZW50
TWlkcG9pbnQgKyAxXS5tX29iaiA9PSBtX2JveGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGN1cnJlbnRNaWRwb2ludCArPSAyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgh
bEJyZWFrLm1fb2JqKSB7Ci0gICAgICAgIEFTU0VSVChtX3doaXRlc3BhY2UtPmlzVGV4dCgpKTsK
LSAgICAgICAgQVNTRVJUKGNvbGxhcHNlRmlyc3RTcGFjZSA9PSBDb2xsYXBzZUZpcnN0U3BhY2Up
OwotICAgICAgICAvLyBBZGQgYSBuZXcgZW5kIG1pZHBvaW50IHRoYXQgc3RvcHMgcmlnaHQgYXQg
dGhlIHZlcnkgZW5kLgotICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBtX3doaXRlc3BhY2UtPnRl
eHRMZW5ndGgoKTsKLSAgICAgICAgdW5zaWduZWQgcG9zID0gbGVuZ3RoID49IDIgPyBsZW5ndGgg
LSAyIDogVUlOVF9NQVg7Ci0gICAgICAgIElubGluZUl0ZXJhdG9yIGVuZE1pZCgwLCBtX3doaXRl
c3BhY2UsIHBvcyk7Ci0gICAgICAgIHN0YXJ0SWdub3JpbmdTcGFjZXMobGluZU1pZHBvaW50U3Rh
dGUsIGVuZE1pZCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9ib3hlcy5zaXpl
KCk7ICsraSkgewotICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMo
bGluZU1pZHBvaW50U3RhdGUsIG1fYm94ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotfQotCi12
b2lkIExpbmVCcmVha2VyOjpyZXNldCgpCi17Ci0gICAgbV9wb3NpdGlvbmVkT2JqZWN0cy5jbGVh
cigpOwotICAgIG1faHlwaGVuYXRlZCA9IGZhbHNlOwotICAgIG1fY2xlYXIgPSBDTk9ORTsKLX0K
LQogSW5saW5lSXRlcmF0b3IgTGluZUJyZWFrZXI6Om5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJl
c29sdmVyJiByZXNvbHZlciwgTGluZUluZm8mIGxpbmVJbmZvLCBSZW5kZXJUZXh0SW5mbyYgcmVu
ZGVyVGV4dEluZm8sIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1
bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgV29yZE1lYXN1cmVtZW50cyYgd29y
ZE1lYXN1cmVtZW50cykKIHsKICNpZiAhRU5BQkxFKENTU19TSEFQRVMpCkBAIC0yNjE5LDg2MyAr
MjA2MCw2IEBAIElubGluZUl0ZXJhdG9yIExpbmVCcmVha2VyOjpuZXh0TGluZUJyZWFrKElubGlu
ZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJbmZvCiAjZW5kaWYKIH0KIAotc3RhdGljIGlu
bGluZSBib29sIGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KGNvbnN0IElu
bGluZUl0ZXJhdG9yJiBpdGVyLCBSZW5kZXJDb21iaW5lVGV4dCYgcmVuZGVyZXIpCi17Ci0gICAg
cmV0dXJuIGl0ZXIubV9vYmogPT0gJnJlbmRlcmVyICYmIGl0ZXIubV9wb3MgPj0gcmVuZGVyZXIu
dGV4dExlbmd0aCgpOwotfQotCi0jaWYgRU5BQkxFKENTU19TSEFQRVMpCi1zdGF0aWMgdm9pZCB1
cGRhdGVTZWdtZW50c0ZvclNoYXBlcyhSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBjb25zdCBGbG9h
dGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgY29uc3QgV29yZE1lYXN1cmVt
ZW50cyYgd29yZE1lYXN1cmVtZW50cywgTGluZVdpZHRoJiB3aWR0aCwgYm9vbCBpc0ZpcnN0TGlu
ZSkKLXsKLSAgICBBU1NFUlQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7Ci0KLSAgICBTaGFw
ZUluc2lkZUluZm8qIHNoYXBlSW5zaWRlSW5mbyA9IGJsb2NrLmxheW91dFNoYXBlSW5zaWRlSW5m
bygpOwotICAgIGlmICghbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZS0+aXNQbGFjZWQoKSB8fCAh
c2hhcGVJbnNpZGVJbmZvKQotICAgICAgICByZXR1cm47Ci0KLSAgICBib29sIGlzSG9yaXpvbnRh
bFdyaXRpbmdNb2RlID0gYmxvY2suaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKTsKLSAgICBMYXlv
dXRVbml0IGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWluZXIgPSBibG9jay5sb2dpY2FsT2Zm
c2V0RnJvbVNoYXBlQW5jZXN0b3JDb250YWluZXIoc2hhcGVJbnNpZGVJbmZvLT5vd25lcigpKS5o
ZWlnaHQoKTsKLQotICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxUb3AgPSBibG9jay5sb2dpY2Fs
SGVpZ2h0KCkgKyBsb2dpY2FsT2Zmc2V0RnJvbVNoYXBlQ29udGFpbmVyOwotICAgIExheW91dFVu
aXQgbGluZUxvZ2ljYWxIZWlnaHQgPSBibG9jay5saW5lSGVpZ2h0KGlzRmlyc3RMaW5lLCBpc0hv
cml6b250YWxXcml0aW5nTW9kZSA/IEhvcml6b250YWxMaW5lIDogVmVydGljYWxMaW5lLCBQb3Np
dGlvbk9mSW50ZXJpb3JMaW5lQm94ZXMpOwotICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxCb3R0
b20gPSBsaW5lTG9naWNhbFRvcCArIGxpbmVMb2dpY2FsSGVpZ2h0OwotCi0gICAgTGF5b3V0VW5p
dCBmbG9hdExvZ2ljYWxUb3AgPSBibG9jay5sb2dpY2FsVG9wRm9yRmxvYXQobGFzdEZsb2F0RnJv
bVByZXZpb3VzTGluZSk7Ci0gICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxCb3R0b20gPSBibG9j
ay5sb2dpY2FsQm90dG9tRm9yRmxvYXQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7Ci0KLSAg
ICBib29sIGxpbmVPdmVybGFwc1dpdGhGbG9hdCA9IChmbG9hdExvZ2ljYWxUb3AgPCBsaW5lTG9n
aWNhbEJvdHRvbSkgJiYgKGxpbmVMb2dpY2FsVG9wIDwgZmxvYXRMb2dpY2FsQm90dG9tKTsKLSAg
ICBpZiAoIWxpbmVPdmVybGFwc1dpdGhGbG9hdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZmxv
YXQgbWluU2VnbWVudFdpZHRoID0gZmlyc3RQb3NpdGl2ZVdpZHRoKHdvcmRNZWFzdXJlbWVudHMp
OwotCi0gICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxXaWR0aCA9IGJsb2NrLmxvZ2ljYWxXaWR0
aEZvckZsb2F0KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpOwotICAgIExheW91dFVuaXQgYXZh
aWxhYmxlTG9naWNhbFdpZHRoID0gYmxvY2subG9naWNhbFdpZHRoKCkgLSBibG9jay5sb2dpY2Fs
UmlnaHRGb3JGbG9hdChsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKTsKLSAgICBpZiAoYXZhaWxh
YmxlTG9naWNhbFdpZHRoIDwgbWluU2VnbWVudFdpZHRoKQotICAgICAgICBibG9jay5zZXRMb2dp
Y2FsSGVpZ2h0KGZsb2F0TG9naWNhbEJvdHRvbSk7Ci0KLSAgICBpZiAoYmxvY2subG9naWNhbEhl
aWdodCgpIDwgZmxvYXRMb2dpY2FsVG9wKSB7Ci0gICAgICAgIHNoYXBlSW5zaWRlSW5mby0+YWRq
dXN0TG9naWNhbExpbmVUb3AobWluU2VnbWVudFdpZHRoICsgZmxvYXRMb2dpY2FsV2lkdGgpOwot
ICAgICAgICBibG9jay5zZXRMb2dpY2FsSGVpZ2h0KHNoYXBlSW5zaWRlSW5mby0+bG9naWNhbExp
bmVUb3AoKSAtIGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWluZXIpOwotICAgIH0KLQotICAg
IGxpbmVMb2dpY2FsVG9wID0gYmxvY2subG9naWNhbEhlaWdodCgpICsgbG9naWNhbE9mZnNldEZy
b21TaGFwZUNvbnRhaW5lcjsKLQotICAgIHNoYXBlSW5zaWRlSW5mby0+dXBkYXRlU2VnbWVudHNG
b3JMaW5lKGxpbmVMb2dpY2FsVG9wLCBsaW5lTG9naWNhbEhlaWdodCk7Ci0gICAgd2lkdGgudXBk
YXRlQ3VycmVudFNoYXBlU2VnbWVudCgpOwotICAgIHdpZHRoLnVwZGF0ZUF2YWlsYWJsZVdpZHRo
KCk7Ci19Ci0jZW5kaWYKLQotY2xhc3MgQnJlYWtpbmdDb250ZXh0IHsKLXB1YmxpYzoKLSAgICBC
cmVha2luZ0NvbnRleHQoTGluZUJyZWFrZXImIGxpbmVCcmVha2VyLCBJbmxpbmVCaWRpUmVzb2x2
ZXImIHJlc29sdmVyLCBMaW5lSW5mbyYgaW5MaW5lSW5mbywgTGluZVdpZHRoJiBsaW5lV2lkdGgs
IFJlbmRlclRleHRJbmZvJiBpblJlbmRlclRleHRJbmZvLCBGbG9hdGluZ09iamVjdCogaW5MYXN0
RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBib29sIGFwcGxpZWRTdGFydFdpZHRoLCBSZW5kZXJCbG9j
a0Zsb3cmIGJsb2NrKQotICAgICAgICA6IG1fbGluZUJyZWFrZXIobGluZUJyZWFrZXIpCi0gICAg
ICAgICwgbV9yZXNvbHZlcihyZXNvbHZlcikKLSAgICAgICAgLCBtX2N1cnJlbnQocmVzb2x2ZXIu
cG9zaXRpb24oKSkKLSAgICAgICAgLCBtX2xpbmVCcmVhayhyZXNvbHZlci5wb3NpdGlvbigpKQot
ICAgICAgICAsIG1fYmxvY2soYmxvY2spCi0gICAgICAgICwgbV9sYXN0T2JqZWN0KG1fY3VycmVu
dC5tX29iaikKLSAgICAgICAgLCBtX25leHRPYmplY3QoMCkKLSAgICAgICAgLCBtX2N1cnJlbnRT
dHlsZSgwKQotICAgICAgICAsIG1fYmxvY2tTdHlsZShibG9jay5zdHlsZSgpKQotICAgICAgICAs
IG1fbGluZUluZm8oaW5MaW5lSW5mbykKLSAgICAgICAgLCBtX3JlbmRlclRleHRJbmZvKGluUmVu
ZGVyVGV4dEluZm8pCi0gICAgICAgICwgbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKGluTGFz
dEZsb2F0RnJvbVByZXZpb3VzTGluZSkKLSAgICAgICAgLCBtX3dpZHRoKGxpbmVXaWR0aCkKLSAg
ICAgICAgLCBtX2N1cnJXUyhOT1JNQUwpCi0gICAgICAgICwgbV9sYXN0V1MoTk9STUFMKQotICAg
ICAgICAsIG1fcHJlc2VydmVzTmV3bGluZShmYWxzZSkKLSAgICAgICAgLCBtX2F0U3RhcnQodHJ1
ZSkKLSAgICAgICAgLCBtX2lnbm9yaW5nU3BhY2VzKGZhbHNlKQotICAgICAgICAsIG1fY3VycmVu
dENoYXJhY3RlcklzU3BhY2UoZmFsc2UpCi0gICAgICAgICwgbV9jdXJyZW50Q2hhcmFjdGVySXNX
UyhmYWxzZSkKLSAgICAgICAgLCBtX2FwcGxpZWRTdGFydFdpZHRoKGFwcGxpZWRTdGFydFdpZHRo
KQotICAgICAgICAsIG1faW5jbHVkZUVuZFdpZHRoKHRydWUpCi0gICAgICAgICwgbV9hdXRvV3Jh
cChmYWxzZSkKLSAgICAgICAgLCBtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUoZmFsc2UpCi0g
ICAgICAgICwgbV9mbG9hdHNGaXRPbkxpbmUodHJ1ZSkKLSAgICAgICAgLCBtX2NvbGxhcHNlV2hp
dGVTcGFjZShmYWxzZSkKLSAgICAgICAgLCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoKG1fbGluZUlu
Zm8ucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpCi0gICAgICAgICwgbV9hbGxvd0ltYWdlc1Rv
QnJlYWsoIWJsb2NrLmRvY3VtZW50KCkuaW5RdWlya3NNb2RlKCkgfHwgIWJsb2NrLmlzVGFibGVD
ZWxsKCkgfHwgIW1fYmxvY2tTdHlsZS5sb2dpY2FsV2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygp
KQotICAgICAgICAsIG1fYXRFbmQoZmFsc2UpCi0gICAgICAgICwgbV9oYWRVbmNvbW1pdHRlZFdp
ZHRoQmVmb3JlQ3VycmVudChmYWxzZSkKLSAgICAgICAgLCBtX2xpbmVNaWRwb2ludFN0YXRlKHJl
c29sdmVyLm1pZHBvaW50U3RhdGUoKSkKLSAgICB7Ci0gICAgICAgIG1fbGluZUluZm8uc2V0UHJl
dmlvdXNMaW5lQnJva2VDbGVhbmx5KGZhbHNlKTsKLSAgICB9Ci0KLSAgICBSZW5kZXJPYmplY3Qq
IGN1cnJlbnRPYmplY3QoKSB7IHJldHVybiBtX2N1cnJlbnQubV9vYmo7IH0KLSAgICBJbmxpbmVJ
dGVyYXRvciBsaW5lQnJlYWsoKSB7IHJldHVybiBtX2xpbmVCcmVhazsgfQotICAgIElubGluZUl0
ZXJhdG9yJiBsaW5lQnJlYWtSZWYoKSB7cmV0dXJuIG1fbGluZUJyZWFrOyB9Ci0gICAgTGluZVdp
ZHRoJiBsaW5lV2lkdGgoKSB7IHJldHVybiBtX3dpZHRoOyB9Ci0gICAgYm9vbCBhdEVuZCgpIHsg
cmV0dXJuIG1fYXRFbmQ7IH0KLQotICAgIHZvaWQgaW5pdGlhbGl6ZUZvckN1cnJlbnRPYmplY3Qo
KTsKLQotICAgIHZvaWQgaW5jcmVtZW50KCk7Ci0KLSAgICB2b2lkIGhhbmRsZUJSKEVDbGVhciYp
OwotICAgIHZvaWQgaGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZChWZWN0b3I8UmVuZGVyQm94Kj4m
IHBvc2l0aW9uZWRPYmplY3RzKTsKLSAgICB2b2lkIGhhbmRsZUZsb2F0KCk7Ci0gICAgdm9pZCBo
YW5kbGVFbXB0eUlubGluZSgpOwotICAgIHZvaWQgaGFuZGxlUmVwbGFjZWQoKTsKLSAgICBib29s
IGhhbmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYsIGJvb2wmIGh5cGhlbmF0ZWQsIHVuc2lnbmVk
JiBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7Ci0gICAgYm9vbCBjYW5CcmVha0F0VGhpc1Bv
c2l0aW9uKCk7Ci0gICAgdm9pZCBjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJZk5lZWRlZCgpOwot
ICAgIElubGluZUl0ZXJhdG9yIGhhbmRsZUVuZE9mTGluZSgpOwotCi0gICAgdm9pZCBjbGVhckxp
bmVCcmVha0lmRml0c09uTGluZShib29sIGlnbm9yaW5nVHJhaWxpbmdTcGFjZSA9IGZhbHNlKQot
ICAgIHsKLSAgICAgICAgaWYgKG1fd2lkdGguZml0c09uTGluZShpZ25vcmluZ1RyYWlsaW5nU3Bh
Y2UpIHx8IG1fbGFzdFdTID09IE5PV1JBUCkKLSAgICAgICAgICAgIG1fbGluZUJyZWFrLmNsZWFy
KCk7Ci0gICAgfQotCi0gICAgdm9pZCBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aChSZW5k
ZXJPYmplY3QqIG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0ID0gMCwgaW50IG5leHRCcmVhayA9IC0x
KQotICAgIHsKLSAgICAgICAgbV93aWR0aC5jb21taXQoKTsKLSAgICAgICAgbV9saW5lQnJlYWsu
bW92ZVRvKG9iamVjdCwgb2Zmc2V0LCBuZXh0QnJlYWspOwotICAgIH0KLQotcHJpdmF0ZToKLSAg
ICBMaW5lQnJlYWtlciYgbV9saW5lQnJlYWtlcjsKLSAgICBJbmxpbmVCaWRpUmVzb2x2ZXImIG1f
cmVzb2x2ZXI7Ci0KLSAgICBJbmxpbmVJdGVyYXRvciBtX2N1cnJlbnQ7Ci0gICAgSW5saW5lSXRl
cmF0b3IgbV9saW5lQnJlYWs7Ci0gICAgSW5saW5lSXRlcmF0b3IgbV9zdGFydE9mSWdub3JlZFNw
YWNlczsKLQotICAgIFJlbmRlckJsb2NrRmxvdyYgbV9ibG9jazsKLSAgICBSZW5kZXJPYmplY3Qq
IG1fbGFzdE9iamVjdDsKLSAgICBSZW5kZXJPYmplY3QqIG1fbmV4dE9iamVjdDsKLQotICAgIFJl
bmRlclN0eWxlKiBtX2N1cnJlbnRTdHlsZTsKLQotICAgIC8vIEZpcmVmb3ggYW5kIE9wZXJhIHdp
bGwgYWxsb3cgYSB0YWJsZSBjZWxsIHRvIGdyb3cgdG8gZml0IGFuIGltYWdlIGluc2lkZSBpdCB1
bmRlcgotICAgIC8vIHZlcnkgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcyAoaW4gb3JkZXIgdG8gbWF0
Y2ggY29tbW9uIFdpbklFIHJlbmRlcmluZ3MpLgotICAgIC8vIE5vdCBzdXBwb3J0aW5nIHRoZSBx
dWlyayBoYXMgY2F1c2VkIHVzIHRvIG1pcy1yZW5kZXIgc29tZSByZWFsIHNpdGVzLiAoU2VlIEJ1
Z3ppbGxhIDEwNTE3LikKLSAgICBSZW5kZXJTdHlsZSYgbV9ibG9ja1N0eWxlOwotCi0gICAgTGlu
ZUluZm8mIG1fbGluZUluZm87Ci0KLSAgICBSZW5kZXJUZXh0SW5mbyYgbV9yZW5kZXJUZXh0SW5m
bzsKLQotICAgIEZsb2F0aW5nT2JqZWN0KiBtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmU7Ci0K
LSAgICBMaW5lV2lkdGggbV93aWR0aDsKLQotICAgIEVXaGl0ZVNwYWNlIG1fY3VycldTOwotICAg
IEVXaGl0ZVNwYWNlIG1fbGFzdFdTOwotCi0gICAgYm9vbCBtX3ByZXNlcnZlc05ld2xpbmU7Ci0g
ICAgYm9vbCBtX2F0U3RhcnQ7Ci0KLSAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgb25seSBp
ZiB3aGl0ZXNwYWNlIGlzbid0IHNldCB0byBQUkUsIGFuZCBpdCB0ZWxscyB1cyB3aGV0aGVyCi0g
ICAgLy8gb3Igbm90IHdlIGFyZSBjdXJyZW50bHkgaWdub3Jpbmcgd2hpdGVzcGFjZS4KLSAgICBi
b29sIG1faWdub3JpbmdTcGFjZXM7Ci0KLSAgICAvLyBUaGlzIHZhcmlhYmxlIHRyYWNrcyB3aGV0
aGVyIHRoZSB2ZXJ5IGxhc3QgY2hhcmFjdGVyIHdlIHNhdyB3YXMgYSBzcGFjZS4gIFdlIHVzZQot
ICAgIC8vIHRoaXMgdG8gZGV0ZWN0IHdoZW4gd2UgZW5jb3VudGVyIGEgc2Vjb25kIHNwYWNlIHNv
IHdlIGtub3cgd2UgaGF2ZSB0byB0ZXJtaW5hdGUKLSAgICAvLyBhIHJ1bi4KLSAgICBib29sIG1f
Y3VycmVudENoYXJhY3RlcklzU3BhY2U7Ci0gICAgYm9vbCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dT
OwotICAgIGJvb2wgbV9hcHBsaWVkU3RhcnRXaWR0aDsKLSAgICBib29sIG1faW5jbHVkZUVuZFdp
ZHRoOwotICAgIGJvb2wgbV9hdXRvV3JhcDsKLSAgICBib29sIG1fYXV0b1dyYXBXYXNFdmVyVHJ1
ZU9uTGluZTsKLSAgICBib29sIG1fZmxvYXRzRml0T25MaW5lOwotICAgIGJvb2wgbV9jb2xsYXBz
ZVdoaXRlU3BhY2U7Ci0gICAgYm9vbCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoOwotICAgIGJvb2wg
bV9hbGxvd0ltYWdlc1RvQnJlYWs7Ci0gICAgYm9vbCBtX2F0RW5kOwotICAgIGJvb2wgbV9oYWRV
bmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudDsKLQotICAgIExpbmVNaWRwb2ludFN0YXRlJiBt
X2xpbmVNaWRwb2ludFN0YXRlOwotCi0gICAgVHJhaWxpbmdPYmplY3RzIG1fdHJhaWxpbmdPYmpl
Y3RzOwotfTsKLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojppbml0aWFsaXplRm9yQ3Vy
cmVudE9iamVjdCgpCi17Ci0gICAgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudCA9
ICEhbV93aWR0aC51bmNvbW1pdHRlZFdpZHRoKCk7Ci0KLSAgICBtX2N1cnJlbnRTdHlsZSA9ICZt
X2N1cnJlbnQubV9vYmotPnN0eWxlKCk7Ci0KLSAgICBBU1NFUlQobV9jdXJyZW50U3R5bGUpOwot
Ci0gICAgbV9uZXh0T2JqZWN0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhtX2Jsb2Nr
LCBtX2N1cnJlbnQubV9vYmopOwotICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0
LT5wYXJlbnQoKSAmJiAhbV9uZXh0T2JqZWN0LT5wYXJlbnQoKS0+aXNEZXNjZW5kYW50T2YobV9j
dXJyZW50Lm1fb2JqLT5wYXJlbnQoKSkpCi0gICAgICAgIG1faW5jbHVkZUVuZFdpZHRoID0gdHJ1
ZTsKLQotICAgIG1fY3VycldTID0gbV9jdXJyZW50Lm1fb2JqLT5pc1JlcGxhY2VkKCkgPyBtX2N1
cnJlbnQubV9vYmotPnBhcmVudCgpLT5zdHlsZSgpLndoaXRlU3BhY2UoKSA6IG1fY3VycmVudFN0
eWxlLT53aGl0ZVNwYWNlKCk7Ci0gICAgbV9sYXN0V1MgPSBtX2xhc3RPYmplY3QtPmlzUmVwbGFj
ZWQoKSA/IG1fbGFzdE9iamVjdC0+cGFyZW50KCktPnN0eWxlKCkud2hpdGVTcGFjZSgpIDogbV9s
YXN0T2JqZWN0LT5zdHlsZSgpLndoaXRlU3BhY2UoKTsKLQotICAgIG1fYXV0b1dyYXAgPSBSZW5k
ZXJTdHlsZTo6YXV0b1dyYXAobV9jdXJyV1MpOwotICAgIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9u
TGluZSA9IG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSB8fCBtX2F1dG9XcmFwOwotCi0jaWYg
RU5BQkxFKFNWRykKLSAgICBtX3ByZXNlcnZlc05ld2xpbmUgPSBtX2N1cnJlbnQubV9vYmotPmlz
U1ZHSW5saW5lVGV4dCgpID8gZmFsc2UgOiBSZW5kZXJTdHlsZTo6cHJlc2VydmVOZXdsaW5lKG1f
Y3VycldTKTsKLSNlbHNlCi0gICAgbV9wcmVzZXJ2ZXNOZXdsaW5lID0gUmVuZGVyU3R5bGU6OnBy
ZXNlcnZlTmV3bGluZShtX2N1cnJXUyk7Ci0jZW5kaWYKLQotICAgIG1fY29sbGFwc2VXaGl0ZVNw
YWNlID0gUmVuZGVyU3R5bGU6OmNvbGxhcHNlV2hpdGVTcGFjZShtX2N1cnJXUyk7Ci19Ci0KLWlu
bGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KCkKLXsKLSAgICAvLyBDbGVhciBv
dXQgb3VyIGNoYXJhY3RlciBzcGFjZSBib29sLCBzaW5jZSBpbmxpbmUgPHByZT5zIGRvbid0IGNv
bGxhcHNlIHdoaXRlc3BhY2UKLSAgICAvLyB3aXRoIGFkamFjZW50IGlubGluZSBub3JtYWwvbm93
cmFwIHNwYW5zLgotICAgIGlmICghbV9jb2xsYXBzZVdoaXRlU3BhY2UpCi0gICAgICAgIG1fY3Vy
cmVudENoYXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKLQotICAgIG1fY3VycmVudC5tb3ZlVG9TdGFy
dE9mKG1fbmV4dE9iamVjdCk7Ci0gICAgbV9hdFN0YXJ0ID0gZmFsc2U7Ci19Ci0KLWlubGluZSB2
b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlQlIoRUNsZWFyJiBjbGVhcikKLXsKLSAgICBpZiAo
bV93aWR0aC5maXRzT25MaW5lKCkpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBiciA9IG1fY3Vy
cmVudC5tX29iajsKLSAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvU3RhcnRPZihicik7Ci0gICAg
ICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOwotCi0gICAgICAgIC8vIEEgPGJyPiBhbHdheXMg
YnJlYWtzIGEgbGluZSwgc28gZG9uJ3QgbGV0IHRoZSBsaW5lIGJlIGNvbGxhcHNlZAotICAgICAg
ICAvLyBhd2F5LiBBbHNvLCB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aCBhIDxi
cj4gZG9lcyBub3QKLSAgICAgICAgLy8gZ2V0IGNvbGxhcHNlZCBhd2F5LiBJdCBvbmx5IGRvZXMg
dGhpcyBpZiB0aGUgcHJldmlvdXMgbGluZSBicm9rZQotICAgICAgICAvLyBjbGVhbmx5LiBPdGhl
cndpc2UgdGhlIDxicj4gaGFzIG5vIGVmZmVjdCBvbiB3aGV0aGVyIHRoZSBsaW5lIGlzCi0gICAg
ICAgIC8vIGVtcHR5IG9yIG5vdC4KLSAgICAgICAgaWYgKG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGgp
Ci0gICAgICAgICAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAmbV9ibG9jaywgJm1fd2lk
dGgpOwotICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOwotICAgICAgICBtX2xpbmVJ
bmZvLnNldFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKLQotICAgICAgICAvLyBBIDxi
cj4gd2l0aCBjbGVhcmFuY2UgYWx3YXlzIG5lZWRzIGEgbGluZWJveCBpbiBjYXNlIHRoZSBsaW5l
cyBiZWxvdyBpdCBnZXQgZGlydGllZCBsYXRlciBhbmQKLSAgICAgICAgLy8gbmVlZCB0byBjaGVj
ayBmb3IgZmxvYXRzIHRvIGNsZWFyIC0gc28gaWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCBzdG9w
IGlnbm9yaW5nIHRoZW0gYW5kIGFkZCBhCi0gICAgICAgIC8vIHJ1biBmb3IgdGhpcyBvYmplY3Qu
Ci0gICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jbGVhcigp
ICE9IENOT05FKQotICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMo
bV9saW5lTWlkcG9pbnRTdGF0ZSwgYnIpOwotICAgICAgICAvLyBJZiB3ZSB3ZXJlIHByZWNlZGVk
IGJ5IGNvbGxhcHNpbmcgc3BhY2UgYW5kIGFyZSBpbiBhIHJpZ2h0LWFsaWduZWQgY29udGFpbmVy
IHdlIG5lZWQgdG8gZW5zdXJlIHRoZSBzcGFjZSBnZXRzCi0gICAgICAgIC8vIGNvbGxhcHNlZCBh
d2F5IHNvIHRoYXQgaXQgZG9lc24ndCBwdXNoIHRoZSB0ZXh0IG91dCBmcm9tIHRoZSBjb250YWlu
ZXIncyByaWdodC1oYW5kIGVkZ2UuCi0gICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2FyZGxl
c3Mgb2YgdGhlIGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2VsaW5p
bmcgYSBsb3Qgb2YgdGVzdCByZXN1bHRzLgotICAgICAgICBlbHNlIGlmIChtX2lnbm9yaW5nU3Bh
Y2VzICYmIChtX2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gUklHSFQgfHwgbV9ibG9ja1N0eWxl
LnRleHRBbGlnbigpID09IFdFQktJVF9SSUdIVCkpCi0gICAgICAgICAgICBzdG9wSWdub3JpbmdT
cGFjZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50Lm1f
b2JqLCBtX2N1cnJlbnQubV9wb3MpKTsKLQotICAgICAgICBpZiAoIW1fbGluZUluZm8uaXNFbXB0
eSgpKQotICAgICAgICAgICAgY2xlYXIgPSBtX2N1cnJlbnRTdHlsZS0+Y2xlYXIoKTsKLSAgICB9
Ci0gICAgbV9hdEVuZCA9IHRydWU7Ci19Ci0KLWlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6
aGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZChWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRP
YmplY3RzKQotewotICAgIC8vIElmIG91ciBvcmlnaW5hbCBkaXNwbGF5IHdhc24ndCBhbiBpbmxp
bmUgdHlwZSwgdGhlbiB3ZSBjYW4KLSAgICAvLyBnbyBhaGVhZCBhbmQgZGV0ZXJtaW5lIG91ciBz
dGF0aWMgaW5saW5lIHBvc2l0aW9uIG5vdy4KLSAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVy
Qm94KG1fY3VycmVudC5tX29iaik7Ci0gICAgYm9vbCBpc0lubGluZVR5cGUgPSBib3gtPnN0eWxl
KCkuaXNPcmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCk7Ci0gICAgaWYgKCFpc0lubGluZVR5cGUp
Ci0gICAgICAgIG1fYmxvY2suc2V0U3RhdGljSW5saW5lUG9zaXRpb25Gb3JDaGlsZCgqYm94LCBt
X2Jsb2NrLmxvZ2ljYWxIZWlnaHQoKSwgbV9ibG9jay5zdGFydE9mZnNldEZvckNvbnRlbnQobV9i
bG9jay5sb2dpY2FsSGVpZ2h0KCkpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgLy8gSWYgb3VyIG9y
aWdpbmFsIGRpc3BsYXkgd2FzIGFuIElOTElORSB0eXBlLCB0aGVuIHdlIGNhbiBnbyBhaGVhZAot
ICAgICAgICAvLyBhbmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMgeSBwb3NpdGlvbiBub3cuCi0gICAg
ICAgIGJveC0+bGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlvbihtX2Jsb2NrLmxvZ2ljYWxI
ZWlnaHQoKSk7Ci0gICAgfQotCi0gICAgLy8gSWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCB3ZSBo
YXZlIHRvIHN0b3AgYW5kIGluY2x1ZGUgdGhpcyBvYmplY3QgYW5kCi0gICAgLy8gdGhlbiBzdGFy
dCBpZ25vcmluZyBzcGFjZXMgYWdhaW4uCi0gICAgaWYgKGlzSW5saW5lVHlwZSB8fCBib3gtPmNv
bnRhaW5lcigpLT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgIGlmIChtX2lnbm9yaW5nU3Bh
Y2VzKQotICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9saW5l
TWlkcG9pbnRTdGF0ZSwgYm94KTsKLSAgICAgICAgbV90cmFpbGluZ09iamVjdHMuYXBwZW5kQm94
SWZOZWVkZWQoYm94KTsKLSAgICB9IGVsc2UKLSAgICAgICAgcG9zaXRpb25lZE9iamVjdHMuYXBw
ZW5kKGJveCk7Ci0KLSAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoaW5saW5lTG9naWNh
bFdpZHRoKGJveCkpOwotICAgIC8vIFJlc2V0IHByaW9yIGxpbmUgYnJlYWsgY29udGV4dCBjaGFy
YWN0ZXJzLgotICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNldFBy
aW9yQ29udGV4dCgpOwotfQotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUZs
b2F0KCkKLXsKLSAgICBSZW5kZXJCb3gmIGZsb2F0Qm94ID0gdG9SZW5kZXJCb3goKm1fY3VycmVu
dC5tX29iaik7Ci0gICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gbV9ibG9jay5p
bnNlcnRGbG9hdGluZ09iamVjdChmbG9hdEJveCk7Ci0gICAgLy8gY2hlY2sgaWYgaXQgZml0cyBp
biB0aGUgY3VycmVudCBsaW5lLgotICAgIC8vIElmIGl0IGRvZXMsIHBvc2l0aW9uIGl0IG5vdywg
b3RoZXJ3aXNlLCBwb3NpdGlvbgotICAgIC8vIGl0IGFmdGVyIG1vdmluZyB0byBuZXh0IGxpbmUg
KGluIG5ld0xpbmUoKSBmdW5jKQotICAgIC8vIEZJWE1FOiBCdWcgMTEwMzcyOiBQcm9wZXJseSBw
b3NpdGlvbiBtdWx0aXBsZSBzdGFja2VkIGZsb2F0cyB3aXRoIG5vbi1yZWN0YW5ndWxhciBzaGFw
ZSBvdXRzaWRlLgotICAgIGlmIChtX2Zsb2F0c0ZpdE9uTGluZSAmJiBtX3dpZHRoLmZpdHNPbkxp
bmVFeGNsdWRpbmdUcmFpbGluZ1doaXRlc3BhY2UobV9ibG9jay5sb2dpY2FsV2lkdGhGb3JGbG9h
dChmbG9hdGluZ09iamVjdCkpKSB7Ci0gICAgICAgIG1fYmxvY2sucG9zaXRpb25OZXdGbG9hdE9u
TGluZShmbG9hdGluZ09iamVjdCwgbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBtX2xpbmVJ
bmZvLCBtX3dpZHRoKTsKLSAgICAgICAgaWYgKG1fbGluZUJyZWFrLm1fb2JqID09IG1fY3VycmVu
dC5tX29iaikgewotICAgICAgICAgICAgQVNTRVJUKCFtX2xpbmVCcmVhay5tX3Bvcyk7Ci0gICAg
ICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZQot
ICAgICAgICBtX2Zsb2F0c0ZpdE9uTGluZSA9IGZhbHNlOwotICAgIC8vIFVwZGF0ZSBwcmlvciBs
aW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVycywgdXNpbmcgVStGRkZEIChPQkpFQ1QgUkVQTEFD
RU1FTlQgQ0hBUkFDVEVSKSBmb3IgZmxvYXRpbmcgZWxlbWVudC4KLSAgICBtX3JlbmRlclRleHRJ
bmZvLm1fbGluZUJyZWFrSXRlcmF0b3IudXBkYXRlUHJpb3JDb250ZXh0KHJlcGxhY2VtZW50Q2hh
cmFjdGVyKTsKLX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbXB0eUlu
bGluZSgpCi17Ci0gICAgUmVuZGVySW5saW5lJiBmbG93Qm94ID0gdG9SZW5kZXJJbmxpbmUoKm1f
Y3VycmVudC5tX29iaik7Ci0KLSAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGVuZCB1cCBiZWluZyBj
YWxsZWQgb24gZW1wdHkgaW5saW5lcwotICAgIEFTU0VSVChpc0VtcHR5SW5saW5lKGZsb3dCb3gp
KTsKLQotICAgIC8vIE5vdyB0aGF0IHNvbWUgaW5saW5lIGZsb3dzIGhhdmUgbGluZSBib3hlcywg
aWYgd2UgYXJlIGFscmVhZHkgaWdub3Jpbmcgc3BhY2VzLCB3ZSBuZWVkCi0gICAgLy8gdG8gbWFr
ZSBzdXJlIHRoYXQgd2Ugc3RvcCB0byBpbmNsdWRlIHRoaXMgb2JqZWN0IGFuZCB0aGVuIHN0YXJ0
IGlnbm9yaW5nIHNwYWNlcyBhZ2Fpbi4KLSAgICAvLyBJZiB0aGlzIG9iamVjdCBpcyBhdCB0aGUg
c3RhcnQgb2YgdGhlIGxpbmUsIHdlIG5lZWQgdG8gYmVoYXZlIGxpa2UgbGlzdCBtYXJrZXJzIGFu
ZAotICAgIC8vIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcy4KLSAgICBib29sIHJlcXVpcmVzTGluZUJv
eCA9IGFsd2F5c1JlcXVpcmVzTGluZUJveChmbG93Qm94KTsKLSAgICBpZiAocmVxdWlyZXNMaW5l
Qm94IHx8IHJlcXVpcmVzTGluZUJveEZvckNvbnRlbnQoZmxvd0JveCwgbV9saW5lSW5mbykpIHsK
LSAgICAgICAgLy8gQW4gZW1wdHkgaW5saW5lIHRoYXQgb25seSBoYXMgbGluZS1oZWlnaHQsIHZl
cnRpY2FsLWFsaWduIG9yIGZvbnQtbWV0cmljcyB3aWxsIG9ubHkgZ2V0IGEKLSAgICAgICAgLy8g
bGluZSBib3ggdG8gYWZmZWN0IHRoZSBoZWlnaHQgb2YgdGhlIGxpbmUgaWYgdGhlIHJlc3Qgb2Yg
dGhlIGxpbmUgaXMgbm90IGVtcHR5LgotICAgICAgICBpZiAocmVxdWlyZXNMaW5lQm94KQotICAg
ICAgICAgICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsK
LSAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMpIHsKLSAgICAgICAgICAgIG1fdHJhaWxpbmdP
YmplY3RzLmNsZWFyKCk7Ci0gICAgICAgICAgICBlbnN1cmVMaW5lQm94SW5zaWRlSWdub3JlZFNw
YWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQubV9vYmopOwotICAgICAgICB9IGVs
c2UgaWYgKG1fYmxvY2tTdHlsZS5jb2xsYXBzZVdoaXRlU3BhY2UoKSAmJiBtX3Jlc29sdmVyLnBv
c2l0aW9uKCkubV9vYmogPT0gbV9jdXJyZW50Lm1fb2JqCi0gICAgICAgICAgICAmJiBzaG91bGRT
a2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QobV9ibG9jaywgbV9jdXJyZW50Lm1fb2JqLCBt
X2xpbmVNaWRwb2ludFN0YXRlKSkgewotICAgICAgICAgICAgLy8gTGlrZSB3aXRoIGxpc3QgbWFy
a2Vycywgd2Ugc3RhcnQgaWdub3Jpbmcgc3BhY2VzIHRvIG1ha2Ugc3VyZSB0aGF0IGFueQotICAg
ICAgICAgICAgLy8gYWRkaXRpb25hbCBzcGFjZXMgd2Ugc2VlIHdpbGwgYmUgZGlzY2FyZGVkLgot
ICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IHRydWU7Ci0gICAgICAgICAg
ICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTID0gdHJ1ZTsKLSAgICAgICAgICAgIG1faWdub3JpbmdT
cGFjZXMgPSB0cnVlOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1fdHJhaWxpbmdPYmpl
Y3RzLmFwcGVuZEJveElmTmVlZGVkKCZmbG93Qm94KTsKLSAgICB9Ci0KLSAgICBtX3dpZHRoLmFk
ZFVuY29tbWl0dGVkV2lkdGgoaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaikgKyBi
b3JkZXJQYWRkaW5nTWFyZ2luU3RhcnQoZmxvd0JveCkgKyBib3JkZXJQYWRkaW5nTWFyZ2luRW5k
KGZsb3dCb3gpKTsKLX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVSZXBs
YWNlZCgpCi17Ci0gICAgUmVuZGVyQm94JiByZXBsYWNlZEJveCA9IHRvUmVuZGVyQm94KCptX2N1
cnJlbnQubV9vYmopOwotCi0gICAgaWYgKG1fYXRTdGFydCkKLSAgICAgICAgbV93aWR0aC51cGRh
dGVBdmFpbGFibGVXaWR0aChyZXBsYWNlZEJveC5sb2dpY2FsSGVpZ2h0KCkpOwotCi0gICAgLy8g
QnJlYWsgb24gcmVwbGFjZWQgZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUtc3Bh
Y2UuCi0gICAgaWYgKChtX2F1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChtX2xhc3RX
UykpICYmICghbV9jdXJyZW50Lm1fb2JqLT5pc0ltYWdlKCkgfHwgbV9hbGxvd0ltYWdlc1RvQnJl
YWspKSB7Ci0gICAgICAgIG1fd2lkdGguY29tbWl0KCk7Ci0gICAgICAgIG1fbGluZUJyZWFrLm1v
dmVUb1N0YXJ0T2YobV9jdXJyZW50Lm1fb2JqKTsKLSAgICB9Ci0KLSAgICBpZiAobV9pZ25vcmlu
Z1NwYWNlcykKLSAgICAgICAgc3RvcElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUs
IElubGluZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5tX29iaiwgMCkpOwotCi0gICAgbV9saW5lSW5m
by5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKLSAgICBtX2lnbm9yaW5nU3Bh
Y2VzID0gZmFsc2U7Ci0gICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOwotICAg
IG1fY3VycmVudENoYXJhY3RlcklzV1MgPSBmYWxzZTsKLSAgICBtX3RyYWlsaW5nT2JqZWN0cy5j
bGVhcigpOwotCi0gICAgLy8gT3B0aW1pemUgZm9yIGEgY29tbW9uIGNhc2UuIElmIHdlIGNhbid0
IGZpbmQgd2hpdGVzcGFjZSBhZnRlciB0aGUgbGlzdAotICAgIC8vIGl0ZW0sIHRoZW4gdGhpcyBp
cyBhbGwgbW9vdC4KLSAgICBMYXlvdXRVbml0IHJlcGxhY2VkTG9naWNhbFdpZHRoID0gbV9ibG9j
ay5sb2dpY2FsV2lkdGhGb3JDaGlsZChyZXBsYWNlZEJveCkgKyBtX2Jsb2NrLm1hcmdpblN0YXJ0
Rm9yQ2hpbGQocmVwbGFjZWRCb3gpICsgbV9ibG9jay5tYXJnaW5FbmRGb3JDaGlsZChyZXBsYWNl
ZEJveCkgKyBpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50Lm1fb2JqKTsKLSAgICBpZiAobV9j
dXJyZW50Lm1fb2JqLT5pc0xpc3RNYXJrZXIoKSkgewotICAgICAgICBpZiAobV9ibG9ja1N0eWxl
LmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9i
amVjdChtX2Jsb2NrLCBtX2N1cnJlbnQubV9vYmosIG1fbGluZU1pZHBvaW50U3RhdGUpKSB7Ci0g
ICAgICAgICAgICAvLyBMaWtlIHdpdGggaW5saW5lIGZsb3dzLCB3ZSBzdGFydCBpZ25vcmluZyBz
cGFjZXMgdG8gbWFrZSBzdXJlIHRoYXQgYW55Ci0gICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHNw
YWNlcyB3ZSBzZWUgd2lsbCBiZSBkaXNjYXJkZWQuCi0gICAgICAgICAgICBtX2N1cnJlbnRDaGFy
YWN0ZXJJc1NwYWNlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzV1Mg
PSBmYWxzZTsKLSAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSB0cnVlOwotICAgICAgICB9
Ci0gICAgICAgIGlmICh0b1JlbmRlckxpc3RNYXJrZXIoKm1fY3VycmVudC5tX29iaikuaXNJbnNp
ZGUoKSkKLSAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChyZXBsYWNlZExv
Z2ljYWxXaWR0aCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRX
aWR0aChyZXBsYWNlZExvZ2ljYWxXaWR0aCk7Ci0gICAgaWYgKG1fY3VycmVudC5tX29iai0+aXNS
dWJ5UnVuKCkpCi0gICAgICAgIG1fd2lkdGguYXBwbHlPdmVyaGFuZyh0b1JlbmRlclJ1YnlSdW4o
bV9jdXJyZW50Lm1fb2JqKSwgbV9sYXN0T2JqZWN0LCBtX25leHRPYmplY3QpOwotICAgIC8vIFVw
ZGF0ZSBwcmlvciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVycywgdXNpbmcgVStGRkZEIChP
QkpFQ1QgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSKSBmb3IgcmVwbGFjZWQgZWxlbWVudC4KLSAgICBt
X3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IudXBkYXRlUHJpb3JDb250ZXh0KHJl
cGxhY2VtZW50Q2hhcmFjdGVyKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmV4dENoYXJh
Y3RlcihVQ2hhciYgY3VycmVudENoYXJhY3RlciwgVUNoYXImIGxhc3RDaGFyYWN0ZXIsIFVDaGFy
JiBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpCi17Ci0gICAgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0g
bGFzdENoYXJhY3RlcjsKLSAgICBsYXN0Q2hhcmFjdGVyID0gY3VycmVudENoYXJhY3RlcjsKLX0K
LQotaW5saW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVu
dHMmIHdvcmRNZWFzdXJlbWVudHMsIGJvb2wmIGh5cGhlbmF0ZWQsICB1bnNpZ25lZCYgY29uc2Vj
dXRpdmVIeXBoZW5hdGVkTGluZXMpCi17Ci0gICAgaWYgKCFtX2N1cnJlbnQubV9wb3MpCi0gICAg
ICAgIG1fYXBwbGllZFN0YXJ0V2lkdGggPSBmYWxzZTsKLQotICAgIFJlbmRlclRleHQqIHJlbmRl
clRleHQgPSB0b1JlbmRlclRleHQobV9jdXJyZW50Lm1fb2JqKTsKLQotI2lmIEVOQUJMRShTVkcp
Ci0gICAgYm9vbCBpc1NWR1RleHQgPSByZW5kZXJUZXh0LT5pc1NWR0lubGluZVRleHQoKTsKLSNl
bmRpZgotCi0gICAgLy8gSWYgd2UgaGF2ZSBsZWZ0IGEgbm8td3JhcCBpbmxpbmUgYW5kIGVudGVy
ZWQgYW4gYXV0b3dyYXAgaW5saW5lIHdoaWxlIGlnbm9yaW5nIHNwYWNlcwotICAgIC8vIHRoZW4g
d2UgbmVlZCB0byBtYXJrIHRoZSBzdGFydCBvZiB0aGUgYXV0b3dyYXAgaW5saW5lIGFzIGEgcG90
ZW50aWFsIGxpbmVicmVhayBub3cuCi0gICAgaWYgKG1fYXV0b1dyYXAgJiYgIVJlbmRlclN0eWxl
OjphdXRvV3JhcChtX2xhc3RXUykgJiYgbV9pZ25vcmluZ1NwYWNlcykKLSAgICAgICAgY29tbWl0
TGluZUJyZWFrQXRDdXJyZW50V2lkdGgobV9jdXJyZW50Lm1fb2JqKTsKLQotICAgIGlmIChyZW5k
ZXJUZXh0LT5zdHlsZSgpLmhhc1RleHRDb21iaW5lKCkgJiYgbV9jdXJyZW50Lm1fb2JqLT5pc0Nv
bWJpbmVUZXh0KCkgJiYgIXRvUmVuZGVyQ29tYmluZVRleHQoKm1fY3VycmVudC5tX29iaikuaXND
b21iaW5lZCgpKSB7Ci0gICAgICAgIFJlbmRlckNvbWJpbmVUZXh0JiBjb21iaW5lUmVuZGVyZXIg
PSB0b1JlbmRlckNvbWJpbmVUZXh0KCptX2N1cnJlbnQubV9vYmopOwotICAgICAgICBjb21iaW5l
UmVuZGVyZXIuY29tYmluZVRleHQoKTsKLSAgICAgICAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcmVu
ZGVyZXIncyB0ZXh0IG1heSBoYXZlIGNoYW5nZWQuIEluY3JlbWVudCBzdGFsZSBpdGVyYXRvciBw
b3NpdGlvbnMKLSAgICAgICAgaWYgKGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVU
ZXh0KG1fbGluZUJyZWFrLCBjb21iaW5lUmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICBBU1NFUlQo
aXRlcmF0b3JJc0JleW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQobV9yZXNvbHZlci5wb3NpdGlv
bigpLCBjb21iaW5lUmVuZGVyZXIpKTsKLSAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVu
dCgpOwotICAgICAgICAgICAgbV9yZXNvbHZlci5pbmNyZW1lbnQoKTsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IGxpbmVTdHlsZSgqcmVuZGVyVGV4
dC0+cGFyZW50KCksIG1fbGluZUluZm8pOwotICAgIGNvbnN0IEZvbnQmIGZvbnQgPSBzdHlsZS5m
b250KCk7Ci0gICAgYm9vbCBpc0ZpeGVkUGl0Y2ggPSBmb250LmlzRml4ZWRQaXRjaCgpOwotICAg
IGJvb2wgY2FuSHlwaGVuYXRlID0gc3R5bGUuaHlwaGVucygpID09IEh5cGhlbnNBdXRvICYmIFdl
YkNvcmU6OmNhbkh5cGhlbmF0ZShzdHlsZS5sb2NhbGUoKSk7Ci0KLSAgICB1bnNpZ25lZCBsYXN0
U3BhY2UgPSBtX2N1cnJlbnQubV9wb3M7Ci0gICAgZmxvYXQgd29yZFNwYWNpbmcgPSBtX2N1cnJl
bnRTdHlsZS0+d29yZFNwYWNpbmcoKTsKLSAgICBmbG9hdCBsYXN0U3BhY2VXb3JkU3BhY2luZyA9
IDA7Ci0gICAgZmxvYXQgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAwOwotCi0gICAg
ZmxvYXQgd3JhcFcgPSBtX3dpZHRoLnVuY29tbWl0dGVkV2lkdGgoKSArIGlubGluZUxvZ2ljYWxX
aWR0aChtX2N1cnJlbnQubV9vYmosICFtX2FwcGxpZWRTdGFydFdpZHRoLCB0cnVlKTsKLSAgICBm
bG9hdCBjaGFyV2lkdGggPSAwOwotICAgIGJvb2wgYnJlYWtOQlNQID0gbV9hdXRvV3JhcCAmJiBt
X2N1cnJlbnRTdHlsZS0+bmJzcE1vZGUoKSA9PSBTUEFDRTsKLSAgICAvLyBBdXRvLXdyYXBwaW5n
IHRleHQgc2hvdWxkIHdyYXAgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgb25seSBpZiBpdCBjb3Vs
ZCBub3Qgd3JhcCBiZWZvcmUgdGhlIHdvcmQsCi0gICAgLy8gd2hpY2ggaXMgb25seSBwb3NzaWJs
ZSBpZiB0aGUgd29yZCBpcyB0aGUgZmlyc3QgdGhpbmcgb24gdGhlIGxpbmUsIHRoYXQgaXMsIGlm
IHx3fCBpcyB6ZXJvLgotICAgIGJvb2wgYnJlYWtXb3JkcyA9IG1fY3VycmVudFN0eWxlLT5icmVh
a1dvcmRzKCkgJiYgKChtX2F1dG9XcmFwICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHx8
IG1fY3VycldTID09IFBSRSk7Ci0gICAgYm9vbCBtaWRXb3JkQnJlYWsgPSBmYWxzZTsKLSAgICBi
b29sIGJyZWFrQWxsID0gbV9jdXJyZW50U3R5bGUtPndvcmRCcmVhaygpID09IEJyZWFrQWxsV29y
ZEJyZWFrICYmIG1fYXV0b1dyYXA7Ci0gICAgZmxvYXQgaHlwaGVuV2lkdGggPSAwOwotI2lmIEVO
QUJMRShTVkcpCi0gICAgaWYgKGlzU1ZHVGV4dCkgewotICAgICAgICBicmVha1dvcmRzID0gZmFs
c2U7Ci0gICAgICAgIGJyZWFrQWxsID0gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAo
bV9yZW5kZXJUZXh0SW5mby5tX3RleHQgIT0gcmVuZGVyVGV4dCkgewotICAgICAgICB1cGRhdGVD
b3VudGVySWZOZWVkZWQoKnJlbmRlclRleHQpOwotICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1f
dGV4dCA9IHJlbmRlclRleHQ7Ci0gICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9mb250ID0gJmZv
bnQ7Ci0gICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgPSBmb250LmNyZWF0ZUxheW91
dChyZW5kZXJUZXh0LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFj
ZSk7Ci0gICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNldFN0
cmluZ0FuZFJlbGVhc2VJdGVyYXRvcihyZW5kZXJUZXh0LT50ZXh0KCksIHN0eWxlLmxvY2FsZSgp
KTsKLSAgICB9IGVsc2UgaWYgKG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgJiYgbV9yZW5kZXJU
ZXh0SW5mby5tX2ZvbnQgIT0gJmZvbnQpIHsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2Zv
bnQgPSAmZm9udDsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xheW91dCA9IGZvbnQuY3Jl
YXRlTGF5b3V0KHJlbmRlclRleHQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIG1fY29sbGFwc2VX
aGl0ZVNwYWNlKTsKLSAgICB9Ci0KLSAgICBUZXh0TGF5b3V0KiB0ZXh0TGF5b3V0ID0gbV9yZW5k
ZXJUZXh0SW5mby5tX2xheW91dC5nZXQoKTsKLQotICAgIC8vIE5vbi16ZXJvIG9ubHkgd2hlbiBr
ZXJuaW5nIGlzIGVuYWJsZWQgYW5kIFRleHRMYXlvdXQgaXNuJ3QgdXNlZCwgaW4gd2hpY2ggY2Fz
ZSB3ZSBtZWFzdXJlCi0gICAgLy8gd29yZHMgd2l0aCB0aGVpciB0cmFpbGluZyBzcGFjZSwgdGhl
biBzdWJ0cmFjdCBpdHMgd2lkdGguCi0gICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+
IGZhbGxiYWNrRm9udHM7Ci0gICAgZmxvYXQgd29yZFRyYWlsaW5nU3BhY2VXaWR0aCA9IChmb250
LnR5cGVzZXR0aW5nRmVhdHVyZXMoKSAmIEtlcm5pbmcpICYmICF0ZXh0TGF5b3V0ID8gZm9udC53
aWR0aChSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bihyZW5kZXJUZXh0LCBmb250LCAmc3Bh
Y2UsIDEsIHN0eWxlKSwgJmZhbGxiYWNrRm9udHMpICsgd29yZFNwYWNpbmcgOiAwOwotCi0gICAg
VUNoYXIgbGFzdENoYXJhY3RlciA9IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRv
ci5sYXN0Q2hhcmFjdGVyKCk7Ci0gICAgVUNoYXIgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gbV9y
ZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLnNlY29uZFRvTGFzdENoYXJhY3Rlcigp
OwotICAgIGZvciAoOyBtX2N1cnJlbnQubV9wb3MgPCByZW5kZXJUZXh0LT50ZXh0TGVuZ3RoKCk7
IG1fY3VycmVudC5mYXN0SW5jcmVtZW50SW5UZXh0Tm9kZSgpKSB7Ci0gICAgICAgIGJvb2wgcHJl
dmlvdXNDaGFyYWN0ZXJJc1NwYWNlID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKLSAgICAg
ICAgYm9vbCBwcmV2aW91c0NoYXJhY3RlcklzV1MgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTOwot
ICAgICAgICBVQ2hhciBjID0gbV9jdXJyZW50LmN1cnJlbnQoKTsKLSAgICAgICAgbV9jdXJyZW50
Q2hhcmFjdGVySXNTcGFjZSA9IGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCAoIW1fcHJlc2VydmVz
TmV3bGluZSAmJiAoYyA9PSAnXG4nKSk7Ci0KLSAgICAgICAgaWYgKCFtX2NvbGxhcHNlV2hpdGVT
cGFjZSB8fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKLSAgICAgICAgICAgIG1fbGluZUlu
Zm8uc2V0RW1wdHkoZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7Ci0KLSAgICAgICAgaWYgKGMg
PT0gc29mdEh5cGhlbiAmJiBtX2F1dG9XcmFwICYmICFoeXBoZW5XaWR0aCAmJiBzdHlsZS5oeXBo
ZW5zKCkgIT0gSHlwaGVuc05vbmUpIHsKLSAgICAgICAgICAgIGh5cGhlbldpZHRoID0gbWVhc3Vy
ZUh5cGhlbldpZHRoKHJlbmRlclRleHQsIGZvbnQsICZmYWxsYmFja0ZvbnRzKTsKLSAgICAgICAg
ICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChoeXBoZW5XaWR0aCk7Ci0gICAgICAgIH0K
LQotICAgICAgICBib29sIGFwcGx5V29yZFNwYWNpbmcgPSBmYWxzZTsKLQotICAgICAgICBtX2N1
cnJlbnRDaGFyYWN0ZXJJc1dTID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSB8fCAoYnJlYWtO
QlNQICYmIGMgPT0gbm9CcmVha1NwYWNlKTsKLQotICAgICAgICBpZiAoKGJyZWFrQWxsIHx8IGJy
ZWFrV29yZHMpICYmICFtaWRXb3JkQnJlYWsgJiYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNl
IHx8IHN0eWxlLndoaXRlU3BhY2UoKSAhPSBQUkVfV1JBUCkpIHsKLSAgICAgICAgICAgIHdyYXBX
ICs9IGNoYXJXaWR0aDsKLSAgICAgICAgICAgIGJvb2wgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJy
b2dhdGVQYWlyID0gVTE2X0lTX0xFQUQoYykgJiYgbV9jdXJyZW50Lm1fcG9zICsgMSA8IHJlbmRl
clRleHQtPnRleHRMZW5ndGgoKSAmJiBVMTZfSVNfVFJBSUwoKCpyZW5kZXJUZXh0KVttX2N1cnJl
bnQubV9wb3MgKyAxXSk7Ci0gICAgICAgICAgICBjaGFyV2lkdGggPSB0ZXh0V2lkdGgocmVuZGVy
VGV4dCwgbV9jdXJyZW50Lm1fcG9zLCBtaWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIg
PyAyIDogMSwgZm9udCwgbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcsIGlzRml4ZWRQ
aXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOwot
ICAgICAgICAgICAgbWlkV29yZEJyZWFrID0gbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3Jh
cFcgKyBjaGFyV2lkdGggPiBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCk7Ci0gICAgICAgIH0KLQot
ICAgICAgICBib29sIGJldHdlZW5Xb3JkcyA9IGMgPT0gJ1xuJyB8fCAobV9jdXJyV1MgIT0gUFJF
ICYmICFtX2F0U3RhcnQgJiYgaXNCcmVha2FibGUobV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVh
a0l0ZXJhdG9yLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2FibGVQb3Np
dGlvbiwgYnJlYWtOQlNQKQotICAgICAgICAgICAgJiYgKHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBo
ZW5zTm9uZSB8fCAobV9jdXJyZW50LnByZXZpb3VzSW5TYW1lTm9kZSgpICE9IHNvZnRIeXBoZW4p
KSk7Ci0KLSAgICAgICAgaWYgKGJldHdlZW5Xb3JkcyB8fCBtaWRXb3JkQnJlYWspIHsKLSAgICAg
ICAgICAgIGJvb2wgc3RvcHBlZElnbm9yaW5nU3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICBp
ZiAobV9pZ25vcmluZ1NwYWNlcykgewotICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFj
aW5nID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2Up
IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBpZ25vcmluZyBzcGFjZXMgYW5kIGJlZ2lu
IGF0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHBvaW50LgotICAgICAgICAgICAg
ICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHdv
cmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbGFz
dFNwYWNlID0gbV9jdXJyZW50Lm1fcG9zOyAvLyBlLmcuLCAiRm9vICAgIGdvbyIsIGRvbid0IGFk
ZCBpbiBhbnkgb2YgdGhlIGlnbm9yZWQgc3BhY2VzLgotICAgICAgICAgICAgICAgICAgICBzdG9w
SWdub3JpbmdTcGFjZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9j
dXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MpKTsKLSAgICAgICAgICAgICAgICAgICAgc3Rv
cHBlZElnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgICAgICAgICAvLyBKdXN0IGtlZXAgaWdub3JpbmcgdGhlc2Ugc3BhY2VzLgotICAg
ICAgICAgICAgICAgICAgICBuZXh0Q2hhcmFjdGVyKGMsIGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRv
TGFzdENoYXJhY3Rlcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50cy5n
cm93KHdvcmRNZWFzdXJlbWVudHMuc2l6ZSgpICsgMSk7Ci0gICAgICAgICAgICBXb3JkTWVhc3Vy
ZW1lbnQmIHdvcmRNZWFzdXJlbWVudCA9IHdvcmRNZWFzdXJlbWVudHMubGFzdCgpOwotCi0gICAg
ICAgICAgICB3b3JkTWVhc3VyZW1lbnQucmVuZGVyZXIgPSByZW5kZXJUZXh0OwotICAgICAgICAg
ICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fY3VycmVudC5tX3BvczsKLSAgICAgICAg
ICAgIHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCA9IGxhc3RTcGFjZTsKLQotICAgICAgICAg
ICAgZmxvYXQgYWRkaXRpb25hbFRlbXBXaWR0aDsKLSAgICAgICAgICAgIGlmICh3b3JkVHJhaWxp
bmdTcGFjZVdpZHRoICYmIGMgPT0gJyAnKQotICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZW1w
V2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3Mg
KyAxIC0gbGFzdFNwYWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0
Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywg
dGV4dExheW91dCkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoOwotICAgICAgICAgICAgZWxzZQot
ICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4
dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGgu
Y3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRN
ZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKLQotICAgICAgICAgICAgaWYg
KHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSAmJiAhZmFsbGJhY2tGb250
cy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9u
dHMuc3dhcChmYWxsYmFja0ZvbnRzKTsKLSAgICAgICAgICAgIGZhbGxiYWNrRm9udHMuY2xlYXIo
KTsKLQotICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0gYWRkaXRpb25hbFRlbXBX
aWR0aCArIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50OwotICAgICAgICAgICAgYWRkaXRp
b25hbFRlbXBXaWR0aCArPSBsYXN0U3BhY2VXb3JkU3BhY2luZzsKLSAgICAgICAgICAgIG1fd2lk
dGguYWRkVW5jb21taXR0ZWRXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoKTsKLQotICAgICAgICAg
ICAgaWYgKG1fY29sbGFwc2VXaGl0ZVNwYWNlICYmIHByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSAm
JiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0aW9uYWxUZW1wV2lkdGgpCi0gICAg
ICAgICAgICAgICAgbV93aWR0aC5zZXRUcmFpbGluZ1doaXRlc3BhY2VXaWR0aChhZGRpdGlvbmFs
VGVtcFdpZHRoKTsKLQotICAgICAgICAgICAgaWYgKCFtX2FwcGxpZWRTdGFydFdpZHRoKSB7Ci0g
ICAgICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlubGluZUxvZ2ljYWxX
aWR0aChtX2N1cnJlbnQubV9vYmosIHRydWUsIGZhbHNlKSk7Ci0gICAgICAgICAgICAgICAgbV9h
cHBsaWVkU3RhcnRXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NT
X1NIQVBFUykKLSAgICAgICAgICAgIGlmIChtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpCi0g
ICAgICAgICAgICAgICAgdXBkYXRlU2VnbWVudHNGb3JTaGFwZXMobV9ibG9jaywgbV9sYXN0Rmxv
YXRGcm9tUHJldmlvdXNMaW5lLCB3b3JkTWVhc3VyZW1lbnRzLCBtX3dpZHRoLCBtX2xpbmVJbmZv
LmlzRmlyc3RMaW5lKCkpOwotI2VuZGlmCi0gICAgICAgICAgICBhcHBseVdvcmRTcGFjaW5nID0g
d29yZFNwYWNpbmcgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKLQotICAgICAgICAgICAg
aWYgKCFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgJiYgbV9hdXRvV3JhcCAmJiAhbV93aWR0aC5m
aXRzT25MaW5lKCkpCi0gICAgICAgICAgICAgICAgbV93aWR0aC5maXRCZWxvd0Zsb2F0cygpOwot
Ci0gICAgICAgICAgICBpZiAobV9hdXRvV3JhcCB8fCBicmVha1dvcmRzKSB7Ci0gICAgICAgICAg
ICAgICAgLy8gSWYgd2UgYnJlYWsgb25seSBhZnRlciB3aGl0ZS1zcGFjZSwgY29uc2lkZXIgdGhl
IGN1cnJlbnQgY2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgLy8gYXMgY2FuZGlkYXRlIHdpZHRo
IGZvciB0aGlzIGxpbmUuCi0gICAgICAgICAgICAgICAgYm9vbCBsaW5lV2FzVG9vV2lkZSA9IGZh
bHNlOwotICAgICAgICAgICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoKSAmJiBtX2N1cnJl
bnRDaGFyYWN0ZXJJc1NwYWNlICYmIG1fY3VycmVudFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRl
U3BhY2UoKSAmJiAhbWlkV29yZEJyZWFrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGNo
YXJXaWR0aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBtX2N1cnJlbnQubV9wb3MsIDEsIGZvbnQs
IG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3Bh
Y2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSArIChhcHBseVdv
cmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hl
Y2sgaWYgbGluZSBpcyB0b28gYmlnIGV2ZW4gd2l0aG91dCB0aGUgZXh0cmEgc3BhY2UKLSAgICAg
ICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gSWYgaXQgaXMgbm90LCBk
byBub3RoaW5nLgotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBuZWVkcyB0aGUg
ZXh0cmEgd2hpdGVzcGFjZSB0byBiZSB0b28gbG9uZywKLSAgICAgICAgICAgICAgICAgICAgLy8g
dGhlbiBtb3ZlIHRoZSBsaW5lIGJyZWFrIHRvIHRoZSBzcGFjZSBhbmQgc2tpcCBhbGwKLSAgICAg
ICAgICAgICAgICAgICAgLy8gYWRkaXRpb25hbCB3aGl0ZXNwYWNlLgotICAgICAgICAgICAgICAg
ICAgICBpZiAoIW1fd2lkdGguZml0c09uTGluZUluY2x1ZGluZ0V4dHJhV2lkdGgoY2hhcldpZHRo
KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZVdhc1Rvb1dpZGUgPSB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwg
bV9jdXJyZW50Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOwotICAg
ICAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWtlci5za2lwVHJhaWxpbmdXaGl0ZXNwYWNl
KG1fbGluZUJyZWFrLCBtX2xpbmVJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZVdhc1Rvb1dpZGUgfHwgIW1fd2lk
dGguZml0c09uTGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYW5IeXBoZW5hdGUg
JiYgIW1fd2lkdGguZml0c09uTGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnlI
eXBoZW5hdGluZyhyZW5kZXJUZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMoKSwgc3R5
bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QWZ0ZXIo
KSwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MsIG1fd2lkdGguY3VycmVudFdpZHRoKCkgLSBh
ZGRpdGlvbmFsVGVtcFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCksIGlzRml4ZWRQaXRj
aCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBtX2xpbmVCcmVh
aywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBtX2xpbmVCcmVha2VyLm1faHlw
aGVuYXRlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWtlci5tX2h5
cGhlbmF0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAg
aWYgKG1fbGluZUJyZWFrLmF0VGV4dFBhcmFncmFwaFNlcGFyYXRvcigpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQubV9w
b3MgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNM
aW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm1f
cG9zOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2xp
bmVCcmVhay5tX29iaiAmJiBtX2xpbmVCcmVhay5tX3BvcyAmJiBtX2xpbmVCcmVhay5tX29iai0+
aXNUZXh0KCkgJiYgdG9SZW5kZXJUZXh0KG1fbGluZUJyZWFrLm1fb2JqKS0+dGV4dExlbmd0aCgp
ICYmIHRvUmVuZGVyVGV4dChtX2xpbmVCcmVhay5tX29iaiktPmNoYXJhY3RlckF0KG1fbGluZUJy
ZWFrLm1fcG9zIC0gMSkgPT0gc29mdEh5cGhlbiAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVu
c05vbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICAgICAgaWYgKG1fbGluZUJyZWFrLm1fcG9zICYmIG1fbGluZUJyZWFrLm1fcG9z
ICE9ICh1bnNpZ25lZCl3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ICYmICF3b3JkTWVhc3VyZW1l
bnQud2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyV2lkdGgpIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9s
aW5lQnJlYWsubV9wb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVt
ZW50LndpZHRoID0gY2hhcldpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIERpZG4ndCBmaXQuIEp1bXAg
dG8gdGhlIGVuZCB1bmxlc3MgdGhlcmUncyBzdGlsbCBhbiBvcHBvcnR1bml0eSB0byBjb2xsYXBz
ZSB3aGl0ZXNwYWNlLgotICAgICAgICAgICAgICAgICAgICBpZiAobV9pZ25vcmluZ1NwYWNlcyB8
fCAhbV9jb2xsYXBzZVdoaXRlU3BhY2UgfHwgIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgfHwg
IXByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9h
dEVuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgICAgICBpZiAoIWJldHdlZW5Xb3JkcyB8fCAobWlkV29yZEJyZWFrICYmICFtX2F1dG9XcmFw
KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aCgt
YWRkaXRpb25hbFRlbXBXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoeXBoZW5XaWR0
aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VidHJhY3QgdGhlIHdpZHRoIG9mIHRo
ZSBzb2Z0IGh5cGhlbiBvdXQgc2luY2Ugd2UgZml0IG9uIGEgbGluZS4KLSAgICAgICAgICAgICAg
ICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aCgtaHlwaGVuV2lkdGgpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgaHlwaGVuV2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAo
YyA9PSAnXG4nICYmIG1fcHJlc2VydmVzTmV3bGluZSkgewotICAgICAgICAgICAgICAgIGlmICgh
c3RvcHBlZElnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudC5tX3BvcyA+IDApCi0gICAgICAgICAg
ICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUs
IG1fY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVu
dC5tX29iaiwgbV9jdXJyZW50Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRp
b24pOwotICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOwotICAgICAgICAg
ICAgICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwotICAg
ICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBp
ZiAobV9hdXRvV3JhcCAmJiBiZXR3ZWVuV29yZHMpIHsKLSAgICAgICAgICAgICAgICBtX3dpZHRo
LmNvbW1pdCgpOwotICAgICAgICAgICAgICAgIHdyYXBXID0gMDsKLSAgICAgICAgICAgICAgICBt
X2xpbmVCcmVhay5tb3ZlVG8obV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3Vy
cmVudC5tX25leHRCcmVha2FibGVQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgLy8gQXV0by13
cmFwcGluZyB0ZXh0IHNob3VsZCBub3Qgd3JhcCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBvbmNl
IGl0IGhhcyBoYWQgYW4KLSAgICAgICAgICAgICAgICAvLyBvcHBvcnR1bml0eSB0byBicmVhayBh
ZnRlciBhIHdvcmQuCi0gICAgICAgICAgICAgICAgYnJlYWtXb3JkcyA9IGZhbHNlOwotICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWlkV29yZEJyZWFrICYmICFVMTZfSVNfVFJBSUwo
YykgJiYgIShVX0dFVF9HQ19NQVNLKGMpICYgVV9HQ19NX01BU0spKSB7Ci0gICAgICAgICAgICAg
ICAgLy8gUmVtZW1iZXIgdGhpcyBhcyBhIGJyZWFrYWJsZSBwb3NpdGlvbiBpbiBjYXNlCi0gICAg
ICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBlbmQgd2lkdGggZm9yY2VzIGEgYnJlYWsuCi0gICAg
ICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50
Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOwotICAgICAgICAgICAg
ICAgIG1pZFdvcmRCcmVhayAmPSAoYnJlYWtXb3JkcyB8fCBicmVha0FsbCk7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIGlmIChiZXR3ZWVuV29yZHMpIHsKLSAgICAgICAgICAgICAgICBs
YXN0U3BhY2VXb3JkU3BhY2luZyA9IGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7
Ci0gICAgICAgICAgICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAoYXBwbHlX
b3JkU3BhY2luZyAmJiB3b3JkTWVhc3VyZW1lbnQud2lkdGgpID8gd29yZFNwYWNpbmcgOiAwOwot
ICAgICAgICAgICAgICAgIGxhc3RTcGFjZSA9IG1fY3VycmVudC5tX3BvczsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgaWYgKCFtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxl
LT5jb2xsYXBzZVdoaXRlU3BhY2UoKSkgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIGVuY291
bnRlciBhIG5ld2xpbmUsIG9yIGlmIHdlIGVuY291bnRlciBhCi0gICAgICAgICAgICAgICAgLy8g
c2Vjb25kIHNwYWNlLCB3ZSBuZWVkIHRvIGdvIGFoZWFkIGFuZCBicmVhayB1cCB0aGlzCi0gICAg
ICAgICAgICAgICAgLy8gcnVuIGFuZCBlbnRlciBhIG1vZGUgd2hlcmUgd2Ugc3RhcnQgY29sbGFw
c2luZyBzcGFjZXMuCi0gICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudENoYXJhY3RlcklzU3Bh
Y2UgJiYgcHJldmlvdXNDaGFyYWN0ZXJJc1NwYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1f
aWdub3JpbmdTcGFjZXMgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGp1c3Qg
ZW50ZXJlZCBhIG1vZGUgd2hlcmUgd2UgYXJlIGlnbm9yaW5nCi0gICAgICAgICAgICAgICAgICAg
IC8vIHNwYWNlcy4gQ3JlYXRlIGEgbWlkcG9pbnQgdG8gdGVybWluYXRlIHRoZSBydW4KLSAgICAg
ICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBzZWNvbmQgc3BhY2UuCi0gICAgICAgICAgICAg
ICAgICAgIHN0YXJ0SWdub3JpbmdTcGFjZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9zdGFydE9m
SWdub3JlZFNwYWNlcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLnVw
ZGF0ZU1pZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5l
SXRlcmF0b3IoKSwgVHJhaWxpbmdPYmplY3RzOjpEb05vdENvbGxhcHNlRmlyc3RTcGFjZSk7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1faWdu
b3JpbmdTcGFjZXMpIHsKLSAgICAgICAgICAgIC8vIFN0b3AgaWdub3Jpbmcgc3BhY2VzIGFuZCBi
ZWdpbiBhdCB0aGlzCi0gICAgICAgICAgICAvLyBuZXcgcG9pbnQuCi0gICAgICAgICAgICBtX2ln
bm9yaW5nU3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9
IGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7Ci0gICAgICAgICAgICB3b3JkU3Bh
Y2luZ0ZvcldvcmRNZWFzdXJlbWVudCA9IChhcHBseVdvcmRTcGFjaW5nICYmIHdvcmRNZWFzdXJl
bWVudHMubGFzdCgpLndpZHRoKSA/IHdvcmRTcGFjaW5nIDogMDsKLSAgICAgICAgICAgIGxhc3RT
cGFjZSA9IG1fY3VycmVudC5tX3BvczsgLy8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQg
aW4gYW55IG9mIHRoZSBpZ25vcmVkIHNwYWNlcy4KLSAgICAgICAgICAgIHN0b3BJZ25vcmluZ1Nw
YWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJlbnQubV9v
YmosIG1fY3VycmVudC5tX3BvcykpOwotICAgICAgICB9Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAg
ICAgaWYgKGlzU1ZHVGV4dCAmJiBtX2N1cnJlbnQubV9wb3MgPiAwKSB7Ci0gICAgICAgICAgICAv
LyBGb3JjZSBjcmVhdGlvbiBvZiBuZXcgSW5saW5lQm94ZXMgZm9yIGVhY2ggYWJzb2x1dGUgcG9z
aXRpb25lZCBjaGFyYWN0ZXIgKHRob3NlIHRoYXQgc3RhcnQgbmV3IHRleHQgY2h1bmtzKS4KLSAg
ICAgICAgICAgIGlmICh0b1JlbmRlclNWR0lubGluZVRleHQocmVuZGVyVGV4dCktPmNoYXJhY3Rl
clN0YXJ0c05ld1RleHRDaHVuayhtX2N1cnJlbnQubV9wb3MpKQotICAgICAgICAgICAgICAgIGVu
c3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7
Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGlmIChtX2N1cnJlbnRDaGFyYWN0ZXJJc1Nw
YWNlICYmICFwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UpIHsKLSAgICAgICAgICAgIG1fc3RhcnRP
Zklnbm9yZWRTcGFjZXMubV9vYmogPSBtX2N1cnJlbnQubV9vYmo7Ci0gICAgICAgICAgICBtX3N0
YXJ0T2ZJZ25vcmVkU3BhY2VzLm1fcG9zID0gbV9jdXJyZW50Lm1fcG9zOwotICAgICAgICAgICAg
Ly8gU3BhY2VzIGFmdGVyIHJpZ2h0LWFsaWduZWQgdGV4dCBhbmQgYmVmb3JlIGEgbGluZS1icmVh
ayBnZXQgY29sbGFwc2VkIGF3YXkgY29tcGxldGVseSBzbyB0aGF0IHRoZSB0cmFpbGluZwotICAg
ICAgICAgICAgLy8gc3BhY2UgZG9lc24ndCBzZWVtIHRvIHB1c2ggdGhlIHRleHQgb3V0IGZyb20g
dGhlIHJpZ2h0LWhhbmQgZWRnZS4KLSAgICAgICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2Fy
ZGxlc3Mgb2YgdGhlIGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2Vs
aW5pbmcgYSBsb3Qgb2YgdGVzdCByZXN1bHRzLgotICAgICAgICAgICAgaWYgKG1fbmV4dE9iamVj
dCAmJiBtX25leHRPYmplY3QtPmlzQlIoKSAmJiAobV9ibG9ja1N0eWxlLnRleHRBbGlnbigpID09
IFJJR0hUIHx8IG1fYmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfUklHSFQpKSB7Ci0g
ICAgICAgICAgICAgICAgbV9zdGFydE9mSWdub3JlZFNwYWNlcy5tX3Bvcy0tOwotICAgICAgICAg
ICAgICAgIC8vIElmIHRoZXJlJ3MganVzdCBhIHNpbmdsZSB0cmFpbGluZyBzcGFjZSBzdGFydCBp
Z25vcmluZyBpdCBub3cgc28gaXQgY29sbGFwc2VzIGF3YXkuCi0gICAgICAgICAgICAgICAgaWYg
KG1fY3VycmVudC5tX3BvcyA9PSByZW5kZXJUZXh0LT50ZXh0TGVuZ3RoKCkgLSAxKQotICAgICAg
ICAgICAgICAgICAgICBzdGFydElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1f
c3RhcnRPZklnbm9yZWRTcGFjZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIHByZXZpb3VzQ2hhcmFjdGVySXNX
UykgewotICAgICAgICAgICAgaWYgKG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUtPmJyZWFr
T25seUFmdGVyV2hpdGVTcGFjZSgpKQotICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVU
byhtX2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3BvcywgbV9jdXJyZW50Lm1fbmV4dEJyZWFr
YWJsZVBvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2NvbGxhcHNlV2hpdGVT
cGFjZSAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFtX2lnbm9yaW5nU3BhY2VzKQot
ICAgICAgICAgICAgbV90cmFpbGluZ09iamVjdHMuc2V0VHJhaWxpbmdXaGl0ZXNwYWNlKHRvUmVu
ZGVyVGV4dChtX2N1cnJlbnQubV9vYmopKTsKLSAgICAgICAgZWxzZSBpZiAoIW1fY3VycmVudFN0
eWxlLT5jb2xsYXBzZVdoaXRlU3BhY2UoKSB8fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkK
LSAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7Ci0KLSAgICAgICAgbV9hdFN0
YXJ0ID0gZmFsc2U7Ci0gICAgICAgIG5leHRDaGFyYWN0ZXIoYywgbGFzdENoYXJhY3Rlciwgc2Vj
b25kVG9MYXN0Q2hhcmFjdGVyKTsKLSAgICB9Ci0KLSAgICBtX3JlbmRlclRleHRJbmZvLm1fbGlu
ZUJyZWFrSXRlcmF0b3Iuc2V0UHJpb3JDb250ZXh0KGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFz
dENoYXJhY3Rlcik7Ci0KLSAgICB3b3JkTWVhc3VyZW1lbnRzLmdyb3cod29yZE1lYXN1cmVtZW50
cy5zaXplKCkgKyAxKTsKLSAgICBXb3JkTWVhc3VyZW1lbnQmIHdvcmRNZWFzdXJlbWVudCA9IHdv
cmRNZWFzdXJlbWVudHMubGFzdCgpOwotICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9IHJl
bmRlclRleHQ7Ci0KLSAgICAvLyBJTVBPUlRBTlQ6IGN1cnJlbnQubV9wb3MgaXMgPiBsZW5ndGgg
aGVyZSEKLSAgICBmbG9hdCBhZGRpdGlvbmFsVGVtcFdpZHRoID0gbV9pZ25vcmluZ1NwYWNlcyA/
IDAgOiB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MgLSBs
YXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9j
b2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5
b3V0KTsKLSAgICB3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQgPSBsYXN0U3BhY2U7Ci0gICAg
d29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fY3VycmVudC5tX3BvczsKLSAgICB3b3JkTWVh
c3VyZW1lbnQud2lkdGggPSBtX2lnbm9yaW5nU3BhY2VzID8gMCA6IGFkZGl0aW9uYWxUZW1wV2lk
dGggKyB3b3JkU3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudDsKLSAgICBhZGRpdGlvbmFsVGVtcFdp
ZHRoICs9IGxhc3RTcGFjZVdvcmRTcGFjaW5nOwotCi0gICAgZmxvYXQgaW5saW5lTG9naWNhbFRl
bXBXaWR0aCA9IGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQubV9vYmosICFtX2FwcGxpZWRT
dGFydFdpZHRoLCBtX2luY2x1ZGVFbmRXaWR0aCk7Ci0gICAgbV93aWR0aC5hZGRVbmNvbW1pdHRl
ZFdpZHRoKGFkZGl0aW9uYWxUZW1wV2lkdGggKyBpbmxpbmVMb2dpY2FsVGVtcFdpZHRoKTsKLQot
ICAgIGlmICh3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5pc0VtcHR5KCkgJiYgIWZhbGxi
YWNrRm9udHMuaXNFbXB0eSgpKQotICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250
cy5zd2FwKGZhbGxiYWNrRm9udHMpOwotICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKLQotICAg
IGlmIChtX2NvbGxhcHNlV2hpdGVTcGFjZSAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYm
IGFkZGl0aW9uYWxUZW1wV2lkdGgpCi0gICAgICAgIG1fd2lkdGguc2V0VHJhaWxpbmdXaGl0ZXNw
YWNlV2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0aCwgaW5saW5lTG9naWNhbFRlbXBXaWR0aCk7Ci0K
LSAgICBtX2luY2x1ZGVFbmRXaWR0aCA9IGZhbHNlOwotCi0gICAgaWYgKCFtX3dpZHRoLmZpdHNP
bkxpbmUoKSkgewotICAgICAgICBpZiAoY2FuSHlwaGVuYXRlKQotICAgICAgICAgICAgdHJ5SHlw
aGVuYXRpbmcocmVuZGVyVGV4dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNvbnNlY3V0aXZlSHlw
aGVuYXRlZExpbmVzLCBtX2Jsb2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCksIHN0eWxl
Lmh5cGhlbmF0aW9uTGltaXRCZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCks
IGxhc3RTcGFjZSwgbV9jdXJyZW50Lm1fcG9zLCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpIC0gYWRk
aXRpb25hbFRlbXBXaWR0aCwgbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gs
IG1fY29sbGFwc2VXaGl0ZVNwYWNlLCBsYXN0U3BhY2VXb3JkU3BhY2luZywgbV9saW5lQnJlYWss
IG1fY3VycmVudC5tX25leHRCcmVha2FibGVQb3NpdGlvbiwgbV9saW5lQnJlYWtlci5tX2h5cGhl
bmF0ZWQpOwotCi0gICAgICAgIGlmICghaHlwaGVuYXRlZCAmJiBtX2xpbmVCcmVhay5wcmV2aW91
c0luU2FtZU5vZGUoKSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5z
Tm9uZSkgewotICAgICAgICAgICAgaHlwaGVuYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICBtX2F0
RW5kID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0
YXRpYyBib29sIHRleHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRpb24oUmVuZGVyT2JqZWN0KiBu
ZXh0KQotewotICAgIEFTU0VSVChuZXh0LT5pc1RleHQoKSk7Ci0gICAgUmVuZGVyVGV4dCogbmV4
dFRleHQgPSB0b1JlbmRlclRleHQobmV4dCk7Ci0gICAgaWYgKCFuZXh0VGV4dC0+dGV4dExlbmd0
aCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgVUNoYXIgYyA9IG5leHRUZXh0LT5jaGFy
YWN0ZXJBdCgwKTsKLSAgICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IChjID09ICdc
bicgJiYgIW5leHRUZXh0LT5wcmVzZXJ2ZXNOZXdsaW5lKCkpOwotfQotCi1pbmxpbmUgYm9vbCBC
cmVha2luZ0NvbnRleHQ6OmNhbkJyZWFrQXRUaGlzUG9zaXRpb24oKQotewotICAgIC8vIElmIHdl
IGFyZSBuby13cmFwIGFuZCBoYXZlIGZvdW5kIGEgbGluZS1icmVha2luZyBvcHBvcnR1bml0eSBh
bHJlYWR5IHRoZW4gd2Ugc2hvdWxkIHRha2UgaXQuCi0gICAgaWYgKG1fd2lkdGguY29tbWl0dGVk
V2lkdGgoKSAmJiAhbV93aWR0aC5maXRzT25MaW5lKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2Up
ICYmIG1fY3VycldTID09IE5PV1JBUCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBB
dm9pZCBicmVha2luZyBiZWZvcmUgZW1wdHkgaW5saW5lcy4KLSAgICBpZiAobV9uZXh0T2JqZWN0
ICYmIG1fbmV4dE9iamVjdC0+aXNSZW5kZXJJbmxpbmUoKSAmJiBpc0VtcHR5SW5saW5lKHRvUmVu
ZGVySW5saW5lKCptX25leHRPYmplY3QpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAg
Ly8gUmV0dXJuIGVhcmx5IGlmIHdlIGF1dG93cmFwIGFuZCB0aGUgY3VycmVudCBjaGFyYWN0ZXIg
aXMgYSBzcGFjZSBhcyB3ZSB3aWxsIGFsd2F5cyB3YW50IHRvIGJyZWFrIGF0IHN1Y2ggYSBwb3Np
dGlvbi4KLSAgICBpZiAobV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2Jq
ZWN0LT5pc0xpbmVCcmVha09wcG9ydHVuaXR5KCkpCi0gICAgICAgIHJldHVybiBtX2F1dG9XcmFw
OwotCi0gICAgYm9vbCBuZXh0SXNBdXRvV3JhcHBpbmdUZXh0ID0gKG1fbmV4dE9iamVjdCAmJiBt
X25leHRPYmplY3QtPmlzVGV4dCgpICYmIChtX2F1dG9XcmFwIHx8IG1fbmV4dE9iamVjdC0+c3R5
bGUoKS5hdXRvV3JhcCgpKSk7Ci0gICAgaWYgKCFuZXh0SXNBdXRvV3JhcHBpbmdUZXh0KQotICAg
ICAgICByZXR1cm4gbV9hdXRvV3JhcDsKLSAgICBib29sIGN1cnJlbnRJc1RleHRPckVtcHR5SW5s
aW5lID0gbV9jdXJyZW50Lm1fb2JqLT5pc1RleHQoKSB8fCAobV9jdXJyZW50Lm1fb2JqLT5pc1Jl
bmRlcklubGluZSgpICYmIGlzRW1wdHlJbmxpbmUodG9SZW5kZXJJbmxpbmUoKm1fY3VycmVudC5t
X29iaikpKTsKLSAgICBpZiAoIWN1cnJlbnRJc1RleHRPckVtcHR5SW5saW5lKQotICAgICAgICBy
ZXR1cm4gbV9hdXRvV3JhcDsKLQotICAgIGJvb2wgY2FuQnJlYWtIZXJlID0gIW1fY3VycmVudENo
YXJhY3RlcklzU3BhY2UgJiYgdGV4dEJlZ2luc1dpdGhCcmVha2FibGVQb3NpdGlvbihtX25leHRP
YmplY3QpOwotCi0gICAgLy8gU2VlIGlmIGF0dGVtcHRpbmcgdG8gZml0IGJlbG93IGZsb2F0cyBj
cmVhdGVzIG1vcmUgYXZhaWxhYmxlIHdpZHRoIG9uIHRoZSBsaW5lLgotICAgIGlmICghbV93aWR0
aC5maXRzT25MaW5lKCkgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSkKLSAgICAgICAgbV93
aWR0aC5maXRCZWxvd0Zsb2F0cygpOwotCi0gICAgYm9vbCBjYW5QbGFjZU9uTGluZSA9IG1fd2lk
dGguZml0c09uTGluZSgpIHx8ICFtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmU7Ci0KLSAgICBp
ZiAoY2FuUGxhY2VPbkxpbmUgJiYgY2FuQnJlYWtIZXJlKQotICAgICAgICBjb21taXRMaW5lQnJl
YWtBdEN1cnJlbnRXaWR0aChtX25leHRPYmplY3QpOwotCi0gICAgcmV0dXJuIGNhbkJyZWFrSGVy
ZTsKLX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojpjb21taXRBbmRVcGRhdGVMaW5l
QnJlYWtJZk5lZWRlZCgpCi17Ci0gICAgYm9vbCBjaGVja0ZvckJyZWFrID0gY2FuQnJlYWtBdFRo
aXNQb3NpdGlvbigpOwotCi0gICAgaWYgKGNoZWNrRm9yQnJlYWsgJiYgIW1fd2lkdGguZml0c09u
TGluZShtX2lnbm9yaW5nU3BhY2VzKSkgewotICAgICAgICAvLyBpZiB3ZSBoYXZlIGZsb2F0cywg
dHJ5IHRvIGdldCBiZWxvdyB0aGVtLgotICAgICAgICBpZiAobV9jdXJyZW50Q2hhcmFjdGVySXNT
cGFjZSAmJiAhbV9pZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VXaGl0
ZVNwYWNlKCkpCi0gICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOwotCi0gICAg
ICAgIGlmIChtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsKLSAgICAgICAgICAgIG1fYXRFbmQg
PSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbV93aWR0
aC5maXRCZWxvd0Zsb2F0cygpOwotCi0gICAgICAgIC8vIHx3aWR0aHwgbWF5IGhhdmUgYmVlbiBh
ZGp1c3RlZCBiZWNhdXNlIHdlIGdvdCBzaG92ZWQgZG93biBwYXN0IGEgZmxvYXQgKHRodXMKLSAg
ICAgICAgLy8gZ2l2aW5nIHVzIG1vcmUgcm9vbSksIHNvIHdlIG5lZWQgdG8gcmV0ZXN0LCBhbmQg
b25seSBqdW1wIHRvCi0gICAgICAgIC8vIHRoZSBlbmQgbGFiZWwgaWYgd2Ugc3RpbGwgZG9uJ3Qg
Zml0IG9uIHRoZSBsaW5lLiAtZHdoCi0gICAgICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lKG1f
aWdub3JpbmdTcGFjZXMpKSB7Ci0gICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKLSAgICAgICAg
ICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9ibG9ja1N0eWxlLmF1dG9X
cmFwKCkgJiYgIW1fd2lkdGguZml0c09uTGluZSgpICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRo
KCkpIHsKLSAgICAgICAgLy8gSWYgdGhlIGNvbnRhaW5lciBhdXRvd3JhcHMgYnV0IHRoZSBjdXJy
ZW50IGNoaWxkIGRvZXMgbm90IHRoZW4gd2Ugc3RpbGwgbmVlZCB0byBlbnN1cmUgdGhhdCBpdAot
ICAgICAgICAvLyB3cmFwcyBhbmQgbW92ZXMgYmVsb3cgYW55IGZsb2F0cy4KLSAgICAgICAgbV93
aWR0aC5maXRCZWxvd0Zsb2F0cygpOwotICAgIH0KLQotICAgIGlmICghbV9jdXJyZW50Lm1fb2Jq
LT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgbV9sYXN0T2Jq
ZWN0ID0gbV9jdXJyZW50Lm1fb2JqOwotICAgICAgICBpZiAobV9sYXN0T2JqZWN0LT5pc1JlcGxh
Y2VkKCkgJiYgbV9hdXRvV3JhcCAmJiAoIW1fbGFzdE9iamVjdC0+aXNJbWFnZSgpIHx8IG1fYWxs
b3dJbWFnZXNUb0JyZWFrKSAmJiAoIW1fbGFzdE9iamVjdC0+aXNMaXN0TWFya2VyKCkgfHwgdG9S
ZW5kZXJMaXN0TWFya2VyKCptX2xhc3RPYmplY3QpLmlzSW5zaWRlKCkpKSB7Ci0gICAgICAgICAg
ICBtX3dpZHRoLmNvbW1pdCgpOwotICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvU3RhcnRP
ZihtX25leHRPYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1JbmxpbmVJdGVyYXRvciBC
cmVha2luZ0NvbnRleHQ6OmhhbmRsZUVuZE9mTGluZSgpCi17Ci0jaWYgRU5BQkxFKENTU19TSEFQ
RVMpCi0gICAgU2hhcGVJbnNpZGVJbmZvKiBzaGFwZUluZm8gPSBtX2Jsb2NrLmxheW91dFNoYXBl
SW5zaWRlSW5mbygpOwotICAgIGJvb2wgc2VnbWVudEFsbG93c092ZXJmbG93ID0gIXNoYXBlSW5m
byB8fCAhc2hhcGVJbmZvLT5oYXNTZWdtZW50cygpOwotI2Vsc2UKLSAgICBib29sIHNlZ21lbnRB
bGxvd3NPdmVyZmxvdyA9IHRydWU7Ci0jZW5kaWYKLSAgICBpZiAoc2VnbWVudEFsbG93c092ZXJm
bG93KSB7Ci0gICAgICAgIGlmIChtX2xpbmVCcmVhayA9PSBtX3Jlc29sdmVyLnBvc2l0aW9uKCkp
IHsKLSAgICAgICAgICAgIGlmICghbV9saW5lQnJlYWsubV9vYmogfHwgIW1fbGluZUJyZWFrLm1f
b2JqLT5pc0JSKCkpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGFkZCBhcyBtdWNoIGFz
IHBvc3NpYmxlCi0gICAgICAgICAgICAgICAgaWYgKG1fYmxvY2tTdHlsZS53aGl0ZVNwYWNlKCkg
PT0gUFJFICYmICFtX2N1cnJlbnQubV9wb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9saW5l
QnJlYWsubW92ZVRvKG1fbGFzdE9iamVjdCwgbV9sYXN0T2JqZWN0LT5pc1RleHQoKSA/IG1fbGFz
dE9iamVjdC0+bGVuZ3RoKCkgOiAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fbGlu
ZUJyZWFrLm1fb2JqKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGV2ZXIgYnJlYWsg
aW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgaWYgd2UgY2FuIGhlbHAgaXQuCi0gICAgICAgICAgICAg
ICAgICAgIC8vIFRoZXJlJ3Mgbm8gcm9vbSBhdCBhbGwuIFdlIGp1c3QgaGF2ZSB0byBiZSBvbiB0
aGlzIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gdGhvdWdoIHdlJ2xsIHNwaWxs
IG91dC4KLSAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5t
X29iaiwgbV9jdXJyZW50Lm1fcG9zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgY29uc3VtZSBhdCBsZWFzdCBvbmUgY2hhci9v
YmplY3QuCi0gICAgICAgICAgICBpZiAobV9saW5lQnJlYWsgPT0gbV9yZXNvbHZlci5wb3NpdGlv
bigpKQotICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOwotICAgICAgICB9
IGVsc2UgaWYgKCFtX2N1cnJlbnQubV9wb3MgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAm
JiBtX3dpZHRoLnVuY29tbWl0dGVkV2lkdGgoKSAmJiAhbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVm
b3JlQ3VycmVudCkgewotICAgICAgICAgICAgLy8gRG8gbm90IHB1c2ggdGhlIGN1cnJlbnQgb2Jq
ZWN0IHRvIHRoZSBuZXh0IGxpbmUsIHdoZW4gdGhpcyBsaW5lIGhhcyBzb21lIGNvbnRlbnQsIGJ1
dCBpdCBpcyBzdGlsbCBjb25zaWRlcmVkIGVtcHR5LgotICAgICAgICAgICAgLy8gRW1wdHkgaW5s
aW5lIGVsZW1lbnRzIGxpa2UgPHNwYW4+PC9zcGFuPiBjYW4gcHJvZHVjZSBzdWNoIGxpbmVzIGFu
ZCBub3cgd2UganVzdCBpZ25vcmUgdGhlc2UgYnJlYWsgb3Bwb3J0dW5pdGllcwotICAgICAgICAg
ICAgLy8gYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSwgaWYgbm8gd2lkdGggaGFzIGJlZW4gY29tbWl0
dGVkIHlldC4KLSAgICAgICAgICAgIC8vIEJlaGF2ZSBhcyBpZiBpdCB3YXMgYWN0dWFsbHkgZW1w
dHkgYW5kIGNvbnN1bWUgYXQgbGVhc3Qgb25lIG9iamVjdC4KLSAgICAgICAgICAgIG1fbGluZUJy
ZWFrLmluY3JlbWVudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2FuaXR5IGNoZWNr
IG91ciBtaWRwb2ludHMuCi0gICAgY2hlY2tNaWRwb2ludHMobV9saW5lTWlkcG9pbnRTdGF0ZSwg
bV9saW5lQnJlYWspOwotCi0gICAgbV90cmFpbGluZ09iamVjdHMudXBkYXRlTWlkcG9pbnRzRm9y
VHJhaWxpbmdCb3hlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2xpbmVCcmVhaywgVHJhaWxpbmdP
YmplY3RzOjpDb2xsYXBzZUZpcnN0U3BhY2UpOwotCi0gICAgLy8gV2UgbWlnaHQgaGF2ZSBtYWRl
IGxpbmVCcmVhayBhbiBpdGVyYXRvciB0aGF0IHBvaW50cyBwYXN0IHRoZSBlbmQKLSAgICAvLyBv
ZiB0aGUgb2JqZWN0LiBEbyB0aGlzIGFkanVzdG1lbnQgdG8gbWFrZSBpdCBwb2ludCB0byB0aGUg
c3RhcnQKLSAgICAvLyBvZiB0aGUgbmV4dCBvYmplY3QgaW5zdGVhZCB0byBhdm9pZCBjb25mdXNp
bmcgdGhlIHJlc3Qgb2YgdGhlCi0gICAgLy8gY29kZS4KLSAgICBpZiAobV9saW5lQnJlYWsubV9w
b3MgPiAwKSB7Ci0gICAgICAgIG1fbGluZUJyZWFrLm1fcG9zLS07Ci0gICAgICAgIG1fbGluZUJy
ZWFrLmluY3JlbWVudCgpOwotICAgIH0KLQotICAgIHJldHVybiBtX2xpbmVCcmVhazsKLX0KLQog
SW5saW5lSXRlcmF0b3IgTGluZUJyZWFrZXI6Om5leHRTZWdtZW50QnJlYWsoSW5saW5lQmlkaVJl
c29sdmVyJiByZXNvbHZlciwgTGluZUluZm8mIGxpbmVJbmZvLCBSZW5kZXJUZXh0SW5mbyYgcmVu
ZGVyVGV4dEluZm8sIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1
bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgV29yZE1lYXN1cmVtZW50cyYgd29y
ZE1lYXN1cmVtZW50cykKIHsKICAgICByZXNldCgpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oIGIvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOTgzODYKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHRJbmxpbmVI
ZWFkZXJzLmgKQEAgLTAsMCArMSwxMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIExh
cnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIw
MDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21h
aWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmln
aHQgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICoKKyAqLworCisjaWZuZGVmIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnNfaAor
I2RlZmluZSBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzX2gKKworI2luY2x1ZGUgIkh5cGhl
bmF0aW9uLmgiCisjaW5jbHVkZSAiTGluZUJyZWFrZXIuaCIKKyNpbmNsdWRlICJMaW5lSW5mby5o
IgorI2luY2x1ZGUgIkxpbmVXaWR0aC5oIgorI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0Lmgi
CisjaW5jbHVkZSAiUmVuZGVyQ291bnRlci5oIgorI2luY2x1ZGUgIlJlbmRlcklubGluZS5oIgor
I2luY2x1ZGUgIlJlbmRlckxpc3RNYXJrZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJSdWJ5UnVuLmgi
CisjaW5jbHVkZSAiYnJlYWtfbGluZXMuaCIKKyNpbmNsdWRlIDx3dGYvdW5pY29kZS9DaGFyYWN0
ZXJOYW1lcy5oPgorCisjaWYgRU5BQkxFKFNWRykKKyNpbmNsdWRlICJSZW5kZXJTVkdJbmxpbmVU
ZXh0LmgiCisjZW5kaWYKKworI2lmIEVOQUJMRShDU1NfU0hBUEVTKQorI2luY2x1ZGUgIlNoYXBl
SW5zaWRlSW5mby5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gV2UgZG9u
J3QgbGV0IG91ciBsaW5lIGJveCB0cmVlIGZvciBhIHNpbmdsZSBsaW5lIGdldCBhbnkgZGVlcGVy
IHRoYW4gdGhpcy4KK2NvbnN0IHVuc2lnbmVkIGNNYXhMaW5lRGVwdGggPSAyMDA7CisKK2NsYXNz
IFdvcmRNZWFzdXJlbWVudCB7CitwdWJsaWM6CisgICAgV29yZE1lYXN1cmVtZW50KCkKKyAgICAg
ICAgOiByZW5kZXJlcigwKQorICAgICAgICAsIHdpZHRoKDApCisgICAgICAgICwgc3RhcnRPZmZz
ZXQoMCkKKyAgICAgICAgLCBlbmRPZmZzZXQoMCkKKyAgICB7CisgICAgfQorCisgICAgUmVuZGVy
VGV4dCogcmVuZGVyZXI7CisgICAgZmxvYXQgd2lkdGg7CisgICAgaW50IHN0YXJ0T2Zmc2V0Owor
ICAgIGludCBlbmRPZmZzZXQ7CisgICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+IGZh
bGxiYWNrRm9udHM7Cit9OworCitjbGFzcyBUcmFpbGluZ09iamVjdHMgeworcHVibGljOgorICAg
IFRyYWlsaW5nT2JqZWN0cygpOworICAgIHZvaWQgc2V0VHJhaWxpbmdXaGl0ZXNwYWNlKFJlbmRl
clRleHQqKTsKKyAgICB2b2lkIGNsZWFyKCk7CisgICAgdm9pZCBhcHBlbmRCb3hJZk5lZWRlZChS
ZW5kZXJCb3hNb2RlbE9iamVjdCopOworCisgICAgZW51bSBDb2xsYXBzZUZpcnN0U3BhY2VPck5v
dCB7IERvTm90Q29sbGFwc2VGaXJzdFNwYWNlLCBDb2xsYXBzZUZpcnN0U3BhY2UgfTsKKworICAg
IHZvaWQgdXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxpbmdCb3hlcyhMaW5lTWlkcG9pbnRTdGF0ZSYs
IGNvbnN0IElubGluZUl0ZXJhdG9yJiBsQnJlYWssIENvbGxhcHNlRmlyc3RTcGFjZU9yTm90KTsK
KworcHJpdmF0ZToKKyAgICBSZW5kZXJUZXh0KiBtX3doaXRlc3BhY2U7CisgICAgVmVjdG9yPFJl
bmRlckJveE1vZGVsT2JqZWN0KiwgND4gbV9ib3hlczsKK307CisKK1RyYWlsaW5nT2JqZWN0czo6
VHJhaWxpbmdPYmplY3RzKCkKKyAgICA6IG1fd2hpdGVzcGFjZSgwKQoreworfQorCitpbmxpbmUg
dm9pZCBUcmFpbGluZ09iamVjdHM6OnNldFRyYWlsaW5nV2hpdGVzcGFjZShSZW5kZXJUZXh0KiB3
aGl0ZXNwYWNlKQoreworICAgIEFTU0VSVCh3aGl0ZXNwYWNlKTsKKyAgICBtX3doaXRlc3BhY2Ug
PSB3aGl0ZXNwYWNlOworfQorCitpbmxpbmUgdm9pZCBUcmFpbGluZ09iamVjdHM6OmNsZWFyKCkK
K3sKKyAgICBtX3doaXRlc3BhY2UgPSAwOworICAgIG1fYm94ZXMuc2hyaW5rKDApOyAvLyBVc2Ug
c2hyaW5rKDApIGluc3RlYWQgb2YgY2xlYXIoKSB0byByZXRhaW4gb3VyIGNhcGFjaXR5LgorfQor
CitpbmxpbmUgdm9pZCBUcmFpbGluZ09iamVjdHM6OmFwcGVuZEJveElmTmVlZGVkKFJlbmRlckJv
eE1vZGVsT2JqZWN0KiBib3gpCit7CisgICAgaWYgKG1fd2hpdGVzcGFjZSkKKyAgICAgICAgbV9i
b3hlcy5hcHBlbmQoYm94KTsKK30KKworLy8gRG9uJ3QgY2FsbCB0aGlzIGRpcmVjdGx5LiBVc2Ug
b25lIG9mIHRoZSBkZXNjcmlwdGl2ZSBoZWxwZXIgZnVuY3Rpb25zIGJlbG93LgoraW5saW5lIHZv
aWQgZGVwcmVjYXRlZEFkZE1pZHBvaW50KExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRT
dGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQoreworICAgIGlmIChsaW5lTWlk
cG9pbnRTdGF0ZS5taWRwb2ludHMuc2l6ZSgpIDw9IGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBv
aW50cykKKyAgICAgICAgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmdyb3cobGluZU1pZHBv
aW50U3RhdGUubnVtTWlkcG9pbnRzICsgMTApOworCisgICAgSW5saW5lSXRlcmF0b3IqIG1pZHBv
aW50cyA9IGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50cy5kYXRhKCk7CisgICAgbWlkcG9pbnRz
W2xpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cysrXSA9IG1pZHBvaW50OworfQorCitpbmxp
bmUgdm9pZCBzdGFydElnbm9yaW5nU3BhY2VzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9p
bnRTdGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQoreworICAgIEFTU0VSVCgh
KGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAlIDIpKTsKKyAgICBkZXByZWNhdGVkQWRk
TWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIG1pZHBvaW50KTsKK30KKworaW5saW5lIHZvaWQg
c3RvcElnbm9yaW5nU3BhY2VzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwg
Y29uc3QgSW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQoreworICAgIEFTU0VSVChsaW5lTWlkcG9p
bnRTdGF0ZS5udW1NaWRwb2ludHMgJSAyKTsKKyAgICBkZXByZWNhdGVkQWRkTWlkcG9pbnQobGlu
ZU1pZHBvaW50U3RhdGUsIG1pZHBvaW50KTsKK30KKworLy8gV2hlbiBpZ25vcmluZyBzcGFjZXMs
IHRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgbmVlZCBsaW5lIGJveGVz
IHN1Y2ggYXMgUmVuZGVySW5saW5lcyBvcgorLy8gaGFyZCBsaW5lIGJyZWFrcyB0byBlbnN1cmUg
dGhhdCB0aGV5J3JlIG5vdCBpZ25vcmVkLgoraW5saW5lIHZvaWQgZW5zdXJlTGluZUJveEluc2lk
ZUlnbm9yZWRTcGFjZXMoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBSZW5k
ZXJPYmplY3QqIHJlbmRlcmVyKQoreworICAgIElubGluZUl0ZXJhdG9yIG1pZHBvaW50KDAsIHJl
bmRlcmVyLCAwKTsKKyAgICBzdG9wSWdub3JpbmdTcGFjZXMobGluZU1pZHBvaW50U3RhdGUsIG1p
ZHBvaW50KTsKKyAgICBzdGFydElnbm9yaW5nU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBtaWRw
b2ludCk7Cit9CisKK3ZvaWQgVHJhaWxpbmdPYmplY3RzOjp1cGRhdGVNaWRwb2ludHNGb3JUcmFp
bGluZ0JveGVzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgY29uc3QgSW5s
aW5lSXRlcmF0b3ImIGxCcmVhaywgQ29sbGFwc2VGaXJzdFNwYWNlT3JOb3QgY29sbGFwc2VGaXJz
dFNwYWNlKQoreworICAgIGlmICghbV93aGl0ZXNwYWNlKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBUaGlzIG9iamVjdCBpcyBlaXRoZXIgZ29pbmcgdG8gYmUgcGFydCBvZiB0aGUgbGFzdCBt
aWRwb2ludCwgb3IgaXQgaXMgZ29pbmcgdG8gYmUgdGhlIGFjdHVhbCBlbmRwb2ludC4KKyAgICAv
LyBJbiBib3RoIGNhc2VzIHdlIGp1c3QgZGVjcmVhc2Ugb3VyIHBvcyBieSAxIGxldmVsIHRvIGV4
Y2x1ZGUgdGhlIHNwYWNlLCBhbGxvd2luZyBpdCB0byAtIGluIGVmZmVjdCAtIGNvbGxhcHNlIGlu
dG8gdGhlIG5ld2xpbmUuCisgICAgaWYgKGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAl
IDIpIHsKKyAgICAgICAgLy8gRmluZCB0aGUgdHJhaWxpbmcgc3BhY2Ugb2JqZWN0J3MgbWlkcG9p
bnQuCisgICAgICAgIGludCB0cmFpbGluZ1NwYWNlTWlkcG9pbnQgPSBsaW5lTWlkcG9pbnRTdGF0
ZS5udW1NaWRwb2ludHMgLSAxOworICAgICAgICBmb3IgKCA7IHRyYWlsaW5nU3BhY2VNaWRwb2lu
dCA+IDAgJiYgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzW3RyYWlsaW5nU3BhY2VNaWRwb2lu
dF0ubV9vYmogIT0gbV93aGl0ZXNwYWNlOyAtLXRyYWlsaW5nU3BhY2VNaWRwb2ludCkgeyB9Cisg
ICAgICAgIEFTU0VSVCh0cmFpbGluZ1NwYWNlTWlkcG9pbnQgPj0gMCk7CisgICAgICAgIGlmIChj
b2xsYXBzZUZpcnN0U3BhY2UgPT0gQ29sbGFwc2VGaXJzdFNwYWNlKQorICAgICAgICAgICAgbGlu
ZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzW3RyYWlsaW5nU3BhY2VNaWRwb2ludF0ubV9wb3MtLTsK
KworICAgICAgICAvLyBOb3cgbWFrZSBzdXJlIGV2ZXJ5IHNpbmdsZSB0cmFpbGluZ1Bvc2l0aW9u
ZWRCb3ggZm9sbG93aW5nIHRoZSB0cmFpbGluZ1NwYWNlTWlkcG9pbnQgcHJvcGVybHkgc3RvcHMg
YW5kIHN0YXJ0cworICAgICAgICAvLyBpZ25vcmluZyBzcGFjZXMuCisgICAgICAgIHNpemVfdCBj
dXJyZW50TWlkcG9pbnQgPSB0cmFpbGluZ1NwYWNlTWlkcG9pbnQgKyAxOworICAgICAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IG1fYm94ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlm
IChjdXJyZW50TWlkcG9pbnQgPj0gbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKSB7Cisg
ICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIG1pZHBvaW50IGZvciB0aGlzIGJveCB5
ZXQuCisgICAgICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobGlu
ZU1pZHBvaW50U3RhdGUsIG1fYm94ZXNbaV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgICAgICBBU1NFUlQobGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzW2N1cnJlbnRNaWRw
b2ludF0ubV9vYmogPT0gbV9ib3hlc1tpXSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKGxpbmVN
aWRwb2ludFN0YXRlLm1pZHBvaW50c1tjdXJyZW50TWlkcG9pbnQgKyAxXS5tX29iaiA9PSBtX2Jv
eGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnRNaWRwb2ludCArPSAy
OworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghbEJyZWFrLm1fb2JqKSB7CisgICAgICAgIEFT
U0VSVChtX3doaXRlc3BhY2UtPmlzVGV4dCgpKTsKKyAgICAgICAgQVNTRVJUKGNvbGxhcHNlRmly
c3RTcGFjZSA9PSBDb2xsYXBzZUZpcnN0U3BhY2UpOworICAgICAgICAvLyBBZGQgYSBuZXcgZW5k
IG1pZHBvaW50IHRoYXQgc3RvcHMgcmlnaHQgYXQgdGhlIHZlcnkgZW5kLgorICAgICAgICB1bnNp
Z25lZCBsZW5ndGggPSBtX3doaXRlc3BhY2UtPnRleHRMZW5ndGgoKTsKKyAgICAgICAgdW5zaWdu
ZWQgcG9zID0gbGVuZ3RoID49IDIgPyBsZW5ndGggLSAyIDogVUlOVF9NQVg7CisgICAgICAgIElu
bGluZUl0ZXJhdG9yIGVuZE1pZCgwLCBtX3doaXRlc3BhY2UsIHBvcyk7CisgICAgICAgIHN0YXJ0
SWdub3JpbmdTcGFjZXMobGluZU1pZHBvaW50U3RhdGUsIGVuZE1pZCk7CisgICAgICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgbV9ib3hlcy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIGVuc3Vy
ZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBtX2JveGVzW2ld
KTsKKyAgICB9Cit9CisKK2NsYXNzIEJyZWFraW5nQ29udGV4dCB7CitwdWJsaWM6CisgICAgQnJl
YWtpbmdDb250ZXh0KExpbmVCcmVha2VyJiBsaW5lQnJlYWtlciwgSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlciwgTGluZUluZm8mIGluTGluZUluZm8sIExpbmVXaWR0aCYgbGluZVdpZHRoLCBS
ZW5kZXJUZXh0SW5mbyYgaW5SZW5kZXJUZXh0SW5mbywgRmxvYXRpbmdPYmplY3QqIGluTGFzdEZs
b2F0RnJvbVByZXZpb3VzTGluZSwgYm9vbCBhcHBsaWVkU3RhcnRXaWR0aCwgUmVuZGVyQmxvY2tG
bG93JiBibG9jaykKKyAgICAgICAgOiBtX2xpbmVCcmVha2VyKGxpbmVCcmVha2VyKQorICAgICAg
ICAsIG1fcmVzb2x2ZXIocmVzb2x2ZXIpCisgICAgICAgICwgbV9jdXJyZW50KHJlc29sdmVyLnBv
c2l0aW9uKCkpCisgICAgICAgICwgbV9saW5lQnJlYWsocmVzb2x2ZXIucG9zaXRpb24oKSkKKyAg
ICAgICAgLCBtX2Jsb2NrKGJsb2NrKQorICAgICAgICAsIG1fbGFzdE9iamVjdChtX2N1cnJlbnQu
bV9vYmopCisgICAgICAgICwgbV9uZXh0T2JqZWN0KDApCisgICAgICAgICwgbV9jdXJyZW50U3R5
bGUoMCkKKyAgICAgICAgLCBtX2Jsb2NrU3R5bGUoYmxvY2suc3R5bGUoKSkKKyAgICAgICAgLCBt
X2xpbmVJbmZvKGluTGluZUluZm8pCisgICAgICAgICwgbV9yZW5kZXJUZXh0SW5mbyhpblJlbmRl
clRleHRJbmZvKQorICAgICAgICAsIG1fbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZShpbkxhc3RG
bG9hdEZyb21QcmV2aW91c0xpbmUpCisgICAgICAgICwgbV93aWR0aChsaW5lV2lkdGgpCisgICAg
ICAgICwgbV9jdXJyV1MoTk9STUFMKQorICAgICAgICAsIG1fbGFzdFdTKE5PUk1BTCkKKyAgICAg
ICAgLCBtX3ByZXNlcnZlc05ld2xpbmUoZmFsc2UpCisgICAgICAgICwgbV9hdFN0YXJ0KHRydWUp
CisgICAgICAgICwgbV9pZ25vcmluZ1NwYWNlcyhmYWxzZSkKKyAgICAgICAgLCBtX2N1cnJlbnRD
aGFyYWN0ZXJJc1NwYWNlKGZhbHNlKQorICAgICAgICAsIG1fY3VycmVudENoYXJhY3RlcklzV1Mo
ZmFsc2UpCisgICAgICAgICwgbV9hcHBsaWVkU3RhcnRXaWR0aChhcHBsaWVkU3RhcnRXaWR0aCkK
KyAgICAgICAgLCBtX2luY2x1ZGVFbmRXaWR0aCh0cnVlKQorICAgICAgICAsIG1fYXV0b1dyYXAo
ZmFsc2UpCisgICAgICAgICwgbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lKGZhbHNlKQorICAg
ICAgICAsIG1fZmxvYXRzRml0T25MaW5lKHRydWUpCisgICAgICAgICwgbV9jb2xsYXBzZVdoaXRl
U3BhY2UoZmFsc2UpCisgICAgICAgICwgbV9zdGFydGluZ05ld1BhcmFncmFwaChtX2xpbmVJbmZv
LnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpKQorICAgICAgICAsIG1fYWxsb3dJbWFnZXNUb0Jy
ZWFrKCFibG9jay5kb2N1bWVudCgpLmluUXVpcmtzTW9kZSgpIHx8ICFibG9jay5pc1RhYmxlQ2Vs
bCgpIHx8ICFtX2Jsb2NrU3R5bGUubG9naWNhbFdpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkK
KyAgICAgICAgLCBtX2F0RW5kKGZhbHNlKQorICAgICAgICAsIG1faGFkVW5jb21taXR0ZWRXaWR0
aEJlZm9yZUN1cnJlbnQoZmFsc2UpCisgICAgICAgICwgbV9saW5lTWlkcG9pbnRTdGF0ZShyZXNv
bHZlci5taWRwb2ludFN0YXRlKCkpCisgICAgeworICAgICAgICBtX2xpbmVJbmZvLnNldFByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seShmYWxzZSk7CisgICAgfQorCisgICAgUmVuZGVyT2JqZWN0KiBj
dXJyZW50T2JqZWN0KCkgeyByZXR1cm4gbV9jdXJyZW50Lm1fb2JqOyB9CisgICAgSW5saW5lSXRl
cmF0b3IgbGluZUJyZWFrKCkgeyByZXR1cm4gbV9saW5lQnJlYWs7IH0KKyAgICBJbmxpbmVJdGVy
YXRvciYgbGluZUJyZWFrUmVmKCkge3JldHVybiBtX2xpbmVCcmVhazsgfQorICAgIExpbmVXaWR0
aCYgbGluZVdpZHRoKCkgeyByZXR1cm4gbV93aWR0aDsgfQorICAgIGJvb2wgYXRFbmQoKSB7IHJl
dHVybiBtX2F0RW5kOyB9CisKKyAgICB2b2lkIGluaXRpYWxpemVGb3JDdXJyZW50T2JqZWN0KCk7
CisKKyAgICB2b2lkIGluY3JlbWVudCgpOworCisgICAgdm9pZCBoYW5kbGVCUihFQ2xlYXImKTsK
KyAgICB2b2lkIGhhbmRsZU91dE9mRmxvd1Bvc2l0aW9uZWQoVmVjdG9yPFJlbmRlckJveCo+JiBw
b3NpdGlvbmVkT2JqZWN0cyk7CisgICAgdm9pZCBoYW5kbGVGbG9hdCgpOworICAgIHZvaWQgaGFu
ZGxlRW1wdHlJbmxpbmUoKTsKKyAgICB2b2lkIGhhbmRsZVJlcGxhY2VkKCk7CisgICAgYm9vbCBo
YW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmLCBib29sJiBoeXBoZW5hdGVkLCB1bnNpZ25lZCYg
Y29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpOworICAgIGJvb2wgY2FuQnJlYWtBdFRoaXNQb3Np
dGlvbigpOworICAgIHZvaWQgY29tbWl0QW5kVXBkYXRlTGluZUJyZWFrSWZOZWVkZWQoKTsKKyAg
ICBJbmxpbmVJdGVyYXRvciBoYW5kbGVFbmRPZkxpbmUoKTsKKworICAgIHZvaWQgY2xlYXJMaW5l
QnJlYWtJZkZpdHNPbkxpbmUoYm9vbCBpZ25vcmluZ1RyYWlsaW5nU3BhY2UgPSBmYWxzZSkKKyAg
ICB7CisgICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoaWdub3JpbmdUcmFpbGluZ1NwYWNl
KSB8fCBtX2xhc3RXUyA9PSBOT1dSQVApCisgICAgICAgICAgICBtX2xpbmVCcmVhay5jbGVhcigp
OworICAgIH0KKworICAgIHZvaWQgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoUmVuZGVy
T2JqZWN0KiBvYmplY3QsIHVuc2lnbmVkIG9mZnNldCA9IDAsIGludCBuZXh0QnJlYWsgPSAtMSkK
KyAgICB7CisgICAgICAgIG1fd2lkdGguY29tbWl0KCk7CisgICAgICAgIG1fbGluZUJyZWFrLm1v
dmVUbyhvYmplY3QsIG9mZnNldCwgbmV4dEJyZWFrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAg
TGluZUJyZWFrZXImIG1fbGluZUJyZWFrZXI7CisgICAgSW5saW5lQmlkaVJlc29sdmVyJiBtX3Jl
c29sdmVyOworCisgICAgSW5saW5lSXRlcmF0b3IgbV9jdXJyZW50OworICAgIElubGluZUl0ZXJh
dG9yIG1fbGluZUJyZWFrOworICAgIElubGluZUl0ZXJhdG9yIG1fc3RhcnRPZklnbm9yZWRTcGFj
ZXM7CisKKyAgICBSZW5kZXJCbG9ja0Zsb3cmIG1fYmxvY2s7CisgICAgUmVuZGVyT2JqZWN0KiBt
X2xhc3RPYmplY3Q7CisgICAgUmVuZGVyT2JqZWN0KiBtX25leHRPYmplY3Q7CisKKyAgICBSZW5k
ZXJTdHlsZSogbV9jdXJyZW50U3R5bGU7CisKKyAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aWxs
IGFsbG93IGEgdGFibGUgY2VsbCB0byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQgdW5k
ZXIKKyAgICAvLyB2ZXJ5IHNwZWNpZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1hdGNo
IGNvbW1vbiBXaW5JRSByZW5kZXJpbmdzKS4KKyAgICAvLyBOb3Qgc3VwcG9ydGluZyB0aGUgcXVp
cmsgaGFzIGNhdXNlZCB1cyB0byBtaXMtcmVuZGVyIHNvbWUgcmVhbCBzaXRlcy4gKFNlZSBCdWd6
aWxsYSAxMDUxNy4pCisgICAgUmVuZGVyU3R5bGUmIG1fYmxvY2tTdHlsZTsKKworICAgIExpbmVJ
bmZvJiBtX2xpbmVJbmZvOworCisgICAgUmVuZGVyVGV4dEluZm8mIG1fcmVuZGVyVGV4dEluZm87
CisKKyAgICBGbG9hdGluZ09iamVjdCogbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lOworCisg
ICAgTGluZVdpZHRoIG1fd2lkdGg7CisKKyAgICBFV2hpdGVTcGFjZSBtX2N1cnJXUzsKKyAgICBF
V2hpdGVTcGFjZSBtX2xhc3RXUzsKKworICAgIGJvb2wgbV9wcmVzZXJ2ZXNOZXdsaW5lOworICAg
IGJvb2wgbV9hdFN0YXJ0OworCisgICAgLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIG9ubHkgaWYg
d2hpdGVzcGFjZSBpc24ndCBzZXQgdG8gUFJFLCBhbmQgaXQgdGVsbHMgdXMgd2hldGhlcgorICAg
IC8vIG9yIG5vdCB3ZSBhcmUgY3VycmVudGx5IGlnbm9yaW5nIHdoaXRlc3BhY2UuCisgICAgYm9v
bCBtX2lnbm9yaW5nU3BhY2VzOworCisgICAgLy8gVGhpcyB2YXJpYWJsZSB0cmFja3Mgd2hldGhl
ciB0aGUgdmVyeSBsYXN0IGNoYXJhY3RlciB3ZSBzYXcgd2FzIGEgc3BhY2UuIFdlIHVzZQorICAg
IC8vIHRoaXMgdG8gZGV0ZWN0IHdoZW4gd2UgZW5jb3VudGVyIGEgc2Vjb25kIHNwYWNlIHNvIHdl
IGtub3cgd2UgaGF2ZSB0byB0ZXJtaW5hdGUKKyAgICAvLyBhIHJ1bi4KKyAgICBib29sIG1fY3Vy
cmVudENoYXJhY3RlcklzU3BhY2U7CisgICAgYm9vbCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTOwor
ICAgIGJvb2wgbV9hcHBsaWVkU3RhcnRXaWR0aDsKKyAgICBib29sIG1faW5jbHVkZUVuZFdpZHRo
OworICAgIGJvb2wgbV9hdXRvV3JhcDsKKyAgICBib29sIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9u
TGluZTsKKyAgICBib29sIG1fZmxvYXRzRml0T25MaW5lOworICAgIGJvb2wgbV9jb2xsYXBzZVdo
aXRlU3BhY2U7CisgICAgYm9vbCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoOworICAgIGJvb2wgbV9h
bGxvd0ltYWdlc1RvQnJlYWs7CisgICAgYm9vbCBtX2F0RW5kOworICAgIGJvb2wgbV9oYWRVbmNv
bW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudDsKKworICAgIExpbmVNaWRwb2ludFN0YXRlJiBtX2xp
bmVNaWRwb2ludFN0YXRlOworCisgICAgVHJhaWxpbmdPYmplY3RzIG1fdHJhaWxpbmdPYmplY3Rz
OworfTsKKworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojppbml0aWFsaXplRm9yQ3VycmVu
dE9iamVjdCgpCit7CisgICAgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudCA9ICEh
bV93aWR0aC51bmNvbW1pdHRlZFdpZHRoKCk7CisKKyAgICBtX2N1cnJlbnRTdHlsZSA9ICZtX2N1
cnJlbnQubV9vYmotPnN0eWxlKCk7CisKKyAgICBBU1NFUlQobV9jdXJyZW50U3R5bGUpOworCisg
ICAgbV9uZXh0T2JqZWN0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhtX2Jsb2NrLCBt
X2N1cnJlbnQubV9vYmopOworICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5w
YXJlbnQoKSAmJiAhbV9uZXh0T2JqZWN0LT5wYXJlbnQoKS0+aXNEZXNjZW5kYW50T2YobV9jdXJy
ZW50Lm1fb2JqLT5wYXJlbnQoKSkpCisgICAgICAgIG1faW5jbHVkZUVuZFdpZHRoID0gdHJ1ZTsK
KworICAgIG1fY3VycldTID0gbV9jdXJyZW50Lm1fb2JqLT5pc1JlcGxhY2VkKCkgPyBtX2N1cnJl
bnQubV9vYmotPnBhcmVudCgpLT5zdHlsZSgpLndoaXRlU3BhY2UoKSA6IG1fY3VycmVudFN0eWxl
LT53aGl0ZVNwYWNlKCk7CisgICAgbV9sYXN0V1MgPSBtX2xhc3RPYmplY3QtPmlzUmVwbGFjZWQo
KSA/IG1fbGFzdE9iamVjdC0+cGFyZW50KCktPnN0eWxlKCkud2hpdGVTcGFjZSgpIDogbV9sYXN0
T2JqZWN0LT5zdHlsZSgpLndoaXRlU3BhY2UoKTsKKworICAgIG1fYXV0b1dyYXAgPSBSZW5kZXJT
dHlsZTo6YXV0b1dyYXAobV9jdXJyV1MpOworICAgIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGlu
ZSA9IG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSB8fCBtX2F1dG9XcmFwOworCisjaWYgRU5B
QkxFKFNWRykKKyAgICBtX3ByZXNlcnZlc05ld2xpbmUgPSBtX2N1cnJlbnQubV9vYmotPmlzU1ZH
SW5saW5lVGV4dCgpID8gZmFsc2UgOiBSZW5kZXJTdHlsZTo6cHJlc2VydmVOZXdsaW5lKG1fY3Vy
cldTKTsKKyNlbHNlCisgICAgbV9wcmVzZXJ2ZXNOZXdsaW5lID0gUmVuZGVyU3R5bGU6OnByZXNl
cnZlTmV3bGluZShtX2N1cnJXUyk7CisjZW5kaWYKKworICAgIG1fY29sbGFwc2VXaGl0ZVNwYWNl
ID0gUmVuZGVyU3R5bGU6OmNvbGxhcHNlV2hpdGVTcGFjZShtX2N1cnJXUyk7Cit9CisKK2lubGlu
ZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KCkKK3sKKyAgICAvLyBDbGVhciBvdXQg
b3VyIGNoYXJhY3RlciBzcGFjZSBib29sLCBzaW5jZSBpbmxpbmUgPHByZT5zIGRvbid0IGNvbGxh
cHNlIHdoaXRlc3BhY2UKKyAgICAvLyB3aXRoIGFkamFjZW50IGlubGluZSBub3JtYWwvbm93cmFw
IHNwYW5zLgorICAgIGlmICghbV9jb2xsYXBzZVdoaXRlU3BhY2UpCisgICAgICAgIG1fY3VycmVu
dENoYXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKKworICAgIG1fY3VycmVudC5tb3ZlVG9TdGFydE9m
KG1fbmV4dE9iamVjdCk7CisgICAgbV9hdFN0YXJ0ID0gZmFsc2U7Cit9CisKK2lubGluZSB2b2lk
IEJyZWFraW5nQ29udGV4dDo6aGFuZGxlQlIoRUNsZWFyJiBjbGVhcikKK3sKKyAgICBpZiAobV93
aWR0aC5maXRzT25MaW5lKCkpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiBiciA9IG1fY3VycmVu
dC5tX29iajsKKyAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvU3RhcnRPZihicik7CisgICAgICAg
IG1fbGluZUJyZWFrLmluY3JlbWVudCgpOworCisgICAgICAgIC8vIEEgPGJyPiBhbHdheXMgYnJl
YWtzIGEgbGluZSwgc28gZG9uJ3QgbGV0IHRoZSBsaW5lIGJlIGNvbGxhcHNlZAorICAgICAgICAv
LyBhd2F5LiBBbHNvLCB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aCBhIDxicj4g
ZG9lcyBub3QKKyAgICAgICAgLy8gZ2V0IGNvbGxhcHNlZCBhd2F5LiBJdCBvbmx5IGRvZXMgdGhp
cyBpZiB0aGUgcHJldmlvdXMgbGluZSBicm9rZQorICAgICAgICAvLyBjbGVhbmx5LiBPdGhlcndp
c2UgdGhlIDxicj4gaGFzIG5vIGVmZmVjdCBvbiB3aGV0aGVyIHRoZSBsaW5lIGlzCisgICAgICAg
IC8vIGVtcHR5IG9yIG5vdC4KKyAgICAgICAgaWYgKG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGgpCisg
ICAgICAgICAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAmbV9ibG9jaywgJm1fd2lkdGgp
OworICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOworICAgICAgICBtX2xpbmVJbmZv
LnNldFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKKworICAgICAgICAvLyBBIDxicj4g
d2l0aCBjbGVhcmFuY2UgYWx3YXlzIG5lZWRzIGEgbGluZWJveCBpbiBjYXNlIHRoZSBsaW5lcyBi
ZWxvdyBpdCBnZXQgZGlydGllZCBsYXRlciBhbmQKKyAgICAgICAgLy8gbmVlZCB0byBjaGVjayBm
b3IgZmxvYXRzIHRvIGNsZWFyIC0gc28gaWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCBzdG9wIGln
bm9yaW5nIHRoZW0gYW5kIGFkZCBhCisgICAgICAgIC8vIHJ1biBmb3IgdGhpcyBvYmplY3QuCisg
ICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jbGVhcigpICE9
IENOT05FKQorICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9s
aW5lTWlkcG9pbnRTdGF0ZSwgYnIpOworICAgICAgICAvLyBJZiB3ZSB3ZXJlIHByZWNlZGVkIGJ5
IGNvbGxhcHNpbmcgc3BhY2UgYW5kIGFyZSBpbiBhIHJpZ2h0LWFsaWduZWQgY29udGFpbmVyIHdl
IG5lZWQgdG8gZW5zdXJlIHRoZSBzcGFjZSBnZXRzCisgICAgICAgIC8vIGNvbGxhcHNlZCBhd2F5
IHNvIHRoYXQgaXQgZG9lc24ndCBwdXNoIHRoZSB0ZXh0IG91dCBmcm9tIHRoZSBjb250YWluZXIn
cyByaWdodC1oYW5kIGVkZ2UuCisgICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2FyZGxlc3Mg
b2YgdGhlIGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2VsaW5pbmcg
YSBsb3Qgb2YgdGVzdCByZXN1bHRzLgorICAgICAgICBlbHNlIGlmIChtX2lnbm9yaW5nU3BhY2Vz
ICYmIChtX2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gUklHSFQgfHwgbV9ibG9ja1N0eWxlLnRl
eHRBbGlnbigpID09IFdFQktJVF9SSUdIVCkpCisgICAgICAgICAgICBzdG9wSWdub3JpbmdTcGFj
ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50Lm1fb2Jq
LCBtX2N1cnJlbnQubV9wb3MpKTsKKworICAgICAgICBpZiAoIW1fbGluZUluZm8uaXNFbXB0eSgp
KQorICAgICAgICAgICAgY2xlYXIgPSBtX2N1cnJlbnRTdHlsZS0+Y2xlYXIoKTsKKyAgICB9Cisg
ICAgbV9hdEVuZCA9IHRydWU7Cit9CisKK2lubGluZSBMYXlvdXRVbml0IGJvcmRlclBhZGRpbmdN
YXJnaW5TdGFydChjb25zdCBSZW5kZXJJbmxpbmUmIGNoaWxkKQoreworICAgIHJldHVybiBjaGls
ZC5tYXJnaW5TdGFydCgpICsgY2hpbGQucGFkZGluZ1N0YXJ0KCkgKyBjaGlsZC5ib3JkZXJTdGFy
dCgpOworfQorCitpbmxpbmUgTGF5b3V0VW5pdCBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKGNvbnN0
IFJlbmRlcklubGluZSYgY2hpbGQpCit7CisgICAgcmV0dXJuIGNoaWxkLm1hcmdpbkVuZCgpICsg
Y2hpbGQucGFkZGluZ0VuZCgpICsgY2hpbGQuYm9yZGVyRW5kKCk7Cit9CisKK2lubGluZSBib29s
IHNob3VsZEFkZEJvcmRlclBhZGRpbmdNYXJnaW4oUmVuZGVyT2JqZWN0KiBjaGlsZCkKK3sKKyAg
ICAvLyBXaGVuIGRlY2lkaW5nIHdoZXRoZXIgd2UncmUgYXQgdGhlIGVkZ2Ugb2YgYW4gaW5saW5l
LCBhZGphY2VudCBjb2xsYXBzZWQgd2hpdGVzcGFjZSBpcyB0aGUgc2FtZSBhcyBubyBzaWJsaW5n
IGF0IGFsbC4KKyAgICByZXR1cm4gIWNoaWxkIHx8IChjaGlsZC0+aXNUZXh0KCkgJiYgIXRvUmVu
ZGVyVGV4dChjaGlsZCktPnRleHRMZW5ndGgoKSk7Cit9CisKK2lubGluZSBSZW5kZXJPYmplY3Qq
IHByZXZpb3VzSW5GbG93U2libGluZyhSZW5kZXJPYmplY3QqIGNoaWxkKQoreworICAgIGNoaWxk
ID0gY2hpbGQtPnByZXZpb3VzU2libGluZygpOworICAgIHdoaWxlIChjaGlsZCAmJiBjaGlsZC0+
aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCisgICAgICAgIGNoaWxkID0gY2hpbGQtPnByZXZpb3Vz
U2libGluZygpOworICAgIHJldHVybiBjaGlsZDsKK30KKworTGF5b3V0VW5pdCBpbmxpbmVMb2dp
Y2FsV2lkdGgoUmVuZGVyT2JqZWN0KiBjaGlsZCwgYm9vbCBjaGVja1N0YXJ0RWRnZSA9IHRydWUs
IGJvb2wgY2hlY2tFbmRFZGdlID0gdHJ1ZSkKK3sKKyAgICB1bnNpZ25lZCBsaW5lRGVwdGggPSAx
OworICAgIExheW91dFVuaXQgZXh0cmFXaWR0aCA9IDA7CisgICAgUmVuZGVyRWxlbWVudCogcGFy
ZW50ID0gY2hpbGQtPnBhcmVudCgpOworICAgIHdoaWxlIChwYXJlbnQtPmlzUmVuZGVySW5saW5l
KCkgJiYgbGluZURlcHRoKysgPCBjTWF4TGluZURlcHRoKSB7CisgICAgICAgIGNvbnN0IFJlbmRl
cklubGluZSYgcGFyZW50QXNSZW5kZXJJbmxpbmUgPSB0b1JlbmRlcklubGluZSgqcGFyZW50KTsK
KyAgICAgICAgaWYgKCFpc0VtcHR5SW5saW5lKHBhcmVudEFzUmVuZGVySW5saW5lKSkgeworICAg
ICAgICAgICAgY2hlY2tTdGFydEVkZ2UgPSBjaGVja1N0YXJ0RWRnZSAmJiBzaG91bGRBZGRCb3Jk
ZXJQYWRkaW5nTWFyZ2luKHByZXZpb3VzSW5GbG93U2libGluZyhjaGlsZCkpOworICAgICAgICAg
ICAgaWYgKGNoZWNrU3RhcnRFZGdlKQorICAgICAgICAgICAgICAgIGV4dHJhV2lkdGggKz0gYm9y
ZGVyUGFkZGluZ01hcmdpblN0YXJ0KHBhcmVudEFzUmVuZGVySW5saW5lKTsKKyAgICAgICAgICAg
IGNoZWNrRW5kRWRnZSA9IGNoZWNrRW5kRWRnZSAmJiBzaG91bGRBZGRCb3JkZXJQYWRkaW5nTWFy
Z2luKGNoaWxkLT5uZXh0U2libGluZygpKTsKKyAgICAgICAgICAgIGlmIChjaGVja0VuZEVkZ2Up
CisgICAgICAgICAgICAgICAgZXh0cmFXaWR0aCArPSBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKHBh
cmVudEFzUmVuZGVySW5saW5lKTsKKyAgICAgICAgICAgIGlmICghY2hlY2tTdGFydEVkZ2UgJiYg
IWNoZWNrRW5kRWRnZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFXaWR0aDsKKyAgICAg
ICAgfQorICAgICAgICBjaGlsZCA9IHBhcmVudDsKKyAgICAgICAgcGFyZW50ID0gY2hpbGQtPnBh
cmVudCgpOworICAgIH0KKyAgICByZXR1cm4gZXh0cmFXaWR0aDsKK30KKworaW5saW5lIHZvaWQg
QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVPdXRPZkZsb3dQb3NpdGlvbmVkKFZlY3RvcjxSZW5kZXJC
b3gqPiYgcG9zaXRpb25lZE9iamVjdHMpCit7CisgICAgLy8gSWYgb3VyIG9yaWdpbmFsIGRpc3Bs
YXkgd2Fzbid0IGFuIGlubGluZSB0eXBlLCB0aGVuIHdlIGNhbgorICAgIC8vIGdvIGFoZWFkIGFu
ZCBkZXRlcm1pbmUgb3VyIHN0YXRpYyBpbmxpbmUgcG9zaXRpb24gbm93LgorICAgIFJlbmRlckJv
eCogYm94ID0gdG9SZW5kZXJCb3gobV9jdXJyZW50Lm1fb2JqKTsKKyAgICBib29sIGlzSW5saW5l
VHlwZSA9IGJveC0+c3R5bGUoKS5pc09yaWdpbmFsRGlzcGxheUlubGluZVR5cGUoKTsKKyAgICBp
ZiAoIWlzSW5saW5lVHlwZSkKKyAgICAgICAgbV9ibG9jay5zZXRTdGF0aWNJbmxpbmVQb3NpdGlv
bkZvckNoaWxkKCpib3gsIG1fYmxvY2subG9naWNhbEhlaWdodCgpLCBtX2Jsb2NrLnN0YXJ0T2Zm
c2V0Rm9yQ29udGVudChtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQoKSkpOworICAgIGVsc2UgeworICAg
ICAgICAvLyBJZiBvdXIgb3JpZ2luYWwgZGlzcGxheSB3YXMgYW4gSU5MSU5FIHR5cGUsIHRoZW4g
d2UgY2FuIGdvIGFoZWFkCisgICAgICAgIC8vIGFuZCBkZXRlcm1pbmUgb3VyIHN0YXRpYyB5IHBv
c2l0aW9uIG5vdy4KKyAgICAgICAgYm94LT5sYXllcigpLT5zZXRTdGF0aWNCbG9ja1Bvc2l0aW9u
KG1fYmxvY2subG9naWNhbEhlaWdodCgpKTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSdyZSBpZ25v
cmluZyBzcGFjZXMsIHdlIGhhdmUgdG8gc3RvcCBhbmQgaW5jbHVkZSB0aGlzIG9iamVjdCBhbmQK
KyAgICAvLyB0aGVuIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcyBhZ2Fpbi4KKyAgICBpZiAoaXNJbmxp
bmVUeXBlIHx8IGJveC0+Y29udGFpbmVyKCktPmlzUmVuZGVySW5saW5lKCkpIHsKKyAgICAgICAg
aWYgKG1faWdub3JpbmdTcGFjZXMpCisgICAgICAgICAgICBlbnN1cmVMaW5lQm94SW5zaWRlSWdu
b3JlZFNwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBib3gpOworICAgICAgICBtX3RyYWlsaW5n
T2JqZWN0cy5hcHBlbmRCb3hJZk5lZWRlZChib3gpOworICAgIH0gZWxzZQorICAgICAgICBwb3Np
dGlvbmVkT2JqZWN0cy5hcHBlbmQoYm94KTsKKworICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRX
aWR0aChpbmxpbmVMb2dpY2FsV2lkdGgoYm94KSk7CisgICAgLy8gUmVzZXQgcHJpb3IgbGluZSBi
cmVhayBjb250ZXh0IGNoYXJhY3RlcnMuCisgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVh
a0l0ZXJhdG9yLnJlc2V0UHJpb3JDb250ZXh0KCk7Cit9CisKK2lubGluZSB2b2lkIEJyZWFraW5n
Q29udGV4dDo6aGFuZGxlRmxvYXQoKQoreworICAgIFJlbmRlckJveCYgZmxvYXRCb3ggPSB0b1Jl
bmRlckJveCgqbV9jdXJyZW50Lm1fb2JqKTsKKyAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdP
YmplY3QgPSBtX2Jsb2NrLmluc2VydEZsb2F0aW5nT2JqZWN0KGZsb2F0Qm94KTsKKyAgICAvLyBj
aGVjayBpZiBpdCBmaXRzIGluIHRoZSBjdXJyZW50IGxpbmUuCisgICAgLy8gSWYgaXQgZG9lcywg
cG9zaXRpb24gaXQgbm93LCBvdGhlcndpc2UsIHBvc2l0aW9uCisgICAgLy8gaXQgYWZ0ZXIgbW92
aW5nIHRvIG5leHQgbGluZSAoaW4gbmV3TGluZSgpIGZ1bmMpCisgICAgLy8gRklYTUU6IEJ1ZyAx
MTAzNzI6IFByb3Blcmx5IHBvc2l0aW9uIG11bHRpcGxlIHN0YWNrZWQgZmxvYXRzIHdpdGggbm9u
LXJlY3Rhbmd1bGFyIHNoYXBlIG91dHNpZGUuCisgICAgaWYgKG1fZmxvYXRzRml0T25MaW5lICYm
IG1fd2lkdGguZml0c09uTGluZUV4Y2x1ZGluZ1RyYWlsaW5nV2hpdGVzcGFjZShtX2Jsb2NrLmxv
Z2ljYWxXaWR0aEZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KSkpIHsKKyAgICAgICAgbV9ibG9jay5w
b3NpdGlvbk5ld0Zsb2F0T25MaW5lKGZsb2F0aW5nT2JqZWN0LCBtX2xhc3RGbG9hdEZyb21QcmV2
aW91c0xpbmUsIG1fbGluZUluZm8sIG1fd2lkdGgpOworICAgICAgICBpZiAobV9saW5lQnJlYWsu
bV9vYmogPT0gbV9jdXJyZW50Lm1fb2JqKSB7CisgICAgICAgICAgICBBU1NFUlQoIW1fbGluZUJy
ZWFrLm1fcG9zKTsKKyAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOworICAgICAg
ICB9CisgICAgfSBlbHNlCisgICAgICAgIG1fZmxvYXRzRml0T25MaW5lID0gZmFsc2U7CisgICAg
Ly8gVXBkYXRlIHByaW9yIGxpbmUgYnJlYWsgY29udGV4dCBjaGFyYWN0ZXJzLCB1c2luZyBVK0ZG
RkQgKE9CSkVDVCBSRVBMQUNFTUVOVCBDSEFSQUNURVIpIGZvciBmbG9hdGluZyBlbGVtZW50Lgor
ICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci51cGRhdGVQcmlvckNvbnRl
eHQocmVwbGFjZW1lbnRDaGFyYWN0ZXIpOworfQorCisvLyBUaGlzIGlzIGN1cnJlbnRseSBqdXN0
IHVzZWQgZm9yIGxpc3QgbWFya2VycyBhbmQgaW5saW5lIGZsb3dzIHRoYXQgaGF2ZSBsaW5lIGJv
eGVzLiBOZWl0aGVyIHNob3VsZAorLy8gaGF2ZSBhbiBlZmZlY3Qgb24gd2hpdGVzcGFjZSBhdCB0
aGUgc3RhcnQgb2YgdGhlIGxpbmUuCitpbmxpbmUgYm9vbCBzaG91bGRTa2lwV2hpdGVzcGFjZUFm
dGVyU3RhcnRPYmplY3QoUmVuZGVyQmxvY2tGbG93JiBibG9jaywgUmVuZGVyT2JqZWN0KiBvLCBM
aW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUpCit7CisgICAgUmVuZGVyT2JqZWN0
KiBuZXh0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhibG9jaywgbyk7CisgICAgd2hp
bGUgKG5leHQgJiYgbmV4dC0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKQorICAg
ICAgICBuZXh0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhibG9jaywgbmV4dCk7CisK
KyAgICBpZiAobmV4dCAmJiBuZXh0LT5pc1RleHQoKSAmJiB0b1JlbmRlclRleHQobmV4dCktPnRl
eHRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgUmVuZGVyVGV4dCogbmV4dFRleHQgPSB0b1JlbmRl
clRleHQobmV4dCk7CisgICAgICAgIFVDaGFyIG5leHRDaGFyID0gbmV4dFRleHQtPmNoYXJhY3Rl
ckF0KDApOworICAgICAgICBpZiAobmV4dFRleHQtPnN0eWxlKCkuaXNDb2xsYXBzaWJsZVdoaXRl
U3BhY2UobmV4dENoYXIpKSB7CisgICAgICAgICAgICBzdGFydElnbm9yaW5nU3BhY2VzKGxpbmVN
aWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCAwKSk7CisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworaW5s
aW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbXB0eUlubGluZSgpCit7CisgICAgUmVu
ZGVySW5saW5lJiBmbG93Qm94ID0gdG9SZW5kZXJJbmxpbmUoKm1fY3VycmVudC5tX29iaik7CisK
KyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGVuZCB1cCBiZWluZyBjYWxsZWQgb24gZW1wdHkgaW5s
aW5lcworICAgIEFTU0VSVChpc0VtcHR5SW5saW5lKGZsb3dCb3gpKTsKKworICAgIC8vIE5vdyB0
aGF0IHNvbWUgaW5saW5lIGZsb3dzIGhhdmUgbGluZSBib3hlcywgaWYgd2UgYXJlIGFscmVhZHkg
aWdub3Jpbmcgc3BhY2VzLCB3ZSBuZWVkCisgICAgLy8gdG8gbWFrZSBzdXJlIHRoYXQgd2Ugc3Rv
cCB0byBpbmNsdWRlIHRoaXMgb2JqZWN0IGFuZCB0aGVuIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcyBh
Z2Fpbi4KKyAgICAvLyBJZiB0aGlzIG9iamVjdCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUs
IHdlIG5lZWQgdG8gYmVoYXZlIGxpa2UgbGlzdCBtYXJrZXJzIGFuZAorICAgIC8vIHN0YXJ0IGln
bm9yaW5nIHNwYWNlcy4KKyAgICBib29sIHJlcXVpcmVzTGluZUJveCA9IGFsd2F5c1JlcXVpcmVz
TGluZUJveChmbG93Qm94KTsKKyAgICBpZiAocmVxdWlyZXNMaW5lQm94IHx8IHJlcXVpcmVzTGlu
ZUJveEZvckNvbnRlbnQoZmxvd0JveCwgbV9saW5lSW5mbykpIHsKKyAgICAgICAgLy8gQW4gZW1w
dHkgaW5saW5lIHRoYXQgb25seSBoYXMgbGluZS1oZWlnaHQsIHZlcnRpY2FsLWFsaWduIG9yIGZv
bnQtbWV0cmljcyB3aWxsIG9ubHkgZ2V0IGEKKyAgICAgICAgLy8gbGluZSBib3ggdG8gYWZmZWN0
IHRoZSBoZWlnaHQgb2YgdGhlIGxpbmUgaWYgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgaXMgbm90IGVt
cHR5LgorICAgICAgICBpZiAocmVxdWlyZXNMaW5lQm94KQorICAgICAgICAgICAgbV9saW5lSW5m
by5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKKyAgICAgICAgaWYgKG1faWdu
b3JpbmdTcGFjZXMpIHsKKyAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7Cisg
ICAgICAgICAgICBlbnN1cmVMaW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcyhtX2xpbmVNaWRwb2lu
dFN0YXRlLCBtX2N1cnJlbnQubV9vYmopOworICAgICAgICB9IGVsc2UgaWYgKG1fYmxvY2tTdHls
ZS5jb2xsYXBzZVdoaXRlU3BhY2UoKSAmJiBtX3Jlc29sdmVyLnBvc2l0aW9uKCkubV9vYmogPT0g
bV9jdXJyZW50Lm1fb2JqCisgICAgICAgICAgICAmJiBzaG91bGRTa2lwV2hpdGVzcGFjZUFmdGVy
U3RhcnRPYmplY3QobV9ibG9jaywgbV9jdXJyZW50Lm1fb2JqLCBtX2xpbmVNaWRwb2ludFN0YXRl
KSkgeworICAgICAgICAgICAgLy8gTGlrZSB3aXRoIGxpc3QgbWFya2Vycywgd2Ugc3RhcnQgaWdu
b3Jpbmcgc3BhY2VzIHRvIG1ha2Ugc3VyZSB0aGF0IGFueQorICAgICAgICAgICAgLy8gYWRkaXRp
b25hbCBzcGFjZXMgd2Ugc2VlIHdpbGwgYmUgZGlzY2FyZGVkLgorICAgICAgICAgICAgbV9jdXJy
ZW50Q2hhcmFjdGVySXNTcGFjZSA9IHRydWU7CisgICAgICAgICAgICBtX2N1cnJlbnRDaGFyYWN0
ZXJJc1dTID0gdHJ1ZTsKKyAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSB0cnVlOworICAg
ICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmFwcGVuZEJveElmTmVl
ZGVkKCZmbG93Qm94KTsKKyAgICB9CisKKyAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgo
aW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaikgKyBib3JkZXJQYWRkaW5nTWFyZ2lu
U3RhcnQoZmxvd0JveCkgKyBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKGZsb3dCb3gpKTsKK30KKwor
aW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVSZXBsYWNlZCgpCit7CisgICAgUmVu
ZGVyQm94JiByZXBsYWNlZEJveCA9IHRvUmVuZGVyQm94KCptX2N1cnJlbnQubV9vYmopOworCisg
ICAgaWYgKG1fYXRTdGFydCkKKyAgICAgICAgbV93aWR0aC51cGRhdGVBdmFpbGFibGVXaWR0aChy
ZXBsYWNlZEJveC5sb2dpY2FsSGVpZ2h0KCkpOworCisgICAgLy8gQnJlYWsgb24gcmVwbGFjZWQg
ZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUtc3BhY2UuCisgICAgaWYgKChtX2F1
dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChtX2xhc3RXUykpICYmICghbV9jdXJyZW50
Lm1fb2JqLT5pc0ltYWdlKCkgfHwgbV9hbGxvd0ltYWdlc1RvQnJlYWspKSB7CisgICAgICAgIG1f
d2lkdGguY29tbWl0KCk7CisgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUb1N0YXJ0T2YobV9jdXJy
ZW50Lm1fb2JqKTsKKyAgICB9CisKKyAgICBpZiAobV9pZ25vcmluZ1NwYWNlcykKKyAgICAgICAg
c3RvcElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAs
IG1fY3VycmVudC5tX29iaiwgMCkpOworCisgICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwg
Jm1fYmxvY2ssICZtX3dpZHRoKTsKKyAgICBtX2lnbm9yaW5nU3BhY2VzID0gZmFsc2U7CisgICAg
bV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOworICAgIG1fY3VycmVudENoYXJhY3Rl
cklzV1MgPSBmYWxzZTsKKyAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOworCisgICAgLy8g
T3B0aW1pemUgZm9yIGEgY29tbW9uIGNhc2UuIElmIHdlIGNhbid0IGZpbmQgd2hpdGVzcGFjZSBh
ZnRlciB0aGUgbGlzdAorICAgIC8vIGl0ZW0sIHRoZW4gdGhpcyBpcyBhbGwgbW9vdC4KKyAgICBM
YXlvdXRVbml0IHJlcGxhY2VkTG9naWNhbFdpZHRoID0gbV9ibG9jay5sb2dpY2FsV2lkdGhGb3JD
aGlsZChyZXBsYWNlZEJveCkgKyBtX2Jsb2NrLm1hcmdpblN0YXJ0Rm9yQ2hpbGQocmVwbGFjZWRC
b3gpICsgbV9ibG9jay5tYXJnaW5FbmRGb3JDaGlsZChyZXBsYWNlZEJveCkgKyBpbmxpbmVMb2dp
Y2FsV2lkdGgobV9jdXJyZW50Lm1fb2JqKTsKKyAgICBpZiAobV9jdXJyZW50Lm1fb2JqLT5pc0xp
c3RNYXJrZXIoKSkgeworICAgICAgICBpZiAobV9ibG9ja1N0eWxlLmNvbGxhcHNlV2hpdGVTcGFj
ZSgpICYmIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdChtX2Jsb2NrLCBtX2N1
cnJlbnQubV9vYmosIG1fbGluZU1pZHBvaW50U3RhdGUpKSB7CisgICAgICAgICAgICAvLyBMaWtl
IHdpdGggaW5saW5lIGZsb3dzLCB3ZSBzdGFydCBpZ25vcmluZyBzcGFjZXMgdG8gbWFrZSBzdXJl
IHRoYXQgYW55CisgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHNwYWNlcyB3ZSBzZWUgd2lsbCBi
ZSBkaXNjYXJkZWQuCisgICAgICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlID0gdHJ1
ZTsKKyAgICAgICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSBmYWxzZTsKKyAgICAgICAg
ICAgIG1faWdub3JpbmdTcGFjZXMgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICh0b1Jl
bmRlckxpc3RNYXJrZXIoKm1fY3VycmVudC5tX29iaikuaXNJbnNpZGUoKSkKKyAgICAgICAgICAg
IG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChyZXBsYWNlZExvZ2ljYWxXaWR0aCk7CisgICAg
fSBlbHNlCisgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChyZXBsYWNlZExvZ2lj
YWxXaWR0aCk7CisgICAgaWYgKG1fY3VycmVudC5tX29iai0+aXNSdWJ5UnVuKCkpCisgICAgICAg
IG1fd2lkdGguYXBwbHlPdmVyaGFuZyh0b1JlbmRlclJ1YnlSdW4obV9jdXJyZW50Lm1fb2JqKSwg
bV9sYXN0T2JqZWN0LCBtX25leHRPYmplY3QpOworICAgIC8vIFVwZGF0ZSBwcmlvciBsaW5lIGJy
ZWFrIGNvbnRleHQgY2hhcmFjdGVycywgdXNpbmcgVStGRkZEIChPQkpFQ1QgUkVQTEFDRU1FTlQg
Q0hBUkFDVEVSKSBmb3IgcmVwbGFjZWQgZWxlbWVudC4KKyAgICBtX3JlbmRlclRleHRJbmZvLm1f
bGluZUJyZWFrSXRlcmF0b3IudXBkYXRlUHJpb3JDb250ZXh0KHJlcGxhY2VtZW50Q2hhcmFjdGVy
KTsKK30KKworaW5saW5lIGZsb2F0IGZpcnN0UG9zaXRpdmVXaWR0aChjb25zdCBXb3JkTWVhc3Vy
ZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
d29yZE1lYXN1cmVtZW50cy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAod29yZE1lYXN1cmVt
ZW50c1tpXS53aWR0aCA+IDApCisgICAgICAgICAgICByZXR1cm4gd29yZE1lYXN1cmVtZW50c1tp
XS53aWR0aDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEUoQ1NTX1NIQVBF
UykKK2lubGluZSB2b2lkIHVwZGF0ZVNlZ21lbnRzRm9yU2hhcGVzKFJlbmRlckJsb2NrRmxvdyYg
YmxvY2ssIGNvbnN0IEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBj
b25zdCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzLCBMaW5lV2lkdGgmIHdpZHRo
LCBib29sIGlzRmlyc3RMaW5lKQoreworICAgIEFTU0VSVChsYXN0RmxvYXRGcm9tUHJldmlvdXNM
aW5lKTsKKworICAgIFNoYXBlSW5zaWRlSW5mbyogc2hhcGVJbnNpZGVJbmZvID0gYmxvY2subGF5
b3V0U2hhcGVJbnNpZGVJbmZvKCk7CisgICAgaWYgKCFsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5l
LT5pc1BsYWNlZCgpIHx8ICFzaGFwZUluc2lkZUluZm8pCisgICAgICAgIHJldHVybjsKKworICAg
IGJvb2wgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUgPSBibG9jay5pc0hvcml6b250YWxXcml0aW5n
TW9kZSgpOworICAgIExheW91dFVuaXQgbG9naWNhbE9mZnNldEZyb21TaGFwZUNvbnRhaW5lciA9
IGJsb2NrLmxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVBbmNlc3RvckNvbnRhaW5lcihzaGFwZUluc2lk
ZUluZm8tPm93bmVyKCkpLmhlaWdodCgpOworCisgICAgTGF5b3V0VW5pdCBsaW5lTG9naWNhbFRv
cCA9IGJsb2NrLmxvZ2ljYWxIZWlnaHQoKSArIGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWlu
ZXI7CisgICAgTGF5b3V0VW5pdCBsaW5lTG9naWNhbEhlaWdodCA9IGJsb2NrLmxpbmVIZWlnaHQo
aXNGaXJzdExpbmUsIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlID8gSG9yaXpvbnRhbExpbmUgOiBW
ZXJ0aWNhbExpbmUsIFBvc2l0aW9uT2ZJbnRlcmlvckxpbmVCb3hlcyk7CisgICAgTGF5b3V0VW5p
dCBsaW5lTG9naWNhbEJvdHRvbSA9IGxpbmVMb2dpY2FsVG9wICsgbGluZUxvZ2ljYWxIZWlnaHQ7
CisKKyAgICBMYXlvdXRVbml0IGZsb2F0TG9naWNhbFRvcCA9IGJsb2NrLmxvZ2ljYWxUb3BGb3JG
bG9hdChsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKTsKKyAgICBMYXlvdXRVbml0IGZsb2F0TG9n
aWNhbEJvdHRvbSA9IGJsb2NrLmxvZ2ljYWxCb3R0b21Gb3JGbG9hdChsYXN0RmxvYXRGcm9tUHJl
dmlvdXNMaW5lKTsKKworICAgIGJvb2wgbGluZU92ZXJsYXBzV2l0aEZsb2F0ID0gKGZsb2F0TG9n
aWNhbFRvcCA8IGxpbmVMb2dpY2FsQm90dG9tKSAmJiAobGluZUxvZ2ljYWxUb3AgPCBmbG9hdExv
Z2ljYWxCb3R0b20pOworICAgIGlmICghbGluZU92ZXJsYXBzV2l0aEZsb2F0KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBmbG9hdCBtaW5TZWdtZW50V2lkdGggPSBmaXJzdFBvc2l0aXZlV2lkdGgo
d29yZE1lYXN1cmVtZW50cyk7CisKKyAgICBMYXlvdXRVbml0IGZsb2F0TG9naWNhbFdpZHRoID0g
YmxvY2subG9naWNhbFdpZHRoRm9yRmxvYXQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7Cisg
ICAgTGF5b3V0VW5pdCBhdmFpbGFibGVMb2dpY2FsV2lkdGggPSBibG9jay5sb2dpY2FsV2lkdGgo
KSAtIGJsb2NrLmxvZ2ljYWxSaWdodEZvckZsb2F0KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUp
OworICAgIGlmIChhdmFpbGFibGVMb2dpY2FsV2lkdGggPCBtaW5TZWdtZW50V2lkdGgpCisgICAg
ICAgIGJsb2NrLnNldExvZ2ljYWxIZWlnaHQoZmxvYXRMb2dpY2FsQm90dG9tKTsKKworICAgIGlm
IChibG9jay5sb2dpY2FsSGVpZ2h0KCkgPCBmbG9hdExvZ2ljYWxUb3ApIHsKKyAgICAgICAgc2hh
cGVJbnNpZGVJbmZvLT5hZGp1c3RMb2dpY2FsTGluZVRvcChtaW5TZWdtZW50V2lkdGggKyBmbG9h
dExvZ2ljYWxXaWR0aCk7CisgICAgICAgIGJsb2NrLnNldExvZ2ljYWxIZWlnaHQoc2hhcGVJbnNp
ZGVJbmZvLT5sb2dpY2FsTGluZVRvcCgpIC0gbG9naWNhbE9mZnNldEZyb21TaGFwZUNvbnRhaW5l
cik7CisgICAgfQorCisgICAgbGluZUxvZ2ljYWxUb3AgPSBibG9jay5sb2dpY2FsSGVpZ2h0KCkg
KyBsb2dpY2FsT2Zmc2V0RnJvbVNoYXBlQ29udGFpbmVyOworCisgICAgc2hhcGVJbnNpZGVJbmZv
LT51cGRhdGVTZWdtZW50c0ZvckxpbmUobGluZUxvZ2ljYWxUb3AsIGxpbmVMb2dpY2FsSGVpZ2h0
KTsKKyAgICB3aWR0aC51cGRhdGVDdXJyZW50U2hhcGVTZWdtZW50KCk7CisgICAgd2lkdGgudXBk
YXRlQXZhaWxhYmxlV2lkdGgoKTsKK30KKyNlbmRpZgorCitpbmxpbmUgYm9vbCBpdGVyYXRvcklz
QmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChjb25zdCBJbmxpbmVJdGVyYXRvciYgaXRlciwg
UmVuZGVyQ29tYmluZVRleHQmIHJlbmRlcmVyKQoreworICAgIHJldHVybiBpdGVyLm1fb2JqID09
ICZyZW5kZXJlciAmJiBpdGVyLm1fcG9zID49IHJlbmRlcmVyLnRleHRMZW5ndGgoKTsKK30KKwor
aW5saW5lIHZvaWQgbmV4dENoYXJhY3RlcihVQ2hhciYgY3VycmVudENoYXJhY3RlciwgVUNoYXIm
IGxhc3RDaGFyYWN0ZXIsIFVDaGFyJiBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpCit7CisgICAgc2Vj
b25kVG9MYXN0Q2hhcmFjdGVyID0gbGFzdENoYXJhY3RlcjsKKyAgICBsYXN0Q2hhcmFjdGVyID0g
Y3VycmVudENoYXJhY3RlcjsKK30KKworLy8gRklYTUU6IERvbid0IGxldCBjb3VudGVycyBtYXJr
IHRoZW1zZWx2ZXMgYXMgbmVlZGluZyBwcmVmIHdpZHRoIHJlY2FsY3MgZHVyaW5nIGxheW91dAor
Ly8gc28gd2UgZG9uJ3QgbmVlZCB0aGlzIGhhY2suCitpbmxpbmUgdm9pZCB1cGRhdGVDb3VudGVy
SWZOZWVkZWQoUmVuZGVyVGV4dCYgcmVuZGVyVGV4dCkKK3sKKyAgICBpZiAoIXJlbmRlclRleHQu
cHJlZmVycmVkTG9naWNhbFdpZHRoc0RpcnR5KCkgfHwgIXJlbmRlclRleHQuaXNDb3VudGVyKCkp
CisgICAgICAgIHJldHVybjsKKyAgICB0b1JlbmRlckNvdW50ZXIocmVuZGVyVGV4dCkudXBkYXRl
Q291bnRlcigpOworfQorCitpbmxpbmUgZmxvYXQgbWVhc3VyZUh5cGhlbldpZHRoKFJlbmRlclRl
eHQqIHJlbmRlcmVyLCBjb25zdCBGb250JiBmb250LCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnRE
YXRhKj4qIGZhbGxiYWNrRm9udHMgPSAwKQoreworICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHls
ZSA9IHJlbmRlcmVyLT5zdHlsZSgpOworICAgIHJldHVybiBmb250LndpZHRoKFJlbmRlckJsb2Nr
Ojpjb25zdHJ1Y3RUZXh0UnVuKHJlbmRlcmVyLCBmb250LCBzdHlsZS5oeXBoZW5TdHJpbmcoKS5z
dHJpbmcoKSwgc3R5bGUpLCBmYWxsYmFja0ZvbnRzKTsKK30KKworQUxXQVlTX0lOTElORSBmbG9h
dCB0ZXh0V2lkdGgoUmVuZGVyVGV4dCogdGV4dCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVu
LCBjb25zdCBGb250JiBmb250LCBmbG9hdCB4UG9zLCBib29sIGlzRml4ZWRQaXRjaCwgYm9vbCBj
b2xsYXBzZVdoaXRlU3BhY2UsIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiYgZmFsbGJh
Y2tGb250cywgVGV4dExheW91dCogbGF5b3V0ID0gMCkKK3sKKyAgICBjb25zdCBSZW5kZXJTdHls
ZSYgc3R5bGUgPSB0ZXh0LT5zdHlsZSgpOworCisgICAgR2x5cGhPdmVyZmxvdyBnbHlwaE92ZXJm
bG93OworICAgIGlmIChpc0ZpeGVkUGl0Y2ggfHwgKCFmcm9tICYmIGxlbiA9PSB0ZXh0LT50ZXh0
TGVuZ3RoKCkpIHx8IHN0eWxlLmhhc1RleHRDb21iaW5lKCkpCisgICAgICAgIHJldHVybiB0ZXh0
LT53aWR0aChmcm9tLCBsZW4sIGZvbnQsIHhQb3MsICZmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVy
Zmxvdyk7CisKKyAgICBpZiAobGF5b3V0KQorICAgICAgICByZXR1cm4gRm9udDo6d2lkdGgoKmxh
eW91dCwgZnJvbSwgbGVuLCAmZmFsbGJhY2tGb250cyk7CisKKyAgICBUZXh0UnVuIHJ1biA9IFJl
bmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHRleHQsIGZyb20sIGxlbiwg
c3R5bGUpOworICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3RoKHRleHQtPnRleHRMZW5ndGgoKSAt
IGZyb20pOworICAgIEFTU0VSVChydW4uY2hhcmFjdGVyc0xlbmd0aCgpID49IHJ1bi5sZW5ndGgo
KSk7CisKKyAgICBydW4uc2V0Q2hhcmFjdGVyU2NhbkZvckNvZGVQYXRoKCF0ZXh0LT5jYW5Vc2VT
aW1wbGVGb250Q29kZVBhdGgoKSk7CisgICAgcnVuLnNldFRhYlNpemUoIWNvbGxhcHNlV2hpdGVT
cGFjZSwgc3R5bGUudGFiU2l6ZSgpKTsKKyAgICBydW4uc2V0WFBvcyh4UG9zKTsKKyAgICByZXR1
cm4gZm9udC53aWR0aChydW4sICZmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdyk7Cit9CisK
Ky8vIEFkZGluZyBhIHBhaXIgb2YgbWlkcG9pbnRzIGJlZm9yZSBhIGNoYXJhY3RlciB3aWxsIHNw
bGl0IGl0IG91dCBpbnRvIGEgbmV3IGxpbmUgYm94LgoraW5saW5lIHZvaWQgZW5zdXJlQ2hhcmFj
dGVyR2V0c0xpbmVCb3goTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBJbmxp
bmVJdGVyYXRvciYgdGV4dFBhcmFncmFwaFNlcGFyYXRvcikKK3sKKyAgICBJbmxpbmVJdGVyYXRv
ciBtaWRwb2ludCgwLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fb2JqLCB0ZXh0UGFyYWdyYXBo
U2VwYXJhdG9yLm1fcG9zKTsKKyAgICBzdGFydElnbm9yaW5nU3BhY2VzKGxpbmVNaWRwb2ludFN0
YXRlLCBJbmxpbmVJdGVyYXRvcigwLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fb2JqLCB0ZXh0
UGFyYWdyYXBoU2VwYXJhdG9yLm1fcG9zIC0gMSkpOworICAgIHN0b3BJZ25vcmluZ1NwYWNlcyhs
aW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgdGV4dFBhcmFncmFwaFNlcGFyYXRv
ci5tX29iaiwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX3BvcykpOworfQorCit2b2lkIHRyeUh5
cGhlbmF0aW5nKFJlbmRlclRleHQqIHRleHQsIGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IEF0b21p
Y1N0cmluZyYgbG9jYWxlSWRlbnRpZmllciwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVk
TGluZXMsIGludCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0LCBpbnQgbWluaW11bVBy
ZWZpeExpbWl0LCBpbnQgbWluaW11bVN1ZmZpeExpbWl0LCB1bnNpZ25lZCBsYXN0U3BhY2UsIHVu
c2lnbmVkIHBvcywgZmxvYXQgeFBvcywgaW50IGF2YWlsYWJsZVdpZHRoLCBib29sIGlzRml4ZWRQ
aXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UsIGludCBsYXN0U3BhY2VXb3JkU3BhY2luZywg
SW5saW5lSXRlcmF0b3ImIGxpbmVCcmVhaywgaW50IG5leHRCcmVha2FibGUsIGJvb2wmIGh5cGhl
bmF0ZWQpCit7CisgICAgLy8gTWFwICdoeXBoZW5hdGUtbGltaXQte2JlZm9yZSxhZnRlcn06IGF1
dG87JyB0byAyLgorICAgIHVuc2lnbmVkIG1pbmltdW1QcmVmaXhMZW5ndGg7CisgICAgdW5zaWdu
ZWQgbWluaW11bVN1ZmZpeExlbmd0aDsKKworICAgIGlmIChtaW5pbXVtUHJlZml4TGltaXQgPCAw
KQorICAgICAgICBtaW5pbXVtUHJlZml4TGVuZ3RoID0gMjsKKyAgICBlbHNlCisgICAgICAgIG1p
bmltdW1QcmVmaXhMZW5ndGggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obWluaW11bVByZWZpeExp
bWl0KTsKKworICAgIGlmIChtaW5pbXVtU3VmZml4TGltaXQgPCAwKQorICAgICAgICBtaW5pbXVt
U3VmZml4TGVuZ3RoID0gMjsKKyAgICBlbHNlCisgICAgICAgIG1pbmltdW1TdWZmaXhMZW5ndGgg
PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obWluaW11bVN1ZmZpeExpbWl0KTsKKworICAgIGlmIChw
b3MgLSBsYXN0U3BhY2UgPD0gbWluaW11bVN1ZmZpeExlbmd0aCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzTGltaXQgPj0gMCAmJiBjb25zZWN1
dGl2ZUh5cGhlbmF0ZWRMaW5lcyA+PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXNMaW1pdCkpCisgICAgICAgIHJldHVybjsKKworICAgIGludCBoeXBoZW5X
aWR0aCA9IG1lYXN1cmVIeXBoZW5XaWR0aCh0ZXh0LCBmb250KTsKKworICAgIGZsb2F0IG1heFBy
ZWZpeFdpZHRoID0gYXZhaWxhYmxlV2lkdGggLSB4UG9zIC0gaHlwaGVuV2lkdGggLSBsYXN0U3Bh
Y2VXb3JkU3BhY2luZzsKKyAgICAvLyBJZiB0aGUgbWF4aW11bSB3aWR0aCBhdmFpbGFibGUgZm9y
IHRoZSBwcmVmaXggYmVmb3JlIHRoZSBoeXBoZW4gaXMgc21hbGwsIHRoZW4gaXQgaXMgdmVyeSB1
bmxpa2VseQorICAgIC8vIHRoYXQgYW4gaHlwaGVuYXRpb24gb3Bwb3J0dW5pdHkgZXhpc3RzLCBz
byBkbyBub3QgYm90aGVyIHRvIGxvb2sgZm9yIGl0LgorICAgIGlmIChtYXhQcmVmaXhXaWR0aCA8
PSBmb250LnBpeGVsU2l6ZSgpICogNSAvIDQpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0
IFJlbmRlclN0eWxlJiBzdHlsZSA9IHRleHQtPnN0eWxlKCk7CisgICAgVGV4dFJ1biBydW4gPSBS
ZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bih0ZXh0LCBmb250LCB0ZXh0LCBsYXN0U3BhY2Us
IHBvcyAtIGxhc3RTcGFjZSwgc3R5bGUpOworICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3RoKHRl
eHQtPnRleHRMZW5ndGgoKSAtIGxhc3RTcGFjZSk7CisgICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJz
TGVuZ3RoKCkgPj0gcnVuLmxlbmd0aCgpKTsKKworICAgIHJ1bi5zZXRUYWJTaXplKCFjb2xsYXBz
ZVdoaXRlU3BhY2UsIHN0eWxlLnRhYlNpemUoKSk7CisgICAgcnVuLnNldFhQb3MoeFBvcyArIGxh
c3RTcGFjZVdvcmRTcGFjaW5nKTsKKworICAgIHVuc2lnbmVkIHByZWZpeExlbmd0aCA9IGZvbnQu
b2Zmc2V0Rm9yUG9zaXRpb24ocnVuLCBtYXhQcmVmaXhXaWR0aCwgZmFsc2UpOworICAgIGlmIChw
cmVmaXhMZW5ndGggPCBtaW5pbXVtUHJlZml4TGVuZ3RoKQorICAgICAgICByZXR1cm47CisKKyAg
ICBwcmVmaXhMZW5ndGggPSBsYXN0SHlwaGVuTG9jYXRpb24odGV4dC0+Y2hhcmFjdGVycygpICsg
bGFzdFNwYWNlLCBwb3MgLSBsYXN0U3BhY2UsIHN0ZDo6bWluKHByZWZpeExlbmd0aCwgcG9zIC0g
bGFzdFNwYWNlIC0gbWluaW11bVN1ZmZpeExlbmd0aCkgKyAxLCBsb2NhbGVJZGVudGlmaWVyKTsK
KyAgICBpZiAoIXByZWZpeExlbmd0aCB8fCBwcmVmaXhMZW5ndGggPCBtaW5pbXVtUHJlZml4TGVu
Z3RoKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBXaGVuIGxhc3RTYXBjZSBpcyBhIHNwYWNl
LCB3aGljaCBpdCBhbHdheXMgaXMgZXhjZXB0IHNvbWV0aW1lcyBhdCB0aGUgYmVnaW5uaW5nIG9m
IGEgbGluZSBvciBhZnRlciBjb2xsYXBzZWQKKyAgICAvLyBzcGFjZSwgaXQgc2hvdWxkIG5vdCBj
b3VudCB0b3dhcmRzIGh5cGhlbmF0ZS1saW1pdC1iZWZvcmUuCisgICAgaWYgKHByZWZpeExlbmd0
aCA9PSBtaW5pbXVtUHJlZml4TGVuZ3RoKSB7CisgICAgICAgIFVDaGFyIGNoYXJhY3RlckF0TGFz
dFNwYWNlID0gdGV4dC0+Y2hhcmFjdGVyQXQobGFzdFNwYWNlKTsKKyAgICAgICAgaWYgKGNoYXJh
Y3RlckF0TGFzdFNwYWNlID09ICcgJyB8fCBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSAnXG4nIHx8
IGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICdcdCcgfHwgY2hhcmFjdGVyQXRMYXN0U3BhY2UgPT0g
bm9CcmVha1NwYWNlKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVChw
b3MgLSBsYXN0U3BhY2UgLSBwcmVmaXhMZW5ndGggPj0gbWluaW11bVN1ZmZpeExlbmd0aCk7CisK
KyNpZiAhQVNTRVJUX0RJU0FCTEVECisgICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+
IGZhbGxiYWNrRm9udHM7CisgICAgZmxvYXQgcHJlZml4V2lkdGggPSBoeXBoZW5XaWR0aCArIHRl
eHRXaWR0aCh0ZXh0LCBsYXN0U3BhY2UsIHByZWZpeExlbmd0aCwgZm9udCwgeFBvcywgaXNGaXhl
ZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIGZhbGxiYWNrRm9udHMpICsgbGFzdFNwYWNlV29y
ZFNwYWNpbmc7CisgICAgQVNTRVJUKHhQb3MgKyBwcmVmaXhXaWR0aCA8PSBhdmFpbGFibGVXaWR0
aCk7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShpc0ZpeGVkUGl0Y2gpOworI2VuZGlmCisKKyAg
ICBsaW5lQnJlYWsubW92ZVRvKHRleHQsIGxhc3RTcGFjZSArIHByZWZpeExlbmd0aCwgbmV4dEJy
ZWFrYWJsZSk7CisgICAgaHlwaGVuYXRlZCA9IHRydWU7Cit9CisKK2lubGluZSBib29sIEJyZWFr
aW5nQ29udGV4dDo6aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRz
LCBib29sJiBoeXBoZW5hdGVkLCAgdW5zaWduZWQmIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVz
KQoreworICAgIGlmICghbV9jdXJyZW50Lm1fcG9zKQorICAgICAgICBtX2FwcGxpZWRTdGFydFdp
ZHRoID0gZmFsc2U7CisKKyAgICBSZW5kZXJUZXh0KiByZW5kZXJUZXh0ID0gdG9SZW5kZXJUZXh0
KG1fY3VycmVudC5tX29iaik7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGJvb2wgaXNTVkdUZXh0
ID0gcmVuZGVyVGV4dC0+aXNTVkdJbmxpbmVUZXh0KCk7CisjZW5kaWYKKworICAgIC8vIElmIHdl
IGhhdmUgbGVmdCBhIG5vLXdyYXAgaW5saW5lIGFuZCBlbnRlcmVkIGFuIGF1dG93cmFwIGlubGlu
ZSB3aGlsZSBpZ25vcmluZyBzcGFjZXMKKyAgICAvLyB0aGVuIHdlIG5lZWQgdG8gbWFyayB0aGUg
c3RhcnQgb2YgdGhlIGF1dG93cmFwIGlubGluZSBhcyBhIHBvdGVudGlhbCBsaW5lYnJlYWsgbm93
LgorICAgIGlmIChtX2F1dG9XcmFwICYmICFSZW5kZXJTdHlsZTo6YXV0b1dyYXAobV9sYXN0V1Mp
ICYmIG1faWdub3JpbmdTcGFjZXMpCisgICAgICAgIGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdp
ZHRoKG1fY3VycmVudC5tX29iaik7CisKKyAgICBpZiAocmVuZGVyVGV4dC0+c3R5bGUoKS5oYXNU
ZXh0Q29tYmluZSgpICYmIG1fY3VycmVudC5tX29iai0+aXNDb21iaW5lVGV4dCgpICYmICF0b1Jl
bmRlckNvbWJpbmVUZXh0KCptX2N1cnJlbnQubV9vYmopLmlzQ29tYmluZWQoKSkgeworICAgICAg
ICBSZW5kZXJDb21iaW5lVGV4dCYgY29tYmluZVJlbmRlcmVyID0gdG9SZW5kZXJDb21iaW5lVGV4
dCgqbV9jdXJyZW50Lm1fb2JqKTsKKyAgICAgICAgY29tYmluZVJlbmRlcmVyLmNvbWJpbmVUZXh0
KCk7CisgICAgICAgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHJlbmRlcmVyJ3MgdGV4dCBtYXkgaGF2
ZSBjaGFuZ2VkLiBJbmNyZW1lbnQgc3RhbGUgaXRlcmF0b3IgcG9zaXRpb25zCisgICAgICAgIGlm
IChpdGVyYXRvcklzQmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChtX2xpbmVCcmVhaywgY29t
YmluZVJlbmRlcmVyKSkgeworICAgICAgICAgICAgQVNTRVJUKGl0ZXJhdG9ySXNCZXlvbmRFbmRP
ZlJlbmRlckNvbWJpbmVUZXh0KG1fcmVzb2x2ZXIucG9zaXRpb24oKSwgY29tYmluZVJlbmRlcmVy
KSk7CisgICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgIG1f
cmVzb2x2ZXIuaW5jcmVtZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBSZW5k
ZXJTdHlsZSYgc3R5bGUgPSBsaW5lU3R5bGUoKnJlbmRlclRleHQtPnBhcmVudCgpLCBtX2xpbmVJ
bmZvKTsKKyAgICBjb25zdCBGb250JiBmb250ID0gc3R5bGUuZm9udCgpOworICAgIGJvb2wgaXNG
aXhlZFBpdGNoID0gZm9udC5pc0ZpeGVkUGl0Y2goKTsKKyAgICBib29sIGNhbkh5cGhlbmF0ZSA9
IHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBoZW5zQXV0byAmJiBXZWJDb3JlOjpjYW5IeXBoZW5hdGUo
c3R5bGUubG9jYWxlKCkpOworCisgICAgdW5zaWduZWQgbGFzdFNwYWNlID0gbV9jdXJyZW50Lm1f
cG9zOworICAgIGZsb2F0IHdvcmRTcGFjaW5nID0gbV9jdXJyZW50U3R5bGUtPndvcmRTcGFjaW5n
KCk7CisgICAgZmxvYXQgbGFzdFNwYWNlV29yZFNwYWNpbmcgPSAwOworICAgIGZsb2F0IHdvcmRT
cGFjaW5nRm9yV29yZE1lYXN1cmVtZW50ID0gMDsKKworICAgIGZsb2F0IHdyYXBXID0gbV93aWR0
aC51bmNvbW1pdHRlZFdpZHRoKCkgKyBpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50Lm1fb2Jq
LCAhbV9hcHBsaWVkU3RhcnRXaWR0aCwgdHJ1ZSk7CisgICAgZmxvYXQgY2hhcldpZHRoID0gMDsK
KyAgICBib29sIGJyZWFrTkJTUCA9IG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUtPm5ic3BN
b2RlKCkgPT0gU1BBQ0U7CisgICAgLy8gQXV0by13cmFwcGluZyB0ZXh0IHNob3VsZCB3cmFwIGlu
IHRoZSBtaWRkbGUgb2YgYSB3b3JkIG9ubHkgaWYgaXQgY291bGQgbm90IHdyYXAgYmVmb3JlIHRo
ZSB3b3JkLAorICAgIC8vIHdoaWNoIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHdvcmQgaXMgdGhl
IGZpcnN0IHRoaW5nIG9uIHRoZSBsaW5lLCB0aGF0IGlzLCBpZiB8d3wgaXMgemVyby4KKyAgICBi
b29sIGJyZWFrV29yZHMgPSBtX2N1cnJlbnRTdHlsZS0+YnJlYWtXb3JkcygpICYmICgobV9hdXRv
V3JhcCAmJiAhbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpKSB8fCBtX2N1cnJXUyA9PSBQUkUpOwor
ICAgIGJvb2wgbWlkV29yZEJyZWFrID0gZmFsc2U7CisgICAgYm9vbCBicmVha0FsbCA9IG1fY3Vy
cmVudFN0eWxlLT53b3JkQnJlYWsoKSA9PSBCcmVha0FsbFdvcmRCcmVhayAmJiBtX2F1dG9XcmFw
OworICAgIGZsb2F0IGh5cGhlbldpZHRoID0gMDsKKyNpZiBFTkFCTEUoU1ZHKQorICAgIGlmIChp
c1NWR1RleHQpIHsKKyAgICAgICAgYnJlYWtXb3JkcyA9IGZhbHNlOworICAgICAgICBicmVha0Fs
bCA9IGZhbHNlOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKG1fcmVuZGVyVGV4dEluZm8ubV90
ZXh0ICE9IHJlbmRlclRleHQpIHsKKyAgICAgICAgdXBkYXRlQ291bnRlcklmTmVlZGVkKCpyZW5k
ZXJUZXh0KTsKKyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX3RleHQgPSByZW5kZXJUZXh0Owor
ICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fZm9udCA9ICZmb250OworICAgICAgICBtX3JlbmRl
clRleHRJbmZvLm1fbGF5b3V0ID0gZm9udC5jcmVhdGVMYXlvdXQocmVuZGVyVGV4dCwgbV93aWR0
aC5jdXJyZW50V2lkdGgoKSwgbV9jb2xsYXBzZVdoaXRlU3BhY2UpOworICAgICAgICBtX3JlbmRl
clRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IucmVzZXRTdHJpbmdBbmRSZWxlYXNlSXRlcmF0
b3IocmVuZGVyVGV4dC0+dGV4dCgpLCBzdHlsZS5sb2NhbGUoKSk7CisgICAgfSBlbHNlIGlmICht
X3JlbmRlclRleHRJbmZvLm1fbGF5b3V0ICYmIG1fcmVuZGVyVGV4dEluZm8ubV9mb250ICE9ICZm
b250KSB7CisgICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9mb250ID0gJmZvbnQ7CisgICAgICAg
IG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgPSBmb250LmNyZWF0ZUxheW91dChyZW5kZXJUZXh0
LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSk7CisgICAgfQor
CisgICAgVGV4dExheW91dCogdGV4dExheW91dCA9IG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQu
Z2V0KCk7CisKKyAgICAvLyBOb24temVybyBvbmx5IHdoZW4ga2VybmluZyBpcyBlbmFibGVkIGFu
ZCBUZXh0TGF5b3V0IGlzbid0IHVzZWQsIGluIHdoaWNoIGNhc2Ugd2UgbWVhc3VyZQorICAgIC8v
IHdvcmRzIHdpdGggdGhlaXIgdHJhaWxpbmcgc3BhY2UsIHRoZW4gc3VidHJhY3QgaXRzIHdpZHRo
LgorICAgIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiBmYWxsYmFja0ZvbnRzOworICAg
IGZsb2F0IHdvcmRUcmFpbGluZ1NwYWNlV2lkdGggPSAoZm9udC50eXBlc2V0dGluZ0ZlYXR1cmVz
KCkgJiBLZXJuaW5nKSAmJiAhdGV4dExheW91dCA/IGZvbnQud2lkdGgoUmVuZGVyQmxvY2s6OmNv
bnN0cnVjdFRleHRSdW4ocmVuZGVyVGV4dCwgZm9udCwgJnNwYWNlLCAxLCBzdHlsZSksICZmYWxs
YmFja0ZvbnRzKSArIHdvcmRTcGFjaW5nIDogMDsKKworICAgIFVDaGFyIGxhc3RDaGFyYWN0ZXIg
PSBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IubGFzdENoYXJhY3RlcigpOwor
ICAgIFVDaGFyIHNlY29uZFRvTGFzdENoYXJhY3RlciA9IG1fcmVuZGVyVGV4dEluZm8ubV9saW5l
QnJlYWtJdGVyYXRvci5zZWNvbmRUb0xhc3RDaGFyYWN0ZXIoKTsKKyAgICBmb3IgKDsgbV9jdXJy
ZW50Lm1fcG9zIDwgcmVuZGVyVGV4dC0+dGV4dExlbmd0aCgpOyBtX2N1cnJlbnQuZmFzdEluY3Jl
bWVudEluVGV4dE5vZGUoKSkgeworICAgICAgICBib29sIHByZXZpb3VzQ2hhcmFjdGVySXNTcGFj
ZSA9IG1fY3VycmVudENoYXJhY3RlcklzU3BhY2U7CisgICAgICAgIGJvb2wgcHJldmlvdXNDaGFy
YWN0ZXJJc1dTID0gbV9jdXJyZW50Q2hhcmFjdGVySXNXUzsKKyAgICAgICAgVUNoYXIgYyA9IG1f
Y3VycmVudC5jdXJyZW50KCk7CisgICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgPSBj
ID09ICcgJyB8fCBjID09ICdcdCcgfHwgKCFtX3ByZXNlcnZlc05ld2xpbmUgJiYgKGMgPT0gJ1xu
JykpOworCisgICAgICAgIGlmICghbV9jb2xsYXBzZVdoaXRlU3BhY2UgfHwgIW1fY3VycmVudENo
YXJhY3RlcklzU3BhY2UpCisgICAgICAgICAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAm
bV9ibG9jaywgJm1fd2lkdGgpOworCisgICAgICAgIGlmIChjID09IHNvZnRIeXBoZW4gJiYgbV9h
dXRvV3JhcCAmJiAhaHlwaGVuV2lkdGggJiYgc3R5bGUuaHlwaGVucygpICE9IEh5cGhlbnNOb25l
KSB7CisgICAgICAgICAgICBoeXBoZW5XaWR0aCA9IG1lYXN1cmVIeXBoZW5XaWR0aChyZW5kZXJU
ZXh0LCBmb250LCAmZmFsbGJhY2tGb250cyk7CisgICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29t
bWl0dGVkV2lkdGgoaHlwaGVuV2lkdGgpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBhcHBs
eVdvcmRTcGFjaW5nID0gZmFsc2U7CisKKyAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyA9
IG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgfHwgKGJyZWFrTkJTUCAmJiBjID09IG5vQnJlYWtT
cGFjZSk7CisKKyAgICAgICAgaWYgKChicmVha0FsbCB8fCBicmVha1dvcmRzKSAmJiAhbWlkV29y
ZEJyZWFrICYmICghbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSB8fCBzdHlsZS53aGl0ZVNwYWNl
KCkgIT0gUFJFX1dSQVApKSB7CisgICAgICAgICAgICB3cmFwVyArPSBjaGFyV2lkdGg7CisgICAg
ICAgICAgICBib29sIG1pZFdvcmRCcmVha0lzQmVmb3JlU3Vycm9nYXRlUGFpciA9IFUxNl9JU19M
RUFEKGMpICYmIG1fY3VycmVudC5tX3BvcyArIDEgPCByZW5kZXJUZXh0LT50ZXh0TGVuZ3RoKCkg
JiYgVTE2X0lTX1RSQUlMKCgqcmVuZGVyVGV4dClbbV9jdXJyZW50Lm1fcG9zICsgMV0pOworICAg
ICAgICAgICAgY2hhcldpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIG1fY3VycmVudC5tX3Bv
cywgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID8gMiA6IDEsIGZvbnQsIG1fd2lk
dGguY29tbWl0dGVkV2lkdGgoKSArIHdyYXBXLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0
ZVNwYWNlLCBmYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKKyAgICAgICAgICAgIG1pZFdvcmRC
cmVhayA9IG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSArIHdyYXBXICsgY2hhcldpZHRoID4gbV93
aWR0aC5hdmFpbGFibGVXaWR0aCgpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBiZXR3ZWVu
V29yZHMgPSBjID09ICdcbicgfHwgKG1fY3VycldTICE9IFBSRSAmJiAhbV9hdFN0YXJ0ICYmIGlz
QnJlYWthYmxlKG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvciwgbV9jdXJyZW50
Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24sIGJyZWFrTkJTUCkKKyAg
ICAgICAgICAgICYmIChzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUgfHwgKG1fY3VycmVu
dC5wcmV2aW91c0luU2FtZU5vZGUoKSAhPSBzb2Z0SHlwaGVuKSkpOworCisgICAgICAgIGlmIChi
ZXR3ZWVuV29yZHMgfHwgbWlkV29yZEJyZWFrKSB7CisgICAgICAgICAgICBib29sIHN0b3BwZWRJ
Z25vcmluZ1NwYWNlcyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMp
IHsKKyAgICAgICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IDA7CisgICAgICAgICAg
ICAgICAgaWYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKSB7CisgICAgICAgICAgICAgICAg
ICAgIC8vIFN0b3AgaWdub3Jpbmcgc3BhY2VzIGFuZCBiZWdpbiBhdCB0aGlzCisgICAgICAgICAg
ICAgICAgICAgIC8vIG5ldyBwb2ludC4KKyAgICAgICAgICAgICAgICAgICAgbV9pZ25vcmluZ1Nw
YWNlcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB3b3JkU3BhY2luZ0ZvcldvcmRNZWFz
dXJlbWVudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZSA9IG1fY3VycmVudC5t
X3BvczsgLy8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQgaW4gYW55IG9mIHRoZSBpZ25v
cmVkIHNwYWNlcy4KKyAgICAgICAgICAgICAgICAgICAgc3RvcElnbm9yaW5nU3BhY2VzKG1fbGlu
ZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5tX29iaiwgbV9jdXJy
ZW50Lm1fcG9zKSk7CisgICAgICAgICAgICAgICAgICAgIHN0b3BwZWRJZ25vcmluZ1NwYWNlcyA9
IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8g
SnVzdCBrZWVwIGlnbm9yaW5nIHRoZXNlIHNwYWNlcy4KKyAgICAgICAgICAgICAgICAgICAgbmV4
dENoYXJhY3RlcihjLCBsYXN0Q2hhcmFjdGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpOworICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudHMuZ3Jvdyh3b3JkTWVhc3VyZW1lbnRz
LnNpemUoKSArIDEpOworICAgICAgICAgICAgV29yZE1lYXN1cmVtZW50JiB3b3JkTWVhc3VyZW1l
bnQgPSB3b3JkTWVhc3VyZW1lbnRzLmxhc3QoKTsKKworICAgICAgICAgICAgd29yZE1lYXN1cmVt
ZW50LnJlbmRlcmVyID0gcmVuZGVyVGV4dDsKKyAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5l
bmRPZmZzZXQgPSBtX2N1cnJlbnQubV9wb3M7CisgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQu
c3RhcnRPZmZzZXQgPSBsYXN0U3BhY2U7CisKKyAgICAgICAgICAgIGZsb2F0IGFkZGl0aW9uYWxU
ZW1wV2lkdGg7CisgICAgICAgICAgICBpZiAod29yZFRyYWlsaW5nU3BhY2VXaWR0aCAmJiBjID09
ICcgJykKKyAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVGVtcFdpZHRoID0gdGV4dFdpZHRoKHJl
bmRlclRleHQsIGxhc3RTcGFjZSwgbV9jdXJyZW50Lm1fcG9zICsgMSAtIGxhc3RTcGFjZSwgZm9u
dCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVT
cGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpIC0gd29yZFRy
YWlsaW5nU3BhY2VXaWR0aDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhZGRp
dGlvbmFsVGVtcFdpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIGxhc3RTcGFjZSwgbV9jdXJy
ZW50Lm1fcG9zIC0gbGFzdFNwYWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0Zp
eGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tG
b250cywgdGV4dExheW91dCk7CisKKyAgICAgICAgICAgIGlmICh3b3JkTWVhc3VyZW1lbnQuZmFs
bGJhY2tGb250cy5pc0VtcHR5KCkgJiYgIWZhbGxiYWNrRm9udHMuaXNFbXB0eSgpKQorICAgICAg
ICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLnN3YXAoZmFsbGJhY2tGb250
cyk7CisgICAgICAgICAgICBmYWxsYmFja0ZvbnRzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIHdv
cmRNZWFzdXJlbWVudC53aWR0aCA9IGFkZGl0aW9uYWxUZW1wV2lkdGggKyB3b3JkU3BhY2luZ0Zv
cldvcmRNZWFzdXJlbWVudDsKKyAgICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggKz0gbGFz
dFNwYWNlV29yZFNwYWNpbmc7CisgICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lk
dGgoYWRkaXRpb25hbFRlbXBXaWR0aCk7CisKKyAgICAgICAgICAgIGlmIChtX2NvbGxhcHNlV2hp
dGVTcGFjZSAmJiBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UgJiYgbV9jdXJyZW50Q2hhcmFjdGVy
SXNTcGFjZSAmJiBhZGRpdGlvbmFsVGVtcFdpZHRoKQorICAgICAgICAgICAgICAgIG1fd2lkdGgu
c2V0VHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0aCk7CisKKyAgICAg
ICAgICAgIGlmICghbV9hcHBsaWVkU3RhcnRXaWR0aCkgeworICAgICAgICAgICAgICAgIG1fd2lk
dGguYWRkVW5jb21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50Lm1fb2Jq
LCB0cnVlLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIG1fYXBwbGllZFN0YXJ0V2lkdGggPSB0
cnVlOworICAgICAgICAgICAgfQorCisjaWYgRU5BQkxFKENTU19TSEFQRVMpCisgICAgICAgICAg
ICBpZiAobV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKQorICAgICAgICAgICAgICAgIHVwZGF0
ZVNlZ21lbnRzRm9yU2hhcGVzKG1fYmxvY2ssIG1fbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwg
d29yZE1lYXN1cmVtZW50cywgbV93aWR0aCwgbV9saW5lSW5mby5pc0ZpcnN0TGluZSgpKTsKKyNl
bmRpZgorICAgICAgICAgICAgYXBwbHlXb3JkU3BhY2luZyA9IHdvcmRTcGFjaW5nICYmIG1fY3Vy
cmVudENoYXJhY3RlcklzU3BhY2U7CisKKyAgICAgICAgICAgIGlmICghbV93aWR0aC5jb21taXR0
ZWRXaWR0aCgpICYmIG1fYXV0b1dyYXAgJiYgIW1fd2lkdGguZml0c09uTGluZSgpKQorICAgICAg
ICAgICAgICAgIG1fd2lkdGguZml0QmVsb3dGbG9hdHMoKTsKKworICAgICAgICAgICAgaWYgKG1f
YXV0b1dyYXAgfHwgYnJlYWtXb3JkcykgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGJyZWFr
IG9ubHkgYWZ0ZXIgd2hpdGUtc3BhY2UsIGNvbnNpZGVyIHRoZSBjdXJyZW50IGNoYXJhY3Rlcgor
ICAgICAgICAgICAgICAgIC8vIGFzIGNhbmRpZGF0ZSB3aWR0aCBmb3IgdGhpcyBsaW5lLgorICAg
ICAgICAgICAgICAgIGJvb2wgbGluZVdhc1Rvb1dpZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAg
ICBpZiAobV93aWR0aC5maXRzT25MaW5lKCkgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAm
JiBtX2N1cnJlbnRTdHlsZS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkgJiYgIW1pZFdvcmRC
cmVhaykgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBjaGFyV2lkdGggPSB0ZXh0V2lkdGgo
cmVuZGVyVGV4dCwgbV9jdXJyZW50Lm1fcG9zLCAxLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0
aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQu
ZmFsbGJhY2tGb250cywgdGV4dExheW91dCkgKyAoYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFj
aW5nIDogMCk7CisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGxpbmUgaXMgdG9vIGJp
ZyBldmVuIHdpdGhvdXQgdGhlIGV4dHJhIHNwYWNlCisgICAgICAgICAgICAgICAgICAgIC8vIGF0
IHRoZSBlbmQgb2YgdGhlIGxpbmUuIElmIGl0IGlzIG5vdCwgZG8gbm90aGluZy4KKyAgICAgICAg
ICAgICAgICAgICAgLy8gSWYgdGhlIGxpbmUgbmVlZHMgdGhlIGV4dHJhIHdoaXRlc3BhY2UgdG8g
YmUgdG9vIGxvbmcsCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gbW92ZSB0aGUgbGluZSBi
cmVhayB0byB0aGUgc3BhY2UgYW5kIHNraXAgYWxsCisgICAgICAgICAgICAgICAgICAgIC8vIGFk
ZGl0aW9uYWwgd2hpdGVzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3dpZHRoLmZp
dHNPbkxpbmVJbmNsdWRpbmdFeHRyYVdpZHRoKGNoYXJXaWR0aCkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGxpbmVXYXNUb29XaWRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3BvcywgbV9j
dXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IG1fbGluZUJyZWFrZXIuc2tpcFRyYWlsaW5nV2hpdGVzcGFjZShtX2xpbmVCcmVhaywgbV9saW5l
SW5mbyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgaWYgKGxpbmVXYXNUb29XaWRlIHx8ICFtX3dpZHRoLmZpdHNPbkxpbmUoKSkgewor
ICAgICAgICAgICAgICAgICAgICBpZiAoY2FuSHlwaGVuYXRlICYmICFtX3dpZHRoLmZpdHNPbkxp
bmUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5SHlwaGVuYXRpbmcocmVuZGVyVGV4
dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBtX2Js
b2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCksIHN0eWxlLmh5cGhlbmF0aW9uTGltaXRC
ZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCksIGxhc3RTcGFjZSwgbV9jdXJy
ZW50Lm1fcG9zLCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpIC0gYWRkaXRpb25hbFRlbXBXaWR0aCwg
bV93aWR0aC5hdmFpbGFibGVXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNw
YWNlLCBsYXN0U3BhY2VXb3JkU3BhY2luZywgbV9saW5lQnJlYWssIG1fY3VycmVudC5tX25leHRC
cmVha2FibGVQb3NpdGlvbiwgbV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQpOworICAgICAgICAg
ICAgICAgICAgICAgICAgaWYgKG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVhay5hdFRl
eHRQYXJhZ3JhcGhTZXBhcmF0b3IoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFz
dG9wcGVkSWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50Lm1fcG9zID4gMCkKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBlbnN1cmVDaGFyYWN0ZXJHZXRzTGluZUJveChtX2xpbmVNaWRwb2lu
dFN0YXRlLCBtX2N1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsu
aW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVJbmZvLnNldFByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRN
ZWFzdXJlbWVudC5lbmRPZmZzZXQgPSBtX2xpbmVCcmVhay5tX3BvczsKKyAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWsubV9vYmogJiYgbV9s
aW5lQnJlYWsubV9wb3MgJiYgbV9saW5lQnJlYWsubV9vYmotPmlzVGV4dCgpICYmIHRvUmVuZGVy
VGV4dChtX2xpbmVCcmVhay5tX29iaiktPnRleHRMZW5ndGgoKSAmJiB0b1JlbmRlclRleHQobV9s
aW5lQnJlYWsubV9vYmopLT5jaGFyYWN0ZXJBdChtX2xpbmVCcmVhay5tX3BvcyAtIDEpID09IHNv
ZnRIeXBoZW4gJiYgc3R5bGUuaHlwaGVucygpICE9IEh5cGhlbnNOb25lKQorICAgICAgICAgICAg
ICAgICAgICAgICAgaHlwaGVuYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmICht
X2xpbmVCcmVhay5tX3BvcyAmJiBtX2xpbmVCcmVhay5tX3BvcyAhPSAodW5zaWduZWQpd29yZE1l
YXN1cmVtZW50LmVuZE9mZnNldCAmJiAhd29yZE1lYXN1cmVtZW50LndpZHRoKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoY2hhcldpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm1fcG9zOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC53aWR0aCA9IGNoYXJXaWR0
aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgICAgICAvLyBEaWRuJ3QgZml0LiBKdW1wIHRvIHRoZSBlbmQgdW5sZXNzIHRo
ZXJlJ3Mgc3RpbGwgYW4gb3Bwb3J0dW5pdHkgdG8gY29sbGFwc2Ugd2hpdGVzcGFjZS4KKyAgICAg
ICAgICAgICAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMgfHwgIW1fY29sbGFwc2VXaGl0ZVNw
YWNlIHx8ICFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlIHx8ICFwcmV2aW91c0NoYXJhY3Rlcklz
U3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOworICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFiZXR3ZWVu
V29yZHMgfHwgKG1pZFdvcmRCcmVhayAmJiAhbV9hdXRvV3JhcCkpCisgICAgICAgICAgICAgICAg
ICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoLWFkZGl0aW9uYWxUZW1wV2lkdGgp
OworICAgICAgICAgICAgICAgICAgICBpZiAoaHlwaGVuV2lkdGgpIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIFN1YnRyYWN0IHRoZSB3aWR0aCBvZiB0aGUgc29mdCBoeXBoZW4gb3V0IHNp
bmNlIHdlIGZpdCBvbiBhIGxpbmUuCisgICAgICAgICAgICAgICAgICAgICAgICBtX3dpZHRoLmFk
ZFVuY29tbWl0dGVkV2lkdGgoLWh5cGhlbldpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGh5cGhlbldpZHRoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJyAmJiBtX3ByZXNl
cnZlc05ld2xpbmUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNl
cyAmJiBtX2N1cnJlbnQubV9wb3MgPiAwKQorICAgICAgICAgICAgICAgICAgICBlbnN1cmVDaGFy
YWN0ZXJHZXRzTGluZUJveChtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQpOworICAgICAg
ICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5t
X3BvcywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAg
ICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBtX2xpbmVJbmZvLnNl
dFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1fYXV0b1dyYXAgJiYgYmV0
d2VlbldvcmRzKSB7CisgICAgICAgICAgICAgICAgbV93aWR0aC5jb21taXQoKTsKKyAgICAgICAg
ICAgICAgICB3cmFwVyA9IDA7CisgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1f
Y3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxl
UG9zaXRpb24pOworICAgICAgICAgICAgICAgIC8vIEF1dG8td3JhcHBpbmcgdGV4dCBzaG91bGQg
bm90IHdyYXAgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgb25jZSBpdCBoYXMgaGFkIGFuCisgICAg
ICAgICAgICAgICAgLy8gb3Bwb3J0dW5pdHkgdG8gYnJlYWsgYWZ0ZXIgYSB3b3JkLgorICAgICAg
ICAgICAgICAgIGJyZWFrV29yZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgaWYgKG1pZFdvcmRCcmVhayAmJiAhVTE2X0lTX1RSQUlMKGMpICYmICEoVV9HRVRfR0NfTUFT
SyhjKSAmIFVfR0NfTV9NQVNLKSkgeworICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoaXMg
YXMgYSBicmVha2FibGUgcG9zaXRpb24gaW4gY2FzZQorICAgICAgICAgICAgICAgIC8vIGFkZGlu
ZyB0aGUgZW5kIHdpZHRoIGZvcmNlcyBhIGJyZWFrLgorICAgICAgICAgICAgICAgIG1fbGluZUJy
ZWFrLm1vdmVUbyhtX2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3BvcywgbV9jdXJyZW50Lm1f
bmV4dEJyZWFrYWJsZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBtaWRXb3JkQnJlYWsgJj0g
KGJyZWFrV29yZHMgfHwgYnJlYWtBbGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBp
ZiAoYmV0d2VlbldvcmRzKSB7CisgICAgICAgICAgICAgICAgbGFzdFNwYWNlV29yZFNwYWNpbmcg
PSBhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwOworICAgICAgICAgICAgICAgIHdv
cmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50ID0gKGFwcGx5V29yZFNwYWNpbmcgJiYgd29yZE1l
YXN1cmVtZW50LndpZHRoKSA/IHdvcmRTcGFjaW5nIDogMDsKKyAgICAgICAgICAgICAgICBsYXN0
U3BhY2UgPSBtX2N1cnJlbnQubV9wb3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlm
ICghbV9pZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VXaGl0ZVNwYWNl
KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBuZXdsaW5lLCBvciBp
ZiB3ZSBlbmNvdW50ZXIgYQorICAgICAgICAgICAgICAgIC8vIHNlY29uZCBzcGFjZSwgd2UgbmVl
ZCB0byBnbyBhaGVhZCBhbmQgYnJlYWsgdXAgdGhpcworICAgICAgICAgICAgICAgIC8vIHJ1biBh
bmQgZW50ZXIgYSBtb2RlIHdoZXJlIHdlIHN0YXJ0IGNvbGxhcHNpbmcgc3BhY2VzLgorICAgICAg
ICAgICAgICAgIGlmIChtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIHByZXZpb3VzQ2hhcmFj
dGVySXNTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0gdHJ1
ZTsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSBqdXN0IGVudGVyZWQgYSBtb2RlIHdoZXJl
IHdlIGFyZSBpZ25vcmluZworICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZXMuIENyZWF0ZSBh
IG1pZHBvaW50IHRvIHRlcm1pbmF0ZSB0aGUgcnVuCisgICAgICAgICAgICAgICAgICAgIC8vIGJl
Zm9yZSB0aGUgc2Vjb25kIHNwYWNlLgorICAgICAgICAgICAgICAgICAgICBzdGFydElnbm9yaW5n
U3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fc3RhcnRPZklnbm9yZWRTcGFjZXMpOworICAg
ICAgICAgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy51cGRhdGVNaWRwb2ludHNGb3JUcmFp
bGluZ0JveGVzKG1fbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKCksIFRyYWlsaW5n
T2JqZWN0czo6RG9Ob3RDb2xsYXBzZUZpcnN0U3BhY2UpOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtX2lnbm9yaW5nU3BhY2VzKSB7CisgICAg
ICAgICAgICAvLyBTdG9wIGlnbm9yaW5nIHNwYWNlcyBhbmQgYmVnaW4gYXQgdGhpcworICAgICAg
ICAgICAgLy8gbmV3IHBvaW50LgorICAgICAgICAgICAgbV9pZ25vcmluZ1NwYWNlcyA9IGZhbHNl
OworICAgICAgICAgICAgbGFzdFNwYWNlV29yZFNwYWNpbmcgPSBhcHBseVdvcmRTcGFjaW5nID8g
d29yZFNwYWNpbmcgOiAwOworICAgICAgICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1l
bnQgPSAoYXBwbHlXb3JkU3BhY2luZyAmJiB3b3JkTWVhc3VyZW1lbnRzLmxhc3QoKS53aWR0aCkg
PyB3b3JkU3BhY2luZyA6IDA7CisgICAgICAgICAgICBsYXN0U3BhY2UgPSBtX2N1cnJlbnQubV9w
b3M7IC8vIGUuZy4sICJGb28gICAgZ29vIiwgZG9uJ3QgYWRkIGluIGFueSBvZiB0aGUgaWdub3Jl
ZCBzcGFjZXMuCisgICAgICAgICAgICBzdG9wSWdub3JpbmdTcGFjZXMobV9saW5lTWlkcG9pbnRT
dGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3Mp
KTsKKyAgICAgICAgfQorI2lmIEVOQUJMRShTVkcpCisgICAgICAgIGlmIChpc1NWR1RleHQgJiYg
bV9jdXJyZW50Lm1fcG9zID4gMCkgeworICAgICAgICAgICAgLy8gRm9yY2UgY3JlYXRpb24gb2Yg
bmV3IElubGluZUJveGVzIGZvciBlYWNoIGFic29sdXRlIHBvc2l0aW9uZWQgY2hhcmFjdGVyICh0
aG9zZSB0aGF0IHN0YXJ0IG5ldyB0ZXh0IGNodW5rcykuCisgICAgICAgICAgICBpZiAodG9SZW5k
ZXJTVkdJbmxpbmVUZXh0KHJlbmRlclRleHQpLT5jaGFyYWN0ZXJTdGFydHNOZXdUZXh0Q2h1bmso
bV9jdXJyZW50Lm1fcG9zKSkKKyAgICAgICAgICAgICAgICBlbnN1cmVDaGFyYWN0ZXJHZXRzTGlu
ZUJveChtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQpOworICAgICAgICB9CisjZW5kaWYK
KworICAgICAgICBpZiAobV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhcHJldmlvdXNDaGFy
YWN0ZXJJc1NwYWNlKSB7CisgICAgICAgICAgICBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLm1fb2Jq
ID0gbV9jdXJyZW50Lm1fb2JqOworICAgICAgICAgICAgbV9zdGFydE9mSWdub3JlZFNwYWNlcy5t
X3BvcyA9IG1fY3VycmVudC5tX3BvczsKKyAgICAgICAgICAgIC8vIFNwYWNlcyBhZnRlciByaWdo
dC1hbGlnbmVkIHRleHQgYW5kIGJlZm9yZSBhIGxpbmUtYnJlYWsgZ2V0IGNvbGxhcHNlZCBhd2F5
IGNvbXBsZXRlbHkgc28gdGhhdCB0aGUgdHJhaWxpbmcKKyAgICAgICAgICAgIC8vIHNwYWNlIGRv
ZXNuJ3Qgc2VlbSB0byBwdXNoIHRoZSB0ZXh0IG91dCBmcm9tIHRoZSByaWdodC1oYW5kIGVkZ2Uu
CisgICAgICAgICAgICAvLyBGSVhNRTogRG8gdGhpcyByZWdhcmRsZXNzIG9mIHRoZSBjb250YWlu
ZXIncyBhbGlnbm1lbnQgLSB3aWxsIHJlcXVpcmUgcmViYXNlbGluaW5nIGEgbG90IG9mIHRlc3Qg
cmVzdWx0cy4KKyAgICAgICAgICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5p
c0JSKCkgJiYgKG1fYmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBSSUdIVCB8fCBtX2Jsb2NrU3R5
bGUudGV4dEFsaWduKCkgPT0gV0VCS0lUX1JJR0hUKSkgeworICAgICAgICAgICAgICAgIG1fc3Rh
cnRPZklnbm9yZWRTcGFjZXMubV9wb3MtLTsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdz
IGp1c3QgYSBzaW5nbGUgdHJhaWxpbmcgc3BhY2Ugc3RhcnQgaWdub3JpbmcgaXQgbm93IHNvIGl0
IGNvbGxhcHNlcyBhd2F5LgorICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnQubV9wb3MgPT0g
cmVuZGVyVGV4dC0+dGV4dExlbmd0aCgpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRJ
Z25vcmluZ1NwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2Vz
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbV9jdXJyZW50Q2hh
cmFjdGVySXNTcGFjZSAmJiBwcmV2aW91c0NoYXJhY3RlcklzV1MpIHsKKyAgICAgICAgICAgIGlm
IChtX2F1dG9XcmFwICYmIG1fY3VycmVudFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRlU3BhY2Uo
KSkKKyAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8obV9jdXJyZW50Lm1fb2JqLCBt
X2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2FibGVQb3NpdGlvbik7CisgICAg
ICAgIH0KKworICAgICAgICBpZiAobV9jb2xsYXBzZVdoaXRlU3BhY2UgJiYgbV9jdXJyZW50Q2hh
cmFjdGVySXNTcGFjZSAmJiAhbV9pZ25vcmluZ1NwYWNlcykKKyAgICAgICAgICAgIG1fdHJhaWxp
bmdPYmplY3RzLnNldFRyYWlsaW5nV2hpdGVzcGFjZSh0b1JlbmRlclRleHQobV9jdXJyZW50Lm1f
b2JqKSk7CisgICAgICAgIGVsc2UgaWYgKCFtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VXaGl0ZVNw
YWNlKCkgfHwgIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpCisgICAgICAgICAgICBtX3RyYWls
aW5nT2JqZWN0cy5jbGVhcigpOworCisgICAgICAgIG1fYXRTdGFydCA9IGZhbHNlOworICAgICAg
ICBuZXh0Q2hhcmFjdGVyKGMsIGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rlcik7
CisgICAgfQorCisgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLnNldFBy
aW9yQ29udGV4dChsYXN0Q2hhcmFjdGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpOworCisgICAg
d29yZE1lYXN1cmVtZW50cy5ncm93KHdvcmRNZWFzdXJlbWVudHMuc2l6ZSgpICsgMSk7CisgICAg
V29yZE1lYXN1cmVtZW50JiB3b3JkTWVhc3VyZW1lbnQgPSB3b3JkTWVhc3VyZW1lbnRzLmxhc3Qo
KTsKKyAgICB3b3JkTWVhc3VyZW1lbnQucmVuZGVyZXIgPSByZW5kZXJUZXh0OworCisgICAgLy8g
SU1QT1JUQU5UOiBjdXJyZW50Lm1fcG9zIGlzID4gbGVuZ3RoIGhlcmUhCisgICAgZmxvYXQgYWRk
aXRpb25hbFRlbXBXaWR0aCA9IG1faWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRoKHJlbmRl
clRleHQsIGxhc3RTcGFjZSwgbV9jdXJyZW50Lm1fcG9zIC0gbGFzdFNwYWNlLCBmb250LCBtX3dp
ZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCB3
b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91dCk7CisgICAgd29yZE1lYXN1
cmVtZW50LnN0YXJ0T2Zmc2V0ID0gbGFzdFNwYWNlOworICAgIHdvcmRNZWFzdXJlbWVudC5lbmRP
ZmZzZXQgPSBtX2N1cnJlbnQubV9wb3M7CisgICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0gbV9p
Z25vcmluZ1NwYWNlcyA/IDAgOiBhZGRpdGlvbmFsVGVtcFdpZHRoICsgd29yZFNwYWNpbmdGb3JX
b3JkTWVhc3VyZW1lbnQ7CisgICAgYWRkaXRpb25hbFRlbXBXaWR0aCArPSBsYXN0U3BhY2VXb3Jk
U3BhY2luZzsKKworICAgIGZsb2F0IGlubGluZUxvZ2ljYWxUZW1wV2lkdGggPSBpbmxpbmVMb2dp
Y2FsV2lkdGgobV9jdXJyZW50Lm1fb2JqLCAhbV9hcHBsaWVkU3RhcnRXaWR0aCwgbV9pbmNsdWRl
RW5kV2lkdGgpOworICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChhZGRpdGlvbmFsVGVt
cFdpZHRoICsgaW5saW5lTG9naWNhbFRlbXBXaWR0aCk7CisKKyAgICBpZiAod29yZE1lYXN1cmVt
ZW50LmZhbGxiYWNrRm9udHMuaXNFbXB0eSgpICYmICFmYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSkK
KyAgICAgICAgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuc3dhcChmYWxsYmFja0ZvbnRz
KTsKKyAgICBmYWxsYmFja0ZvbnRzLmNsZWFyKCk7CisKKyAgICBpZiAobV9jb2xsYXBzZVdoaXRl
U3BhY2UgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiBhZGRpdGlvbmFsVGVtcFdpZHRo
KQorICAgICAgICBtX3dpZHRoLnNldFRyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKGFkZGl0aW9uYWxU
ZW1wV2lkdGgsIGlubGluZUxvZ2ljYWxUZW1wV2lkdGgpOworCisgICAgbV9pbmNsdWRlRW5kV2lk
dGggPSBmYWxzZTsKKworICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lKCkpIHsKKyAgICAgICAg
aWYgKGNhbkh5cGhlbmF0ZSkKKyAgICAgICAgICAgIHRyeUh5cGhlbmF0aW5nKHJlbmRlclRleHQs
IGZvbnQsIHN0eWxlLmxvY2FsZSgpLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgbV9ibG9j
a1N0eWxlLmh5cGhlbmF0aW9uTGltaXRMaW5lcygpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVm
b3JlKCksIHN0eWxlLmh5cGhlbmF0aW9uTGltaXRBZnRlcigpLCBsYXN0U3BhY2UsIG1fY3VycmVu
dC5tX3BvcywgbV93aWR0aC5jdXJyZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lkdGgsIG1f
d2lkdGguYXZhaWxhYmxlV2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFj
ZSwgbGFzdFNwYWNlV29yZFNwYWNpbmcsIG1fbGluZUJyZWFrLCBtX2N1cnJlbnQubV9uZXh0QnJl
YWthYmxlUG9zaXRpb24sIG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKKworICAgICAgICBp
ZiAoIWh5cGhlbmF0ZWQgJiYgbV9saW5lQnJlYWsucHJldmlvdXNJblNhbWVOb2RlKCkgPT0gc29m
dEh5cGhlbiAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUpIHsKKyAgICAgICAgICAg
IGh5cGhlbmF0ZWQgPSB0cnVlOworICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7CisgICAgICAg
IH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCB0ZXh0QmVnaW5z
V2l0aEJyZWFrYWJsZVBvc2l0aW9uKFJlbmRlck9iamVjdCogbmV4dCkKK3sKKyAgICBBU1NFUlQo
bmV4dC0+aXNUZXh0KCkpOworICAgIFJlbmRlclRleHQqIG5leHRUZXh0ID0gdG9SZW5kZXJUZXh0
KG5leHQpOworICAgIGlmICghbmV4dFRleHQtPnRleHRMZW5ndGgoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIFVDaGFyIGMgPSBuZXh0VGV4dC0+Y2hhcmFjdGVyQXQoMCk7CisgICAgcmV0
dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCAoYyA9PSAnXG4nICYmICFuZXh0VGV4dC0+cHJl
c2VydmVzTmV3bGluZSgpKTsKK30KKworaW5saW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0OjpjYW5C
cmVha0F0VGhpc1Bvc2l0aW9uKCkKK3sKKyAgICAvLyBJZiB3ZSBhcmUgbm8td3JhcCBhbmQgaGF2
ZSBmb3VuZCBhIGxpbmUtYnJlYWtpbmcgb3Bwb3J0dW5pdHkgYWxyZWFkeSB0aGVuIHdlIHNob3Vs
ZCB0YWtlIGl0LgorICAgIGlmIChtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgJiYgIW1fd2lkdGgu
Zml0c09uTGluZShtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKSAmJiBtX2N1cnJXUyA9PSBOT1dS
QVApCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gQXZvaWQgYnJlYWtpbmcgYmVmb3Jl
IGVtcHR5IGlubGluZXMuCisgICAgaWYgKG1fbmV4dE9iamVjdCAmJiBtX25leHRPYmplY3QtPmlz
UmVuZGVySW5saW5lKCkgJiYgaXNFbXB0eUlubGluZSh0b1JlbmRlcklubGluZSgqbV9uZXh0T2Jq
ZWN0KSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFJldHVybiBlYXJseSBpZiB3
ZSBhdXRvd3JhcCBhbmQgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIGEgc3BhY2UgYXMgd2Ugd2ls
bCBhbHdheXMgd2FudCB0byBicmVhayBhdCBzdWNoIGEgcG9zaXRpb24uCisgICAgaWYgKG1fYXV0
b1dyYXAgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKKyAgICAgICAgcmV0dXJuIHRydWU7
CisKKyAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1fbmV4dE9iamVjdC0+aXNMaW5lQnJlYWtPcHBv
cnR1bml0eSgpKQorICAgICAgICByZXR1cm4gbV9hdXRvV3JhcDsKKworICAgIGJvb2wgbmV4dElz
QXV0b1dyYXBwaW5nVGV4dCA9IChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5pc1RleHQo
KSAmJiAobV9hdXRvV3JhcCB8fCBtX25leHRPYmplY3QtPnN0eWxlKCkuYXV0b1dyYXAoKSkpOwor
ICAgIGlmICghbmV4dElzQXV0b1dyYXBwaW5nVGV4dCkKKyAgICAgICAgcmV0dXJuIG1fYXV0b1dy
YXA7CisgICAgYm9vbCBjdXJyZW50SXNUZXh0T3JFbXB0eUlubGluZSA9IG1fY3VycmVudC5tX29i
ai0+aXNUZXh0KCkgfHwgKG1fY3VycmVudC5tX29iai0+aXNSZW5kZXJJbmxpbmUoKSAmJiBpc0Vt
cHR5SW5saW5lKHRvUmVuZGVySW5saW5lKCptX2N1cnJlbnQubV9vYmopKSk7CisgICAgaWYgKCFj
dXJyZW50SXNUZXh0T3JFbXB0eUlubGluZSkKKyAgICAgICAgcmV0dXJuIG1fYXV0b1dyYXA7CisK
KyAgICBib29sIGNhbkJyZWFrSGVyZSA9ICFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIHRl
eHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRpb24obV9uZXh0T2JqZWN0KTsKKworICAgIC8vIFNl
ZSBpZiBhdHRlbXB0aW5nIHRvIGZpdCBiZWxvdyBmbG9hdHMgY3JlYXRlcyBtb3JlIGF2YWlsYWJs
ZSB3aWR0aCBvbiB0aGUgbGluZS4KKyAgICBpZiAoIW1fd2lkdGguZml0c09uTGluZSgpICYmICFt
X3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpCisgICAgICAgIG1fd2lkdGguZml0QmVsb3dGbG9hdHMo
KTsKKworICAgIGJvb2wgY2FuUGxhY2VPbkxpbmUgPSBtX3dpZHRoLmZpdHNPbkxpbmUoKSB8fCAh
bV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lOworCisgICAgaWYgKGNhblBsYWNlT25MaW5lICYm
IGNhbkJyZWFrSGVyZSkKKyAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgobV9u
ZXh0T2JqZWN0KTsKKworICAgIHJldHVybiBjYW5CcmVha0hlcmU7Cit9CisKK2lubGluZSB2b2lk
IEJyZWFraW5nQ29udGV4dDo6Y29tbWl0QW5kVXBkYXRlTGluZUJyZWFrSWZOZWVkZWQoKQorewor
ICAgIGJvb2wgY2hlY2tGb3JCcmVhayA9IGNhbkJyZWFrQXRUaGlzUG9zaXRpb24oKTsKKworICAg
IGlmIChjaGVja0ZvckJyZWFrICYmICFtX3dpZHRoLmZpdHNPbkxpbmUobV9pZ25vcmluZ1NwYWNl
cykpIHsKKyAgICAgICAgLy8gaWYgd2UgaGF2ZSBmbG9hdHMsIHRyeSB0byBnZXQgYmVsb3cgdGhl
bS4KKyAgICAgICAgaWYgKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgIW1faWdub3JpbmdT
cGFjZXMgJiYgbV9jdXJyZW50U3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpKQorICAgICAgICAg
ICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKKworICAgICAgICBpZiAobV93aWR0aC5jb21t
aXR0ZWRXaWR0aCgpKSB7CisgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1fd2lkdGguZml0QmVsb3dGbG9hdHMoKTsK
KworICAgICAgICAvLyB8d2lkdGh8IG1heSBoYXZlIGJlZW4gYWRqdXN0ZWQgYmVjYXVzZSB3ZSBn
b3Qgc2hvdmVkIGRvd24gcGFzdCBhIGZsb2F0ICh0aHVzCisgICAgICAgIC8vIGdpdmluZyB1cyBt
b3JlIHJvb20pLCBzbyB3ZSBuZWVkIHRvIHJldGVzdCwgYW5kIG9ubHkganVtcCB0bworICAgICAg
ICAvLyB0aGUgZW5kIGxhYmVsIGlmIHdlIHN0aWxsIGRvbid0IGZpdCBvbiB0aGUgbGluZS4gLWR3
aAorICAgICAgICBpZiAoIW1fd2lkdGguZml0c09uTGluZShtX2lnbm9yaW5nU3BhY2VzKSkgewor
ICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKyAgICB9IGVsc2UgaWYgKG1fYmxvY2tTdHlsZS5hdXRvV3JhcCgpICYmICFtX3dpZHRoLmZp
dHNPbkxpbmUoKSAmJiAhbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpKSB7CisgICAgICAgIC8vIElm
IHRoZSBjb250YWluZXIgYXV0b3dyYXBzIGJ1dCB0aGUgY3VycmVudCBjaGlsZCBkb2VzIG5vdCB0
aGVuIHdlIHN0aWxsIG5lZWQgdG8gZW5zdXJlIHRoYXQgaXQKKyAgICAgICAgLy8gd3JhcHMgYW5k
IG1vdmVzIGJlbG93IGFueSBmbG9hdHMuCisgICAgICAgIG1fd2lkdGguZml0QmVsb3dGbG9hdHMo
KTsKKyAgICB9CisKKyAgICBpZiAoIW1fY3VycmVudC5tX29iai0+aXNGbG9hdGluZ09yT3V0T2ZG
bG93UG9zaXRpb25lZCgpKSB7CisgICAgICAgIG1fbGFzdE9iamVjdCA9IG1fY3VycmVudC5tX29i
ajsKKyAgICAgICAgaWYgKG1fbGFzdE9iamVjdC0+aXNSZXBsYWNlZCgpICYmIG1fYXV0b1dyYXAg
JiYgKCFtX2xhc3RPYmplY3QtPmlzSW1hZ2UoKSB8fCBtX2FsbG93SW1hZ2VzVG9CcmVhaykgJiYg
KCFtX2xhc3RPYmplY3QtPmlzTGlzdE1hcmtlcigpIHx8IHRvUmVuZGVyTGlzdE1hcmtlcigqbV9s
YXN0T2JqZWN0KS5pc0luc2lkZSgpKSkgeworICAgICAgICAgICAgbV93aWR0aC5jb21taXQoKTsK
KyAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUb1N0YXJ0T2YobV9uZXh0T2JqZWN0KTsKKyAg
ICAgICAgfQorICAgIH0KK30KKworaW5saW5lIHZvaWQgY2hlY2tNaWRwb2ludHMoTGluZU1pZHBv
aW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvciYgbEJyZWFrKQorewor
ICAgIC8vIENoZWNrIHRvIHNlZSBpZiBvdXIgbGFzdCBtaWRwb2ludCBpcyBhIHN0YXJ0IHBvaW50
IGJleW9uZCB0aGUgbGluZSBicmVhay4gSWYgc28sCisgICAgLy8gc2hhdmUgaXQgb2ZmIHRoZSBs
aXN0LCBhbmQgc2hhdmUgb2ZmIGEgdHJhaWxpbmcgc3BhY2UgaWYgdGhlIHByZXZpb3VzIGVuZCBw
b2ludCBkb2Vzbid0CisgICAgLy8gcHJlc2VydmUgd2hpdGVzcGFjZS4KKyAgICBpZiAobEJyZWFr
Lm1fb2JqICYmIGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAmJiAhKGxpbmVNaWRwb2lu
dFN0YXRlLm51bU1pZHBvaW50cyAlIDIpKSB7CisgICAgICAgIElubGluZUl0ZXJhdG9yKiBtaWRw
b2ludHMgPSBsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHMuZGF0YSgpOworICAgICAgICBJbmxp
bmVJdGVyYXRvciYgZW5kcG9pbnQgPSBtaWRwb2ludHNbbGluZU1pZHBvaW50U3RhdGUubnVtTWlk
cG9pbnRzIC0gMl07CisgICAgICAgIGNvbnN0IElubGluZUl0ZXJhdG9yJiBzdGFydHBvaW50ID0g
bWlkcG9pbnRzW2xpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAtIDFdOworICAgICAgICBJ
bmxpbmVJdGVyYXRvciBjdXJycG9pbnQgPSBlbmRwb2ludDsKKyAgICAgICAgd2hpbGUgKCFjdXJy
cG9pbnQuYXRFbmQoKSAmJiBjdXJycG9pbnQgIT0gc3RhcnRwb2ludCAmJiBjdXJycG9pbnQgIT0g
bEJyZWFrKQorICAgICAgICAgICAgY3VycnBvaW50LmluY3JlbWVudCgpOworICAgICAgICBpZiAo
Y3VycnBvaW50ID09IGxCcmVhaykgeworICAgICAgICAgICAgLy8gV2UgaGl0IHRoZSBsaW5lIGJy
ZWFrIGJlZm9yZSB0aGUgc3RhcnQgcG9pbnQuIFNoYXZlIG9mZiB0aGUgc3RhcnQgcG9pbnQuCisg
ICAgICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMtLTsKKyAgICAgICAgICAg
IGlmIChlbmRwb2ludC5tX29iai0+c3R5bGUoKS5jb2xsYXBzZVdoaXRlU3BhY2UoKSAmJiBlbmRw
b2ludC5tX29iai0+aXNUZXh0KCkpCisgICAgICAgICAgICAgICAgZW5kcG9pbnQubV9wb3MtLTsK
KyAgICAgICAgfQorICAgIH0KK30KKworSW5saW5lSXRlcmF0b3IgQnJlYWtpbmdDb250ZXh0Ojpo
YW5kbGVFbmRPZkxpbmUoKQoreworI2lmIEVOQUJMRShDU1NfU0hBUEVTKQorICAgIFNoYXBlSW5z
aWRlSW5mbyogc2hhcGVJbmZvID0gbV9ibG9jay5sYXlvdXRTaGFwZUluc2lkZUluZm8oKTsKKyAg
ICBib29sIHNlZ21lbnRBbGxvd3NPdmVyZmxvdyA9ICFzaGFwZUluZm8gfHwgIXNoYXBlSW5mby0+
aGFzU2VnbWVudHMoKTsKKyNlbHNlCisgICAgYm9vbCBzZWdtZW50QWxsb3dzT3ZlcmZsb3cgPSB0
cnVlOworI2VuZGlmCisgICAgaWYgKHNlZ21lbnRBbGxvd3NPdmVyZmxvdykgeworICAgICAgICBp
ZiAobV9saW5lQnJlYWsgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigpKSB7CisgICAgICAgICAgICBp
ZiAoIW1fbGluZUJyZWFrLm1fb2JqIHx8ICFtX2xpbmVCcmVhay5tX29iai0+aXNCUigpKSB7Cisg
ICAgICAgICAgICAgICAgLy8gd2UganVzdCBhZGQgYXMgbXVjaCBhcyBwb3NzaWJsZQorICAgICAg
ICAgICAgICAgIGlmIChtX2Jsb2NrU3R5bGUud2hpdGVTcGFjZSgpID09IFBSRSAmJiAhbV9jdXJy
ZW50Lm1fcG9zKSB7CisgICAgICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2xh
c3RPYmplY3QsIG1fbGFzdE9iamVjdC0+aXNUZXh0KCkgPyBtX2xhc3RPYmplY3QtPmxlbmd0aCgp
IDogMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX2xpbmVCcmVhay5tX29iaikgewor
ICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBldmVyIGJyZWFrIGluIHRoZSBtaWRkbGUgb2Yg
YSB3b3JkIGlmIHdlIGNhbiBoZWxwIGl0LgorICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSdz
IG5vIHJvb20gYXQgYWxsLiBXZSBqdXN0IGhhdmUgdG8gYmUgb24gdGhpcyBsaW5lLAorICAgICAg
ICAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCB3ZSdsbCBzcGlsbCBvdXQuCisgICAgICAgICAg
ICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5t
X3Bvcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8g
bWFrZSBzdXJlIHdlIGNvbnN1bWUgYXQgbGVhc3Qgb25lIGNoYXIvb2JqZWN0LgorICAgICAgICAg
ICAgaWYgKG1fbGluZUJyZWFrID09IG1fcmVzb2x2ZXIucG9zaXRpb24oKSkKKyAgICAgICAgICAg
ICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAgfSBlbHNlIGlmICghbV9jdXJy
ZW50Lm1fcG9zICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgJiYgbV93aWR0aC51bmNvbW1p
dHRlZFdpZHRoKCkgJiYgIW1faGFkVW5jb21taXR0ZWRXaWR0aEJlZm9yZUN1cnJlbnQpIHsKKyAg
ICAgICAgICAgIC8vIERvIG5vdCBwdXNoIHRoZSBjdXJyZW50IG9iamVjdCB0byB0aGUgbmV4dCBs
aW5lLCB3aGVuIHRoaXMgbGluZSBoYXMgc29tZSBjb250ZW50LCBidXQgaXQgaXMgc3RpbGwgY29u
c2lkZXJlZCBlbXB0eS4KKyAgICAgICAgICAgIC8vIEVtcHR5IGlubGluZSBlbGVtZW50cyBsaWtl
IDxzcGFuPjwvc3Bhbj4gY2FuIHByb2R1Y2Ugc3VjaCBsaW5lcyBhbmQgbm93IHdlIGp1c3QgaWdu
b3JlIHRoZXNlIGJyZWFrIG9wcG9ydHVuaXRpZXMKKyAgICAgICAgICAgIC8vIGF0IHRoZSBzdGFy
dCBvZiBhIGxpbmUsIGlmIG5vIHdpZHRoIGhhcyBiZWVuIGNvbW1pdHRlZCB5ZXQuCisgICAgICAg
ICAgICAvLyBCZWhhdmUgYXMgaWYgaXQgd2FzIGFjdHVhbGx5IGVtcHR5IGFuZCBjb25zdW1lIGF0
IGxlYXN0IG9uZSBvYmplY3QuCisgICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNhbml0eSBjaGVjayBvdXIgbWlkcG9pbnRzLgor
ICAgIGNoZWNrTWlkcG9pbnRzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fbGluZUJyZWFrKTsKKwor
ICAgIG1fdHJhaWxpbmdPYmplY3RzLnVwZGF0ZU1pZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMobV9s
aW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5lQnJlYWssIFRyYWlsaW5nT2JqZWN0czo6Q29sbGFwc2VG
aXJzdFNwYWNlKTsKKworICAgIC8vIFdlIG1pZ2h0IGhhdmUgbWFkZSBsaW5lQnJlYWsgYW4gaXRl
cmF0b3IgdGhhdCBwb2ludHMgcGFzdCB0aGUgZW5kCisgICAgLy8gb2YgdGhlIG9iamVjdC4gRG8g
dGhpcyBhZGp1c3RtZW50IHRvIG1ha2UgaXQgcG9pbnQgdG8gdGhlIHN0YXJ0CisgICAgLy8gb2Yg
dGhlIG5leHQgb2JqZWN0IGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW5nIHRoZSByZXN0IG9mIHRo
ZQorICAgIC8vIGNvZGUuCisgICAgaWYgKG1fbGluZUJyZWFrLm1fcG9zID4gMCkgeworICAgICAg
ICBtX2xpbmVCcmVhay5tX3Bvcy0tOworICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsK
KyAgICB9CisKKyAgICByZXR1cm4gbV9saW5lQnJlYWs7Cit9CisKK30KKworI2VuZGlmIC8vIEJy
ZWFraW5nQ29udGV4dElubGluZUhlYWRlcnNfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L2xpbmUvTGluZUJyZWFrZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LmNiOTNiYmMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGlu
ZS9MaW5lQnJlYWtlci5jcHAKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwMCBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAy
MDA0LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJp
Z2h0IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hhbmdTZW9rIE9oIDxzaGl2YW1p
ZG93QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluYy4g
QWxsIHJpZ2h0IHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkxp
bmVCcmVha2VyLmgiCisKKyNpbmNsdWRlICJSZW5kZXJDb21iaW5lVGV4dC5oIgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK3ZvaWQgTGluZUJyZWFrZXI6OnJlc2V0KCkKK3sKKyAgICBtX3Bvc2l0
aW9uZWRPYmplY3RzLmNsZWFyKCk7CisgICAgbV9oeXBoZW5hdGVkID0gZmFsc2U7CisgICAgbV9j
bGVhciA9IENOT05FOworfQorCisvLyBGSVhNRTogVGhlIGVudGlyZSBjb25jZXB0IG9mIHRoZSBz
a2lwVHJhaWxpbmdXaGl0ZXNwYWNlIGZ1bmN0aW9uIGlzIGZsYXdlZCwgc2luY2Ugd2UgcmVhbGx5
IG5lZWQgdG8gYmUgYnVpbGRpbmcKKy8vIGxpbmUgYm94ZXMgZXZlbiBmb3IgY29udGFpbmVycyB0
aGF0IG1heSB1bHRpbWF0ZWx5IGNvbGxhcHNlIGF3YXkuIE90aGVyd2lzZSB3ZSdsbCBuZXZlciBn
ZXQgcG9zaXRpb25lZAorLy8gZWxlbWVudHMgcXVpdGUgcmlnaHQuIEluIG90aGVyIHdvcmRzLCB3
ZSBuZWVkIHRvIGJ1aWxkIHRoaXMgZnVuY3Rpb24ncyB3b3JrIGludG8gdGhlIG5vcm1hbCBsaW5l
CisvLyBvYmplY3QgaXRlcmF0aW9uIHByb2Nlc3MuCisvLyBOQi4gdGhpcyBmdW5jdGlvbiB3aWxs
IGluc2VydCBhbnkgZmxvYXRpbmcgZWxlbWVudHMgdGhhdCB3b3VsZCBvdGhlcndpc2UKKy8vIGJl
IHNraXBwZWQgYnV0IGl0IHdpbGwgbm90IHBvc2l0aW9uIHRoZW0uCit2b2lkIExpbmVCcmVha2Vy
Ojpza2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiBpdGVyYXRvciwgY29uc3Qg
TGluZUluZm8mIGxpbmVJbmZvKQoreworICAgIHdoaWxlICghaXRlcmF0b3IuYXRFbmQoKSAmJiAh
cmVxdWlyZXNMaW5lQm94KGl0ZXJhdG9yLCBsaW5lSW5mbywgVHJhaWxpbmdXaGl0ZXNwYWNlKSkg
eworICAgICAgICBSZW5kZXJPYmplY3QmIG9iamVjdCA9ICppdGVyYXRvci5tX29iajsKKyAgICAg
ICAgaWYgKG9iamVjdC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHNldFN0
YXRpY1Bvc2l0aW9ucyhtX2Jsb2NrLCB0b1JlbmRlckJveChvYmplY3QpKTsKKyAgICAgICAgZWxz
ZSBpZiAob2JqZWN0LmlzRmxvYXRpbmcoKSkKKyAgICAgICAgICAgIG1fYmxvY2suaW5zZXJ0Rmxv
YXRpbmdPYmplY3QodG9SZW5kZXJCb3gob2JqZWN0KSk7CisgICAgICAgIGl0ZXJhdG9yLmluY3Jl
bWVudCgpOworICAgIH0KK30KKwordm9pZCBMaW5lQnJlYWtlcjo6c2tpcExlYWRpbmdXaGl0ZXNw
YWNlKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJbmZvJiBsaW5lSW5mbywgRmxv
YXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIExpbmVXaWR0aCYgd2lkdGgp
Cit7CisgICAgd2hpbGUgKCFyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkgJiYgIXJlcXVpcmVz
TGluZUJveChyZXNvbHZlci5wb3NpdGlvbigpLCBsaW5lSW5mbywgTGVhZGluZ1doaXRlc3BhY2Up
KSB7CisgICAgICAgIFJlbmRlck9iamVjdCYgb2JqZWN0ID0gKnJlc29sdmVyLnBvc2l0aW9uKCku
bV9vYmo7CisgICAgICAgIGlmIChvYmplY3QuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpIHsKKyAg
ICAgICAgICAgIHNldFN0YXRpY1Bvc2l0aW9ucyhtX2Jsb2NrLCB0b1JlbmRlckJveChvYmplY3Qp
KTsKKyAgICAgICAgICAgIGlmIChvYmplY3Quc3R5bGUoKS5pc09yaWdpbmFsRGlzcGxheUlubGlu
ZVR5cGUoKSkgeworICAgICAgICAgICAgICAgIHJlc29sdmVyLnJ1bnMoKS5hZGRSdW4obmV3IEJp
ZGlSdW4oMCwgMSwgb2JqZWN0LCByZXNvbHZlci5jb250ZXh0KCksIHJlc29sdmVyLmRpcigpKSk7
CisgICAgICAgICAgICAgICAgbGluZUluZm8uaW5jcmVtZW50UnVuc0Zyb21MZWFkaW5nV2hpdGVz
cGFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG9iamVjdC5pc0Zsb2F0
aW5nKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSB0b3AgbWFyZ2luIGVkZ2Ugb2YgYSBzZWxmLWNv
bGxhcHNpbmcgYmxvY2sgdGhhdCBjbGVhcnMgYSBmbG9hdCBpbnRydWRlcyB1cCBpbnRvIGl0IGJ5
IHRoZSBoZWlnaHQgb2YgdGhlIG1hcmdpbiwKKyAgICAgICAgICAgIC8vIHNvIGluIG9yZGVyIHRv
IHBsYWNlIHRoaXMgZmlyc3QgY2hpbGQgZmxvYXQgYXQgdGhlIHRvcCBjb250ZW50IGVkZ2Ugb2Yg
dGhlIHNlbGYtY29sbGFwc2luZyBibG9jayBhZGQgdGhlIG1hcmdpbiBiYWNrIGluIGJlZm9yZSBw
bGFjZW1lbnQuCisgICAgICAgICAgICBMYXlvdXRVbml0IG1hcmdpbk9mZnNldCA9ICghb2JqZWN0
LnByZXZpb3VzU2libGluZygpICYmIG1fYmxvY2suaXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkgJiYg
bV9ibG9jay5zdHlsZSgpLmNsZWFyKCkgJiYgbV9ibG9jay5nZXRDbGVhckRlbHRhKG1fYmxvY2ss
IExheW91dFVuaXQoKSkpID8gbV9ibG9jay5jb2xsYXBzZWRNYXJnaW5CZWZvcmVGb3JDaGlsZCht
X2Jsb2NrKSA6IExheW91dFVuaXQoKTsKKyAgICAgICAgICAgIExheW91dFVuaXQgb2xkTG9naWNh
bEhlaWdodCA9IG1fYmxvY2subG9naWNhbEhlaWdodCgpOworICAgICAgICAgICAgbV9ibG9jay5z
ZXRMb2dpY2FsSGVpZ2h0KG9sZExvZ2ljYWxIZWlnaHQgKyBtYXJnaW5PZmZzZXQpOworICAgICAg
ICAgICAgbV9ibG9jay5wb3NpdGlvbk5ld0Zsb2F0T25MaW5lKG1fYmxvY2suaW5zZXJ0RmxvYXRp
bmdPYmplY3QodG9SZW5kZXJCb3gob2JqZWN0KSksIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUs
IGxpbmVJbmZvLCB3aWR0aCk7CisgICAgICAgICAgICBtX2Jsb2NrLnNldExvZ2ljYWxIZWlnaHQo
b2xkTG9naWNhbEhlaWdodCk7CisgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0LmlzVGV4dCgpICYm
IG9iamVjdC5zdHlsZSgpLmhhc1RleHRDb21iaW5lKCkgJiYgb2JqZWN0LmlzQ29tYmluZVRleHQo
KSAmJiAhdG9SZW5kZXJDb21iaW5lVGV4dChvYmplY3QpLmlzQ29tYmluZWQoKSkgeworICAgICAg
ICAgICAgdG9SZW5kZXJDb21iaW5lVGV4dChvYmplY3QpLmNvbWJpbmVUZXh0KCk7CisgICAgICAg
ICAgICBpZiAodG9SZW5kZXJDb21iaW5lVGV4dChvYmplY3QpLmlzQ29tYmluZWQoKSkKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICByZXNvbHZlci5pbmNyZW1l
bnQoKTsKKyAgICB9CisgICAgcmVzb2x2ZXIuY29tbWl0RXhwbGljaXRFbWJlZGRpbmcoKTsKK30K
KworfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFr
ZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlY2ZiZQotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmgKQEAgLTAsMCArMSw3
OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBMYXJzIEtub2xsIChrbm9sbEBrZGUub3Jn
KQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAy
MDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChD
KSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTMgQ2hhbmdTZW9rIE9oIDxzaGl2YW1pZG93QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAo
QykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluYy4gQWxsIHJpZ2h0IHJlc2VydmVkLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg
KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg
Rmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRl
ZiBMaW5lQnJlYWtlcl9oCisjZGVmaW5lIExpbmVCcmVha2VyX2gKKworI2luY2x1ZGUgIklubGlu
ZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAiTGluZUluZm8uaCIKKyNpbmNsdWRlICJMaW5lSW5saW5l
SGVhZGVycy5oIgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitjbGFzcyBSZW5kZXJUZXh0OworCitzdHJ1Y3QgUmVuZGVyVGV4dEluZm8geworICAgIC8v
IERlc3RydWN0aW9uIG9mIG1fbGF5b3V0IHJlcXVpcmVzIFRleHRMYXlvdXQgdG8gYmUgYSBjb21w
bGV0ZSB0eXBlLCBzbyB0aGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgYXJlIG1hZGUgbm9u
LWlubGluZSB0byBhdm9pZCBjb21waWxhdGlvbiBlcnJvcnMuCisgICAgUmVuZGVyVGV4dEluZm8o
KTsKKyAgICB+UmVuZGVyVGV4dEluZm8oKTsKKworICAgIFJlbmRlclRleHQqIG1fdGV4dDsKKyAg
ICBPd25QdHI8VGV4dExheW91dD4gbV9sYXlvdXQ7CisgICAgTGF6eUxpbmVCcmVha0l0ZXJhdG9y
IG1fbGluZUJyZWFrSXRlcmF0b3I7CisgICAgY29uc3QgRm9udCogbV9mb250OworfTsKKworY2xh
c3MgTGluZUJyZWFrZXIgeworcHVibGljOgorICAgIGZyaWVuZCBjbGFzcyBCcmVha2luZ0NvbnRl
eHQ7CisgICAgTGluZUJyZWFrZXIoUmVuZGVyQmxvY2tGbG93JiBibG9jaykKKyAgICAgICAgOiBt
X2Jsb2NrKGJsb2NrKQorICAgIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICBJbmxp
bmVJdGVyYXRvciBuZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIExpbmVJbmZvJiwg
UmVuZGVyVGV4dEluZm8mLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGlu
ZSwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIFdvcmRNZWFzdXJlbWVudHMm
KTsKKworICAgIGJvb2wgbGluZVdhc0h5cGhlbmF0ZWQoKSB7IHJldHVybiBtX2h5cGhlbmF0ZWQ7
IH0KKyAgICBjb25zdCBWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmplY3RzKCkgeyBy
ZXR1cm4gbV9wb3NpdGlvbmVkT2JqZWN0czsgfQorICAgIEVDbGVhciBjbGVhcigpIHsgcmV0dXJu
IG1fY2xlYXI7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICBJbmxpbmVJ
dGVyYXRvciBuZXh0U2VnbWVudEJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIExpbmVJbmZvJiwg
UmVuZGVyVGV4dEluZm8mLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGlu
ZSwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIFdvcmRNZWFzdXJlbWVudHMm
KTsKKyAgICB2b2lkIHNraXBUcmFpbGluZ1doaXRlc3BhY2UoSW5saW5lSXRlcmF0b3ImLCBjb25z
dCBMaW5lSW5mbyYpOworICAgIHZvaWQgc2tpcExlYWRpbmdXaGl0ZXNwYWNlKElubGluZUJpZGlS
ZXNvbHZlciYsIExpbmVJbmZvJiwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91
c0xpbmUsIExpbmVXaWR0aCYpOworCisgICAgUmVuZGVyQmxvY2tGbG93JiBtX2Jsb2NrOworICAg
IGJvb2wgbV9oeXBoZW5hdGVkOworICAgIEVDbGVhciBtX2NsZWFyOworICAgIFZlY3RvcjxSZW5k
ZXJCb3gqPiBtX3Bvc2l0aW9uZWRPYmplY3RzOworfTsKKworfQorCisjZW5kaWYgLy8gTGluZUJy
ZWFrZXJfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUlu
Zm8uY3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUluZm8uY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNzE4YWQKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lSW5mby5jcHAKQEAgLTAsMCArMSw0
OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRl
ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
ICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nCisgKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMKKyAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQg
Q09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBDT1BZ
UklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisg
KiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisg
KiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkxpbmVJbmZvLmgiCisK
KyNpbmNsdWRlICJSZW5kZXJCbG9jay5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQg
TGluZUluZm86OnNldEVtcHR5KGJvb2wgZW1wdHksIFJlbmRlckJsb2NrKiBibG9jaywgTGluZVdp
ZHRoKiBsaW5lV2lkdGgpCit7CisgICAgaWYgKG1faXNFbXB0eSA9PSBlbXB0eSkKKyAgICAgICAg
cmV0dXJuOworICAgIG1faXNFbXB0eSA9IGVtcHR5OworICAgIGlmICghZW1wdHkgJiYgYmxvY2sg
JiYgZmxvYXRQYWdpbmF0aW9uU3RydXQoKSkgeworICAgICAgICBibG9jay0+c2V0TG9naWNhbEhl
aWdodChibG9jay0+bG9naWNhbEhlaWdodCgpICsgZmxvYXRQYWdpbmF0aW9uU3RydXQoKSk7Cisg
ICAgICAgIHNldEZsb2F0UGFnaW5hdGlvblN0cnV0KDApOworICAgICAgICBsaW5lV2lkdGgtPnVw
ZGF0ZUF2YWlsYWJsZVdpZHRoKCk7CisgICAgfQorfQorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lSW5mby5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL2xpbmUvTGluZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42
NjM2NmM3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUv
TGluZUluZm8uaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFk
b2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAg
ICBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhF
IENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUKKyAqIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIExpbmVJbmZvX2gKKyNk
ZWZpbmUgTGluZUluZm9faAorCisjaW5jbHVkZSAiTGluZVdpZHRoLmgiCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworY2xhc3MgUmVuZGVyQmxvY2s7CisKK2NsYXNzIExpbmVJbmZvIHsKK3B1Ymxp
YzoKKyAgICBMaW5lSW5mbygpCisgICAgICAgIDogbV9pc0ZpcnN0TGluZSh0cnVlKQorICAgICAg
ICAsIG1faXNMYXN0TGluZShmYWxzZSkKKyAgICAgICAgLCBtX2lzRW1wdHkodHJ1ZSkKKyAgICAg
ICAgLCBtX3ByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKQorICAgICAgICAsIG1fZmxvYXRQ
YWdpbmF0aW9uU3RydXQoMCkKKyAgICAgICAgLCBtX3J1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2Uo
MCkKKyAgICB7IH0KKworICAgIGJvb2wgaXNGaXJzdExpbmUoKSBjb25zdCB7IHJldHVybiBtX2lz
Rmlyc3RMaW5lOyB9CisgICAgYm9vbCBpc0xhc3RMaW5lKCkgY29uc3QgeyByZXR1cm4gbV9pc0xh
c3RMaW5lOyB9CisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9pc0VtcHR5OyB9
CisgICAgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSBjb25zdCB7IHJldHVybiBtX3By
ZXZpb3VzTGluZUJyb2tlQ2xlYW5seTsgfQorICAgIExheW91dFVuaXQgZmxvYXRQYWdpbmF0aW9u
U3RydXQoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0UGFnaW5hdGlvblN0cnV0OyB9CisgICAgdW5z
aWduZWQgcnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fcnVuc0Zy
b21MZWFkaW5nV2hpdGVzcGFjZTsgfQorICAgIHZvaWQgcmVzZXRSdW5zRnJvbUxlYWRpbmdXaGl0
ZXNwYWNlKCkgeyBtX3J1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UgPSAwOyB9CisgICAgdm9pZCBp
bmNyZW1lbnRSdW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKCkgeyBtX3J1bnNGcm9tTGVhZGluZ1do
aXRlc3BhY2UrKzsgfQorCisgICAgdm9pZCBzZXRGaXJzdExpbmUoYm9vbCBmaXJzdExpbmUpIHsg
bV9pc0ZpcnN0TGluZSA9IGZpcnN0TGluZTsgfQorICAgIHZvaWQgc2V0TGFzdExpbmUoYm9vbCBs
YXN0TGluZSkgeyBtX2lzTGFzdExpbmUgPSBsYXN0TGluZTsgfQorICAgIHZvaWQgc2V0RW1wdHko
Ym9vbCBlbXB0eSwgUmVuZGVyQmxvY2sqIGJsb2NrID0gMCwgTGluZVdpZHRoKiBsaW5lV2lkdGgg
PSAwKTsKKyAgICB2b2lkIHNldFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seShib29sIHByZXZpb3Vz
TGluZUJyb2tlQ2xlYW5seSkgeyBtX3ByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSA9IHByZXZpb3Vz
TGluZUJyb2tlQ2xlYW5seTsgfQorICAgIHZvaWQgc2V0RmxvYXRQYWdpbmF0aW9uU3RydXQoTGF5
b3V0VW5pdCBzdHJ1dCkgeyBtX2Zsb2F0UGFnaW5hdGlvblN0cnV0ID0gc3RydXQ7IH0KKworcHJp
dmF0ZToKKyAgICBib29sIG1faXNGaXJzdExpbmU7CisgICAgYm9vbCBtX2lzTGFzdExpbmU7Cisg
ICAgYm9vbCBtX2lzRW1wdHk7CisgICAgYm9vbCBtX3ByZXZpb3VzTGluZUJyb2tlQ2xlYW5seTsK
KyAgICBMYXlvdXRVbml0IG1fZmxvYXRQYWdpbmF0aW9uU3RydXQ7CisgICAgdW5zaWduZWQgbV9y
dW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlOworfTsKKworfQorCisjZW5kaWYgLy8gTGluZUluZm9f
aApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUlubGluZUhl
YWRlcnMuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmxpbmVIZWFkZXJz
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhMWJlZQotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmxpbmVIZWFkZXJz
LmgKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGFycyBLbm9s
bCAoa25vbGxAa2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNiwgMjAw
NywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDEzIENoYW5nU2VvayBPaCA8c2hpdmFtaWRvd0BnbWFpbC5jb20+
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmMuIEFsbCByaWdodCByZXNl
cnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisg
KgorICovCisKKyNpZm5kZWYgTGluZUlubGluZUhlYWRlcnNfaAorI2RlZmluZSBMaW5lSW5saW5l
SGVhZGVyc19oCisKKyNpbmNsdWRlICJSZW5kZXJMYXllci5oIgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2VudW0gV2hpdGVzcGFjZVBvc2l0aW9uIHsgTGVhZGluZ1doaXRlc3BhY2UsIFRyYWls
aW5nV2hpdGVzcGFjZSB9OworCitpbmxpbmUgYm9vbCBoYXNJbmxpbmVEaXJlY3Rpb25Cb3JkZXJz
UGFkZGluZ09yTWFyZ2luKGNvbnN0IFJlbmRlcklubGluZSYgZmxvdykKK3sKKyAgICAvLyBXaGVy
ZSBhbiBlbXB0eSBpbmxpbmUgaXMgc3BsaXQgYWNyb3NzIGFub255bW91cyBibG9ja3Mgd2Ugc2hv
dWxkIG9ubHkgZ2l2ZSBsaW5lYm94ZXMgdG8gdGhlICdzaWRlcycgb2YgdGhlCisgICAgLy8gaW5s
aW5lIHRoYXQgaGF2ZSBib3JkZXJzLCBwYWRkaW5nIG9yIG1hcmdpbi4KKyAgICBib29sIHNob3Vs
ZEFwcGx5U3RhcnRCb3JkZXJQYWRkaW5nT3JNYXJnaW4gPSAhZmxvdy5wYXJlbnQoKS0+aXNBbm9u
eW1vdXNCbG9jaygpIHx8ICFmbG93LmlzSW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigpOworICAg
IGlmIChzaG91bGRBcHBseVN0YXJ0Qm9yZGVyUGFkZGluZ09yTWFyZ2luICYmIChmbG93LmJvcmRl
clN0YXJ0KCkgfHwgZmxvdy5tYXJnaW5TdGFydCgpIHx8IGZsb3cucGFkZGluZ1N0YXJ0KCkpKQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGJvb2wgc2hvdWxkQXBwbHlFbmRCb3JkZXJQYWRk
aW5nT3JNYXJnaW4gPSAhZmxvdy5wYXJlbnQoKS0+aXNBbm9ueW1vdXNCbG9jaygpIHx8IGZsb3cu
aXNJbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCkgfHwgIWZsb3cuaW5saW5lRWxlbWVudENvbnRp
bnVhdGlvbigpOworICAgIHJldHVybiBzaG91bGRBcHBseUVuZEJvcmRlclBhZGRpbmdPck1hcmdp
biAmJiAoZmxvdy5ib3JkZXJFbmQoKSB8fCBmbG93Lm1hcmdpbkVuZCgpIHx8IGZsb3cucGFkZGlu
Z0VuZCgpKTsKK30KKworaW5saW5lIGNvbnN0IFJlbmRlclN0eWxlJiBsaW5lU3R5bGUoY29uc3Qg
UmVuZGVyRWxlbWVudCYgcmVuZGVyZXIsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykKK3sKKyAg
ICByZXR1cm4gbGluZUluZm8uaXNGaXJzdExpbmUoKSA/IHJlbmRlcmVyLmZpcnN0TGluZVN0eWxl
KCkgOiByZW5kZXJlci5zdHlsZSgpOworfQorCitpbmxpbmUgYm9vbCByZXF1aXJlc0xpbmVCb3hG
b3JDb250ZW50KGNvbnN0IFJlbmRlcklubGluZSYgZmxvdywgY29uc3QgTGluZUluZm8mIGxpbmVJ
bmZvKQoreworICAgIFJlbmRlckVsZW1lbnQqIHBhcmVudCA9IGZsb3cucGFyZW50KCk7CisgICAg
aWYgKGZsb3cuZG9jdW1lbnQoKS5pbk5vUXVpcmtzTW9kZSgpKSB7CisgICAgICAgIGNvbnN0IFJl
bmRlclN0eWxlJiBmbG93U3R5bGUgPSBsaW5lU3R5bGUoZmxvdywgbGluZUluZm8pOworICAgICAg
ICBjb25zdCBSZW5kZXJTdHlsZSYgcGFyZW50U3R5bGUgPSBsaW5lU3R5bGUoKnBhcmVudCwgbGlu
ZUluZm8pOworICAgICAgICBpZiAoZmxvd1N0eWxlLmxpbmVIZWlnaHQoKSAhPSBwYXJlbnRTdHls
ZS5saW5lSGVpZ2h0KCkKKyAgICAgICAgICAgIHx8IGZsb3dTdHlsZS52ZXJ0aWNhbEFsaWduKCkg
IT0gcGFyZW50U3R5bGUudmVydGljYWxBbGlnbigpCisgICAgICAgICAgICB8fCAhcGFyZW50U3R5
bGUuZm9udCgpLmZvbnRNZXRyaWNzKCkuaGFzSWRlbnRpY2FsQXNjZW50RGVzY2VudEFuZExpbmVH
YXAoZmxvd1N0eWxlLmZvbnQoKS5mb250TWV0cmljcygpKSkKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgc2hvdWxkQ29sbGFw
c2VXaGl0ZVNwYWNlKGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgTGluZUluZm8mIGxp
bmVJbmZvLCBXaGl0ZXNwYWNlUG9zaXRpb24gd2hpdGVzcGFjZVBvc2l0aW9uKQoreworICAgIC8v
IENTUzIgMTYuNi4xCisgICAgLy8gSWYgYSBzcGFjZSAoVSswMDIwKSBhdCB0aGUgYmVnaW5uaW5n
IG9mIGEgbGluZSBoYXMgJ3doaXRlLXNwYWNlJyBzZXQgdG8gJ25vcm1hbCcsICdub3dyYXAnLCBv
ciAncHJlLWxpbmUnLCBpdCBpcyByZW1vdmVkLgorICAgIC8vIElmIGEgc3BhY2UgKFUrMDAyMCkg
YXQgdGhlIGVuZCBvZiBhIGxpbmUgaGFzICd3aGl0ZS1zcGFjZScgc2V0IHRvICdub3JtYWwnLCAn
bm93cmFwJywgb3IgJ3ByZS1saW5lJywgaXQgaXMgYWxzbyByZW1vdmVkLgorICAgIC8vIElmIHNw
YWNlcyAoVSswMDIwKSBvciB0YWJzIChVKzAwMDkpIGF0IHRoZSBlbmQgb2YgYSBsaW5lIGhhdmUg
J3doaXRlLXNwYWNlJyBzZXQgdG8gJ3ByZS13cmFwJywgVUFzIG1heSB2aXN1YWxseSBjb2xsYXBz
ZSB0aGVtLgorICAgIHJldHVybiBzdHlsZS0+Y29sbGFwc2VXaGl0ZVNwYWNlKCkKKyAgICAgICAg
fHwgKHdoaXRlc3BhY2VQb3NpdGlvbiA9PSBUcmFpbGluZ1doaXRlc3BhY2UgJiYgc3R5bGUtPndo
aXRlU3BhY2UoKSA9PSBQUkVfV1JBUCAmJiAoIWxpbmVJbmZvLmlzRW1wdHkoKSB8fCAhbGluZUlu
Zm8ucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpKTsKK30KKworaW5saW5lIGJvb2wgc2tpcE5v
bkJyZWFraW5nU3BhY2UoY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0LCBjb25zdCBMaW5lSW5mbyYg
bGluZUluZm8pCit7CisgICAgaWYgKGl0Lm1fb2JqLT5zdHlsZSgpLm5ic3BNb2RlKCkgIT0gU1BB
Q0UgfHwgaXQuY3VycmVudCgpICE9IG5vQnJlYWtTcGFjZSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgLy8gRklYTUU6IFRoaXMgaXMgYmFkLiBJdCBtYWtlcyBuYnNwIGluY29uc2lzdGVu
dCB3aXRoIHNwYWNlIGFuZCB3b24ndCB3b3JrIGNvcnJlY3RseQorICAgIC8vIHdpdGggbV9taW5X
aWR0aC9tX21heFdpZHRoLgorICAgIC8vIERvIG5vdCBza2lwIGEgbm9uLWJyZWFraW5nIHNwYWNl
IGlmIGl0IGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAgICAvLyBvbiBhIGxpbmUgYWZ0ZXIgYSBj
bGVhbiBsaW5lIGJyZWFrIChvciBvbiB0aGUgZmlyc3QgbGluZSwgc2luY2UgcHJldmlvdXNMaW5l
QnJva2VDbGVhbmx5IHN0YXJ0cyBvZmYKKyAgICAvLyB8dHJ1ZXwpLgorICAgIGlmIChsaW5lSW5m
by5pc0VtcHR5KCkgJiYgbGluZUluZm8ucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitpbmxpbmUgYm9vbCBh
bHdheXNSZXF1aXJlc0xpbmVCb3goY29uc3QgUmVuZGVySW5saW5lJiBmbG93KQoreworICAgIC8v
IEZJWE1FOiBSaWdodCBub3csIHdlIG9ubHkgYWxsb3cgbGluZSBib3hlcyBmb3IgaW5saW5lcyB0
aGF0IGFyZSB0cnVseSBlbXB0eS4KKyAgICAvLyBXZSBuZWVkIHRvIGZpeCB0aGlzLCB0aG91Z2gs
IGJlY2F1c2UgYXQgdGhlIHZlcnkgbGVhc3QsIGlubGluZXMgY29udGFpbmluZyBvbmx5CisgICAg
Ly8gaWdub3JhYmxlIHdoaXRlc3BhY2Ugc2hvdWxkIHNob3VsZCBhbHNvIGhhdmUgbGluZSBib3hl
cy4KKyAgICByZXR1cm4gaXNFbXB0eUlubGluZShmbG93KSAmJiBoYXNJbmxpbmVEaXJlY3Rpb25C
b3JkZXJzUGFkZGluZ09yTWFyZ2luKGZsb3cpOworfQorCitpbmxpbmUgYm9vbCByZXF1aXJlc0xp
bmVCb3goY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8g
PSBMaW5lSW5mbygpLCBXaGl0ZXNwYWNlUG9zaXRpb24gd2hpdGVzcGFjZVBvc2l0aW9uID0gTGVh
ZGluZ1doaXRlc3BhY2UpCit7CisgICAgaWYgKGl0Lm1fb2JqLT5pc0Zsb2F0aW5nT3JPdXRPZkZs
b3dQb3NpdGlvbmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChpdC5tX29i
ai0+aXNCUigpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGJvb2wgcmVuZGVyZXJJc0Vt
cHR5SW5saW5lID0gZmFsc2U7CisgICAgaWYgKGl0Lm1fb2JqLT5pc1JlbmRlcklubGluZSgpKSB7
CisgICAgICAgIGNvbnN0IFJlbmRlcklubGluZSYgaW5saW5lUmVuZGVyZXIgPSB0b1JlbmRlcklu
bGluZSgqaXQubV9vYmopOworICAgICAgICBpZiAoIWFsd2F5c1JlcXVpcmVzTGluZUJveChpbmxp
bmVSZW5kZXJlcikgJiYgIXJlcXVpcmVzTGluZUJveEZvckNvbnRlbnQoaW5saW5lUmVuZGVyZXIs
IGxpbmVJbmZvKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmVuZGVyZXJJ
c0VtcHR5SW5saW5lID0gaXNFbXB0eUlubGluZShpbmxpbmVSZW5kZXJlcik7CisgICAgfQorCisg
ICAgaWYgKCFzaG91bGRDb2xsYXBzZVdoaXRlU3BhY2UoJml0Lm1fb2JqLT5zdHlsZSgpLCBsaW5l
SW5mbywgd2hpdGVzcGFjZVBvc2l0aW9uKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBV
Q2hhciBjdXJyZW50ID0gaXQuY3VycmVudCgpOworICAgIGJvb2wgbm90SnVzdFdoaXRlc3BhY2Ug
PSBjdXJyZW50ICE9ICcgJyAmJiBjdXJyZW50ICE9ICdcdCcgJiYgY3VycmVudCAhPSBzb2Z0SHlw
aGVuICYmIChjdXJyZW50ICE9ICdcbicgfHwgaXQubV9vYmotPnByZXNlcnZlc05ld2xpbmUoKSkg
JiYgIXNraXBOb25CcmVha2luZ1NwYWNlKGl0LCBsaW5lSW5mbyk7CisgICAgcmV0dXJuIG5vdEp1
c3RXaGl0ZXNwYWNlIHx8IHJlbmRlcmVySXNFbXB0eUlubGluZTsKK30KKworaW5saW5lIHZvaWQg
c2V0U3RhdGljUG9zaXRpb25zKFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIFJlbmRlckJveCYgY2hp
bGQpCit7CisgICAgLy8gRklYTUU6IFRoZSBtYXRoIGhlcmUgaXMgYWN0dWFsbHkgbm90IHJlYWxs
eSByaWdodC4gSXQncyBhIGJlc3QtZ3Vlc3MgYXBwcm94aW1hdGlvbiB0aGF0CisgICAgLy8gd2ls
bCB3b3JrIGZvciB0aGUgY29tbW9uIGNhc2VzCisgICAgUmVuZGVyRWxlbWVudCogY29udGFpbmVy
QmxvY2sgPSBjaGlsZC5jb250YWluZXIoKTsKKyAgICBMYXlvdXRVbml0IGJsb2NrSGVpZ2h0ID0g
YmxvY2subG9naWNhbEhlaWdodCgpOworICAgIGlmIChjb250YWluZXJCbG9jay0+aXNSZW5kZXJJ
bmxpbmUoKSkgeworICAgICAgICAvLyBBIHJlbGF0aXZlIHBvc2l0aW9uZWQgaW5saW5lIGVuY2xv
c2VzIHVzLiBJbiB0aGlzIGNhc2UsIHdlIGFsc28gaGF2ZSB0byBkZXRlcm1pbmUgb3VyCisgICAg
ICAgIC8vIHBvc2l0aW9uIGFzIHRob3VnaCB3ZSB3ZXJlIGFuIGlubGluZS4gU2V0IHxzdGF0aWNJ
bmxpbmVQb3NpdGlvbnwgYW5kIHxzdGF0aWNCbG9ja1Bvc2l0aW9ufCBvbiB0aGUgcmVsYXRpdmUg
cG9zaXRpb25lZAorICAgICAgICAvLyBpbmxpbmUgc28gdGhhdCB3ZSBjYW4gb2J0YWluIHRoZSB2
YWx1ZSBsYXRlci4KKyAgICAgICAgdG9SZW5kZXJJbmxpbmUoY29udGFpbmVyQmxvY2spLT5sYXll
cigpLT5zZXRTdGF0aWNJbmxpbmVQb3NpdGlvbihibG9jay5zdGFydEFsaWduZWRPZmZzZXRGb3JM
aW5lKGJsb2NrSGVpZ2h0LCBmYWxzZSkpOworICAgICAgICB0b1JlbmRlcklubGluZShjb250YWlu
ZXJCbG9jayktPmxheWVyKCktPnNldFN0YXRpY0Jsb2NrUG9zaXRpb24oYmxvY2tIZWlnaHQpOwor
ICAgIH0KKyAgICBibG9jay51cGRhdGVTdGF0aWNJbmxpbmVQb3NpdGlvbkZvckNoaWxkKGNoaWxk
LCBibG9ja0hlaWdodCk7CisgICAgY2hpbGQubGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlv
bihibG9ja0hlaWdodCk7Cit9CisKK30KKworI2VuZGlmCg==
</data>
<flag name="commit-queue"
          id="239957"
          type_id="3"
          status="-"
          setter="gtk-ews"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>216906</attachid>
            <date>2013-11-14 01:11:49 -0800</date>
            <delta_ts>2013-11-14 10:42:54 -0800</delta_ts>
            <desc>EWS bullet2 - style won&apos;t make it (expected)</desc>
            <filename>refactorLB.patch</filename>
            <type>text/plain</type>
            <size>173813</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNv
cmUvQ01ha2VMaXN0cy50eHQKaW5kZXggOGUxNDczMC4uYjM3Y2QxZiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0
cy50eHQKQEAgLTc2LDYgKzc2LDcgQEAgc2V0KFdlYkNvcmVfSU5DTFVERV9ESVJFQ1RPUklFUwog
ICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS90ZXh0IgogICAgICIke1dFQkNPUkVfRElSfS9w
bHVnaW5zIgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmciCisgICAgIiR7V0VCQ09SRV9E
SVJ9L3JlbmRlcmluZy9saW5lIgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmcvbWF0aG1s
IgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmcvc2hhcGVzIgogICAgICIke1dFQkNPUkVf
RElSfS9yZW5kZXJpbmcvc3R5bGUiCkBAIC0yMjA4LDYgKzIyMDksOSBAQCBzZXQoV2ViQ29yZV9T
T1VSQ0VTCiAgICAgcmVuZGVyaW5nL1RleHRQYWludGVyLmNwcAogICAgIHJlbmRlcmluZy9icmVh
a19saW5lcy5jcHAKIAorICAgIHJlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcAorICAgIHJl
bmRlcmluZy9saW5lL0xpbmVJbmZvLmNwcAorCiAgICAgcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJN
YXRoTUxCbG9jay5jcHAKICAgICByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTEZlbmNlZC5j
cHAKICAgICByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTEZyYWN0aW9uLmNwcApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9n
CmluZGV4IDNhM2M2ZGUuLjZhZmM1MzAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMDggQEAKKzIw
MTMtMTEtMTQgIFpvbHRhbiBIb3J2YXRoICA8em9sdGFuQHdlYmtpdC5vcmc+CisKKyAgICAgICAg
TW92ZSBCcmVha2luZ0NvbnRleHQgYW5kIExpbmVCcmVha2VyIGludG8gdGhlaXIgb3duIGZpbGVz
CisgICAgICAgIDxodHRwczovL3dlYmtpdC5vcmcvYi8xMjQzMzY+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW4gdGhpcyBjaGFuZ2UgSSBpbnRyb2R1
Y2VkICdsaW5lJyBzdWJkaXJlY3RvcnkgaW5zaWRlICdyZW5kZXJpbmcnLCB0aGlzIGRpcmVjdG9y
eSB3aWxsIGNvbnRhaW4gYWxsIHRoZSBjbGFzc2VzCisgICAgICAgIHdoaWNoIGhhdmUgYmVlbiBy
ZWZhY3RvcmVkIGZyb20gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4gVGhpcyBjaGFuZ2UgY29u
dGFpbnMgdGhlIHNlcGFyYXRpb24gb2YgQnJlYWtpbmdDb250ZXh0LAorICAgICAgICBhbmQgdGhl
IHNlcGFyYXRpb24gb2YgTGluZUJyZWFrZXIgY2xhc3Nlcy4gU2luY2UgSSB3YW50ZWQgdG8ga2Vl
cCB0aGUgaGVscGVyIGZ1bmN0aW9ucyBvcmdhbml6ZWQsIEkgYWxzbyBhZGRlZCBhCisgICAgICAg
IG5ldyBmaWxlIGNhbGxlZCBMaW5lSW5saW5lSGVhZGVycy5oLCB3aGljaCBjb250YWlucyB0aGUg
ZnVuY3Rpb25zIHdoaWNoIHVzZWQgaW4gTGluZUJyZWFrZXIuaCBhbmQgQnJlYWtpbmdDb250ZXh0
LmguCisgICAgICAgIEkgbW92ZWQgTGluZUluZm8gY2xhc3MgaW50byBsaW5lIGRpcmVjdG9yeS4g
SXQgd2FzIG5lY2Vzc2FyeSB0aGlzIHRpbWUsIHNpbmNlIEkgYWRkZWQgYSBjcHAgZm9yIGl0LiBJ
J2xsIG1vdmUgdGhlCisgICAgICAgIHJlc3Qgb2YgdGhlIGxpbmUgbGF5b3V0IHJlbGF0ZWQgaGVs
cGVyIGNsYXNzZXMgbGF0ZXIuIChJIHdhbnRlZCB0byBtaW5pbWl6ZSBtZXJnZSBjb25mbGljdHMu
KQorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgbm8gYmVoYXZpb3IgY2hhbmdlLgorCisgICAgICAg
ICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogR05VbWFrZWZpbGUuYW06CisgICAgICAgICog
R05VbWFrZWZpbGUubGlzdC5hbToKKyAgICAgICAgKiBXZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52
Y3hwcm9qOgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAg
ICAgICAgKiByZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OmNyZWF0ZVJ1bik6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250
ZXh0SW5saW5lSGVhZGVycy5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OldvcmRNZWFzdXJl
bWVudDo6V29yZE1lYXN1cmVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0
czo6VHJhaWxpbmdPYmplY3RzKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6
c2V0VHJhaWxpbmdXaGl0ZXNwYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0
czo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29yZTo6VHJhaWxpbmdPYmplY3RzOjphcHBlbmRCb3hJ
Zk5lZWRlZCk6CisgICAgICAgIChXZWJDb3JlOjpkZXByZWNhdGVkQWRkTWlkcG9pbnQpOgorICAg
ICAgICAoV2ViQ29yZTo6c3RhcnRJZ25vcmluZ1NwYWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpz
dG9wSWdub3JpbmdTcGFjZXMpOgorICAgICAgICAoV2ViQ29yZTo6ZW5zdXJlTGluZUJveEluc2lk
ZUlnbm9yZWRTcGFjZXMpOgorICAgICAgICAoV2ViQ29yZTo6VHJhaWxpbmdPYmplY3RzOjp1cGRh
dGVNaWRwb2ludHNGb3JUcmFpbGluZ0JveGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5n
Q29udGV4dDo6QnJlYWtpbmdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29u
dGV4dDo6Y3VycmVudE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6
OmxpbmVCcmVhayk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVCcmVh
a1JlZik6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVXaWR0aCk6Cisg
ICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmF0RW5kKToKKyAgICAgICAgKFdlYkNv
cmU6OkJyZWFraW5nQ29udGV4dDo6Y2xlYXJMaW5lQnJlYWtJZkZpdHNPbkxpbmUpOgorICAgICAg
ICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0Ojpjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0
aCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmluaXRpYWxpemVGb3JDdXJy
ZW50T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50
KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aGFuZGxlQlIpOgorICAgICAg
ICAoV2ViQ29yZTo6Ym9yZGVyUGFkZGluZ01hcmdpblN0YXJ0KToKKyAgICAgICAgKFdlYkNvcmU6
OmJvcmRlclBhZGRpbmdNYXJnaW5FbmQpOgorICAgICAgICAoV2ViQ29yZTo6c2hvdWxkQWRkQm9y
ZGVyUGFkZGluZ01hcmdpbik6CisgICAgICAgIChXZWJDb3JlOjpwcmV2aW91c0luRmxvd1NpYmxp
bmcpOgorICAgICAgICAoV2ViQ29yZTo6aW5saW5lTG9naWNhbFdpZHRoKToKKyAgICAgICAgKFdl
YkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZCk6CisgICAg
ICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUZsb2F0KToKKyAgICAgICAgKFdl
YkNvcmU6OnNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdCk6CisgICAgICAgIChX
ZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUVtcHR5SW5saW5lKToKKyAgICAgICAgKFdl
YkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aGFuZGxlUmVwbGFjZWQpOgorICAgICAgICAoV2ViQ29y
ZTo6Zmlyc3RQb3NpdGl2ZVdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OnVwZGF0ZVNlZ21lbnRz
Rm9yU2hhcGVzKToKKyAgICAgICAgKFdlYkNvcmU6Oml0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRl
ckNvbWJpbmVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6Om5leHRDaGFyYWN0ZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6dXBkYXRlQ291bnRlcklmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6Om1l
YXN1cmVIeXBoZW5XaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0V2lkdGgpOgorICAgICAg
ICAoV2ViQ29yZTo6ZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gpOgorICAgICAgICAoV2ViQ29y
ZTo6dHJ5SHlwaGVuYXRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0Ojpo
YW5kbGVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRCZWdpbnNXaXRoQnJlYWthYmxlUG9z
aXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpjYW5CcmVha0F0VGhp
c1Bvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6Y29tbWl0QW5k
VXBkYXRlTGluZUJyZWFrSWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tNaWRwb2lu
dHMpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbmRPZkxpbmUp
OgorICAgICAgICAqIHJlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6cmVzZXQpOgorICAgICAgICAoV2ViQ29yZTo6TGlu
ZUJyZWFrZXI6OnNraXBUcmFpbGluZ1doaXRlc3BhY2UpOgorICAgICAgICAoV2ViQ29yZTo6TGlu
ZUJyZWFrZXI6OnNraXBMZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAgICogcmVuZGVyaW5nL2xp
bmUvTGluZUJyZWFrZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6
TGluZUJyZWFrZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJyZWFrZXI6OmxpbmVXYXNIeXBo
ZW5hdGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVCcmVha2VyOjpwb3NpdGlvbmVkT2JqZWN0
cyk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6Y2xlYXIpOgorICAgICAgICAqIHJl
bmRlcmluZy9saW5lL0xpbmVJbmZvLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMaW5l
SW5mbzo6c2V0RW1wdHkpOgorICAgICAgICAqIHJlbmRlcmluZy9saW5lL0xpbmVJbmZvLmg6IFJl
bmFtZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvTGluZUluZm8uaC4KKyAgICAgICAg
KFdlYkNvcmU6OkxpbmVJbmZvOjpMaW5lSW5mbyk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5m
bzo6aXNGaXJzdExpbmUpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OmlzTGFzdExpbmUp
OgorICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OmlzRW1wdHkpOgorICAgICAgICAoV2ViQ29y
ZTo6TGluZUluZm86OnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk6CisgICAgICAgIChXZWJDb3Jl
OjpMaW5lSW5mbzo6ZmxvYXRQYWdpbmF0aW9uU3RydXQpOgorICAgICAgICAoV2ViQ29yZTo6TGlu
ZUluZm86OnJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UpOgorICAgICAgICAoV2ViQ29yZTo6TGlu
ZUluZm86OnJlc2V0UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAgIChXZWJDb3Jl
OjpMaW5lSW5mbzo6aW5jcmVtZW50UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAg
IChXZWJDb3JlOjpMaW5lSW5mbzo6c2V0Rmlyc3RMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6Okxp
bmVJbmZvOjpzZXRMYXN0TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6c2V0UHJl
dmlvdXNMaW5lQnJva2VDbGVhbmx5KToKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVJbmZvOjpzZXRG
bG9hdFBhZ2luYXRpb25TdHJ1dCk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvTGluZUlubGlu
ZUhlYWRlcnMuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpoYXNJbmxpbmVEaXJlY3Rpb25C
b3JkZXJzUGFkZGluZ09yTWFyZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OmxpbmVTdHlsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpyZXF1aXJlc0xpbmVCb3hGb3JDb250ZW50KToKKyAgICAgICAgKFdl
YkNvcmU6OnNob3VsZENvbGxhcHNlV2hpdGVTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpza2lw
Tm9uQnJlYWtpbmdTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjphbHdheXNSZXF1aXJlc0xpbmVC
b3gpOgorICAgICAgICAoV2ViQ29yZTo6cmVxdWlyZXNMaW5lQm94KToKKyAgICAgICAgKFdlYkNv
cmU6OnNldFN0YXRpY1Bvc2l0aW9ucyk6CisKIDIwMTMtMTEtMTMgIEpvc2VwaCBQZWNvcmFybyAg
PHBlY29yYXJvQGFwcGxlLmNvbT4KIAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBTcGxpdCBJbnNw
ZWN0b3IuanNvbiBpbnRvIGluZGl2aWR1YWwgZG9tYWluIGpzb24gZmlsZXMKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtIGIvU291cmNlL1dlYkNvcmUvR05VbWFrZWZp
bGUuYW0KaW5kZXggMzFlYjA1Yi4uOWRmM2VhMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
R05VbWFrZWZpbGUuYW0KKysrIGIvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KQEAgLTkw
LDYgKzkwLDcgQEAgd2ViY29yZV9jcHBmbGFncyArPSBcCiAJLUkkKHNyY2RpcikvU291cmNlL1dl
YkNvcmUvcGx1Z2lucyBcCiAJLUkkKHNyY2RpcikvU291cmNlL1dlYkNvcmUvcGx1Z2lucy93aW4g
XAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZyBcCisJLUkkKHNyY2Rpcikv
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9tYXRobWwgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9zaGFwZXMgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdHls
ZSBcCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtIGIvU291
cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQppbmRleCBlZmViZWZjLi4yNGNjZDg4IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0KQEAgLTQyOTYsNyArNDI5Niw2IEBAIHdlYmNv
cmVfc291cmNlcyArPSBcCiAJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xvZ2ljYWxTZWxlY3Rp
b25PZmZzZXRDYWNoZXMuaCBcCiAJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xheW91dFJlcGFp
bnRlci5oIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvTGF5b3V0UmVwYWludGVyLmNwcCBc
Ci0JU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xpbmVJbmZvLmggXAogCVNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9MaW5lTGF5b3V0U3RhdGUuaCBcCiAJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L0xpbmVXaWR0aC5oIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvTGluZVdpZHRoLmNwcCBc
CkBAIC00NTAxLDYgKzQ1MDAsMTIgQEAgd2ViY29yZV9zb3VyY2VzICs9IFwKIAlTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvVGV4dFBhaW50ZXIuaCBcCiAJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1RleHRQYWludFN0eWxlLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9WZXJ0aWNhbFBv
c2l0aW9uQ2FjaGUuaCBcCisJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdD
b250ZXh0SW5saW5lSGVhZGVycy5oIFwKKwlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9M
aW5lSW5mby5oIFwKKwlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lSW5mby5jcHAg
XAorCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmggXAorCVNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcCBcCisJU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL2xpbmUvTGluZUlubGluZUhlYWRlcnMuaCBcCiAJU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxCbG9jay5jcHAgXAogCVNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9tYXRobWwvUmVuZGVyTWF0aE1MQmxvY2suaCBcCiAJU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL21hdGhtbC9SZW5kZXJNYXRoTUxGZW5jZWQuY3BwIFwKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2ogYi9Tb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qCmluZGV4IDFhNmZmODAuLjE2NDE2
ZjUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZj
eHByb2oKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJv
agpAQCAtMTEwNTAsNiArMTEwNTAsOCBAQAogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5ccmVu
ZGVyaW5nXFNpbXBsZUxpbmVMYXlvdXQuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0i
Li5ccmVuZGVyaW5nXFNpbXBsZUxpbmVMYXlvdXRGdW5jdGlvbnMuY3BwIiAvPgogICAgIDxDbENv
bXBpbGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXFRleHRQYWludFN0eWxlLmNwcCIgLz4KKyAgICA8
Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xsaW5lXExpbmVCcmVha2VyLmNwcCIgLz4K
KyAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xsaW5lXExpbmVJbmZvLmNwcCIg
Lz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xzaGFwZXNcUG9seWdvblNo
YXBlLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xzaGFwZXNc
UmFzdGVyU2hhcGUuY3BwIiAvPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5n
XHNoYXBlc1xSZWN0YW5nbGVTaGFwZS5jcHAiIC8+CkBAIC0xOTc1Nyw3ICsxOTc1OSw2IEBACiAg
ICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcSW5saW5lVGV4dEJveC5oIiAvPgog
ICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXExheW91dFJlcGFpbnRlci5oIiAv
PgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXExheW91dFN0YXRlLmgiIC8+
Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcTGluZUluZm8uaCIgLz4KICAg
ICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xMaW5lTGF5b3V0U3RhdGUuaCIgLz4K
ICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xMaW5lV2lkdGguaCIgLz4KICAg
ICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xPcmRlckl0ZXJhdG9yLmgiIC8+CkBA
IC0xOTgzMiw2ICsxOTgzMywxMCBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVy
aW5nXFJlbmRlclNlbGVjdGlvbkluZm8uaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4u
XHJlbmRlcmluZ1xSZW5kZXJTbGlkZXIuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4u
XHJlbmRlcmluZ1xSZW5kZXJTbmFwc2hvdHRlZFBsdWdJbi5oIiAvPgorICAgIDxDbEluY2x1ZGUg
SW5jbHVkZT0iLi5ccmVuZGVyaW5nXGxpbmVcQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5o
IiAvPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXGxpbmVcTGluZUJyZWFr
ZXIuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xsaW5lXExpbmVJ
bmZvLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcbGluZVxMaW5l
SW5saW5lSGVhZGVycy5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5n
XHNoYXBlc1xQb2x5Z29uU2hhcGUuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJl
bmRlcmluZ1xzaGFwZXNcUmFzdGVyU2hhcGUuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9
Ii4uXHJlbmRlcmluZ1xzaGFwZXNcUmVjdGFuZ2xlU2hhcGUuaCIgLz4KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9X
ZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagppbmRleCA0NjI1ZDZjLi4x
ZTNmYTdhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVj
dC5wYnhwcm9qCkBAIC0zNDM2LDcgKzM0MzYsNiBAQAogCQk5RkEzN0VGRDExNzJGREE2MDBDNENE
NTUgLyogSlNTY3JpcHRQcm9maWxlTm9kZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gOUZBMzdFRjkxMTcyRkQ5MzAwQzRDRDU1IC8qIEpTU2NyaXB0UHJv
ZmlsZU5vZGUuaCAqLzsgfTsKIAkJQTAyNDU3NTExNkNFQUEyNzAwMEU1NjcxIC8qIEVYVERyYXdC
dWZmZXJzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEEwMjQ1NzRFMTZDRUFBMjcwMDBFNTY3MSAvKiBFWFREcmF3QnVmZmVycy5jcHAgKi87IH07CiAJ
CUEwMjQ1NzUyMTZDRUFBMjcwMDBFNTY3MSAvKiBFWFREcmF3QnVmZmVycy5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQTAyNDU3NEYxNkNFQUEyNzAwMEU1
NjcxIC8qIEVYVERyYXdCdWZmZXJzLmggKi87IH07Ci0JCUEwNkJGRTJFMTdERkI0M0YwMDgzMDJC
QiAvKiBMaW5lSW5mby5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gQTA2QkZFMkMxN0RGQjQzMzAwODMwMkJCIC8qIExpbmVJbmZvLmggKi87IH07CiAJCUEw
N0QzMzU1MTUyQjYzMEUwMDFCNjM5MyAvKiBKU1dlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0LmNw
cCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEEwN0QzMzUz
MTUyQjYzMEUwMDFCNjM5MyAvKiBKU1dlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0LmNwcCAqLzsg
fTsKIAkJQTA3RDMzNTYxNTJCNjMwRTAwMUI2MzkzIC8qIEpTV2ViR0xTaGFkZXJQcmVjaXNpb25G
b3JtYXQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEEw
N0QzMzU0MTUyQjYzMEUwMDFCNjM5MyAvKiBKU1dlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0Lmgg
Ki87IH07CiAJCUEwN0QzMzU4MTUyQjYzMkQwMDFCNjM5MyAvKiBXZWJHTFNoYWRlclByZWNpc2lv
bkZvcm1hdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QTA3RDMzNTcxNTJCNjMyRDAwMUI2MzkzIC8qIFdlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0Lmgg
Ki87IH07CkBAIC02Mjk5LDYgKzYyOTgsOCBAQAogCQlGRUUxODExNDE2QzMxOUU4MDAwODQ4NDkg
LyogU1FMVHJhbnNhY3Rpb25CYWNrZW5kLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSBGRUUxODExMjE2QzMxOUU4MDAwODQ4NDkgLyogU1FMVHJhbnNhY3Rp
b25CYWNrZW5kLmggKi87IH07CiAJCUZGOTQ1RUNCMTYxRjdGMzYwMDk3MUJDOCAvKiBQc2V1ZG9F
bGVtZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEZGOTQ1RUM5MTYxRjdGMzYwMDk3MUJDOCAvKiBQc2V1ZG9FbGVtZW50LmNwcCAqLzsgfTsKIAkJ
RkY5NDVFQ0MxNjFGN0YzNjAwOTcxQkM4IC8qIFBzZXVkb0VsZW1lbnQuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZGOTQ1RUNBMTYxRjdGMzYwMDk3MUJD
OCAvKiBQc2V1ZG9FbGVtZW50LmggKi87IH07CisJCUZGQjY5OENDMTgzM0VFMEQwMDE1OEEzMSAv
KiBMaW5lQnJlYWtlci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBGRkI2OThDQTE4MzNFQzM4MDAxNThBMzEgLyogTGluZUJyZWFrZXIuY3BwICovOyB9
OworCQlGRkI2OThDRjE4MzQwMkJCMDAxNThBMzEgLyogTGluZUluZm8uY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkZCNjk4Q0QxODMzRjE3NjAwMTU4
QTMxIC8qIExpbmVJbmZvLmNwcCAqLzsgfTsKIAkJRkZENUI5N0ExMzVDQzk3ODAwRDVFOTJBIC8q
IFBhZ2VWaXNpYmlsaXR5U3RhdGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gRkZENUI5NzcxMzVDQzk3ODAwRDVFOTJBIC8qIFBhZ2VWaXNpYmlsaXR5
U3RhdGUuY3BwICovOyB9OwogCQlGRkQ1Qjk3QjEzNUNDOTc4MDBENUU5MkEgLyogUGFnZVZpc2li
aWxpdHlTdGF0ZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gRkZENUI5NzgxMzVDQzk3ODAwRDVFOTJBIC8qIFBhZ2VWaXNpYmlsaXR5U3RhdGUuaCAqLzsg
c2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogLyogRW5kIFBCWEJ1
aWxkRmlsZSBzZWN0aW9uICovCkBAIC0xMDIwNSw3ICsxMDIwNiw2IEBACiAJCUEwMjQ1NzRFMTZD
RUFBMjcwMDBFNTY3MSAvKiBFWFREcmF3QnVmZmVycy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IG5hbWUgPSBFWFREcmF3QnVmZmVycy5jcHA7IHBhdGggPSBjYW52YXMvRVhURHJh
d0J1ZmZlcnMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBMDI0NTc0RjE2Q0VB
QTI3MDAwRTU2NzEgLyogRVhURHJhd0J1ZmZlcnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBuYW1lID0gRVhURHJhd0J1ZmZlcnMuaDsgcGF0aCA9IGNhbnZhcy9FWFREcmF3QnVmZmVycy5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBMDI0NTc1MDE2Q0VBQTI3MDAwRTU2NzEg
LyogRVhURHJhd0J1ZmZlcnMuaWRsICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgbmFtZSA9IEVYVERyYXdCdWZm
ZXJzLmlkbDsgcGF0aCA9IGNhbnZhcy9FWFREcmF3QnVmZmVycy5pZGw7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07Ci0JCUEwNkJGRTJDMTdERkI0MzMwMDgzMDJCQiAvKiBMaW5lSW5mby5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBMaW5lSW5mby5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlBMDcxOEJFODE3RTI2RjE2MDBGNkJGNDQgLyogTGluZUxheW91dFN0
YXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IExpbmVMYXlvdXRTdGF0ZS5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBMDdEMzM1MzE1MkI2MzBFMDAxQjYzOTMg
LyogSlNXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBKU1dlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0LmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQTA3RDMzNTQxNTJCNjMwRTAwMUI2MzkzIC8qIEpTV2Vi
R0xTaGFkZXJQcmVjaXNpb25Gb3JtYXQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gSlNXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwpAQCAtMTM0NzIsNiArMTM0NzIsMTEgQEAKIAkJRkVFMTgxMTIxNkMzMTlFODAwMDg0ODQ5
IC8qIFNRTFRyYW5zYWN0aW9uQmFja2VuZC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBh
dGggPSBTUUxUcmFuc2FjdGlvbkJhY2tlbmQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJRkY5NDVFQzkxNjFGN0YzNjAwOTcxQkM4IC8qIFBzZXVkb0VsZW1lbnQuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUHNldWRvRWxlbWVudC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZGOTQ1RUNBMTYxRjdGMzYwMDk3MUJDOCAvKiBQc2V1ZG9F
bGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFBzZXVkb0VsZW1lbnQu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkZCNjk4QzkxODMyRjEwQjAwMTU4QTMx
IC8qIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OworCQlGRkI2OThDQTE4MzNFQzM4MDAxNThBMzEgLyogTGluZUJyZWFrZXIu
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTGluZUJyZWFrZXIuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGRkI2OThDQjE4MzNFQzM4MDAxNThBMzEg
LyogTGluZUJyZWFrZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTGluZUJy
ZWFrZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkZCNjk4Q0QxODMzRjE3NjAw
MTU4QTMxIC8qIExpbmVJbmZvLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0
aCA9IExpbmVJbmZvLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkZCNjk4Q0Ux
ODMzRjE3NjAwMTU4QTMxIC8qIExpbmVJbmZvLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IExpbmVJbmZvLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZGRDVCOTc3
MTM1Q0M5NzgwMEQ1RTkyQSAvKiBQYWdlVmlzaWJpbGl0eVN0YXRlLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFBhZ2VWaXNpYmlsaXR5U3RhdGUuY3BwOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQlGRkQ1Qjk3ODEzNUNDOTc4MDBENUU5MkEgLyogUGFnZVZp
c2liaWxpdHlTdGF0ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBQYWdlVmlz
aWJpbGl0eVN0YXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAvKiBFbmQgUEJYRmls
ZVJlZmVyZW5jZSBzZWN0aW9uICovCkBAIC0yMDkwMSw2ICsyMDkwNiw3IEBACiAJCUY1MjNEMkYz
MDJERTQ0M0IwMTg2MzVDQSAvKiByZW5kZXJpbmcgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsK
IAkJCWNoaWxkcmVuID0gKAorCQkJCUZGQjY5OEM4MTgzMkYxMEIwMDE1OEEzMSAvKiBsaW5lICov
LAogCQkJCUNERTdGQzQyMTgxOTA0QjEwMDJCQkI3NyAvKiBPcmRlckl0ZXJhdG9yLmNwcCAqLywK
IAkJCQlDREU3RkM0MzE4MTkwNEIxMDAyQkJCNzcgLyogT3JkZXJJdGVyYXRvci5oICovLAogCQkJ
CTQzOTA0NkMyMTJEQTI1Q0UwMEFGODBBMiAvKiBtYXRobWwgKi8sCkBAIC0yMDk0OSw3ICsyMDk1
NSw2IEBACiAJCQkJQTEyMEFDQTAxM0Y5OTgzNzAwRkU0QUM3IC8qIExheW91dFJlcGFpbnRlci5o
ICovLAogCQkJCTJEOTA2NjA0MEJFMTQxRDQwMDk1Njk5OCAvKiBMYXlvdXRTdGF0ZS5jcHAgKi8s
CiAJCQkJMkQ5MDY2MDUwQkUxNDFENDAwOTU2OTk4IC8qIExheW91dFN0YXRlLmggKi8sCi0JCQkJ
QTA2QkZFMkMxN0RGQjQzMzAwODMwMkJCIC8qIExpbmVJbmZvLmggKi8sCiAJCQkJQTA3MThCRTgx
N0UyNkYxNjAwRjZCRjQ0IC8qIExpbmVMYXlvdXRTdGF0ZS5oICovLAogCQkJCUEwQ0IwMDIzMTdE
RjgxQUMwMDE3ODk2QiAvKiBMaW5lV2lkdGguY3BwICovLAogCQkJCUEwQ0IwMDIxMTdERTlDRDAw
MDE3ODk2QiAvKiBMaW5lV2lkdGguaCAqLywKQEAgLTIxODg5LDYgKzIxODk0LDE4IEBACiAJCQlu
YW1lID0gV2ViQXVkaW87CiAJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwogCQl9OworCQlGRkI2
OThDODE4MzJGMTBCMDAxNThBMzEgLyogbGluZSAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOwor
CQkJY2hpbGRyZW4gPSAoCisJCQkJRkZCNjk4Q0QxODMzRjE3NjAwMTU4QTMxIC8qIExpbmVJbmZv
LmNwcCAqLywKKwkJCQlGRkI2OThDRTE4MzNGMTc2MDAxNThBMzEgLyogTGluZUluZm8uaCAqLywK
KwkJCQlGRkI2OThDQTE4MzNFQzM4MDAxNThBMzEgLyogTGluZUJyZWFrZXIuY3BwICovLAorCQkJ
CUZGQjY5OENCMTgzM0VDMzgwMDE1OEEzMSAvKiBMaW5lQnJlYWtlci5oICovLAorCQkJCUZGQjY5
OEM5MTgzMkYxMEIwMDE1OEEzMSAvKiBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmggKi8s
CisJCQkpOworCQkJcGF0aCA9IGxpbmU7CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9
OwogLyogRW5kIFBCWEdyb3VwIHNlY3Rpb24gKi8KIAogLyogQmVnaW4gUEJYSGVhZGVyc0J1aWxk
UGhhc2Ugc2VjdGlvbiAqLwpAQCAtMjUxODAsNyArMjUxOTcsNiBAQAogCQkJCUJFMTZDNTk1MTdD
RkUxNzIwMDg1MkMwNCAvKiBJbmJhbmRXZWJWVFRUZXh0VHJhY2suaCBpbiBIZWFkZXJzICovLAog
CQkJCUJDMTBENzY4MTdEOEVFNzEwMDVFMjYyNiAvKiBSZW5kZXJCbG9ja0Zsb3cuaCBpbiBIZWFk
ZXJzICovLAogCQkJCUEwQ0IwMDI1MTdERjgyNkMwMDE3ODk2QiAvKiBMaW5lV2lkdGguaCBpbiBI
ZWFkZXJzICovLAotCQkJCUEwNkJGRTJFMTdERkI0M0YwMDgzMDJCQiAvKiBMaW5lSW5mby5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJQ0QzRTI1MUMxODA0NkIwNjAwRTI3RjU2IC8qIEdyaWRDb29yZGlu
YXRlLmggaW4gSGVhZGVycyAqLywKIAkJCQlDRDNFMjUyNDE4MDQ2QkNEMDBFMjdGNTYgLyogQ1NT
R3JpZFRlbXBsYXRlVmFsdWUuaCBpbiBIZWFkZXJzICovLAogCQkJCUNERUY0RkQ3MTdFODVDOEYw
MEFFRTI0QiAvKiBHcmlkTGVuZ3RoLmggaW4gSGVhZGVycyAqLywKQEAgLTI1NzY1LDYgKzI1Nzgx
LDcgQEAKIAkJCQk5NzdCMzg2MjEyMjg4M0U5MDBCODFGRjggLyogQ1NTUHJlbG9hZFNjYW5uZXIu
Y3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTgwRTZEMDUwQTE5ODlDQTAwN0ZCOEM1IC8qIENTU1By
aW1pdGl2ZVZhbHVlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4MEU2Q0Y3MEExOTg5Q0EwMDdG
QjhDNSAvKiBDU1NQcm9wZXJ0eS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlGRkI2OThDQzE4MzNF
RTBEMDAxNThBMzEgLyogTGluZUJyZWFrZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNzhEMDJC
QzUxNTRBMThERjAwQjYyRDA1IC8qIENTU1Byb3BlcnR5QW5pbWF0aW9uLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTFBQkE3NkNBMTFEMjBFNTAwMDRDMjAxQyAvKiBDU1NQcm9wZXJ0eU5hbWVzLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCTA3QzU5QjU2MTdGNEFDMTUwMDBGQkNCQiAvKiBWaWRlb1N0
cmVhbVRyYWNrLmNwcCBpbiBTb3VyY2VzICovLApAQCAtMjY1NzEsNiArMjY1ODgsNyBAQAogCQkJ
CTA3MDM2M0U1MTgxQTFDREMwMEMwNzRBNSAvKiBBVk1lZGlhQ2FwdHVyZVNvdXJjZS5tbSBpbiBT
b3VyY2VzICovLAogCQkJCTkzOTIyNjJGMTAzMjEwODQwMDZFN0Q1RCAvKiBKU0NTU1J1bGVMaXN0
Q3VzdG9tLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTE0MjAxMUI2MEEwMDMxMzMwMDgzMDNGOSAv
KiBKU0NTU1N0eWxlRGVjbGFyYXRpb24uY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJRkZCNjk4Q0Yx
ODM0MDJCQjAwMTU4QTMxIC8qIExpbmVJbmZvLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDNTgy
NUYzMEMwQjg5MzgwMDUzRjFCNSAvKiBKU0NTU1N0eWxlRGVjbGFyYXRpb25DdXN0b20uY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJQkM0NkMyMDYwQzBERENBMTAwMjBDRkMzIC8qIEpTQ1NTU3R5bGVS
dWxlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDQzVCRTAwMEMwRTkzMTEwMDExQzJEQiAvKiBK
U0NTU1N0eWxlU2hlZXQuY3BwIGluIFNvdXJjZXMgKi8sCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvTGluZUluZm8uaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5l
SW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTNhZTY2Li4wMDAwMDAwCi0t
LSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lSW5mby5oCisrKyAvZGV2L251bGwKQEAg
LTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIElu
Y29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCi0gKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgZGlzY2xhaW1lci4K
LSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKLSAqICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nCi0gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMKLSAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
Ci0gKiBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsCi0gKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECi0gKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBMaW5lSW5mb19oCi0jZGVmaW5lIExpbmVJbmZv
X2gKLQotI2luY2x1ZGUgIkxpbmVXaWR0aC5oIgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNs
YXNzIExpbmVJbmZvIHsKLXB1YmxpYzoKLSAgICBMaW5lSW5mbygpCi0gICAgICAgIDogbV9pc0Zp
cnN0TGluZSh0cnVlKQotICAgICAgICAsIG1faXNMYXN0TGluZShmYWxzZSkKLSAgICAgICAgLCBt
X2lzRW1wdHkodHJ1ZSkKLSAgICAgICAgLCBtX3ByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVl
KQotICAgICAgICAsIG1fZmxvYXRQYWdpbmF0aW9uU3RydXQoMCkKLSAgICAgICAgLCBtX3J1bnNG
cm9tTGVhZGluZ1doaXRlc3BhY2UoMCkKLSAgICB7IH0KLQotICAgIGJvb2wgaXNGaXJzdExpbmUo
KSBjb25zdCB7IHJldHVybiBtX2lzRmlyc3RMaW5lOyB9Ci0gICAgYm9vbCBpc0xhc3RMaW5lKCkg
Y29uc3QgeyByZXR1cm4gbV9pc0xhc3RMaW5lOyB9Ci0gICAgYm9vbCBpc0VtcHR5KCkgY29uc3Qg
eyByZXR1cm4gbV9pc0VtcHR5OyB9Ci0gICAgYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHko
KSBjb25zdCB7IHJldHVybiBtX3ByZXZpb3VzTGluZUJyb2tlQ2xlYW5seTsgfQotICAgIExheW91
dFVuaXQgZmxvYXRQYWdpbmF0aW9uU3RydXQoKSBjb25zdCB7IHJldHVybiBtX2Zsb2F0UGFnaW5h
dGlvblN0cnV0OyB9Ci0gICAgdW5zaWduZWQgcnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgpIGNv
bnN0IHsgcmV0dXJuIG1fcnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZTsgfQotICAgIHZvaWQgcmVz
ZXRSdW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKCkgeyBtX3J1bnNGcm9tTGVhZGluZ1doaXRlc3Bh
Y2UgPSAwOyB9Ci0gICAgdm9pZCBpbmNyZW1lbnRSdW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKCkg
eyBtX3J1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UrKzsgfQotCi0gICAgdm9pZCBzZXRGaXJzdExp
bmUoYm9vbCBmaXJzdExpbmUpIHsgbV9pc0ZpcnN0TGluZSA9IGZpcnN0TGluZTsgfQotICAgIHZv
aWQgc2V0TGFzdExpbmUoYm9vbCBsYXN0TGluZSkgeyBtX2lzTGFzdExpbmUgPSBsYXN0TGluZTsg
fQotICAgIHZvaWQgc2V0RW1wdHkoYm9vbCBlbXB0eSwgUmVuZGVyQmxvY2sqIGJsb2NrID0gMCwg
TGluZVdpZHRoKiBsaW5lV2lkdGggPSAwKQotICAgIHsKLSAgICAgICAgaWYgKG1faXNFbXB0eSA9
PSBlbXB0eSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgbV9pc0VtcHR5ID0gZW1wdHk7
Ci0gICAgICAgIGlmICghZW1wdHkgJiYgYmxvY2sgJiYgZmxvYXRQYWdpbmF0aW9uU3RydXQoKSkg
ewotICAgICAgICAgICAgYmxvY2stPnNldExvZ2ljYWxIZWlnaHQoYmxvY2stPmxvZ2ljYWxIZWln
aHQoKSArIGZsb2F0UGFnaW5hdGlvblN0cnV0KCkpOwotICAgICAgICAgICAgc2V0RmxvYXRQYWdp
bmF0aW9uU3RydXQoMCk7Ci0gICAgICAgICAgICBsaW5lV2lkdGgtPnVwZGF0ZUF2YWlsYWJsZVdp
ZHRoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNldFByZXZpb3VzTGluZUJyb2tl
Q2xlYW5seShib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSkgeyBtX3ByZXZpb3VzTGluZUJy
b2tlQ2xlYW5seSA9IHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seTsgfQotICAgIHZvaWQgc2V0Rmxv
YXRQYWdpbmF0aW9uU3RydXQoTGF5b3V0VW5pdCBzdHJ1dCkgeyBtX2Zsb2F0UGFnaW5hdGlvblN0
cnV0ID0gc3RydXQ7IH0KLQotcHJpdmF0ZToKLSAgICBib29sIG1faXNGaXJzdExpbmU7Ci0gICAg
Ym9vbCBtX2lzTGFzdExpbmU7Ci0gICAgYm9vbCBtX2lzRW1wdHk7Ci0gICAgYm9vbCBtX3ByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seTsKLSAgICBMYXlvdXRVbml0IG1fZmxvYXRQYWdpbmF0aW9uU3Ry
dXQ7Ci0gICAgdW5zaWduZWQgbV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlOwotfTsKLQotfQot
Ci0jZW5kaWYgLy8gTGluZUluZm9faApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAppbmRleCBlNTdiYzg1Li4yMTU2NjUzIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcApA
QCAtMyw2ICszLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNiwgMjAwNywg
MjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KICAq
IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICog
Q29weXJpZ2h0IChDKSAyMDEzIENoYW5nU2VvayBPaCA8c2hpdmFtaWRvd0BnbWFpbC5jb20+Cisg
KiBDb3B5cmlnaHQgKEMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmMuIEFsbCByaWdodCByZXNlcnZl
ZC4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAtMjUsMTM4ICsyNiwzMSBAQAogCiAjaW5jbHVkZSAi
QVhPYmplY3RDYWNoZS5oIgogI2luY2x1ZGUgIkJpZGlSZXNvbHZlci5oIgorI2luY2x1ZGUgIkJy
ZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCIKICNpbmNsdWRlICJGbG9hdGluZ09iamVjdHMu
aCIKLSNpbmNsdWRlICJIeXBoZW5hdGlvbi5oIgogI2luY2x1ZGUgIklubGluZUVsZW1lbnRCb3gu
aCIKICNpbmNsdWRlICJJbmxpbmVJdGVyYXRvci5oIgogI2luY2x1ZGUgIklubGluZVRleHRCb3gu
aCIKLSNpbmNsdWRlICJMaW5lSW5mby5oIgogI2luY2x1ZGUgIkxpbmVMYXlvdXRTdGF0ZS5oIgog
I2luY2x1ZGUgIkxvZ2dpbmcuaCIKICNpbmNsdWRlICJSZW5kZXJCbG9ja0Zsb3cuaCIKLSNpbmNs
dWRlICJSZW5kZXJDb21iaW5lVGV4dC5oIgotI2luY2x1ZGUgIlJlbmRlckNvdW50ZXIuaCIKICNp
bmNsdWRlICJSZW5kZXJGbG93VGhyZWFkLmgiCi0jaW5jbHVkZSAiUmVuZGVySW5saW5lLmgiCi0j
aW5jbHVkZSAiUmVuZGVyTGF5ZXIuaCIKICNpbmNsdWRlICJSZW5kZXJMaW5lQnJlYWsuaCIKLSNp
bmNsdWRlICJSZW5kZXJMaXN0TWFya2VyLmgiCiAjaW5jbHVkZSAiUmVuZGVyUmVnaW9uLmgiCi0j
aW5jbHVkZSAiUmVuZGVyUnVieVJ1bi5oIgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNs
dWRlICJTZXR0aW5ncy5oIgogI2luY2x1ZGUgIlNpbXBsZUxpbmVMYXlvdXRGdW5jdGlvbnMuaCIK
ICNpbmNsdWRlICJUcmFpbGluZ0Zsb2F0c1Jvb3RJbmxpbmVCb3guaCIKICNpbmNsdWRlICJWZXJ0
aWNhbFBvc2l0aW9uQ2FjaGUuaCIKLSNpbmNsdWRlICJicmVha19saW5lcy5oIgogI2luY2x1ZGUg
PHd0Zi9SZWZDb3VudGVkTGVha0NvdW50ZXIuaD4KICNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFz
Lmg+Ci0jaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHd0Zi91bmljb2RlL0NoYXJh
Y3Rlck5hbWVzLmg+Ci0KLSNpZiBFTkFCTEUoQ1NTX1NIQVBFUykKLSNpbmNsdWRlICJTaGFwZUlu
c2lkZUluZm8uaCIKLSNlbmRpZgogCiAjaWYgRU5BQkxFKFNWRykKLSNpbmNsdWRlICJSZW5kZXJT
VkdJbmxpbmVUZXh0LmgiCiAjaW5jbHVkZSAiU1ZHUm9vdElubGluZUJveC5oIgogI2VuZGlmCiAK
LXVzaW5nIG5hbWVzcGFjZSBXVEY7Ci11c2luZyBuYW1lc3BhY2UgVW5pY29kZTsKLQogbmFtZXNw
YWNlIFdlYkNvcmUgewogCi0vLyBXZSBkb24ndCBsZXQgb3VyIGxpbmUgYm94IHRyZWUgZm9yIGEg
c2luZ2xlIGxpbmUgZ2V0IGFueSBkZWVwZXIgdGhhbiB0aGlzLgotY29uc3QgdW5zaWduZWQgY01h
eExpbmVEZXB0aCA9IDIwMDsKLQotc3RydWN0IFJlbmRlclRleHRJbmZvIHsKLSAgICAvLyBEZXN0
cnVjdGlvbiBvZiBtX2xheW91dCByZXF1aXJlcyBUZXh0TGF5b3V0IHRvIGJlIGEgY29tcGxldGUg
dHlwZSwgc28gdGhlIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIGFyZSBtYWRlIG5vbi1pbmxp
bmUgdG8gYXZvaWQgY29tcGlsYXRpb24gZXJyb3JzLgotICAgIFJlbmRlclRleHRJbmZvKCk7Ci0g
ICAgflJlbmRlclRleHRJbmZvKCk7Ci0KLSAgICBSZW5kZXJUZXh0KiBtX3RleHQ7Ci0gICAgT3du
UHRyPFRleHRMYXlvdXQ+IG1fbGF5b3V0OwotICAgIExhenlMaW5lQnJlYWtJdGVyYXRvciBtX2xp
bmVCcmVha0l0ZXJhdG9yOwotICAgIGNvbnN0IEZvbnQqIG1fZm9udDsKLX07Ci0KLWNsYXNzIExp
bmVCcmVha2VyIHsKLXB1YmxpYzoKLSAgICBmcmllbmQgY2xhc3MgQnJlYWtpbmdDb250ZXh0Owot
ICAgIExpbmVCcmVha2VyKFJlbmRlckJsb2NrRmxvdyYgYmxvY2spCi0gICAgICAgIDogbV9ibG9j
ayhibG9jaykKLSAgICB7Ci0gICAgICAgIHJlc2V0KCk7Ci0gICAgfQotCi0gICAgSW5saW5lSXRl
cmF0b3IgbmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYsIFJlbmRl
clRleHRJbmZvJiwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHVu
c2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBXb3JkTWVhc3VyZW1lbnRzJik7Ci0K
LSAgICBib29sIGxpbmVXYXNIeXBoZW5hdGVkKCkgeyByZXR1cm4gbV9oeXBoZW5hdGVkOyB9Ci0g
ICAgY29uc3QgVmVjdG9yPFJlbmRlckJveCo+JiBwb3NpdGlvbmVkT2JqZWN0cygpIHsgcmV0dXJu
IG1fcG9zaXRpb25lZE9iamVjdHM7IH0KLSAgICBFQ2xlYXIgY2xlYXIoKSB7IHJldHVybiBtX2Ns
ZWFyOyB9Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCByZXNldCgpOwotCi0gICAgSW5saW5lSXRlcmF0
b3IgbmV4dFNlZ21lbnRCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYsIFJlbmRl
clRleHRJbmZvJiwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHVu
c2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBXb3JkTWVhc3VyZW1lbnRzJik7Ci0g
ICAgdm9pZCBza2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiwgY29uc3QgTGlu
ZUluZm8mKTsKLSAgICB2b2lkIHNraXBMZWFkaW5nV2hpdGVzcGFjZShJbmxpbmVCaWRpUmVzb2x2
ZXImLCBMaW5lSW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5l
LCBMaW5lV2lkdGgmKTsKLQotICAgIFJlbmRlckJsb2NrRmxvdyYgbV9ibG9jazsKLSAgICBib29s
IG1faHlwaGVuYXRlZDsKLSAgICBFQ2xlYXIgbV9jbGVhcjsKLSAgICBWZWN0b3I8UmVuZGVyQm94
Kj4gbV9wb3NpdGlvbmVkT2JqZWN0czsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgTGF5b3V0VW5pdCBi
b3JkZXJQYWRkaW5nTWFyZ2luU3RhcnQoY29uc3QgUmVuZGVySW5saW5lJiBjaGlsZCkKLXsKLSAg
ICByZXR1cm4gY2hpbGQubWFyZ2luU3RhcnQoKSArIGNoaWxkLnBhZGRpbmdTdGFydCgpICsgY2hp
bGQuYm9yZGVyU3RhcnQoKTsKLX0KLQotc3RhdGljIGlubGluZSBMYXlvdXRVbml0IGJvcmRlclBh
ZGRpbmdNYXJnaW5FbmQoY29uc3QgUmVuZGVySW5saW5lJiBjaGlsZCkKLXsKLSAgICByZXR1cm4g
Y2hpbGQubWFyZ2luRW5kKCkgKyBjaGlsZC5wYWRkaW5nRW5kKCkgKyBjaGlsZC5ib3JkZXJFbmQo
KTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIHNob3VsZEFkZEJvcmRlclBhZGRpbmdNYXJnaW4o
UmVuZGVyT2JqZWN0KiBjaGlsZCkKLXsKLSAgICAvLyBXaGVuIGRlY2lkaW5nIHdoZXRoZXIgd2Un
cmUgYXQgdGhlIGVkZ2Ugb2YgYW4gaW5saW5lLCBhZGphY2VudCBjb2xsYXBzZWQgd2hpdGVzcGFj
ZSBpcyB0aGUgc2FtZSBhcyBubyBzaWJsaW5nIGF0IGFsbC4KLSAgICByZXR1cm4gIWNoaWxkIHx8
IChjaGlsZC0+aXNUZXh0KCkgJiYgIXRvUmVuZGVyVGV4dChjaGlsZCktPnRleHRMZW5ndGgoKSk7
Ci19Ci0KLXN0YXRpYyBSZW5kZXJPYmplY3QqIHByZXZpb3VzSW5GbG93U2libGluZyhSZW5kZXJP
YmplY3QqIGNoaWxkKQotewotICAgIGNoaWxkID0gY2hpbGQtPnByZXZpb3VzU2libGluZygpOwot
ICAgIHdoaWxlIChjaGlsZCAmJiBjaGlsZC0+aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAg
ICAgIGNoaWxkID0gY2hpbGQtPnByZXZpb3VzU2libGluZygpOwotICAgIHJldHVybiBjaGlsZDsK
LX0KLQotc3RhdGljIExheW91dFVuaXQgaW5saW5lTG9naWNhbFdpZHRoKFJlbmRlck9iamVjdCog
Y2hpbGQsIGJvb2wgY2hlY2tTdGFydEVkZ2UgPSB0cnVlLCBib29sIGNoZWNrRW5kRWRnZSA9IHRy
dWUpCi17Ci0gICAgdW5zaWduZWQgbGluZURlcHRoID0gMTsKLSAgICBMYXlvdXRVbml0IGV4dHJh
V2lkdGggPSAwOwotICAgIFJlbmRlckVsZW1lbnQqIHBhcmVudCA9IGNoaWxkLT5wYXJlbnQoKTsK
LSAgICB3aGlsZSAocGFyZW50LT5pc1JlbmRlcklubGluZSgpICYmIGxpbmVEZXB0aCsrIDwgY01h
eExpbmVEZXB0aCkgewotICAgICAgICBjb25zdCBSZW5kZXJJbmxpbmUmIHBhcmVudEFzUmVuZGVy
SW5saW5lID0gdG9SZW5kZXJJbmxpbmUoKnBhcmVudCk7Ci0gICAgICAgIGlmICghaXNFbXB0eUlu
bGluZShwYXJlbnRBc1JlbmRlcklubGluZSkpIHsKLSAgICAgICAgICAgIGNoZWNrU3RhcnRFZGdl
ID0gY2hlY2tTdGFydEVkZ2UgJiYgc2hvdWxkQWRkQm9yZGVyUGFkZGluZ01hcmdpbihwcmV2aW91
c0luRmxvd1NpYmxpbmcoY2hpbGQpKTsKLSAgICAgICAgICAgIGlmIChjaGVja1N0YXJ0RWRnZSkK
LSAgICAgICAgICAgICAgICBleHRyYVdpZHRoICs9IGJvcmRlclBhZGRpbmdNYXJnaW5TdGFydChw
YXJlbnRBc1JlbmRlcklubGluZSk7Ci0gICAgICAgICAgICBjaGVja0VuZEVkZ2UgPSBjaGVja0Vu
ZEVkZ2UgJiYgc2hvdWxkQWRkQm9yZGVyUGFkZGluZ01hcmdpbihjaGlsZC0+bmV4dFNpYmxpbmco
KSk7Ci0gICAgICAgICAgICBpZiAoY2hlY2tFbmRFZGdlKQotICAgICAgICAgICAgICAgIGV4dHJh
V2lkdGggKz0gYm9yZGVyUGFkZGluZ01hcmdpbkVuZChwYXJlbnRBc1JlbmRlcklubGluZSk7Ci0g
ICAgICAgICAgICBpZiAoIWNoZWNrU3RhcnRFZGdlICYmICFjaGVja0VuZEVkZ2UpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIGV4dHJhV2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgY2hpbGQgPSBw
YXJlbnQ7Ci0gICAgICAgIHBhcmVudCA9IGNoaWxkLT5wYXJlbnQoKTsKLSAgICB9Ci0gICAgcmV0
dXJuIGV4dHJhV2lkdGg7Ci19Ci0KIHN0YXRpYyB2b2lkIGRldGVybWluZURpcmVjdGlvbmFsaXR5
KFRleHREaXJlY3Rpb24mIGRpciwgSW5saW5lSXRlcmF0b3IgaXRlcikKIHsKICAgICB3aGlsZSAo
IWl0ZXIuYXRFbmQoKSkgewpAQCAtMTc3LDY3ICs3MSw3IEBAIHN0YXRpYyB2b2lkIGRldGVybWlu
ZURpcmVjdGlvbmFsaXR5KFRleHREaXJlY3Rpb24mIGRpciwgSW5saW5lSXRlcmF0b3IgaXRlcikK
ICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNoZWNrTWlkcG9pbnRzKExpbmVNaWRwb2ludFN0YXRl
JiBsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3ImIGxCcmVhaykKLXsKLSAgICAvLyBD
aGVjayB0byBzZWUgaWYgb3VyIGxhc3QgbWlkcG9pbnQgaXMgYSBzdGFydCBwb2ludCBiZXlvbmQg
dGhlIGxpbmUgYnJlYWsuICBJZiBzbywKLSAgICAvLyBzaGF2ZSBpdCBvZmYgdGhlIGxpc3QsIGFu
ZCBzaGF2ZSBvZmYgYSB0cmFpbGluZyBzcGFjZSBpZiB0aGUgcHJldmlvdXMgZW5kIHBvaW50IGRv
ZXNuJ3QKLSAgICAvLyBwcmVzZXJ2ZSB3aGl0ZXNwYWNlLgotICAgIGlmIChsQnJlYWsubV9vYmog
JiYgbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzICYmICEobGluZU1pZHBvaW50U3RhdGUu
bnVtTWlkcG9pbnRzICUgMikpIHsKLSAgICAgICAgSW5saW5lSXRlcmF0b3IqIG1pZHBvaW50cyA9
IGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50cy5kYXRhKCk7Ci0gICAgICAgIElubGluZUl0ZXJh
dG9yJiBlbmRwb2ludCA9IG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMg
LSAyXTsKLSAgICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3ImIHN0YXJ0cG9pbnQgPSBtaWRwb2lu
dHNbbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzIC0gMV07Ci0gICAgICAgIElubGluZUl0
ZXJhdG9yIGN1cnJwb2ludCA9IGVuZHBvaW50OwotICAgICAgICB3aGlsZSAoIWN1cnJwb2ludC5h
dEVuZCgpICYmIGN1cnJwb2ludCAhPSBzdGFydHBvaW50ICYmIGN1cnJwb2ludCAhPSBsQnJlYWsp
Ci0gICAgICAgICAgICBjdXJycG9pbnQuaW5jcmVtZW50KCk7Ci0gICAgICAgIGlmIChjdXJycG9p
bnQgPT0gbEJyZWFrKSB7Ci0gICAgICAgICAgICAvLyBXZSBoaXQgdGhlIGxpbmUgYnJlYWsgYmVm
b3JlIHRoZSBzdGFydCBwb2ludC4gIFNoYXZlIG9mZiB0aGUgc3RhcnQgcG9pbnQuCi0gICAgICAg
ICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMtLTsKLSAgICAgICAgICAgIGlmIChl
bmRwb2ludC5tX29iai0+c3R5bGUoKS5jb2xsYXBzZVdoaXRlU3BhY2UoKSAmJiBlbmRwb2ludC5t
X29iai0+aXNUZXh0KCkpCi0gICAgICAgICAgICAgICAgZW5kcG9pbnQubV9wb3MtLTsKLSAgICAg
ICAgfQotICAgIH0KLX0KLQotLy8gRG9uJ3QgY2FsbCB0aGlzIGRpcmVjdGx5LiBVc2Ugb25lIG9m
IHRoZSBkZXNjcmlwdGl2ZSBoZWxwZXIgZnVuY3Rpb25zIGJlbG93Lgotc3RhdGljIHZvaWQgZGVw
cmVjYXRlZEFkZE1pZHBvaW50KExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwg
Y29uc3QgSW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQotewotICAgIGlmIChsaW5lTWlkcG9pbnRT
dGF0ZS5taWRwb2ludHMuc2l6ZSgpIDw9IGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cykK
LSAgICAgICAgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmdyb3cobGluZU1pZHBvaW50U3Rh
dGUubnVtTWlkcG9pbnRzICsgMTApOwotCi0gICAgSW5saW5lSXRlcmF0b3IqIG1pZHBvaW50cyA9
IGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50cy5kYXRhKCk7Ci0gICAgbWlkcG9pbnRzW2xpbmVN
aWRwb2ludFN0YXRlLm51bU1pZHBvaW50cysrXSA9IG1pZHBvaW50OwotfQotCi1zdGF0aWMgaW5s
aW5lIHZvaWQgc3RhcnRJZ25vcmluZ1NwYWNlcyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBv
aW50U3RhdGUsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBtaWRwb2ludCkKLXsKLSAgICBBU1NFUlQo
IShsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgJSAyKSk7Ci0gICAgZGVwcmVjYXRlZEFk
ZE1pZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBtaWRwb2ludCk7Ci19Ci0KLXN0YXRpYyBpbmxp
bmUgdm9pZCBzdG9wSWdub3JpbmdTcGFjZXMoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2lu
dFN0YXRlLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbWlkcG9pbnQpCi17Ci0gICAgQVNTRVJUKGxp
bmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAlIDIpOwotICAgIGRlcHJlY2F0ZWRBZGRNaWRw
b2ludChsaW5lTWlkcG9pbnRTdGF0ZSwgbWlkcG9pbnQpOwotfQotCi0vLyBXaGVuIGlnbm9yaW5n
IHNwYWNlcywgdGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgZm9yIG9iamVjdHMgdGhhdCBuZWVkIGxp
bmUgYm94ZXMgc3VjaCBhcyBSZW5kZXJJbmxpbmVzIG9yCi0vLyBoYXJkIGxpbmUgYnJlYWtzIHRv
IGVuc3VyZSB0aGF0IHRoZXkncmUgbm90IGlnbm9yZWQuCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5z
dXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRw
b2ludFN0YXRlLCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQotewotICAgIElubGluZUl0ZXJhdG9y
IG1pZHBvaW50KDAsIHJlbmRlcmVyLCAwKTsKLSAgICBzdG9wSWdub3JpbmdTcGFjZXMobGluZU1p
ZHBvaW50U3RhdGUsIG1pZHBvaW50KTsKLSAgICBzdGFydElnbm9yaW5nU3BhY2VzKGxpbmVNaWRw
b2ludFN0YXRlLCBtaWRwb2ludCk7Ci19Ci0KLS8vIEFkZGluZyBhIHBhaXIgb2YgbWlkcG9pbnRz
IGJlZm9yZSBhIGNoYXJhY3RlciB3aWxsIHNwbGl0IGl0IG91dCBpbnRvIGEgbmV3IGxpbmUgYm94
Lgotc3RhdGljIGlubGluZSB2b2lkIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KExpbmVNaWRw
b2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3ImIHRleHRQYXJhZ3Jh
cGhTZXBhcmF0b3IpCi17Ci0gICAgSW5saW5lSXRlcmF0b3IgbWlkcG9pbnQoMCwgdGV4dFBhcmFn
cmFwaFNlcGFyYXRvci5tX29iaiwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX3Bvcyk7Ci0gICAg
c3RhcnRJZ25vcmluZ1NwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwg
dGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX29iaiwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX3Bv
cyAtIDEpKTsKLSAgICBzdG9wSWdub3JpbmdTcGFjZXMobGluZU1pZHBvaW50U3RhdGUsIElubGlu
ZUl0ZXJhdG9yKDAsIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IubV9vYmosIHRleHRQYXJhZ3JhcGhT
ZXBhcmF0b3IubV9wb3MpKTsKLX0KLQotc3RhdGljIGlubGluZSBCaWRpUnVuKiBjcmVhdGVSdW4o
aW50IHN0YXJ0LCBpbnQgZW5kLCBSZW5kZXJPYmplY3QqIG9iaiwgSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlcikKK2lubGluZSBCaWRpUnVuKiBjcmVhdGVSdW4oaW50IHN0YXJ0LCBpbnQgZW5k
LCBSZW5kZXJPYmplY3QqIG9iaiwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlcikKIHsKICAg
ICBBU1NFUlQob2JqKTsKICAgICByZXR1cm4gbmV3IEJpZGlSdW4oc3RhcnQsIGVuZCwgKm9iaiwg
cmVzb2x2ZXIuY29udGV4dCgpLCByZXNvbHZlci5kaXIoKSk7CkBAIC0zMDMsNyArMTM3LDYgQEAg
Um9vdElubGluZUJveCogUmVuZGVyQmxvY2tGbG93OjpjcmVhdGVBbmRBcHBlbmRSb290SW5saW5l
Qm94KCkKICAgICByZXR1cm4gcm9vdEJveDsKIH0KIAotCiBzdGF0aWMgaW5saW5lIElubGluZUJv
eCogY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGJvb2wgaXNS
b290TGluZUJveCwgYm9vbCBpc09ubHlSdW4gPSBmYWxzZSkKIHsKICAgICBpZiAoaXNSb290TGlu
ZUJveCkKQEAgLTMyOSwxNSArMTYyLDYgQEAgc3RhdGljIGlubGluZSBJbmxpbmVCb3gqIGNyZWF0
ZUlubGluZUJveEZvclJlbmRlcmVyKFJlbmRlck9iamVjdCogb2JqLCBib29sIGlzUm8KICAgICBy
ZXR1cm4gdG9SZW5kZXJJbmxpbmUob2JqKS0+Y3JlYXRlQW5kQXBwZW5kSW5saW5lRmxvd0JveCgp
OwogfQogCi0vLyBGSVhNRTogRG9uJ3QgbGV0IGNvdW50ZXJzIG1hcmsgdGhlbXNlbHZlcyBhcyBu
ZWVkaW5nIHByZWYgd2lkdGggcmVjYWxjcyBkdXJpbmcgbGF5b3V0Ci0vLyBzbyB3ZSBkb24ndCBu
ZWVkIHRoaXMgaGFjay4KLXN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVDb3VudGVySWZOZWVkZWQo
UmVuZGVyVGV4dCYgcmVuZGVyVGV4dCkKLXsKLSAgICBpZiAoIXJlbmRlclRleHQucHJlZmVycmVk
TG9naWNhbFdpZHRoc0RpcnR5KCkgfHwgIXJlbmRlclRleHQuaXNDb3VudGVyKCkpCi0gICAgICAg
IHJldHVybjsKLSAgICB0b1JlbmRlckNvdW50ZXIocmVuZGVyVGV4dCkudXBkYXRlQ291bnRlcigp
OwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgZGlydHlMaW5lQm94ZXNGb3JSZW5kZXJlcihSZW5k
ZXJPYmplY3QmIHJlbmRlcmVyLCBib29sIGZ1bGxMYXlvdXQpCiB7CiAgICAgaWYgKHJlbmRlcmVy
LmlzVGV4dCgpKSB7CkBAIC02MDUsMzQgKzQyOSw2IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93Ojpz
ZXRNYXJnaW5zRm9yUnVieVJ1bihCaWRpUnVuKiBydW4sIFJlbmRlclJ1YnlSdW4mIHJlbmRlcmVy
CiAgICAgc2V0TWFyZ2luRW5kRm9yQ2hpbGQocmVuZGVyZXIsIC1lbmRPdmVyaGFuZyk7CiB9CiAK
LXN0YXRpYyBpbmxpbmUgZmxvYXQgbWVhc3VyZUh5cGhlbldpZHRoKFJlbmRlclRleHQqIHJlbmRl
cmVyLCBjb25zdCBGb250JiBmb250LCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGZh
bGxiYWNrRm9udHMgPSAwKQotewotICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IHJlbmRl
cmVyLT5zdHlsZSgpOwotICAgIHJldHVybiBmb250LndpZHRoKFJlbmRlckJsb2NrOjpjb25zdHJ1
Y3RUZXh0UnVuKHJlbmRlcmVyLCBmb250LCBzdHlsZS5oeXBoZW5TdHJpbmcoKS5zdHJpbmcoKSwg
c3R5bGUpLCBmYWxsYmFja0ZvbnRzKTsKLX0KLQotY2xhc3MgV29yZE1lYXN1cmVtZW50IHsKLXB1
YmxpYzoKLSAgICBXb3JkTWVhc3VyZW1lbnQoKQotICAgICAgICA6IHJlbmRlcmVyKDApCi0gICAg
ICAgICwgd2lkdGgoMCkKLSAgICAgICAgLCBzdGFydE9mZnNldCgwKQotICAgICAgICAsIGVuZE9m
ZnNldCgwKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgUmVuZGVyVGV4dCogcmVuZGVyZXI7Ci0g
ICAgZmxvYXQgd2lkdGg7Ci0gICAgaW50IHN0YXJ0T2Zmc2V0OwotICAgIGludCBlbmRPZmZzZXQ7
Ci0gICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+IGZhbGxiYWNrRm9udHM7Ci19Owot
Ci1zdGF0aWMgaW5saW5lIGNvbnN0IFJlbmRlclN0eWxlJiBsaW5lU3R5bGUoY29uc3QgUmVuZGVy
RWxlbWVudCYgcmVuZGVyZXIsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykKLXsKLSAgICByZXR1
cm4gbGluZUluZm8uaXNGaXJzdExpbmUoKSA/IHJlbmRlcmVyLmZpcnN0TGluZVN0eWxlKCkgOiBy
ZW5kZXJlci5zdHlsZSgpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0TG9naWNhbFdpZHRo
Rm9yVGV4dFJ1bihSb290SW5saW5lQm94KiBsaW5lQm94LCBCaWRpUnVuKiBydW4sIFJlbmRlclRl
eHQqIHJlbmRlcmVyLCBmbG9hdCB4UG9zLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sCiAgICAg
R2x5cGhPdmVyZmxvd0FuZEZhbGxiYWNrRm9udHNNYXAmIHRleHRCb3hEYXRhTWFwLCBWZXJ0aWNh
bFBvc2l0aW9uQ2FjaGUmIHZlcnRpY2FsUG9zaXRpb25DYWNoZSwgV29yZE1lYXN1cmVtZW50cyYg
d29yZE1lYXN1cmVtZW50cykKIHsKQEAgLTk5NywyNCArNzkzLDYgQEAgc3RhdGljIGlubGluZSBi
b29sIGlzQ29sbGFwc2libGVTcGFjZShVQ2hhciBjaGFyYWN0ZXIsIGNvbnN0IFJlbmRlclRleHQm
IHJlbmRlcmUKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLQotc3RhdGljIHZvaWQgc2V0U3RhdGlj
UG9zaXRpb25zKFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIFJlbmRlckJveCYgY2hpbGQpCi17Ci0g
ICAgLy8gRklYTUU6IFRoZSBtYXRoIGhlcmUgaXMgYWN0dWFsbHkgbm90IHJlYWxseSByaWdodC4g
SXQncyBhIGJlc3QtZ3Vlc3MgYXBwcm94aW1hdGlvbiB0aGF0Ci0gICAgLy8gd2lsbCB3b3JrIGZv
ciB0aGUgY29tbW9uIGNhc2VzCi0gICAgUmVuZGVyRWxlbWVudCogY29udGFpbmVyQmxvY2sgPSBj
aGlsZC5jb250YWluZXIoKTsKLSAgICBMYXlvdXRVbml0IGJsb2NrSGVpZ2h0ID0gYmxvY2subG9n
aWNhbEhlaWdodCgpOwotICAgIGlmIChjb250YWluZXJCbG9jay0+aXNSZW5kZXJJbmxpbmUoKSkg
ewotICAgICAgICAvLyBBIHJlbGF0aXZlIHBvc2l0aW9uZWQgaW5saW5lIGVuY2xvc2VzIHVzLiBJ
biB0aGlzIGNhc2UsIHdlIGFsc28gaGF2ZSB0byBkZXRlcm1pbmUgb3VyCi0gICAgICAgIC8vIHBv
c2l0aW9uIGFzIHRob3VnaCB3ZSB3ZXJlIGFuIGlubGluZS4gU2V0IHxzdGF0aWNJbmxpbmVQb3Np
dGlvbnwgYW5kIHxzdGF0aWNCbG9ja1Bvc2l0aW9ufCBvbiB0aGUgcmVsYXRpdmUgcG9zaXRpb25l
ZAotICAgICAgICAvLyBpbmxpbmUgc28gdGhhdCB3ZSBjYW4gb2J0YWluIHRoZSB2YWx1ZSBsYXRl
ci4KLSAgICAgICAgdG9SZW5kZXJJbmxpbmUoY29udGFpbmVyQmxvY2spLT5sYXllcigpLT5zZXRT
dGF0aWNJbmxpbmVQb3NpdGlvbihibG9jay5zdGFydEFsaWduZWRPZmZzZXRGb3JMaW5lKGJsb2Nr
SGVpZ2h0LCBmYWxzZSkpOwotICAgICAgICB0b1JlbmRlcklubGluZShjb250YWluZXJCbG9jaykt
PmxheWVyKCktPnNldFN0YXRpY0Jsb2NrUG9zaXRpb24oYmxvY2tIZWlnaHQpOwotICAgIH0KLSAg
ICBibG9jay51cGRhdGVTdGF0aWNJbmxpbmVQb3NpdGlvbkZvckNoaWxkKGNoaWxkLCBibG9ja0hl
aWdodCk7Ci0gICAgY2hpbGQubGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlvbihibG9ja0hl
aWdodCk7Ci19Ci0KIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFyYWN0ZXJUeXBlPgogc3RhdGljIGlu
bGluZSBpbnQgZmluZEZpcnN0VHJhaWxpbmdTcGFjZShjb25zdCBSZW5kZXJUZXh0JiBsYXN0VGV4
dCwgY29uc3QgQ2hhcmFjdGVyVHlwZSogY2hhcmFjdGVycywgaW50IHN0YXJ0LCBpbnQgc3RvcCkK
IHsKQEAgLTE0NjYsMTUgKzEyNDQsNiBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6dXBkYXRlU2hh
cGVBbmRTZWdtZW50c0ZvckN1cnJlbnRMaW5lSW5GbG93VGhyZWFkKFNoYXBlSW5zaQogICAgICAg
ICBwdXNoU2hhcGVDb250ZW50T3ZlcmZsb3dCZWxvd1RoZUNvbnRlbnRCb3godGhpcywgc2hhcGVJ
bnNpZGVJbmZvLCBsaW5lVG9wLCBsaW5lSGVpZ2h0KTsKIH0KIAotc3RhdGljIGlubGluZSBmbG9h
dCBmaXJzdFBvc2l0aXZlV2lkdGgoY29uc3QgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVt
ZW50cykKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdvcmRNZWFzdXJlbWVudHMuc2l6
ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKHdvcmRNZWFzdXJlbWVudHNbaV0ud2lkdGggPiAwKQot
ICAgICAgICAgICAgcmV0dXJuIHdvcmRNZWFzdXJlbWVudHNbaV0ud2lkdGg7Ci0gICAgfQotICAg
IHJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIExheW91dFVuaXQgYWRqdXN0TG9naWNhbExp
bmVUb3AoU2hhcGVJbnNpZGVJbmZvKiBzaGFwZUluc2lkZUluZm8sIElubGluZUl0ZXJhdG9yIHN0
YXJ0LCBJbmxpbmVJdGVyYXRvciBlbmQsIGNvbnN0IFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFz
dXJlbWVudHMpCiB7CiAgICAgaWYgKCFzaGFwZUluc2lkZUluZm8gfHwgZW5kICE9IHN0YXJ0KQpA
QCAtMjIyNSw5MSArMTk5NCw2IEBAIGJvb2wgUmVuZGVyQmxvY2tGbG93OjptYXRjaGVkRW5kTGlu
ZShMaW5lTGF5b3V0U3RhdGUmIGxheW91dFN0YXRlLCBjb25zdCBJbmxpbmVCCiAgICAgcmV0dXJu
IGZhbHNlOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgc2tpcE5vbkJyZWFraW5nU3BhY2UoY29u
c3QgSW5saW5lSXRlcmF0b3ImIGl0LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCi17Ci0gICAg
aWYgKGl0Lm1fb2JqLT5zdHlsZSgpLm5ic3BNb2RlKCkgIT0gU1BBQ0UgfHwgaXQuY3VycmVudCgp
ICE9IG5vQnJlYWtTcGFjZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gRklYTUU6
IFRoaXMgaXMgYmFkLiAgSXQgbWFrZXMgbmJzcCBpbmNvbnNpc3RlbnQgd2l0aCBzcGFjZSBhbmQg
d29uJ3Qgd29yayBjb3JyZWN0bHkKLSAgICAvLyB3aXRoIG1fbWluV2lkdGgvbV9tYXhXaWR0aC4K
LSAgICAvLyBEbyBub3Qgc2tpcCBhIG5vbi1icmVha2luZyBzcGFjZSBpZiBpdCBpcyB0aGUgZmly
c3QgY2hhcmFjdGVyCi0gICAgLy8gb24gYSBsaW5lIGFmdGVyIGEgY2xlYW4gbGluZSBicmVhayAo
b3Igb24gdGhlIGZpcnN0IGxpbmUsIHNpbmNlIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSBzdGFy
dHMgb2ZmCi0gICAgLy8gfHRydWV8KS4KLSAgICBpZiAobGluZUluZm8uaXNFbXB0eSgpICYmIGxp
bmVJbmZvLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotZW51bSBXaGl0ZXNwYWNlUG9zaXRpb24geyBMZWFk
aW5nV2hpdGVzcGFjZSwgVHJhaWxpbmdXaGl0ZXNwYWNlIH07Ci1zdGF0aWMgaW5saW5lIGJvb2wg
c2hvdWxkQ29sbGFwc2VXaGl0ZVNwYWNlKGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3Qg
TGluZUluZm8mIGxpbmVJbmZvLCBXaGl0ZXNwYWNlUG9zaXRpb24gd2hpdGVzcGFjZVBvc2l0aW9u
KQotewotICAgIC8vIENTUzIgMTYuNi4xCi0gICAgLy8gSWYgYSBzcGFjZSAoVSswMDIwKSBhdCB0
aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBoYXMgJ3doaXRlLXNwYWNlJyBzZXQgdG8gJ25vcm1hbCcs
ICdub3dyYXAnLCBvciAncHJlLWxpbmUnLCBpdCBpcyByZW1vdmVkLgotICAgIC8vIElmIGEgc3Bh
Y2UgKFUrMDAyMCkgYXQgdGhlIGVuZCBvZiBhIGxpbmUgaGFzICd3aGl0ZS1zcGFjZScgc2V0IHRv
ICdub3JtYWwnLCAnbm93cmFwJywgb3IgJ3ByZS1saW5lJywgaXQgaXMgYWxzbyByZW1vdmVkLgot
ICAgIC8vIElmIHNwYWNlcyAoVSswMDIwKSBvciB0YWJzIChVKzAwMDkpIGF0IHRoZSBlbmQgb2Yg
YSBsaW5lIGhhdmUgJ3doaXRlLXNwYWNlJyBzZXQgdG8gJ3ByZS13cmFwJywgVUFzIG1heSB2aXN1
YWxseSBjb2xsYXBzZSB0aGVtLgotICAgIHJldHVybiBzdHlsZS0+Y29sbGFwc2VXaGl0ZVNwYWNl
KCkKLSAgICAgICAgfHwgKHdoaXRlc3BhY2VQb3NpdGlvbiA9PSBUcmFpbGluZ1doaXRlc3BhY2Ug
JiYgc3R5bGUtPndoaXRlU3BhY2UoKSA9PSBQUkVfV1JBUCAmJiAoIWxpbmVJbmZvLmlzRW1wdHko
KSB8fCAhbGluZUluZm8ucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpKTsKLX0KLQotc3RhdGlj
IGJvb2wgcmVxdWlyZXNMaW5lQm94Rm9yQ29udGVudChjb25zdCBSZW5kZXJJbmxpbmUmIGZsb3cs
IGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykKLXsKLSAgICBSZW5kZXJFbGVtZW50KiBwYXJlbnQg
PSBmbG93LnBhcmVudCgpOwotICAgIGlmIChmbG93LmRvY3VtZW50KCkuaW5Ob1F1aXJrc01vZGUo
KSkgewotICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYgZmxvd1N0eWxlID0gbGluZVN0eWxlKGZs
b3csIGxpbmVJbmZvKTsKLSAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUmIHBhcmVudFN0eWxlID0g
bGluZVN0eWxlKCpwYXJlbnQsIGxpbmVJbmZvKTsKLSAgICAgICAgaWYgKGZsb3dTdHlsZS5saW5l
SGVpZ2h0KCkgIT0gcGFyZW50U3R5bGUubGluZUhlaWdodCgpCi0gICAgICAgICAgICB8fCBmbG93
U3R5bGUudmVydGljYWxBbGlnbigpICE9IHBhcmVudFN0eWxlLnZlcnRpY2FsQWxpZ24oKQotICAg
ICAgICAgICAgfHwgIXBhcmVudFN0eWxlLmZvbnQoKS5mb250TWV0cmljcygpLmhhc0lkZW50aWNh
bEFzY2VudERlc2NlbnRBbmRMaW5lR2FwKGZsb3dTdHlsZS5mb250KCkuZm9udE1ldHJpY3MoKSkp
Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0
YXRpYyBib29sIGhhc0lubGluZURpcmVjdGlvbkJvcmRlcnNQYWRkaW5nT3JNYXJnaW4oY29uc3Qg
UmVuZGVySW5saW5lJiBmbG93KQotewotICAgIC8vIFdoZXJlIGFuIGVtcHR5IGlubGluZSBpcyBz
cGxpdCBhY3Jvc3MgYW5vbnltb3VzIGJsb2NrcyB3ZSBzaG91bGQgb25seSBnaXZlIGxpbmVib3hl
cyB0byB0aGUgJ3NpZGVzJyBvZiB0aGUKLSAgICAvLyBpbmxpbmUgdGhhdCBoYXZlIGJvcmRlcnMs
IHBhZGRpbmcgb3IgbWFyZ2luLgotICAgIGJvb2wgc2hvdWxkQXBwbHlTdGFydEJvcmRlclBhZGRp
bmdPck1hcmdpbiA9ICFmbG93LnBhcmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkgfHwgIWZsb3cu
aXNJbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCk7Ci0gICAgaWYgKHNob3VsZEFwcGx5U3RhcnRC
b3JkZXJQYWRkaW5nT3JNYXJnaW4gJiYgKGZsb3cuYm9yZGVyU3RhcnQoKSB8fCBmbG93Lm1hcmdp
blN0YXJ0KCkgfHwgZmxvdy5wYWRkaW5nU3RhcnQoKSkpCi0gICAgICAgIHJldHVybiB0cnVlOwot
Ci0gICAgYm9vbCBzaG91bGRBcHBseUVuZEJvcmRlclBhZGRpbmdPck1hcmdpbiA9ICFmbG93LnBh
cmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkgfHwgZmxvdy5pc0lubGluZUVsZW1lbnRDb250aW51
YXRpb24oKSB8fCAhZmxvdy5pbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCk7Ci0gICAgcmV0dXJu
IHNob3VsZEFwcGx5RW5kQm9yZGVyUGFkZGluZ09yTWFyZ2luICYmIChmbG93LmJvcmRlckVuZCgp
IHx8IGZsb3cubWFyZ2luRW5kKCkgfHwgZmxvdy5wYWRkaW5nRW5kKCkpOwotfQotCi1zdGF0aWMg
Ym9vbCBhbHdheXNSZXF1aXJlc0xpbmVCb3goY29uc3QgUmVuZGVySW5saW5lJiBmbG93KQotewot
ICAgIC8vIEZJWE1FOiBSaWdodCBub3csIHdlIG9ubHkgYWxsb3cgbGluZSBib3hlcyBmb3IgaW5s
aW5lcyB0aGF0IGFyZSB0cnVseSBlbXB0eS4KLSAgICAvLyBXZSBuZWVkIHRvIGZpeCB0aGlzLCB0
aG91Z2gsIGJlY2F1c2UgYXQgdGhlIHZlcnkgbGVhc3QsIGlubGluZXMgY29udGFpbmluZyBvbmx5
Ci0gICAgLy8gaWdub3JhYmxlIHdoaXRlc3BhY2Ugc2hvdWxkIHNob3VsZCBhbHNvIGhhdmUgbGlu
ZSBib3hlcy4KLSAgICByZXR1cm4gaXNFbXB0eUlubGluZShmbG93KSAmJiBoYXNJbmxpbmVEaXJl
Y3Rpb25Cb3JkZXJzUGFkZGluZ09yTWFyZ2luKGZsb3cpOwotfQotCi1zdGF0aWMgYm9vbCByZXF1
aXJlc0xpbmVCb3goY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0LCBjb25zdCBMaW5lSW5mbyYgbGlu
ZUluZm8gPSBMaW5lSW5mbygpLCBXaGl0ZXNwYWNlUG9zaXRpb24gd2hpdGVzcGFjZVBvc2l0aW9u
ID0gTGVhZGluZ1doaXRlc3BhY2UpCi17Ci0gICAgaWYgKGl0Lm1fb2JqLT5pc0Zsb2F0aW5nT3JP
dXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChp
dC5tX29iai0+aXNCUigpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGJvb2wgcmVuZGVy
ZXJJc0VtcHR5SW5saW5lID0gZmFsc2U7Ci0gICAgaWYgKGl0Lm1fb2JqLT5pc1JlbmRlcklubGlu
ZSgpKSB7Ci0gICAgICAgIGNvbnN0IFJlbmRlcklubGluZSYgaW5saW5lUmVuZGVyZXIgPSB0b1Jl
bmRlcklubGluZSgqaXQubV9vYmopOwotICAgICAgICBpZiAoIWFsd2F5c1JlcXVpcmVzTGluZUJv
eChpbmxpbmVSZW5kZXJlcikgJiYgIXJlcXVpcmVzTGluZUJveEZvckNvbnRlbnQoaW5saW5lUmVu
ZGVyZXIsIGxpbmVJbmZvKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmVu
ZGVyZXJJc0VtcHR5SW5saW5lID0gaXNFbXB0eUlubGluZShpbmxpbmVSZW5kZXJlcik7Ci0gICAg
fQotCi0gICAgaWYgKCFzaG91bGRDb2xsYXBzZVdoaXRlU3BhY2UoJml0Lm1fb2JqLT5zdHlsZSgp
LCBsaW5lSW5mbywgd2hpdGVzcGFjZVBvc2l0aW9uKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0K
LSAgICBVQ2hhciBjdXJyZW50ID0gaXQuY3VycmVudCgpOwotICAgIGJvb2wgbm90SnVzdFdoaXRl
c3BhY2UgPSBjdXJyZW50ICE9ICcgJyAmJiBjdXJyZW50ICE9ICdcdCcgJiYgY3VycmVudCAhPSBz
b2Z0SHlwaGVuICYmIChjdXJyZW50ICE9ICdcbicgfHwgaXQubV9vYmotPnByZXNlcnZlc05ld2xp
bmUoKSkgJiYgIXNraXBOb25CcmVha2luZ1NwYWNlKGl0LCBsaW5lSW5mbyk7Ci0gICAgcmV0dXJu
IG5vdEp1c3RXaGl0ZXNwYWNlIHx8IHJlbmRlcmVySXNFbXB0eUlubGluZTsKLX0KLQogYm9vbCBS
ZW5kZXJCbG9jazo6Z2VuZXJhdGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQoUmVuZGVyT2JqZWN0
KiBpbmxpbmVPYmopCiB7CiAgICAgQVNTRVJUKGlubGluZU9iai0+cGFyZW50KCkgPT0gdGhpcyk7
CkBAIC0yMzIyLDI0OSArMjAwNiw2IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmdlbmVyYXRlc0xpbmVC
b3hlc0ZvcklubGluZUNoaWxkKFJlbmRlck9iamVjdCogaW5saW5lT2JqKQogICAgIHJldHVybiAh
aXQuYXRFbmQoKTsKIH0KIAotLy8gRklYTUU6IFRoZSBlbnRpcmUgY29uY2VwdCBvZiB0aGUgc2tp
cFRyYWlsaW5nV2hpdGVzcGFjZSBmdW5jdGlvbiBpcyBmbGF3ZWQsIHNpbmNlIHdlIHJlYWxseSBu
ZWVkIHRvIGJlIGJ1aWxkaW5nCi0vLyBsaW5lIGJveGVzIGV2ZW4gZm9yIGNvbnRhaW5lcnMgdGhh
dCBtYXkgdWx0aW1hdGVseSBjb2xsYXBzZSBhd2F5LiBPdGhlcndpc2Ugd2UnbGwgbmV2ZXIgZ2V0
IHBvc2l0aW9uZWQKLS8vIGVsZW1lbnRzIHF1aXRlIHJpZ2h0LiBJbiBvdGhlciB3b3Jkcywgd2Ug
bmVlZCB0byBidWlsZCB0aGlzIGZ1bmN0aW9uJ3Mgd29yayBpbnRvIHRoZSBub3JtYWwgbGluZQot
Ly8gb2JqZWN0IGl0ZXJhdGlvbiBwcm9jZXNzLgotLy8gTkIuIHRoaXMgZnVuY3Rpb24gd2lsbCBp
bnNlcnQgYW55IGZsb2F0aW5nIGVsZW1lbnRzIHRoYXQgd291bGQgb3RoZXJ3aXNlCi0vLyBiZSBz
a2lwcGVkIGJ1dCBpdCB3aWxsIG5vdCBwb3NpdGlvbiB0aGVtLgotdm9pZCBMaW5lQnJlYWtlcjo6
c2tpcFRyYWlsaW5nV2hpdGVzcGFjZShJbmxpbmVJdGVyYXRvciYgaXRlcmF0b3IsIGNvbnN0IExp
bmVJbmZvJiBsaW5lSW5mbykKLXsKLSAgICB3aGlsZSAoIWl0ZXJhdG9yLmF0RW5kKCkgJiYgIXJl
cXVpcmVzTGluZUJveChpdGVyYXRvciwgbGluZUluZm8sIFRyYWlsaW5nV2hpdGVzcGFjZSkpIHsK
LSAgICAgICAgUmVuZGVyT2JqZWN0JiBvYmplY3QgPSAqaXRlcmF0b3IubV9vYmo7Ci0gICAgICAg
IGlmIChvYmplY3QuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgICAgICBzZXRTdGF0
aWNQb3NpdGlvbnMobV9ibG9jaywgdG9SZW5kZXJCb3gob2JqZWN0KSk7Ci0gICAgICAgIGVsc2Ug
aWYgKG9iamVjdC5pc0Zsb2F0aW5nKCkpCi0gICAgICAgICAgICBtX2Jsb2NrLmluc2VydEZsb2F0
aW5nT2JqZWN0KHRvUmVuZGVyQm94KG9iamVjdCkpOwotICAgICAgICBpdGVyYXRvci5pbmNyZW1l
bnQoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTGluZUJyZWFrZXI6OnNraXBMZWFkaW5nV2hpdGVzcGFj
ZShJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBMaW5lSW5mbyYgbGluZUluZm8sIEZsb2F0
aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lV2lkdGgmIHdpZHRoKQot
ewotICAgIHdoaWxlICghcmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgpICYmICFyZXF1aXJlc0xp
bmVCb3gocmVzb2x2ZXIucG9zaXRpb24oKSwgbGluZUluZm8sIExlYWRpbmdXaGl0ZXNwYWNlKSkg
ewotICAgICAgICBSZW5kZXJPYmplY3QmIG9iamVjdCA9ICpyZXNvbHZlci5wb3NpdGlvbigpLm1f
b2JqOwotICAgICAgICBpZiAob2JqZWN0LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7Ci0gICAg
ICAgICAgICBzZXRTdGF0aWNQb3NpdGlvbnMobV9ibG9jaywgdG9SZW5kZXJCb3gob2JqZWN0KSk7
Ci0gICAgICAgICAgICBpZiAob2JqZWN0LnN0eWxlKCkuaXNPcmlnaW5hbERpc3BsYXlJbmxpbmVU
eXBlKCkpIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlci5ydW5zKCkuYWRkUnVuKGNyZWF0ZVJ1
bigwLCAxLCAmb2JqZWN0LCByZXNvbHZlcikpOwotICAgICAgICAgICAgICAgIGxpbmVJbmZvLmlu
Y3JlbWVudFJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfSBlbHNlIGlmIChvYmplY3QuaXNGbG9hdGluZygpKSB7Ci0gICAgICAgICAgICAvLyBUaGUg
dG9wIG1hcmdpbiBlZGdlIG9mIGEgc2VsZi1jb2xsYXBzaW5nIGJsb2NrIHRoYXQgY2xlYXJzIGEg
ZmxvYXQgaW50cnVkZXMgdXAgaW50byBpdCBieSB0aGUgaGVpZ2h0IG9mIHRoZSBtYXJnaW4sCi0g
ICAgICAgICAgICAvLyBzbyBpbiBvcmRlciB0byBwbGFjZSB0aGlzIGZpcnN0IGNoaWxkIGZsb2F0
IGF0IHRoZSB0b3AgY29udGVudCBlZGdlIG9mIHRoZSBzZWxmLWNvbGxhcHNpbmcgYmxvY2sgYWRk
IHRoZSBtYXJnaW4gYmFjayBpbiBiZWZvcmUgcGxhY2VtZW50LgotICAgICAgICAgICAgTGF5b3V0
VW5pdCBtYXJnaW5PZmZzZXQgPSAoIW9iamVjdC5wcmV2aW91c1NpYmxpbmcoKSAmJiBtX2Jsb2Nr
LmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpICYmIG1fYmxvY2suc3R5bGUoKS5jbGVhcigpICYmIG1f
YmxvY2suZ2V0Q2xlYXJEZWx0YShtX2Jsb2NrLCBMYXlvdXRVbml0KCkpKSA/IG1fYmxvY2suY29s
bGFwc2VkTWFyZ2luQmVmb3JlRm9yQ2hpbGQobV9ibG9jaykgOiBMYXlvdXRVbml0KCk7Ci0gICAg
ICAgICAgICBMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQgPSBtX2Jsb2NrLmxvZ2ljYWxIZWln
aHQoKTsKLSAgICAgICAgICAgIG1fYmxvY2suc2V0TG9naWNhbEhlaWdodChvbGRMb2dpY2FsSGVp
Z2h0ICsgbWFyZ2luT2Zmc2V0KTsKLSAgICAgICAgICAgIG1fYmxvY2sucG9zaXRpb25OZXdGbG9h
dE9uTGluZShtX2Jsb2NrLmluc2VydEZsb2F0aW5nT2JqZWN0KHRvUmVuZGVyQm94KG9iamVjdCkp
LCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBsaW5lSW5mbywgd2lkdGgpOwotICAgICAgICAg
ICAgbV9ibG9jay5zZXRMb2dpY2FsSGVpZ2h0KG9sZExvZ2ljYWxIZWlnaHQpOwotICAgICAgICB9
IGVsc2UgaWYgKG9iamVjdC5pc1RleHQoKSAmJiBvYmplY3Quc3R5bGUoKS5oYXNUZXh0Q29tYmlu
ZSgpICYmIG9iamVjdC5pc0NvbWJpbmVUZXh0KCkgJiYgIXRvUmVuZGVyQ29tYmluZVRleHQob2Jq
ZWN0KS5pc0NvbWJpbmVkKCkpIHsKLSAgICAgICAgICAgIHRvUmVuZGVyQ29tYmluZVRleHQob2Jq
ZWN0KS5jb21iaW5lVGV4dCgpOwotICAgICAgICAgICAgaWYgKHRvUmVuZGVyQ29tYmluZVRleHQo
b2JqZWN0KS5pc0NvbWJpbmVkKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
IH0KLSAgICAgICAgcmVzb2x2ZXIuaW5jcmVtZW50KCk7Ci0gICAgfQotICAgIHJlc29sdmVyLmNv
bW1pdEV4cGxpY2l0RW1iZWRkaW5nKCk7Ci19Ci0KLS8vIFRoaXMgaXMgY3VycmVudGx5IGp1c3Qg
dXNlZCBmb3IgbGlzdCBtYXJrZXJzIGFuZCBpbmxpbmUgZmxvd3MgdGhhdCBoYXZlIGxpbmUgYm94
ZXMuIE5laXRoZXIgc2hvdWxkCi0vLyBoYXZlIGFuIGVmZmVjdCBvbiB3aGl0ZXNwYWNlIGF0IHRo
ZSBzdGFydCBvZiB0aGUgbGluZS4KLXN0YXRpYyBib29sIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0
ZXJTdGFydE9iamVjdChSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBSZW5kZXJPYmplY3QqIG8sIExp
bmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSkKLXsKLSAgICBSZW5kZXJPYmplY3Qq
IG5leHQgPSBiaWRpTmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKGJsb2NrLCBvKTsKLSAgICB3aGls
ZSAobmV4dCAmJiBuZXh0LT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAg
ICAgIG5leHQgPSBiaWRpTmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKGJsb2NrLCBuZXh0KTsKLQot
ICAgIGlmIChuZXh0ICYmIG5leHQtPmlzVGV4dCgpICYmIHRvUmVuZGVyVGV4dChuZXh0KS0+dGV4
dExlbmd0aCgpID4gMCkgewotICAgICAgICBSZW5kZXJUZXh0KiBuZXh0VGV4dCA9IHRvUmVuZGVy
VGV4dChuZXh0KTsKLSAgICAgICAgVUNoYXIgbmV4dENoYXIgPSBuZXh0VGV4dC0+Y2hhcmFjdGVy
QXQoMCk7Ci0gICAgICAgIGlmIChuZXh0VGV4dC0+c3R5bGUoKS5pc0NvbGxhcHNpYmxlV2hpdGVT
cGFjZShuZXh0Q2hhcikpIHsKLSAgICAgICAgICAgIHN0YXJ0SWdub3JpbmdTcGFjZXMobGluZU1p
ZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG8sIDApKTsKLSAgICAgICAgICAgIHJldHVy
biB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0
aWMgQUxXQVlTX0lOTElORSBmbG9hdCB0ZXh0V2lkdGgoUmVuZGVyVGV4dCogdGV4dCwgdW5zaWdu
ZWQgZnJvbSwgdW5zaWduZWQgbGVuLCBjb25zdCBGb250JiBmb250LCBmbG9hdCB4UG9zLCBib29s
IGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UsIEhhc2hTZXQ8Y29uc3QgU2lt
cGxlRm9udERhdGEqPiYgZmFsbGJhY2tGb250cywgVGV4dExheW91dCogbGF5b3V0ID0gMCkKLXsK
LSAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSB0ZXh0LT5zdHlsZSgpOwotCi0gICAgR2x5
cGhPdmVyZmxvdyBnbHlwaE92ZXJmbG93OwotICAgIGlmIChpc0ZpeGVkUGl0Y2ggfHwgKCFmcm9t
ICYmIGxlbiA9PSB0ZXh0LT50ZXh0TGVuZ3RoKCkpIHx8IHN0eWxlLmhhc1RleHRDb21iaW5lKCkp
Ci0gICAgICAgIHJldHVybiB0ZXh0LT53aWR0aChmcm9tLCBsZW4sIGZvbnQsIHhQb3MsICZmYWxs
YmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdyk7Ci0KLSAgICBpZiAobGF5b3V0KQotICAgICAgICBy
ZXR1cm4gRm9udDo6d2lkdGgoKmxheW91dCwgZnJvbSwgbGVuLCAmZmFsbGJhY2tGb250cyk7Ci0K
LSAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZv
bnQsIHRleHQsIGZyb20sIGxlbiwgc3R5bGUpOwotICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3Ro
KHRleHQtPnRleHRMZW5ndGgoKSAtIGZyb20pOwotICAgIEFTU0VSVChydW4uY2hhcmFjdGVyc0xl
bmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7Ci0KLSAgICBydW4uc2V0Q2hhcmFjdGVyU2NhbkZvckNv
ZGVQYXRoKCF0ZXh0LT5jYW5Vc2VTaW1wbGVGb250Q29kZVBhdGgoKSk7Ci0gICAgcnVuLnNldFRh
YlNpemUoIWNvbGxhcHNlV2hpdGVTcGFjZSwgc3R5bGUudGFiU2l6ZSgpKTsKLSAgICBydW4uc2V0
WFBvcyh4UG9zKTsKLSAgICByZXR1cm4gZm9udC53aWR0aChydW4sICZmYWxsYmFja0ZvbnRzLCAm
Z2x5cGhPdmVyZmxvdyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRyeUh5cGhlbmF0aW5nKFJlbmRlclRl
eHQqIHRleHQsIGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IEF0b21pY1N0cmluZyYgbG9jYWxlSWRl
bnRpZmllciwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIGludCBjb25zZWN1
dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0LCBpbnQgbWluaW11bVByZWZpeExpbWl0LCBpbnQgbWlu
aW11bVN1ZmZpeExpbWl0LCB1bnNpZ25lZCBsYXN0U3BhY2UsIHVuc2lnbmVkIHBvcywgZmxvYXQg
eFBvcywgaW50IGF2YWlsYWJsZVdpZHRoLCBib29sIGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBz
ZVdoaXRlU3BhY2UsIGludCBsYXN0U3BhY2VXb3JkU3BhY2luZywgSW5saW5lSXRlcmF0b3ImIGxp
bmVCcmVhaywgaW50IG5leHRCcmVha2FibGUsIGJvb2wmIGh5cGhlbmF0ZWQpCi17Ci0gICAgLy8g
TWFwICdoeXBoZW5hdGUtbGltaXQte2JlZm9yZSxhZnRlcn06IGF1dG87JyB0byAyLgotICAgIHVu
c2lnbmVkIG1pbmltdW1QcmVmaXhMZW5ndGg7Ci0gICAgdW5zaWduZWQgbWluaW11bVN1ZmZpeExl
bmd0aDsKLQotICAgIGlmIChtaW5pbXVtUHJlZml4TGltaXQgPCAwKQotICAgICAgICBtaW5pbXVt
UHJlZml4TGVuZ3RoID0gMjsKLSAgICBlbHNlCi0gICAgICAgIG1pbmltdW1QcmVmaXhMZW5ndGgg
PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obWluaW11bVByZWZpeExpbWl0KTsKLQotICAgIGlmICht
aW5pbXVtU3VmZml4TGltaXQgPCAwKQotICAgICAgICBtaW5pbXVtU3VmZml4TGVuZ3RoID0gMjsK
LSAgICBlbHNlCi0gICAgICAgIG1pbmltdW1TdWZmaXhMZW5ndGggPSBzdGF0aWNfY2FzdDx1bnNp
Z25lZD4obWluaW11bVN1ZmZpeExpbWl0KTsKLQotICAgIGlmIChwb3MgLSBsYXN0U3BhY2UgPD0g
bWluaW11bVN1ZmZpeExlbmd0aCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGNvbnNlY3V0
aXZlSHlwaGVuYXRlZExpbmVzTGltaXQgPj0gMCAmJiBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5l
cyA+PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXNMaW1p
dCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGludCBoeXBoZW5XaWR0aCA9IG1lYXN1cmVIeXBo
ZW5XaWR0aCh0ZXh0LCBmb250KTsKLQotICAgIGZsb2F0IG1heFByZWZpeFdpZHRoID0gYXZhaWxh
YmxlV2lkdGggLSB4UG9zIC0gaHlwaGVuV2lkdGggLSBsYXN0U3BhY2VXb3JkU3BhY2luZzsKLSAg
ICAvLyBJZiB0aGUgbWF4aW11bSB3aWR0aCBhdmFpbGFibGUgZm9yIHRoZSBwcmVmaXggYmVmb3Jl
IHRoZSBoeXBoZW4gaXMgc21hbGwsIHRoZW4gaXQgaXMgdmVyeSB1bmxpa2VseQotICAgIC8vIHRo
YXQgYW4gaHlwaGVuYXRpb24gb3Bwb3J0dW5pdHkgZXhpc3RzLCBzbyBkbyBub3QgYm90aGVyIHRv
IGxvb2sgZm9yIGl0LgotICAgIGlmIChtYXhQcmVmaXhXaWR0aCA8PSBmb250LnBpeGVsU2l6ZSgp
ICogNSAvIDQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHls
ZSA9IHRleHQtPnN0eWxlKCk7Ci0gICAgVGV4dFJ1biBydW4gPSBSZW5kZXJCbG9jazo6Y29uc3Ry
dWN0VGV4dFJ1bih0ZXh0LCBmb250LCB0ZXh0LCBsYXN0U3BhY2UsIHBvcyAtIGxhc3RTcGFjZSwg
c3R5bGUpOwotICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3RoKHRleHQtPnRleHRMZW5ndGgoKSAt
IGxhc3RTcGFjZSk7Ci0gICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJzTGVuZ3RoKCkgPj0gcnVuLmxl
bmd0aCgpKTsKLQotICAgIHJ1bi5zZXRUYWJTaXplKCFjb2xsYXBzZVdoaXRlU3BhY2UsIHN0eWxl
LnRhYlNpemUoKSk7Ci0gICAgcnVuLnNldFhQb3MoeFBvcyArIGxhc3RTcGFjZVdvcmRTcGFjaW5n
KTsKLQotICAgIHVuc2lnbmVkIHByZWZpeExlbmd0aCA9IGZvbnQub2Zmc2V0Rm9yUG9zaXRpb24o
cnVuLCBtYXhQcmVmaXhXaWR0aCwgZmFsc2UpOwotICAgIGlmIChwcmVmaXhMZW5ndGggPCBtaW5p
bXVtUHJlZml4TGVuZ3RoKQotICAgICAgICByZXR1cm47Ci0KLSAgICBwcmVmaXhMZW5ndGggPSBs
YXN0SHlwaGVuTG9jYXRpb24odGV4dC0+Y2hhcmFjdGVycygpICsgbGFzdFNwYWNlLCBwb3MgLSBs
YXN0U3BhY2UsIHN0ZDo6bWluKHByZWZpeExlbmd0aCwgcG9zIC0gbGFzdFNwYWNlIC0gbWluaW11
bVN1ZmZpeExlbmd0aCkgKyAxLCBsb2NhbGVJZGVudGlmaWVyKTsKLSAgICBpZiAoIXByZWZpeExl
bmd0aCB8fCBwcmVmaXhMZW5ndGggPCBtaW5pbXVtUHJlZml4TGVuZ3RoKQotICAgICAgICByZXR1
cm47Ci0KLSAgICAvLyBXaGVuIGxhc3RTYXBjZSBpcyBhIHNwYWNlLCB3aGljaCBpdCBhbHdheXMg
aXMgZXhjZXB0IHNvbWV0aW1lcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBvciBhZnRlciBj
b2xsYXBzZWQKLSAgICAvLyBzcGFjZSwgaXQgc2hvdWxkIG5vdCBjb3VudCB0b3dhcmRzIGh5cGhl
bmF0ZS1saW1pdC1iZWZvcmUuCi0gICAgaWYgKHByZWZpeExlbmd0aCA9PSBtaW5pbXVtUHJlZml4
TGVuZ3RoKSB7Ci0gICAgICAgIFVDaGFyIGNoYXJhY3RlckF0TGFzdFNwYWNlID0gdGV4dC0+Y2hh
cmFjdGVyQXQobGFzdFNwYWNlKTsKLSAgICAgICAgaWYgKGNoYXJhY3RlckF0TGFzdFNwYWNlID09
ICcgJyB8fCBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSAnXG4nIHx8IGNoYXJhY3RlckF0TGFzdFNw
YWNlID09ICdcdCcgfHwgY2hhcmFjdGVyQXRMYXN0U3BhY2UgPT0gbm9CcmVha1NwYWNlKQotICAg
ICAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFTU0VSVChwb3MgLSBsYXN0U3BhY2UgLSBw
cmVmaXhMZW5ndGggPj0gbWluaW11bVN1ZmZpeExlbmd0aCk7Ci0KLSNpZiAhQVNTRVJUX0RJU0FC
TEVECi0gICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+IGZhbGxiYWNrRm9udHM7Ci0g
ICAgZmxvYXQgcHJlZml4V2lkdGggPSBoeXBoZW5XaWR0aCArIHRleHRXaWR0aCh0ZXh0LCBsYXN0
U3BhY2UsIHByZWZpeExlbmd0aCwgZm9udCwgeFBvcywgaXNGaXhlZFBpdGNoLCBjb2xsYXBzZVdo
aXRlU3BhY2UsIGZhbGxiYWNrRm9udHMpICsgbGFzdFNwYWNlV29yZFNwYWNpbmc7Ci0gICAgQVNT
RVJUKHhQb3MgKyBwcmVmaXhXaWR0aCA8PSBhdmFpbGFibGVXaWR0aCk7Ci0jZWxzZQotICAgIFVO
VVNFRF9QQVJBTShpc0ZpeGVkUGl0Y2gpOwotI2VuZGlmCi0KLSAgICBsaW5lQnJlYWsubW92ZVRv
KHRleHQsIGxhc3RTcGFjZSArIHByZWZpeExlbmd0aCwgbmV4dEJyZWFrYWJsZSk7Ci0gICAgaHlw
aGVuYXRlZCA9IHRydWU7Ci19Ci0KLWNsYXNzIFRyYWlsaW5nT2JqZWN0cyB7Ci1wdWJsaWM6Ci0g
ICAgVHJhaWxpbmdPYmplY3RzKCk7Ci0gICAgdm9pZCBzZXRUcmFpbGluZ1doaXRlc3BhY2UoUmVu
ZGVyVGV4dCopOwotICAgIHZvaWQgY2xlYXIoKTsKLSAgICB2b2lkIGFwcGVuZEJveElmTmVlZGVk
KFJlbmRlckJveE1vZGVsT2JqZWN0Kik7Ci0KLSAgICBlbnVtIENvbGxhcHNlRmlyc3RTcGFjZU9y
Tm90IHsgRG9Ob3RDb2xsYXBzZUZpcnN0U3BhY2UsIENvbGxhcHNlRmlyc3RTcGFjZSB9OwotCi0g
ICAgdm9pZCB1cGRhdGVNaWRwb2ludHNGb3JUcmFpbGluZ0JveGVzKExpbmVNaWRwb2ludFN0YXRl
JiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGxCcmVhaywgQ29sbGFwc2VGaXJzdFNwYWNlT3JOb3Qp
OwotCi1wcml2YXRlOgotICAgIFJlbmRlclRleHQqIG1fd2hpdGVzcGFjZTsKLSAgICBWZWN0b3I8
UmVuZGVyQm94TW9kZWxPYmplY3QqLCA0PiBtX2JveGVzOwotfTsKLQotVHJhaWxpbmdPYmplY3Rz
OjpUcmFpbGluZ09iamVjdHMoKQotICAgIDogbV93aGl0ZXNwYWNlKDApCi17Ci19Ci0KLWlubGlu
ZSB2b2lkIFRyYWlsaW5nT2JqZWN0czo6c2V0VHJhaWxpbmdXaGl0ZXNwYWNlKFJlbmRlclRleHQq
IHdoaXRlc3BhY2UpCi17Ci0gICAgQVNTRVJUKHdoaXRlc3BhY2UpOwotICAgIG1fd2hpdGVzcGFj
ZSA9IHdoaXRlc3BhY2U7Ci19Ci0KLWlubGluZSB2b2lkIFRyYWlsaW5nT2JqZWN0czo6Y2xlYXIo
KQotewotICAgIG1fd2hpdGVzcGFjZSA9IDA7Ci0gICAgbV9ib3hlcy5zaHJpbmsoMCk7IC8vIFVz
ZSBzaHJpbmsoMCkgaW5zdGVhZCBvZiBjbGVhcigpIHRvIHJldGFpbiBvdXIgY2FwYWNpdHkuCi19
Ci0KLWlubGluZSB2b2lkIFRyYWlsaW5nT2JqZWN0czo6YXBwZW5kQm94SWZOZWVkZWQoUmVuZGVy
Qm94TW9kZWxPYmplY3QqIGJveCkKLXsKLSAgICBpZiAobV93aGl0ZXNwYWNlKQotICAgICAgICBt
X2JveGVzLmFwcGVuZChib3gpOwotfQotCi12b2lkIFRyYWlsaW5nT2JqZWN0czo6dXBkYXRlTWlk
cG9pbnRzRm9yVHJhaWxpbmdCb3hlcyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3Rh
dGUsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBsQnJlYWssIENvbGxhcHNlRmlyc3RTcGFjZU9yTm90
IGNvbGxhcHNlRmlyc3RTcGFjZSkKLXsKLSAgICBpZiAoIW1fd2hpdGVzcGFjZSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgLy8gVGhpcyBvYmplY3QgaXMgZWl0aGVyIGdvaW5nIHRvIGJlIHBhcnQg
b2YgdGhlIGxhc3QgbWlkcG9pbnQsIG9yIGl0IGlzIGdvaW5nIHRvIGJlIHRoZSBhY3R1YWwgZW5k
cG9pbnQuCi0gICAgLy8gSW4gYm90aCBjYXNlcyB3ZSBqdXN0IGRlY3JlYXNlIG91ciBwb3MgYnkg
MSBsZXZlbCB0byBleGNsdWRlIHRoZSBzcGFjZSwgYWxsb3dpbmcgaXQgdG8gLSBpbiBlZmZlY3Qg
LSBjb2xsYXBzZSBpbnRvIHRoZSBuZXdsaW5lLgotICAgIGlmIChsaW5lTWlkcG9pbnRTdGF0ZS5u
dW1NaWRwb2ludHMgJSAyKSB7Ci0gICAgICAgIC8vIEZpbmQgdGhlIHRyYWlsaW5nIHNwYWNlIG9i
amVjdCdzIG1pZHBvaW50LgotICAgICAgICBpbnQgdHJhaWxpbmdTcGFjZU1pZHBvaW50ID0gbGlu
ZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzIC0gMTsKLSAgICAgICAgZm9yICggOyB0cmFpbGlu
Z1NwYWNlTWlkcG9pbnQgPiAwICYmIGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50c1t0cmFpbGlu
Z1NwYWNlTWlkcG9pbnRdLm1fb2JqICE9IG1fd2hpdGVzcGFjZTsgLS10cmFpbGluZ1NwYWNlTWlk
cG9pbnQpIHsgfQotICAgICAgICBBU1NFUlQodHJhaWxpbmdTcGFjZU1pZHBvaW50ID49IDApOwot
ICAgICAgICBpZiAoY29sbGFwc2VGaXJzdFNwYWNlID09IENvbGxhcHNlRmlyc3RTcGFjZSkKLSAg
ICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50c1t0cmFpbGluZ1NwYWNlTWlkcG9p
bnRdLm1fcG9zLS07Ci0KLSAgICAgICAgLy8gTm93IG1ha2Ugc3VyZSBldmVyeSBzaW5nbGUgdHJh
aWxpbmdQb3NpdGlvbmVkQm94IGZvbGxvd2luZyB0aGUgdHJhaWxpbmdTcGFjZU1pZHBvaW50IHBy
b3Blcmx5IHN0b3BzIGFuZCBzdGFydHMKLSAgICAgICAgLy8gaWdub3Jpbmcgc3BhY2VzLgotICAg
ICAgICBzaXplX3QgY3VycmVudE1pZHBvaW50ID0gdHJhaWxpbmdTcGFjZU1pZHBvaW50ICsgMTsK
LSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2JveGVzLnNpemUoKTsgKytpKSB7Ci0g
ICAgICAgICAgICBpZiAoY3VycmVudE1pZHBvaW50ID49IGxpbmVNaWRwb2ludFN0YXRlLm51bU1p
ZHBvaW50cykgewotICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGhhdmUgYSBtaWRwb2ludCBm
b3IgdGhpcyBib3ggeWV0LgotICAgICAgICAgICAgICAgIGVuc3VyZUxpbmVCb3hJbnNpZGVJZ25v
cmVkU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBtX2JveGVzW2ldKTsKLSAgICAgICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50
c1tjdXJyZW50TWlkcG9pbnRdLm1fb2JqID09IG1fYm94ZXNbaV0pOwotICAgICAgICAgICAgICAg
IEFTU0VSVChsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHNbY3VycmVudE1pZHBvaW50ICsgMV0u
bV9vYmogPT0gbV9ib3hlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdXJyZW50
TWlkcG9pbnQgKz0gMjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIWxCcmVhay5tX29iaikg
ewotICAgICAgICBBU1NFUlQobV93aGl0ZXNwYWNlLT5pc1RleHQoKSk7Ci0gICAgICAgIEFTU0VS
VChjb2xsYXBzZUZpcnN0U3BhY2UgPT0gQ29sbGFwc2VGaXJzdFNwYWNlKTsKLSAgICAgICAgLy8g
QWRkIGEgbmV3IGVuZCBtaWRwb2ludCB0aGF0IHN0b3BzIHJpZ2h0IGF0IHRoZSB2ZXJ5IGVuZC4K
LSAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gbV93aGl0ZXNwYWNlLT50ZXh0TGVuZ3RoKCk7Ci0g
ICAgICAgIHVuc2lnbmVkIHBvcyA9IGxlbmd0aCA+PSAyID8gbGVuZ3RoIC0gMiA6IFVJTlRfTUFY
OwotICAgICAgICBJbmxpbmVJdGVyYXRvciBlbmRNaWQoMCwgbV93aGl0ZXNwYWNlLCBwb3MpOwot
ICAgICAgICBzdGFydElnbm9yaW5nU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBlbmRNaWQpOwot
ICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fYm94ZXMuc2l6ZSgpOyArK2kpIHsKLSAg
ICAgICAgICAgIGVuc3VyZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2VzKGxpbmVNaWRwb2ludFN0
YXRlLCBtX2JveGVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBMaW5lQnJlYWtl
cjo6cmVzZXQoKQotewotICAgIG1fcG9zaXRpb25lZE9iamVjdHMuY2xlYXIoKTsKLSAgICBtX2h5
cGhlbmF0ZWQgPSBmYWxzZTsKLSAgICBtX2NsZWFyID0gQ05PTkU7Ci19Ci0KIElubGluZUl0ZXJh
dG9yIExpbmVCcmVha2VyOjpuZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2
ZXIsIExpbmVJbmZvJiBsaW5lSW5mbywgUmVuZGVyVGV4dEluZm8mIHJlbmRlclRleHRJbmZvLCBG
bG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2Vj
dXRpdmVIeXBoZW5hdGVkTGluZXMsIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMp
CiB7CiAjaWYgIUVOQUJMRShDU1NfU0hBUEVTKQpAQCAtMjYxOSw4NjMgKzIwNjAsNiBAQCBJbmxp
bmVJdGVyYXRvciBMaW5lQnJlYWtlcjo6bmV4dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXIm
IHJlc29sdmVyLCBMaW5lSW5mbwogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBpdGVy
YXRvcklzQmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChjb25zdCBJbmxpbmVJdGVyYXRvciYg
aXRlciwgUmVuZGVyQ29tYmluZVRleHQmIHJlbmRlcmVyKQotewotICAgIHJldHVybiBpdGVyLm1f
b2JqID09ICZyZW5kZXJlciAmJiBpdGVyLm1fcG9zID49IHJlbmRlcmVyLnRleHRMZW5ndGgoKTsK
LX0KLQotI2lmIEVOQUJMRShDU1NfU0hBUEVTKQotc3RhdGljIHZvaWQgdXBkYXRlU2VnbWVudHNG
b3JTaGFwZXMoUmVuZGVyQmxvY2tGbG93JiBibG9jaywgY29uc3QgRmxvYXRpbmdPYmplY3QqIGxh
c3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGNvbnN0IFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFz
dXJlbWVudHMsIExpbmVXaWR0aCYgd2lkdGgsIGJvb2wgaXNGaXJzdExpbmUpCi17Ci0gICAgQVNT
RVJUKGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpOwotCi0gICAgU2hhcGVJbnNpZGVJbmZvKiBz
aGFwZUluc2lkZUluZm8gPSBibG9jay5sYXlvdXRTaGFwZUluc2lkZUluZm8oKTsKLSAgICBpZiAo
IWxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUtPmlzUGxhY2VkKCkgfHwgIXNoYXBlSW5zaWRlSW5m
bykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYm9vbCBpc0hvcml6b250YWxXcml0aW5nTW9kZSA9
IGJsb2NrLmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCk7Ci0gICAgTGF5b3V0VW5pdCBsb2dpY2Fs
T2Zmc2V0RnJvbVNoYXBlQ29udGFpbmVyID0gYmxvY2subG9naWNhbE9mZnNldEZyb21TaGFwZUFu
Y2VzdG9yQ29udGFpbmVyKHNoYXBlSW5zaWRlSW5mby0+b3duZXIoKSkuaGVpZ2h0KCk7Ci0KLSAg
ICBMYXlvdXRVbml0IGxpbmVMb2dpY2FsVG9wID0gYmxvY2subG9naWNhbEhlaWdodCgpICsgbG9n
aWNhbE9mZnNldEZyb21TaGFwZUNvbnRhaW5lcjsKLSAgICBMYXlvdXRVbml0IGxpbmVMb2dpY2Fs
SGVpZ2h0ID0gYmxvY2subGluZUhlaWdodChpc0ZpcnN0TGluZSwgaXNIb3Jpem9udGFsV3JpdGlu
Z01vZGUgPyBIb3Jpem9udGFsTGluZSA6IFZlcnRpY2FsTGluZSwgUG9zaXRpb25PZkludGVyaW9y
TGluZUJveGVzKTsKLSAgICBMYXlvdXRVbml0IGxpbmVMb2dpY2FsQm90dG9tID0gbGluZUxvZ2lj
YWxUb3AgKyBsaW5lTG9naWNhbEhlaWdodDsKLQotICAgIExheW91dFVuaXQgZmxvYXRMb2dpY2Fs
VG9wID0gYmxvY2subG9naWNhbFRvcEZvckZsb2F0KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUp
OwotICAgIExheW91dFVuaXQgZmxvYXRMb2dpY2FsQm90dG9tID0gYmxvY2subG9naWNhbEJvdHRv
bUZvckZsb2F0KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpOwotCi0gICAgYm9vbCBsaW5lT3Zl
cmxhcHNXaXRoRmxvYXQgPSAoZmxvYXRMb2dpY2FsVG9wIDwgbGluZUxvZ2ljYWxCb3R0b20pICYm
IChsaW5lTG9naWNhbFRvcCA8IGZsb2F0TG9naWNhbEJvdHRvbSk7Ci0gICAgaWYgKCFsaW5lT3Zl
cmxhcHNXaXRoRmxvYXQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGZsb2F0IG1pblNlZ21lbnRX
aWR0aCA9IGZpcnN0UG9zaXRpdmVXaWR0aCh3b3JkTWVhc3VyZW1lbnRzKTsKLQotICAgIExheW91
dFVuaXQgZmxvYXRMb2dpY2FsV2lkdGggPSBibG9jay5sb2dpY2FsV2lkdGhGb3JGbG9hdChsYXN0
RmxvYXRGcm9tUHJldmlvdXNMaW5lKTsKLSAgICBMYXlvdXRVbml0IGF2YWlsYWJsZUxvZ2ljYWxX
aWR0aCA9IGJsb2NrLmxvZ2ljYWxXaWR0aCgpIC0gYmxvY2subG9naWNhbFJpZ2h0Rm9yRmxvYXQo
bGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7Ci0gICAgaWYgKGF2YWlsYWJsZUxvZ2ljYWxXaWR0
aCA8IG1pblNlZ21lbnRXaWR0aCkKLSAgICAgICAgYmxvY2suc2V0TG9naWNhbEhlaWdodChmbG9h
dExvZ2ljYWxCb3R0b20pOwotCi0gICAgaWYgKGJsb2NrLmxvZ2ljYWxIZWlnaHQoKSA8IGZsb2F0
TG9naWNhbFRvcCkgewotICAgICAgICBzaGFwZUluc2lkZUluZm8tPmFkanVzdExvZ2ljYWxMaW5l
VG9wKG1pblNlZ21lbnRXaWR0aCArIGZsb2F0TG9naWNhbFdpZHRoKTsKLSAgICAgICAgYmxvY2su
c2V0TG9naWNhbEhlaWdodChzaGFwZUluc2lkZUluZm8tPmxvZ2ljYWxMaW5lVG9wKCkgLSBsb2dp
Y2FsT2Zmc2V0RnJvbVNoYXBlQ29udGFpbmVyKTsKLSAgICB9Ci0KLSAgICBsaW5lTG9naWNhbFRv
cCA9IGJsb2NrLmxvZ2ljYWxIZWlnaHQoKSArIGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWlu
ZXI7Ci0KLSAgICBzaGFwZUluc2lkZUluZm8tPnVwZGF0ZVNlZ21lbnRzRm9yTGluZShsaW5lTG9n
aWNhbFRvcCwgbGluZUxvZ2ljYWxIZWlnaHQpOwotICAgIHdpZHRoLnVwZGF0ZUN1cnJlbnRTaGFw
ZVNlZ21lbnQoKTsKLSAgICB3aWR0aC51cGRhdGVBdmFpbGFibGVXaWR0aCgpOwotfQotI2VuZGlm
Ci0KLWNsYXNzIEJyZWFraW5nQ29udGV4dCB7Ci1wdWJsaWM6Ci0gICAgQnJlYWtpbmdDb250ZXh0
KExpbmVCcmVha2VyJiBsaW5lQnJlYWtlciwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwg
TGluZUluZm8mIGluTGluZUluZm8sIExpbmVXaWR0aCYgbGluZVdpZHRoLCBSZW5kZXJUZXh0SW5m
byYgaW5SZW5kZXJUZXh0SW5mbywgRmxvYXRpbmdPYmplY3QqIGluTGFzdEZsb2F0RnJvbVByZXZp
b3VzTGluZSwgYm9vbCBhcHBsaWVkU3RhcnRXaWR0aCwgUmVuZGVyQmxvY2tGbG93JiBibG9jaykK
LSAgICAgICAgOiBtX2xpbmVCcmVha2VyKGxpbmVCcmVha2VyKQotICAgICAgICAsIG1fcmVzb2x2
ZXIocmVzb2x2ZXIpCi0gICAgICAgICwgbV9jdXJyZW50KHJlc29sdmVyLnBvc2l0aW9uKCkpCi0g
ICAgICAgICwgbV9saW5lQnJlYWsocmVzb2x2ZXIucG9zaXRpb24oKSkKLSAgICAgICAgLCBtX2Js
b2NrKGJsb2NrKQotICAgICAgICAsIG1fbGFzdE9iamVjdChtX2N1cnJlbnQubV9vYmopCi0gICAg
ICAgICwgbV9uZXh0T2JqZWN0KDApCi0gICAgICAgICwgbV9jdXJyZW50U3R5bGUoMCkKLSAgICAg
ICAgLCBtX2Jsb2NrU3R5bGUoYmxvY2suc3R5bGUoKSkKLSAgICAgICAgLCBtX2xpbmVJbmZvKGlu
TGluZUluZm8pCi0gICAgICAgICwgbV9yZW5kZXJUZXh0SW5mbyhpblJlbmRlclRleHRJbmZvKQot
ICAgICAgICAsIG1fbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZShpbkxhc3RGbG9hdEZyb21QcmV2
aW91c0xpbmUpCi0gICAgICAgICwgbV93aWR0aChsaW5lV2lkdGgpCi0gICAgICAgICwgbV9jdXJy
V1MoTk9STUFMKQotICAgICAgICAsIG1fbGFzdFdTKE5PUk1BTCkKLSAgICAgICAgLCBtX3ByZXNl
cnZlc05ld2xpbmUoZmFsc2UpCi0gICAgICAgICwgbV9hdFN0YXJ0KHRydWUpCi0gICAgICAgICwg
bV9pZ25vcmluZ1NwYWNlcyhmYWxzZSkKLSAgICAgICAgLCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1Nw
YWNlKGZhbHNlKQotICAgICAgICAsIG1fY3VycmVudENoYXJhY3RlcklzV1MoZmFsc2UpCi0gICAg
ICAgICwgbV9hcHBsaWVkU3RhcnRXaWR0aChhcHBsaWVkU3RhcnRXaWR0aCkKLSAgICAgICAgLCBt
X2luY2x1ZGVFbmRXaWR0aCh0cnVlKQotICAgICAgICAsIG1fYXV0b1dyYXAoZmFsc2UpCi0gICAg
ICAgICwgbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lKGZhbHNlKQotICAgICAgICAsIG1fZmxv
YXRzRml0T25MaW5lKHRydWUpCi0gICAgICAgICwgbV9jb2xsYXBzZVdoaXRlU3BhY2UoZmFsc2Up
Ci0gICAgICAgICwgbV9zdGFydGluZ05ld1BhcmFncmFwaChtX2xpbmVJbmZvLnByZXZpb3VzTGlu
ZUJyb2tlQ2xlYW5seSgpKQotICAgICAgICAsIG1fYWxsb3dJbWFnZXNUb0JyZWFrKCFibG9jay5k
b2N1bWVudCgpLmluUXVpcmtzTW9kZSgpIHx8ICFibG9jay5pc1RhYmxlQ2VsbCgpIHx8ICFtX2Js
b2NrU3R5bGUubG9naWNhbFdpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKLSAgICAgICAgLCBt
X2F0RW5kKGZhbHNlKQotICAgICAgICAsIG1faGFkVW5jb21taXR0ZWRXaWR0aEJlZm9yZUN1cnJl
bnQoZmFsc2UpCi0gICAgICAgICwgbV9saW5lTWlkcG9pbnRTdGF0ZShyZXNvbHZlci5taWRwb2lu
dFN0YXRlKCkpCi0gICAgewotICAgICAgICBtX2xpbmVJbmZvLnNldFByZXZpb3VzTGluZUJyb2tl
Q2xlYW5seShmYWxzZSk7Ci0gICAgfQotCi0gICAgUmVuZGVyT2JqZWN0KiBjdXJyZW50T2JqZWN0
KCkgeyByZXR1cm4gbV9jdXJyZW50Lm1fb2JqOyB9Ci0gICAgSW5saW5lSXRlcmF0b3IgbGluZUJy
ZWFrKCkgeyByZXR1cm4gbV9saW5lQnJlYWs7IH0KLSAgICBJbmxpbmVJdGVyYXRvciYgbGluZUJy
ZWFrUmVmKCkge3JldHVybiBtX2xpbmVCcmVhazsgfQotICAgIExpbmVXaWR0aCYgbGluZVdpZHRo
KCkgeyByZXR1cm4gbV93aWR0aDsgfQotICAgIGJvb2wgYXRFbmQoKSB7IHJldHVybiBtX2F0RW5k
OyB9Ci0KLSAgICB2b2lkIGluaXRpYWxpemVGb3JDdXJyZW50T2JqZWN0KCk7Ci0KLSAgICB2b2lk
IGluY3JlbWVudCgpOwotCi0gICAgdm9pZCBoYW5kbGVCUihFQ2xlYXImKTsKLSAgICB2b2lkIGhh
bmRsZU91dE9mRmxvd1Bvc2l0aW9uZWQoVmVjdG9yPFJlbmRlckJveCo+JiBwb3NpdGlvbmVkT2Jq
ZWN0cyk7Ci0gICAgdm9pZCBoYW5kbGVGbG9hdCgpOwotICAgIHZvaWQgaGFuZGxlRW1wdHlJbmxp
bmUoKTsKLSAgICB2b2lkIGhhbmRsZVJlcGxhY2VkKCk7Ci0gICAgYm9vbCBoYW5kbGVUZXh0KFdv
cmRNZWFzdXJlbWVudHMmLCBib29sJiBoeXBoZW5hdGVkLCB1bnNpZ25lZCYgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXMpOwotICAgIGJvb2wgY2FuQnJlYWtBdFRoaXNQb3NpdGlvbigpOwotICAg
IHZvaWQgY29tbWl0QW5kVXBkYXRlTGluZUJyZWFrSWZOZWVkZWQoKTsKLSAgICBJbmxpbmVJdGVy
YXRvciBoYW5kbGVFbmRPZkxpbmUoKTsKLQotICAgIHZvaWQgY2xlYXJMaW5lQnJlYWtJZkZpdHNP
bkxpbmUoYm9vbCBpZ25vcmluZ1RyYWlsaW5nU3BhY2UgPSBmYWxzZSkKLSAgICB7Ci0gICAgICAg
IGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoaWdub3JpbmdUcmFpbGluZ1NwYWNlKSB8fCBtX2xhc3RX
UyA9PSBOT1dSQVApCi0gICAgICAgICAgICBtX2xpbmVCcmVhay5jbGVhcigpOwotICAgIH0KLQot
ICAgIHZvaWQgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoUmVuZGVyT2JqZWN0KiBvYmpl
Y3QsIHVuc2lnbmVkIG9mZnNldCA9IDAsIGludCBuZXh0QnJlYWsgPSAtMSkKLSAgICB7Ci0gICAg
ICAgIG1fd2lkdGguY29tbWl0KCk7Ci0gICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhvYmplY3Qs
IG9mZnNldCwgbmV4dEJyZWFrKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgTGluZUJyZWFrZXIm
IG1fbGluZUJyZWFrZXI7Ci0gICAgSW5saW5lQmlkaVJlc29sdmVyJiBtX3Jlc29sdmVyOwotCi0g
ICAgSW5saW5lSXRlcmF0b3IgbV9jdXJyZW50OwotICAgIElubGluZUl0ZXJhdG9yIG1fbGluZUJy
ZWFrOwotICAgIElubGluZUl0ZXJhdG9yIG1fc3RhcnRPZklnbm9yZWRTcGFjZXM7Ci0KLSAgICBS
ZW5kZXJCbG9ja0Zsb3cmIG1fYmxvY2s7Ci0gICAgUmVuZGVyT2JqZWN0KiBtX2xhc3RPYmplY3Q7
Ci0gICAgUmVuZGVyT2JqZWN0KiBtX25leHRPYmplY3Q7Ci0KLSAgICBSZW5kZXJTdHlsZSogbV9j
dXJyZW50U3R5bGU7Ci0KLSAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93IGEgdGFi
bGUgY2VsbCB0byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKLSAgICAvLyB2
ZXJ5IHNwZWNpZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1vbiBXaW5J
RSByZW5kZXJpbmdzKS4KLSAgICAvLyBOb3Qgc3VwcG9ydGluZyB0aGUgcXVpcmsgaGFzIGNhdXNl
ZCB1cyB0byBtaXMtcmVuZGVyIHNvbWUgcmVhbCBzaXRlcy4gKFNlZSBCdWd6aWxsYSAxMDUxNy4p
Ci0gICAgUmVuZGVyU3R5bGUmIG1fYmxvY2tTdHlsZTsKLQotICAgIExpbmVJbmZvJiBtX2xpbmVJ
bmZvOwotCi0gICAgUmVuZGVyVGV4dEluZm8mIG1fcmVuZGVyVGV4dEluZm87Ci0KLSAgICBGbG9h
dGluZ09iamVjdCogbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lOwotCi0gICAgTGluZVdpZHRo
IG1fd2lkdGg7Ci0KLSAgICBFV2hpdGVTcGFjZSBtX2N1cnJXUzsKLSAgICBFV2hpdGVTcGFjZSBt
X2xhc3RXUzsKLQotICAgIGJvb2wgbV9wcmVzZXJ2ZXNOZXdsaW5lOwotICAgIGJvb2wgbV9hdFN0
YXJ0OwotCi0gICAgLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIG9ubHkgaWYgd2hpdGVzcGFjZSBp
c24ndCBzZXQgdG8gUFJFLCBhbmQgaXQgdGVsbHMgdXMgd2hldGhlcgotICAgIC8vIG9yIG5vdCB3
ZSBhcmUgY3VycmVudGx5IGlnbm9yaW5nIHdoaXRlc3BhY2UuCi0gICAgYm9vbCBtX2lnbm9yaW5n
U3BhY2VzOwotCi0gICAgLy8gVGhpcyB2YXJpYWJsZSB0cmFja3Mgd2hldGhlciB0aGUgdmVyeSBs
YXN0IGNoYXJhY3RlciB3ZSBzYXcgd2FzIGEgc3BhY2UuICBXZSB1c2UKLSAgICAvLyB0aGlzIHRv
IGRldGVjdCB3aGVuIHdlIGVuY291bnRlciBhIHNlY29uZCBzcGFjZSBzbyB3ZSBrbm93IHdlIGhh
dmUgdG8gdGVybWluYXRlCi0gICAgLy8gYSBydW4uCi0gICAgYm9vbCBtX2N1cnJlbnRDaGFyYWN0
ZXJJc1NwYWNlOwotICAgIGJvb2wgbV9jdXJyZW50Q2hhcmFjdGVySXNXUzsKLSAgICBib29sIG1f
YXBwbGllZFN0YXJ0V2lkdGg7Ci0gICAgYm9vbCBtX2luY2x1ZGVFbmRXaWR0aDsKLSAgICBib29s
IG1fYXV0b1dyYXA7Ci0gICAgYm9vbCBtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmU7Ci0gICAg
Ym9vbCBtX2Zsb2F0c0ZpdE9uTGluZTsKLSAgICBib29sIG1fY29sbGFwc2VXaGl0ZVNwYWNlOwot
ICAgIGJvb2wgbV9zdGFydGluZ05ld1BhcmFncmFwaDsKLSAgICBib29sIG1fYWxsb3dJbWFnZXNU
b0JyZWFrOwotICAgIGJvb2wgbV9hdEVuZDsKLSAgICBib29sIG1faGFkVW5jb21taXR0ZWRXaWR0
aEJlZm9yZUN1cnJlbnQ7Ci0KLSAgICBMaW5lTWlkcG9pbnRTdGF0ZSYgbV9saW5lTWlkcG9pbnRT
dGF0ZTsKLQotICAgIFRyYWlsaW5nT2JqZWN0cyBtX3RyYWlsaW5nT2JqZWN0czsKLX07Ci0KLWlu
bGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aW5pdGlhbGl6ZUZvckN1cnJlbnRPYmplY3QoKQot
ewotICAgIG1faGFkVW5jb21taXR0ZWRXaWR0aEJlZm9yZUN1cnJlbnQgPSAhIW1fd2lkdGgudW5j
b21taXR0ZWRXaWR0aCgpOwotCi0gICAgbV9jdXJyZW50U3R5bGUgPSAmbV9jdXJyZW50Lm1fb2Jq
LT5zdHlsZSgpOwotCi0gICAgQVNTRVJUKG1fY3VycmVudFN0eWxlKTsKLQotICAgIG1fbmV4dE9i
amVjdCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMobV9ibG9jaywgbV9jdXJyZW50Lm1f
b2JqKTsKLSAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1fbmV4dE9iamVjdC0+cGFyZW50KCkgJiYg
IW1fbmV4dE9iamVjdC0+cGFyZW50KCktPmlzRGVzY2VuZGFudE9mKG1fY3VycmVudC5tX29iai0+
cGFyZW50KCkpKQotICAgICAgICBtX2luY2x1ZGVFbmRXaWR0aCA9IHRydWU7Ci0KLSAgICBtX2N1
cnJXUyA9IG1fY3VycmVudC5tX29iai0+aXNSZXBsYWNlZCgpID8gbV9jdXJyZW50Lm1fb2JqLT5w
YXJlbnQoKS0+c3R5bGUoKS53aGl0ZVNwYWNlKCkgOiBtX2N1cnJlbnRTdHlsZS0+d2hpdGVTcGFj
ZSgpOwotICAgIG1fbGFzdFdTID0gbV9sYXN0T2JqZWN0LT5pc1JlcGxhY2VkKCkgPyBtX2xhc3RP
YmplY3QtPnBhcmVudCgpLT5zdHlsZSgpLndoaXRlU3BhY2UoKSA6IG1fbGFzdE9iamVjdC0+c3R5
bGUoKS53aGl0ZVNwYWNlKCk7Ci0KLSAgICBtX2F1dG9XcmFwID0gUmVuZGVyU3R5bGU6OmF1dG9X
cmFwKG1fY3VycldTKTsKLSAgICBtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUgPSBtX2F1dG9X
cmFwV2FzRXZlclRydWVPbkxpbmUgfHwgbV9hdXRvV3JhcDsKLQotI2lmIEVOQUJMRShTVkcpCi0g
ICAgbV9wcmVzZXJ2ZXNOZXdsaW5lID0gbV9jdXJyZW50Lm1fb2JqLT5pc1NWR0lubGluZVRleHQo
KSA/IGZhbHNlIDogUmVuZGVyU3R5bGU6OnByZXNlcnZlTmV3bGluZShtX2N1cnJXUyk7Ci0jZWxz
ZQotICAgIG1fcHJlc2VydmVzTmV3bGluZSA9IFJlbmRlclN0eWxlOjpwcmVzZXJ2ZU5ld2xpbmUo
bV9jdXJyV1MpOwotI2VuZGlmCi0KLSAgICBtX2NvbGxhcHNlV2hpdGVTcGFjZSA9IFJlbmRlclN0
eWxlOjpjb2xsYXBzZVdoaXRlU3BhY2UobV9jdXJyV1MpOwotfQotCi1pbmxpbmUgdm9pZCBCcmVh
a2luZ0NvbnRleHQ6OmluY3JlbWVudCgpCi17Ci0gICAgLy8gQ2xlYXIgb3V0IG91ciBjaGFyYWN0
ZXIgc3BhY2UgYm9vbCwgc2luY2UgaW5saW5lIDxwcmU+cyBkb24ndCBjb2xsYXBzZSB3aGl0ZXNw
YWNlCi0gICAgLy8gd2l0aCBhZGphY2VudCBpbmxpbmUgbm9ybWFsL25vd3JhcCBzcGFucy4KLSAg
ICBpZiAoIW1fY29sbGFwc2VXaGl0ZVNwYWNlKQotICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlID0gZmFsc2U7Ci0KLSAgICBtX2N1cnJlbnQubW92ZVRvU3RhcnRPZihtX25leHRPYmpl
Y3QpOwotICAgIG1fYXRTdGFydCA9IGZhbHNlOwotfQotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0Nv
bnRleHQ6OmhhbmRsZUJSKEVDbGVhciYgY2xlYXIpCi17Ci0gICAgaWYgKG1fd2lkdGguZml0c09u
TGluZSgpKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogYnIgPSBtX2N1cnJlbnQubV9vYmo7Ci0g
ICAgICAgIG1fbGluZUJyZWFrLm1vdmVUb1N0YXJ0T2YoYnIpOwotICAgICAgICBtX2xpbmVCcmVh
ay5pbmNyZW1lbnQoKTsKLQotICAgICAgICAvLyBBIDxicj4gYWx3YXlzIGJyZWFrcyBhIGxpbmUs
IHNvIGRvbid0IGxldCB0aGUgbGluZSBiZSBjb2xsYXBzZWQKLSAgICAgICAgLy8gYXdheS4gQWxz
bywgdGhlIHNwYWNlIGF0IHRoZSBlbmQgb2YgYSBsaW5lIHdpdGggYSA8YnI+IGRvZXMgbm90Ci0g
ICAgICAgIC8vIGdldCBjb2xsYXBzZWQgYXdheS4gSXQgb25seSBkb2VzIHRoaXMgaWYgdGhlIHBy
ZXZpb3VzIGxpbmUgYnJva2UKLSAgICAgICAgLy8gY2xlYW5seS4gT3RoZXJ3aXNlIHRoZSA8YnI+
IGhhcyBubyBlZmZlY3Qgb24gd2hldGhlciB0aGUgbGluZSBpcwotICAgICAgICAvLyBlbXB0eSBv
ciBub3QuCi0gICAgICAgIGlmIChtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoKQotICAgICAgICAgICAg
bV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKLSAgICAgICAg
bV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKLSAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91
c0xpbmVCcm9rZUNsZWFubHkodHJ1ZSk7Ci0KLSAgICAgICAgLy8gQSA8YnI+IHdpdGggY2xlYXJh
bmNlIGFsd2F5cyBuZWVkcyBhIGxpbmVib3ggaW4gY2FzZSB0aGUgbGluZXMgYmVsb3cgaXQgZ2V0
IGRpcnRpZWQgbGF0ZXIgYW5kCi0gICAgICAgIC8vIG5lZWQgdG8gY2hlY2sgZm9yIGZsb2F0cyB0
byBjbGVhciAtIHNvIGlmIHdlJ3JlIGlnbm9yaW5nIHNwYWNlcywgc3RvcCBpZ25vcmluZyB0aGVt
IGFuZCBhZGQgYQotICAgICAgICAvLyBydW4gZm9yIHRoaXMgb2JqZWN0LgotICAgICAgICBpZiAo
bV9pZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y2xlYXIoKSAhPSBDTk9ORSkKLSAg
ICAgICAgICAgIGVuc3VyZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2VzKG1fbGluZU1pZHBvaW50
U3RhdGUsIGJyKTsKLSAgICAgICAgLy8gSWYgd2Ugd2VyZSBwcmVjZWRlZCBieSBjb2xsYXBzaW5n
IHNwYWNlIGFuZCBhcmUgaW4gYSByaWdodC1hbGlnbmVkIGNvbnRhaW5lciB3ZSBuZWVkIHRvIGVu
c3VyZSB0aGUgc3BhY2UgZ2V0cwotICAgICAgICAvLyBjb2xsYXBzZWQgYXdheSBzbyB0aGF0IGl0
IGRvZXNuJ3QgcHVzaCB0aGUgdGV4dCBvdXQgZnJvbSB0aGUgY29udGFpbmVyJ3MgcmlnaHQtaGFu
ZCBlZGdlLgotICAgICAgICAvLyBGSVhNRTogRG8gdGhpcyByZWdhcmRsZXNzIG9mIHRoZSBjb250
YWluZXIncyBhbGlnbm1lbnQgLSB3aWxsIHJlcXVpcmUgcmViYXNlbGluaW5nIGEgbG90IG9mIHRl
c3QgcmVzdWx0cy4KLSAgICAgICAgZWxzZSBpZiAobV9pZ25vcmluZ1NwYWNlcyAmJiAobV9ibG9j
a1N0eWxlLnRleHRBbGlnbigpID09IFJJR0hUIHx8IG1fYmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9
PSBXRUJLSVRfUklHSFQpKQotICAgICAgICAgICAgc3RvcElnbm9yaW5nU3BhY2VzKG1fbGluZU1p
ZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50
Lm1fcG9zKSk7Ci0KLSAgICAgICAgaWYgKCFtX2xpbmVJbmZvLmlzRW1wdHkoKSkKLSAgICAgICAg
ICAgIGNsZWFyID0gbV9jdXJyZW50U3R5bGUtPmNsZWFyKCk7Ci0gICAgfQotICAgIG1fYXRFbmQg
PSB0cnVlOwotfQotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZU91dE9mRmxv
d1Bvc2l0aW9uZWQoVmVjdG9yPFJlbmRlckJveCo+JiBwb3NpdGlvbmVkT2JqZWN0cykKLXsKLSAg
ICAvLyBJZiBvdXIgb3JpZ2luYWwgZGlzcGxheSB3YXNuJ3QgYW4gaW5saW5lIHR5cGUsIHRoZW4g
d2UgY2FuCi0gICAgLy8gZ28gYWhlYWQgYW5kIGRldGVybWluZSBvdXIgc3RhdGljIGlubGluZSBw
b3NpdGlvbiBub3cuCi0gICAgUmVuZGVyQm94KiBib3ggPSB0b1JlbmRlckJveChtX2N1cnJlbnQu
bV9vYmopOwotICAgIGJvb2wgaXNJbmxpbmVUeXBlID0gYm94LT5zdHlsZSgpLmlzT3JpZ2luYWxE
aXNwbGF5SW5saW5lVHlwZSgpOwotICAgIGlmICghaXNJbmxpbmVUeXBlKQotICAgICAgICBtX2Js
b2NrLnNldFN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hpbGQoKmJveCwgbV9ibG9jay5sb2dpY2Fs
SGVpZ2h0KCksIG1fYmxvY2suc3RhcnRPZmZzZXRGb3JDb250ZW50KG1fYmxvY2subG9naWNhbEhl
aWdodCgpKSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8vIElmIG91ciBvcmlnaW5hbCBkaXNwbGF5
IHdhcyBhbiBJTkxJTkUgdHlwZSwgdGhlbiB3ZSBjYW4gZ28gYWhlYWQKLSAgICAgICAgLy8gYW5k
IGRldGVybWluZSBvdXIgc3RhdGljIHkgcG9zaXRpb24gbm93LgotICAgICAgICBib3gtPmxheWVy
KCktPnNldFN0YXRpY0Jsb2NrUG9zaXRpb24obV9ibG9jay5sb2dpY2FsSGVpZ2h0KCkpOwotICAg
IH0KLQotICAgIC8vIElmIHdlJ3JlIGlnbm9yaW5nIHNwYWNlcywgd2UgaGF2ZSB0byBzdG9wIGFu
ZCBpbmNsdWRlIHRoaXMgb2JqZWN0IGFuZAotICAgIC8vIHRoZW4gc3RhcnQgaWdub3Jpbmcgc3Bh
Y2VzIGFnYWluLgotICAgIGlmIChpc0lubGluZVR5cGUgfHwgYm94LT5jb250YWluZXIoKS0+aXNS
ZW5kZXJJbmxpbmUoKSkgewotICAgICAgICBpZiAobV9pZ25vcmluZ1NwYWNlcykKLSAgICAgICAg
ICAgIGVuc3VyZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUs
IGJveCk7Ci0gICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmFwcGVuZEJveElmTmVlZGVkKGJveCk7
Ci0gICAgfSBlbHNlCi0gICAgICAgIHBvc2l0aW9uZWRPYmplY3RzLmFwcGVuZChib3gpOwotCi0g
ICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlubGluZUxvZ2ljYWxXaWR0aChib3gpKTsK
LSAgICAvLyBSZXNldCBwcmlvciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVycy4KLSAgICBt
X3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IucmVzZXRQcmlvckNvbnRleHQoKTsK
LX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVGbG9hdCgpCi17Ci0gICAg
UmVuZGVyQm94JiBmbG9hdEJveCA9IHRvUmVuZGVyQm94KCptX2N1cnJlbnQubV9vYmopOwotICAg
IEZsb2F0aW5nT2JqZWN0KiBmbG9hdGluZ09iamVjdCA9IG1fYmxvY2suaW5zZXJ0RmxvYXRpbmdP
YmplY3QoZmxvYXRCb3gpOwotICAgIC8vIGNoZWNrIGlmIGl0IGZpdHMgaW4gdGhlIGN1cnJlbnQg
bGluZS4KLSAgICAvLyBJZiBpdCBkb2VzLCBwb3NpdGlvbiBpdCBub3csIG90aGVyd2lzZSwgcG9z
aXRpb24KLSAgICAvLyBpdCBhZnRlciBtb3ZpbmcgdG8gbmV4dCBsaW5lIChpbiBuZXdMaW5lKCkg
ZnVuYykKLSAgICAvLyBGSVhNRTogQnVnIDExMDM3MjogUHJvcGVybHkgcG9zaXRpb24gbXVsdGlw
bGUgc3RhY2tlZCBmbG9hdHMgd2l0aCBub24tcmVjdGFuZ3VsYXIgc2hhcGUgb3V0c2lkZS4KLSAg
ICBpZiAobV9mbG9hdHNGaXRPbkxpbmUgJiYgbV93aWR0aC5maXRzT25MaW5lRXhjbHVkaW5nVHJh
aWxpbmdXaGl0ZXNwYWNlKG1fYmxvY2subG9naWNhbFdpZHRoRm9yRmxvYXQoZmxvYXRpbmdPYmpl
Y3QpKSkgewotICAgICAgICBtX2Jsb2NrLnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUoZmxvYXRpbmdP
YmplY3QsIG1fbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgbV9saW5lSW5mbywgbV93aWR0aCk7
Ci0gICAgICAgIGlmIChtX2xpbmVCcmVhay5tX29iaiA9PSBtX2N1cnJlbnQubV9vYmopIHsKLSAg
ICAgICAgICAgIEFTU0VSVCghbV9saW5lQnJlYWsubV9wb3MpOwotICAgICAgICAgICAgbV9saW5l
QnJlYWsuaW5jcmVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICAgbV9mbG9h
dHNGaXRPbkxpbmUgPSBmYWxzZTsKLSAgICAvLyBVcGRhdGUgcHJpb3IgbGluZSBicmVhayBjb250
ZXh0IGNoYXJhY3RlcnMsIHVzaW5nIFUrRkZGRCAoT0JKRUNUIFJFUExBQ0VNRU5UIENIQVJBQ1RF
UikgZm9yIGZsb2F0aW5nIGVsZW1lbnQuCi0gICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVh
a0l0ZXJhdG9yLnVwZGF0ZVByaW9yQ29udGV4dChyZXBsYWNlbWVudENoYXJhY3Rlcik7Ci19Ci0K
LWlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRW1wdHlJbmxpbmUoKQotewotICAg
IFJlbmRlcklubGluZSYgZmxvd0JveCA9IHRvUmVuZGVySW5saW5lKCptX2N1cnJlbnQubV9vYmop
OwotCi0gICAgLy8gVGhpcyBzaG91bGQgb25seSBlbmQgdXAgYmVpbmcgY2FsbGVkIG9uIGVtcHR5
IGlubGluZXMKLSAgICBBU1NFUlQoaXNFbXB0eUlubGluZShmbG93Qm94KSk7Ci0KLSAgICAvLyBO
b3cgdGhhdCBzb21lIGlubGluZSBmbG93cyBoYXZlIGxpbmUgYm94ZXMsIGlmIHdlIGFyZSBhbHJl
YWR5IGlnbm9yaW5nIHNwYWNlcywgd2UgbmVlZAotICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHdl
IHN0b3AgdG8gaW5jbHVkZSB0aGlzIG9iamVjdCBhbmQgdGhlbiBzdGFydCBpZ25vcmluZyBzcGFj
ZXMgYWdhaW4uCi0gICAgLy8gSWYgdGhpcyBvYmplY3QgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBs
aW5lLCB3ZSBuZWVkIHRvIGJlaGF2ZSBsaWtlIGxpc3QgbWFya2VycyBhbmQKLSAgICAvLyBzdGFy
dCBpZ25vcmluZyBzcGFjZXMuCi0gICAgYm9vbCByZXF1aXJlc0xpbmVCb3ggPSBhbHdheXNSZXF1
aXJlc0xpbmVCb3goZmxvd0JveCk7Ci0gICAgaWYgKHJlcXVpcmVzTGluZUJveCB8fCByZXF1aXJl
c0xpbmVCb3hGb3JDb250ZW50KGZsb3dCb3gsIG1fbGluZUluZm8pKSB7Ci0gICAgICAgIC8vIEFu
IGVtcHR5IGlubGluZSB0aGF0IG9ubHkgaGFzIGxpbmUtaGVpZ2h0LCB2ZXJ0aWNhbC1hbGlnbiBv
ciBmb250LW1ldHJpY3Mgd2lsbCBvbmx5IGdldCBhCi0gICAgICAgIC8vIGxpbmUgYm94IHRvIGFm
ZmVjdCB0aGUgaGVpZ2h0IG9mIHRoZSBsaW5lIGlmIHRoZSByZXN0IG9mIHRoZSBsaW5lIGlzIG5v
dCBlbXB0eS4KLSAgICAgICAgaWYgKHJlcXVpcmVzTGluZUJveCkKLSAgICAgICAgICAgIG1fbGlu
ZUluZm8uc2V0RW1wdHkoZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7Ci0gICAgICAgIGlmICht
X2lnbm9yaW5nU3BhY2VzKSB7Ci0gICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigp
OwotICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9saW5lTWlk
cG9pbnRTdGF0ZSwgbV9jdXJyZW50Lm1fb2JqKTsKLSAgICAgICAgfSBlbHNlIGlmIChtX2Jsb2Nr
U3R5bGUuY29sbGFwc2VXaGl0ZVNwYWNlKCkgJiYgbV9yZXNvbHZlci5wb3NpdGlvbigpLm1fb2Jq
ID09IG1fY3VycmVudC5tX29iagotICAgICAgICAgICAgJiYgc2hvdWxkU2tpcFdoaXRlc3BhY2VB
ZnRlclN0YXJ0T2JqZWN0KG1fYmxvY2ssIG1fY3VycmVudC5tX29iaiwgbV9saW5lTWlkcG9pbnRT
dGF0ZSkpIHsKLSAgICAgICAgICAgIC8vIExpa2Ugd2l0aCBsaXN0IG1hcmtlcnMsIHdlIHN0YXJ0
IGlnbm9yaW5nIHNwYWNlcyB0byBtYWtlIHN1cmUgdGhhdCBhbnkKLSAgICAgICAgICAgIC8vIGFk
ZGl0aW9uYWwgc3BhY2VzIHdlIHNlZSB3aWxsIGJlIGRpc2NhcmRlZC4KLSAgICAgICAgICAgIG1f
Y3VycmVudENoYXJhY3RlcklzU3BhY2UgPSB0cnVlOwotICAgICAgICAgICAgbV9jdXJyZW50Q2hh
cmFjdGVySXNXUyA9IHRydWU7Ci0gICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0gdHJ1ZTsK
LSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5hcHBlbmRCb3hJ
Zk5lZWRlZCgmZmxvd0JveCk7Ci0gICAgfQotCi0gICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdp
ZHRoKGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQubV9vYmopICsgYm9yZGVyUGFkZGluZ01h
cmdpblN0YXJ0KGZsb3dCb3gpICsgYm9yZGVyUGFkZGluZ01hcmdpbkVuZChmbG93Qm94KSk7Ci19
Ci0KLWlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlUmVwbGFjZWQoKQotewotICAg
IFJlbmRlckJveCYgcmVwbGFjZWRCb3ggPSB0b1JlbmRlckJveCgqbV9jdXJyZW50Lm1fb2JqKTsK
LQotICAgIGlmIChtX2F0U3RhcnQpCi0gICAgICAgIG1fd2lkdGgudXBkYXRlQXZhaWxhYmxlV2lk
dGgocmVwbGFjZWRCb3gubG9naWNhbEhlaWdodCgpKTsKLQotICAgIC8vIEJyZWFrIG9uIHJlcGxh
Y2VkIGVsZW1lbnRzIGlmIGVpdGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLgotICAgIGlmICgo
bV9hdXRvV3JhcCB8fCBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobV9sYXN0V1MpKSAmJiAoIW1fY3Vy
cmVudC5tX29iai0+aXNJbWFnZSgpIHx8IG1fYWxsb3dJbWFnZXNUb0JyZWFrKSkgewotICAgICAg
ICBtX3dpZHRoLmNvbW1pdCgpOwotICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG9TdGFydE9mKG1f
Y3VycmVudC5tX29iaik7Ci0gICAgfQotCi0gICAgaWYgKG1faWdub3JpbmdTcGFjZXMpCi0gICAg
ICAgIHN0b3BJZ25vcmluZ1NwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRv
cigwLCBtX2N1cnJlbnQubV9vYmosIDApKTsKLQotICAgIG1fbGluZUluZm8uc2V0RW1wdHkoZmFs
c2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7Ci0gICAgbV9pZ25vcmluZ1NwYWNlcyA9IGZhbHNlOwot
ICAgIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKLSAgICBtX2N1cnJlbnRDaGFy
YWN0ZXJJc1dTID0gZmFsc2U7Ci0gICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKLQotICAg
IC8vIE9wdGltaXplIGZvciBhIGNvbW1vbiBjYXNlLiBJZiB3ZSBjYW4ndCBmaW5kIHdoaXRlc3Bh
Y2UgYWZ0ZXIgdGhlIGxpc3QKLSAgICAvLyBpdGVtLCB0aGVuIHRoaXMgaXMgYWxsIG1vb3QuCi0g
ICAgTGF5b3V0VW5pdCByZXBsYWNlZExvZ2ljYWxXaWR0aCA9IG1fYmxvY2subG9naWNhbFdpZHRo
Rm9yQ2hpbGQocmVwbGFjZWRCb3gpICsgbV9ibG9jay5tYXJnaW5TdGFydEZvckNoaWxkKHJlcGxh
Y2VkQm94KSArIG1fYmxvY2subWFyZ2luRW5kRm9yQ2hpbGQocmVwbGFjZWRCb3gpICsgaW5saW5l
TG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaik7Ci0gICAgaWYgKG1fY3VycmVudC5tX29iai0+
aXNMaXN0TWFya2VyKCkpIHsKLSAgICAgICAgaWYgKG1fYmxvY2tTdHlsZS5jb2xsYXBzZVdoaXRl
U3BhY2UoKSAmJiBzaG91bGRTa2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QobV9ibG9jaywg
bV9jdXJyZW50Lm1fb2JqLCBtX2xpbmVNaWRwb2ludFN0YXRlKSkgewotICAgICAgICAgICAgLy8g
TGlrZSB3aXRoIGlubGluZSBmbG93cywgd2Ugc3RhcnQgaWdub3Jpbmcgc3BhY2VzIHRvIG1ha2Ug
c3VyZSB0aGF0IGFueQotICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBzcGFjZXMgd2Ugc2VlIHdp
bGwgYmUgZGlzY2FyZGVkLgotICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9
IHRydWU7Ci0gICAgICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTID0gZmFsc2U7Ci0gICAg
ICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAo
dG9SZW5kZXJMaXN0TWFya2VyKCptX2N1cnJlbnQubV9vYmopLmlzSW5zaWRlKCkpCi0gICAgICAg
ICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgocmVwbGFjZWRMb2dpY2FsV2lkdGgpOwot
ICAgIH0gZWxzZQotICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgocmVwbGFjZWRM
b2dpY2FsV2lkdGgpOwotICAgIGlmIChtX2N1cnJlbnQubV9vYmotPmlzUnVieVJ1bigpKQotICAg
ICAgICBtX3dpZHRoLmFwcGx5T3ZlcmhhbmcodG9SZW5kZXJSdWJ5UnVuKG1fY3VycmVudC5tX29i
aiksIG1fbGFzdE9iamVjdCwgbV9uZXh0T2JqZWN0KTsKLSAgICAvLyBVcGRhdGUgcHJpb3IgbGlu
ZSBicmVhayBjb250ZXh0IGNoYXJhY3RlcnMsIHVzaW5nIFUrRkZGRCAoT0JKRUNUIFJFUExBQ0VN
RU5UIENIQVJBQ1RFUikgZm9yIHJlcGxhY2VkIGVsZW1lbnQuCi0gICAgbV9yZW5kZXJUZXh0SW5m
by5tX2xpbmVCcmVha0l0ZXJhdG9yLnVwZGF0ZVByaW9yQ29udGV4dChyZXBsYWNlbWVudENoYXJh
Y3Rlcik7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIG5leHRDaGFyYWN0ZXIoVUNoYXImIGN1
cnJlbnRDaGFyYWN0ZXIsIFVDaGFyJiBsYXN0Q2hhcmFjdGVyLCBVQ2hhciYgc2Vjb25kVG9MYXN0
Q2hhcmFjdGVyKQotewotICAgIHNlY29uZFRvTGFzdENoYXJhY3RlciA9IGxhc3RDaGFyYWN0ZXI7
Ci0gICAgbGFzdENoYXJhY3RlciA9IGN1cnJlbnRDaGFyYWN0ZXI7Ci19Ci0KLWlubGluZSBib29s
IEJyZWFraW5nQ29udGV4dDo6aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3Vy
ZW1lbnRzLCBib29sJiBoeXBoZW5hdGVkLCAgdW5zaWduZWQmIGNvbnNlY3V0aXZlSHlwaGVuYXRl
ZExpbmVzKQotewotICAgIGlmICghbV9jdXJyZW50Lm1fcG9zKQotICAgICAgICBtX2FwcGxpZWRT
dGFydFdpZHRoID0gZmFsc2U7Ci0KLSAgICBSZW5kZXJUZXh0KiByZW5kZXJUZXh0ID0gdG9SZW5k
ZXJUZXh0KG1fY3VycmVudC5tX29iaik7Ci0KLSNpZiBFTkFCTEUoU1ZHKQotICAgIGJvb2wgaXNT
VkdUZXh0ID0gcmVuZGVyVGV4dC0+aXNTVkdJbmxpbmVUZXh0KCk7Ci0jZW5kaWYKLQotICAgIC8v
IElmIHdlIGhhdmUgbGVmdCBhIG5vLXdyYXAgaW5saW5lIGFuZCBlbnRlcmVkIGFuIGF1dG93cmFw
IGlubGluZSB3aGlsZSBpZ25vcmluZyBzcGFjZXMKLSAgICAvLyB0aGVuIHdlIG5lZWQgdG8gbWFy
ayB0aGUgc3RhcnQgb2YgdGhlIGF1dG93cmFwIGlubGluZSBhcyBhIHBvdGVudGlhbCBsaW5lYnJl
YWsgbm93LgotICAgIGlmIChtX2F1dG9XcmFwICYmICFSZW5kZXJTdHlsZTo6YXV0b1dyYXAobV9s
YXN0V1MpICYmIG1faWdub3JpbmdTcGFjZXMpCi0gICAgICAgIGNvbW1pdExpbmVCcmVha0F0Q3Vy
cmVudFdpZHRoKG1fY3VycmVudC5tX29iaik7Ci0KLSAgICBpZiAocmVuZGVyVGV4dC0+c3R5bGUo
KS5oYXNUZXh0Q29tYmluZSgpICYmIG1fY3VycmVudC5tX29iai0+aXNDb21iaW5lVGV4dCgpICYm
ICF0b1JlbmRlckNvbWJpbmVUZXh0KCptX2N1cnJlbnQubV9vYmopLmlzQ29tYmluZWQoKSkgewot
ICAgICAgICBSZW5kZXJDb21iaW5lVGV4dCYgY29tYmluZVJlbmRlcmVyID0gdG9SZW5kZXJDb21i
aW5lVGV4dCgqbV9jdXJyZW50Lm1fb2JqKTsKLSAgICAgICAgY29tYmluZVJlbmRlcmVyLmNvbWJp
bmVUZXh0KCk7Ci0gICAgICAgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHJlbmRlcmVyJ3MgdGV4dCBt
YXkgaGF2ZSBjaGFuZ2VkLiBJbmNyZW1lbnQgc3RhbGUgaXRlcmF0b3IgcG9zaXRpb25zCi0gICAg
ICAgIGlmIChpdGVyYXRvcklzQmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChtX2xpbmVCcmVh
aywgY29tYmluZVJlbmRlcmVyKSkgewotICAgICAgICAgICAgQVNTRVJUKGl0ZXJhdG9ySXNCZXlv
bmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KG1fcmVzb2x2ZXIucG9zaXRpb24oKSwgY29tYmluZVJl
bmRlcmVyKSk7Ci0gICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKLSAgICAgICAg
ICAgIG1fcmVzb2x2ZXIuaW5jcmVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25z
dCBSZW5kZXJTdHlsZSYgc3R5bGUgPSBsaW5lU3R5bGUoKnJlbmRlclRleHQtPnBhcmVudCgpLCBt
X2xpbmVJbmZvKTsKLSAgICBjb25zdCBGb250JiBmb250ID0gc3R5bGUuZm9udCgpOwotICAgIGJv
b2wgaXNGaXhlZFBpdGNoID0gZm9udC5pc0ZpeGVkUGl0Y2goKTsKLSAgICBib29sIGNhbkh5cGhl
bmF0ZSA9IHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBoZW5zQXV0byAmJiBXZWJDb3JlOjpjYW5IeXBo
ZW5hdGUoc3R5bGUubG9jYWxlKCkpOwotCi0gICAgdW5zaWduZWQgbGFzdFNwYWNlID0gbV9jdXJy
ZW50Lm1fcG9zOwotICAgIGZsb2F0IHdvcmRTcGFjaW5nID0gbV9jdXJyZW50U3R5bGUtPndvcmRT
cGFjaW5nKCk7Ci0gICAgZmxvYXQgbGFzdFNwYWNlV29yZFNwYWNpbmcgPSAwOwotICAgIGZsb2F0
IHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50ID0gMDsKLQotICAgIGZsb2F0IHdyYXBXID0g
bV93aWR0aC51bmNvbW1pdHRlZFdpZHRoKCkgKyBpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50
Lm1fb2JqLCAhbV9hcHBsaWVkU3RhcnRXaWR0aCwgdHJ1ZSk7Ci0gICAgZmxvYXQgY2hhcldpZHRo
ID0gMDsKLSAgICBib29sIGJyZWFrTkJTUCA9IG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUt
Pm5ic3BNb2RlKCkgPT0gU1BBQ0U7Ci0gICAgLy8gQXV0by13cmFwcGluZyB0ZXh0IHNob3VsZCB3
cmFwIGluIHRoZSBtaWRkbGUgb2YgYSB3b3JkIG9ubHkgaWYgaXQgY291bGQgbm90IHdyYXAgYmVm
b3JlIHRoZSB3b3JkLAotICAgIC8vIHdoaWNoIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHdvcmQg
aXMgdGhlIGZpcnN0IHRoaW5nIG9uIHRoZSBsaW5lLCB0aGF0IGlzLCBpZiB8d3wgaXMgemVyby4K
LSAgICBib29sIGJyZWFrV29yZHMgPSBtX2N1cnJlbnRTdHlsZS0+YnJlYWtXb3JkcygpICYmICgo
bV9hdXRvV3JhcCAmJiAhbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpKSB8fCBtX2N1cnJXUyA9PSBQ
UkUpOwotICAgIGJvb2wgbWlkV29yZEJyZWFrID0gZmFsc2U7Ci0gICAgYm9vbCBicmVha0FsbCA9
IG1fY3VycmVudFN0eWxlLT53b3JkQnJlYWsoKSA9PSBCcmVha0FsbFdvcmRCcmVhayAmJiBtX2F1
dG9XcmFwOwotICAgIGZsb2F0IGh5cGhlbldpZHRoID0gMDsKLSNpZiBFTkFCTEUoU1ZHKQotICAg
IGlmIChpc1NWR1RleHQpIHsKLSAgICAgICAgYnJlYWtXb3JkcyA9IGZhbHNlOwotICAgICAgICBi
cmVha0FsbCA9IGZhbHNlOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKG1fcmVuZGVyVGV4dElu
Zm8ubV90ZXh0ICE9IHJlbmRlclRleHQpIHsKLSAgICAgICAgdXBkYXRlQ291bnRlcklmTmVlZGVk
KCpyZW5kZXJUZXh0KTsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX3RleHQgPSByZW5kZXJU
ZXh0OwotICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fZm9udCA9ICZmb250OwotICAgICAgICBt
X3JlbmRlclRleHRJbmZvLm1fbGF5b3V0ID0gZm9udC5jcmVhdGVMYXlvdXQocmVuZGVyVGV4dCwg
bV93aWR0aC5jdXJyZW50V2lkdGgoKSwgbV9jb2xsYXBzZVdoaXRlU3BhY2UpOwotICAgICAgICBt
X3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IucmVzZXRTdHJpbmdBbmRSZWxlYXNl
SXRlcmF0b3IocmVuZGVyVGV4dC0+dGV4dCgpLCBzdHlsZS5sb2NhbGUoKSk7Ci0gICAgfSBlbHNl
IGlmIChtX3JlbmRlclRleHRJbmZvLm1fbGF5b3V0ICYmIG1fcmVuZGVyVGV4dEluZm8ubV9mb250
ICE9ICZmb250KSB7Ci0gICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9mb250ID0gJmZvbnQ7Ci0g
ICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgPSBmb250LmNyZWF0ZUxheW91dChyZW5k
ZXJUZXh0LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSk7Ci0g
ICAgfQotCi0gICAgVGV4dExheW91dCogdGV4dExheW91dCA9IG1fcmVuZGVyVGV4dEluZm8ubV9s
YXlvdXQuZ2V0KCk7Ci0KLSAgICAvLyBOb24temVybyBvbmx5IHdoZW4ga2VybmluZyBpcyBlbmFi
bGVkIGFuZCBUZXh0TGF5b3V0IGlzbid0IHVzZWQsIGluIHdoaWNoIGNhc2Ugd2UgbWVhc3VyZQot
ICAgIC8vIHdvcmRzIHdpdGggdGhlaXIgdHJhaWxpbmcgc3BhY2UsIHRoZW4gc3VidHJhY3QgaXRz
IHdpZHRoLgotICAgIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiBmYWxsYmFja0ZvbnRz
OwotICAgIGZsb2F0IHdvcmRUcmFpbGluZ1NwYWNlV2lkdGggPSAoZm9udC50eXBlc2V0dGluZ0Zl
YXR1cmVzKCkgJiBLZXJuaW5nKSAmJiAhdGV4dExheW91dCA/IGZvbnQud2lkdGgoUmVuZGVyQmxv
Y2s6OmNvbnN0cnVjdFRleHRSdW4ocmVuZGVyVGV4dCwgZm9udCwgJnNwYWNlLCAxLCBzdHlsZSks
ICZmYWxsYmFja0ZvbnRzKSArIHdvcmRTcGFjaW5nIDogMDsKLQotICAgIFVDaGFyIGxhc3RDaGFy
YWN0ZXIgPSBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IubGFzdENoYXJhY3Rl
cigpOwotICAgIFVDaGFyIHNlY29uZFRvTGFzdENoYXJhY3RlciA9IG1fcmVuZGVyVGV4dEluZm8u
bV9saW5lQnJlYWtJdGVyYXRvci5zZWNvbmRUb0xhc3RDaGFyYWN0ZXIoKTsKLSAgICBmb3IgKDsg
bV9jdXJyZW50Lm1fcG9zIDwgcmVuZGVyVGV4dC0+dGV4dExlbmd0aCgpOyBtX2N1cnJlbnQuZmFz
dEluY3JlbWVudEluVGV4dE5vZGUoKSkgewotICAgICAgICBib29sIHByZXZpb3VzQ2hhcmFjdGVy
SXNTcGFjZSA9IG1fY3VycmVudENoYXJhY3RlcklzU3BhY2U7Ci0gICAgICAgIGJvb2wgcHJldmlv
dXNDaGFyYWN0ZXJJc1dTID0gbV9jdXJyZW50Q2hhcmFjdGVySXNXUzsKLSAgICAgICAgVUNoYXIg
YyA9IG1fY3VycmVudC5jdXJyZW50KCk7Ci0gICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzU3Bh
Y2UgPSBjID09ICcgJyB8fCBjID09ICdcdCcgfHwgKCFtX3ByZXNlcnZlc05ld2xpbmUgJiYgKGMg
PT0gJ1xuJykpOwotCi0gICAgICAgIGlmICghbV9jb2xsYXBzZVdoaXRlU3BhY2UgfHwgIW1fY3Vy
cmVudENoYXJhY3RlcklzU3BhY2UpCi0gICAgICAgICAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZh
bHNlLCAmbV9ibG9jaywgJm1fd2lkdGgpOwotCi0gICAgICAgIGlmIChjID09IHNvZnRIeXBoZW4g
JiYgbV9hdXRvV3JhcCAmJiAhaHlwaGVuV2lkdGggJiYgc3R5bGUuaHlwaGVucygpICE9IEh5cGhl
bnNOb25lKSB7Ci0gICAgICAgICAgICBoeXBoZW5XaWR0aCA9IG1lYXN1cmVIeXBoZW5XaWR0aChy
ZW5kZXJUZXh0LCBmb250LCAmZmFsbGJhY2tGb250cyk7Ci0gICAgICAgICAgICBtX3dpZHRoLmFk
ZFVuY29tbWl0dGVkV2lkdGgoaHlwaGVuV2lkdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9v
bCBhcHBseVdvcmRTcGFjaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVy
SXNXUyA9IG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgfHwgKGJyZWFrTkJTUCAmJiBjID09IG5v
QnJlYWtTcGFjZSk7Ci0KLSAgICAgICAgaWYgKChicmVha0FsbCB8fCBicmVha1dvcmRzKSAmJiAh
bWlkV29yZEJyZWFrICYmICghbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSB8fCBzdHlsZS53aGl0
ZVNwYWNlKCkgIT0gUFJFX1dSQVApKSB7Ci0gICAgICAgICAgICB3cmFwVyArPSBjaGFyV2lkdGg7
Ci0gICAgICAgICAgICBib29sIG1pZFdvcmRCcmVha0lzQmVmb3JlU3Vycm9nYXRlUGFpciA9IFUx
Nl9JU19MRUFEKGMpICYmIG1fY3VycmVudC5tX3BvcyArIDEgPCByZW5kZXJUZXh0LT50ZXh0TGVu
Z3RoKCkgJiYgVTE2X0lTX1RSQUlMKCgqcmVuZGVyVGV4dClbbV9jdXJyZW50Lm1fcG9zICsgMV0p
OwotICAgICAgICAgICAgY2hhcldpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIG1fY3VycmVu
dC5tX3BvcywgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID8gMiA6IDEsIGZvbnQs
IG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSArIHdyYXBXLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFw
c2VXaGl0ZVNwYWNlLCBmYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKLSAgICAgICAgICAgIG1p
ZFdvcmRCcmVhayA9IG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSArIHdyYXBXICsgY2hhcldpZHRo
ID4gbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBi
ZXR3ZWVuV29yZHMgPSBjID09ICdcbicgfHwgKG1fY3VycldTICE9IFBSRSAmJiAhbV9hdFN0YXJ0
ICYmIGlzQnJlYWthYmxlKG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvciwgbV9j
dXJyZW50Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24sIGJyZWFrTkJT
UCkKLSAgICAgICAgICAgICYmIChzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUgfHwgKG1f
Y3VycmVudC5wcmV2aW91c0luU2FtZU5vZGUoKSAhPSBzb2Z0SHlwaGVuKSkpOwotCi0gICAgICAg
IGlmIChiZXR3ZWVuV29yZHMgfHwgbWlkV29yZEJyZWFrKSB7Ci0gICAgICAgICAgICBib29sIHN0
b3BwZWRJZ25vcmluZ1NwYWNlcyA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1faWdub3JpbmdT
cGFjZXMpIHsKLSAgICAgICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IDA7Ci0gICAg
ICAgICAgICAgICAgaWYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIC8vIFN0b3AgaWdub3Jpbmcgc3BhY2VzIGFuZCBiZWdpbiBhdCB0aGlzCi0gICAg
ICAgICAgICAgICAgICAgIC8vIG5ldyBwb2ludC4KLSAgICAgICAgICAgICAgICAgICAgbV9pZ25v
cmluZ1NwYWNlcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB3b3JkU3BhY2luZ0Zvcldv
cmRNZWFzdXJlbWVudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZSA9IG1fY3Vy
cmVudC5tX3BvczsgLy8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQgaW4gYW55IG9mIHRo
ZSBpZ25vcmVkIHNwYWNlcy4KLSAgICAgICAgICAgICAgICAgICAgc3RvcElnbm9yaW5nU3BhY2Vz
KG1fbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5tX29iaiwg
bV9jdXJyZW50Lm1fcG9zKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0b3BwZWRJZ25vcmluZ1Nw
YWNlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAg
ICAgLy8gSnVzdCBrZWVwIGlnbm9yaW5nIHRoZXNlIHNwYWNlcy4KLSAgICAgICAgICAgICAgICAg
ICAgbmV4dENoYXJhY3RlcihjLCBsYXN0Q2hhcmFjdGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIp
OwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudHMuZ3Jvdyh3b3JkTWVhc3Vy
ZW1lbnRzLnNpemUoKSArIDEpOwotICAgICAgICAgICAgV29yZE1lYXN1cmVtZW50JiB3b3JkTWVh
c3VyZW1lbnQgPSB3b3JkTWVhc3VyZW1lbnRzLmxhc3QoKTsKLQotICAgICAgICAgICAgd29yZE1l
YXN1cmVtZW50LnJlbmRlcmVyID0gcmVuZGVyVGV4dDsKLSAgICAgICAgICAgIHdvcmRNZWFzdXJl
bWVudC5lbmRPZmZzZXQgPSBtX2N1cnJlbnQubV9wb3M7Ci0gICAgICAgICAgICB3b3JkTWVhc3Vy
ZW1lbnQuc3RhcnRPZmZzZXQgPSBsYXN0U3BhY2U7Ci0KLSAgICAgICAgICAgIGZsb2F0IGFkZGl0
aW9uYWxUZW1wV2lkdGg7Ci0gICAgICAgICAgICBpZiAod29yZFRyYWlsaW5nU3BhY2VXaWR0aCAm
JiBjID09ICcgJykKLSAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVGVtcFdpZHRoID0gdGV4dFdp
ZHRoKHJlbmRlclRleHQsIGxhc3RTcGFjZSwgbV9jdXJyZW50Lm1fcG9zICsgMSAtIGxhc3RTcGFj
ZSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNl
V2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpIC0g
d29yZFRyYWlsaW5nU3BhY2VXaWR0aDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg
ICBhZGRpdGlvbmFsVGVtcFdpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIGxhc3RTcGFjZSwg
bV9jdXJyZW50Lm1fcG9zIC0gbGFzdFNwYWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgp
LCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFs
bGJhY2tGb250cywgdGV4dExheW91dCk7Ci0KLSAgICAgICAgICAgIGlmICh3b3JkTWVhc3VyZW1l
bnQuZmFsbGJhY2tGb250cy5pc0VtcHR5KCkgJiYgIWZhbGxiYWNrRm9udHMuaXNFbXB0eSgpKQot
ICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLnN3YXAoZmFsbGJh
Y2tGb250cyk7Ci0gICAgICAgICAgICBmYWxsYmFja0ZvbnRzLmNsZWFyKCk7Ci0KLSAgICAgICAg
ICAgIHdvcmRNZWFzdXJlbWVudC53aWR0aCA9IGFkZGl0aW9uYWxUZW1wV2lkdGggKyB3b3JkU3Bh
Y2luZ0ZvcldvcmRNZWFzdXJlbWVudDsKLSAgICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGgg
Kz0gbGFzdFNwYWNlV29yZFNwYWNpbmc7Ci0gICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0
dGVkV2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0aCk7Ci0KLSAgICAgICAgICAgIGlmIChtX2NvbGxh
cHNlV2hpdGVTcGFjZSAmJiBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UgJiYgbV9jdXJyZW50Q2hh
cmFjdGVySXNTcGFjZSAmJiBhZGRpdGlvbmFsVGVtcFdpZHRoKQotICAgICAgICAgICAgICAgIG1f
d2lkdGguc2V0VHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0aCk7Ci0K
LSAgICAgICAgICAgIGlmICghbV9hcHBsaWVkU3RhcnRXaWR0aCkgewotICAgICAgICAgICAgICAg
IG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50
Lm1fb2JqLCB0cnVlLCBmYWxzZSkpOwotICAgICAgICAgICAgICAgIG1fYXBwbGllZFN0YXJ0V2lk
dGggPSB0cnVlOwotICAgICAgICAgICAgfQotCi0jaWYgRU5BQkxFKENTU19TSEFQRVMpCi0gICAg
ICAgICAgICBpZiAobV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKQotICAgICAgICAgICAgICAg
IHVwZGF0ZVNlZ21lbnRzRm9yU2hhcGVzKG1fYmxvY2ssIG1fbGFzdEZsb2F0RnJvbVByZXZpb3Vz
TGluZSwgd29yZE1lYXN1cmVtZW50cywgbV93aWR0aCwgbV9saW5lSW5mby5pc0ZpcnN0TGluZSgp
KTsKLSNlbmRpZgotICAgICAgICAgICAgYXBwbHlXb3JkU3BhY2luZyA9IHdvcmRTcGFjaW5nICYm
IG1fY3VycmVudENoYXJhY3RlcklzU3BhY2U7Ci0KLSAgICAgICAgICAgIGlmICghbV93aWR0aC5j
b21taXR0ZWRXaWR0aCgpICYmIG1fYXV0b1dyYXAgJiYgIW1fd2lkdGguZml0c09uTGluZSgpKQot
ICAgICAgICAgICAgICAgIG1fd2lkdGguZml0QmVsb3dGbG9hdHMoKTsKLQotICAgICAgICAgICAg
aWYgKG1fYXV0b1dyYXAgfHwgYnJlYWtXb3JkcykgewotICAgICAgICAgICAgICAgIC8vIElmIHdl
IGJyZWFrIG9ubHkgYWZ0ZXIgd2hpdGUtc3BhY2UsIGNvbnNpZGVyIHRoZSBjdXJyZW50IGNoYXJh
Y3RlcgotICAgICAgICAgICAgICAgIC8vIGFzIGNhbmRpZGF0ZSB3aWR0aCBmb3IgdGhpcyBsaW5l
LgotICAgICAgICAgICAgICAgIGJvb2wgbGluZVdhc1Rvb1dpZGUgPSBmYWxzZTsKLSAgICAgICAg
ICAgICAgICBpZiAobV93aWR0aC5maXRzT25MaW5lKCkgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNT
cGFjZSAmJiBtX2N1cnJlbnRTdHlsZS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkgJiYgIW1p
ZFdvcmRCcmVhaykgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBjaGFyV2lkdGggPSB0ZXh0
V2lkdGgocmVuZGVyVGV4dCwgbV9jdXJyZW50Lm1fcG9zLCAxLCBmb250LCBtX3dpZHRoLmN1cnJl
bnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3Vy
ZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91dCkgKyAoYXBwbHlXb3JkU3BhY2luZyA/IHdv
cmRTcGFjaW5nIDogMCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGxpbmUgaXMg
dG9vIGJpZyBldmVuIHdpdGhvdXQgdGhlIGV4dHJhIHNwYWNlCi0gICAgICAgICAgICAgICAgICAg
IC8vIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuIElmIGl0IGlzIG5vdCwgZG8gbm90aGluZy4KLSAg
ICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGxpbmUgbmVlZHMgdGhlIGV4dHJhIHdoaXRlc3Bh
Y2UgdG8gYmUgdG9vIGxvbmcsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gbW92ZSB0aGUg
bGluZSBicmVhayB0byB0aGUgc3BhY2UgYW5kIHNraXAgYWxsCi0gICAgICAgICAgICAgICAgICAg
IC8vIGFkZGl0aW9uYWwgd2hpdGVzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3dp
ZHRoLmZpdHNPbkxpbmVJbmNsdWRpbmdFeHRyYVdpZHRoKGNoYXJXaWR0aCkpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGxpbmVXYXNUb29XaWRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3Bv
cywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIG1fbGluZUJyZWFrZXIuc2tpcFRyYWlsaW5nV2hpdGVzcGFjZShtX2xpbmVCcmVhaywg
bV9saW5lSW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgaWYgKGxpbmVXYXNUb29XaWRlIHx8ICFtX3dpZHRoLmZpdHNPbkxpbmUo
KSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2FuSHlwaGVuYXRlICYmICFtX3dpZHRoLmZp
dHNPbkxpbmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5SHlwaGVuYXRpbmcocmVu
ZGVyVGV4dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVz
LCBtX2Jsb2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCksIHN0eWxlLmh5cGhlbmF0aW9u
TGltaXRCZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCksIGxhc3RTcGFjZSwg
bV9jdXJyZW50Lm1fcG9zLCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpIC0gYWRkaXRpb25hbFRlbXBX
aWR0aCwgbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VX
aGl0ZVNwYWNlLCBsYXN0U3BhY2VXb3JkU3BhY2luZywgbV9saW5lQnJlYWssIG1fY3VycmVudC5t
X25leHRCcmVha2FibGVQb3NpdGlvbiwgbV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVh
ay5hdFRleHRQYXJhZ3JhcGhTZXBhcmF0b3IoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKCFzdG9wcGVkSWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50Lm1fcG9zID4gMCkKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVDaGFyYWN0ZXJHZXRzTGluZUJveChtX2xpbmVN
aWRwb2ludFN0YXRlLCBtX2N1cnJlbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbV9saW5l
QnJlYWsuaW5jcmVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVJbmZvLnNl
dFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IHdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgPSBtX2xpbmVCcmVhay5tX3BvczsKLSAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWsubV9vYmog
JiYgbV9saW5lQnJlYWsubV9wb3MgJiYgbV9saW5lQnJlYWsubV9vYmotPmlzVGV4dCgpICYmIHRv
UmVuZGVyVGV4dChtX2xpbmVCcmVhay5tX29iaiktPnRleHRMZW5ndGgoKSAmJiB0b1JlbmRlclRl
eHQobV9saW5lQnJlYWsubV9vYmopLT5jaGFyYWN0ZXJBdChtX2xpbmVCcmVhay5tX3BvcyAtIDEp
ID09IHNvZnRIeXBoZW4gJiYgc3R5bGUuaHlwaGVucygpICE9IEh5cGhlbnNOb25lKQotICAgICAg
ICAgICAgICAgICAgICAgICAgaHlwaGVuYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAg
IGlmIChtX2xpbmVCcmVhay5tX3BvcyAmJiBtX2xpbmVCcmVhay5tX3BvcyAhPSAodW5zaWduZWQp
d29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCAmJiAhd29yZE1lYXN1cmVtZW50LndpZHRoKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcldpZHRoKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm1fcG9z
OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC53aWR0aCA9IGNo
YXJXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgICAgICAgICAvLyBEaWRuJ3QgZml0LiBKdW1wIHRvIHRoZSBlbmQgdW5s
ZXNzIHRoZXJlJ3Mgc3RpbGwgYW4gb3Bwb3J0dW5pdHkgdG8gY29sbGFwc2Ugd2hpdGVzcGFjZS4K
LSAgICAgICAgICAgICAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMgfHwgIW1fY29sbGFwc2VX
aGl0ZVNwYWNlIHx8ICFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlIHx8ICFwcmV2aW91c0NoYXJh
Y3RlcklzU3BhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOwot
ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFi
ZXR3ZWVuV29yZHMgfHwgKG1pZFdvcmRCcmVhayAmJiAhbV9hdXRvV3JhcCkpCi0gICAgICAgICAg
ICAgICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoLWFkZGl0aW9uYWxUZW1w
V2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaHlwaGVuV2lkdGgpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIC8vIFN1YnRyYWN0IHRoZSB3aWR0aCBvZiB0aGUgc29mdCBoeXBoZW4g
b3V0IHNpbmNlIHdlIGZpdCBvbiBhIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBtX3dp
ZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoLWh5cGhlbldpZHRoKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGh5cGhlbldpZHRoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJyAmJiBt
X3ByZXNlcnZlc05ld2xpbmUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmlu
Z1NwYWNlcyAmJiBtX2N1cnJlbnQubV9wb3MgPiAwKQotICAgICAgICAgICAgICAgICAgICBlbnN1
cmVDaGFyYWN0ZXJHZXRzTGluZUJveChtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQpOwot
ICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQubV9vYmosIG1fY3Vy
cmVudC5tX3BvcywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uKTsKLSAgICAgICAg
ICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBtX2xpbmVJ
bmZvLnNldFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1fYXV0b1dyYXAg
JiYgYmV0d2VlbldvcmRzKSB7Ci0gICAgICAgICAgICAgICAgbV93aWR0aC5jb21taXQoKTsKLSAg
ICAgICAgICAgICAgICB3cmFwVyA9IDA7Ci0gICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92
ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJl
YWthYmxlUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIC8vIEF1dG8td3JhcHBpbmcgdGV4dCBz
aG91bGQgbm90IHdyYXAgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgb25jZSBpdCBoYXMgaGFkIGFu
Ci0gICAgICAgICAgICAgICAgLy8gb3Bwb3J0dW5pdHkgdG8gYnJlYWsgYWZ0ZXIgYSB3b3JkLgot
ICAgICAgICAgICAgICAgIGJyZWFrV29yZHMgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgaWYgKG1pZFdvcmRCcmVhayAmJiAhVTE2X0lTX1RSQUlMKGMpICYmICEoVV9HRVRf
R0NfTUFTSyhjKSAmIFVfR0NfTV9NQVNLKSkgewotICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVy
IHRoaXMgYXMgYSBicmVha2FibGUgcG9zaXRpb24gaW4gY2FzZQotICAgICAgICAgICAgICAgIC8v
IGFkZGluZyB0aGUgZW5kIHdpZHRoIGZvcmNlcyBhIGJyZWFrLgotICAgICAgICAgICAgICAgIG1f
bGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3BvcywgbV9jdXJy
ZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBtaWRXb3JkQnJl
YWsgJj0gKGJyZWFrV29yZHMgfHwgYnJlYWtBbGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICBpZiAoYmV0d2VlbldvcmRzKSB7Ci0gICAgICAgICAgICAgICAgbGFzdFNwYWNlV29yZFNw
YWNpbmcgPSBhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwOwotICAgICAgICAgICAg
ICAgIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50ID0gKGFwcGx5V29yZFNwYWNpbmcgJiYg
d29yZE1lYXN1cmVtZW50LndpZHRoKSA/IHdvcmRTcGFjaW5nIDogMDsKLSAgICAgICAgICAgICAg
ICBsYXN0U3BhY2UgPSBtX2N1cnJlbnQubV9wb3M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIGlmICghbV9pZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VXaGl0
ZVNwYWNlKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBuZXdsaW5l
LCBvciBpZiB3ZSBlbmNvdW50ZXIgYQotICAgICAgICAgICAgICAgIC8vIHNlY29uZCBzcGFjZSwg
d2UgbmVlZCB0byBnbyBhaGVhZCBhbmQgYnJlYWsgdXAgdGhpcwotICAgICAgICAgICAgICAgIC8v
IHJ1biBhbmQgZW50ZXIgYSBtb2RlIHdoZXJlIHdlIHN0YXJ0IGNvbGxhcHNpbmcgc3BhY2VzLgot
ICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIHByZXZpb3Vz
Q2hhcmFjdGVySXNTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2Vz
ID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBXZSBqdXN0IGVudGVyZWQgYSBtb2Rl
IHdoZXJlIHdlIGFyZSBpZ25vcmluZwotICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZXMuIENy
ZWF0ZSBhIG1pZHBvaW50IHRvIHRlcm1pbmF0ZSB0aGUgcnVuCi0gICAgICAgICAgICAgICAgICAg
IC8vIGJlZm9yZSB0aGUgc2Vjb25kIHNwYWNlLgotICAgICAgICAgICAgICAgICAgICBzdGFydEln
bm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fc3RhcnRPZklnbm9yZWRTcGFjZXMp
OwotICAgICAgICAgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy51cGRhdGVNaWRwb2ludHNG
b3JUcmFpbGluZ0JveGVzKG1fbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKCksIFRy
YWlsaW5nT2JqZWN0czo6RG9Ob3RDb2xsYXBzZUZpcnN0U3BhY2UpOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtX2lnbm9yaW5nU3BhY2VzKSB7
Ci0gICAgICAgICAgICAvLyBTdG9wIGlnbm9yaW5nIHNwYWNlcyBhbmQgYmVnaW4gYXQgdGhpcwot
ICAgICAgICAgICAgLy8gbmV3IHBvaW50LgotICAgICAgICAgICAgbV9pZ25vcmluZ1NwYWNlcyA9
IGZhbHNlOwotICAgICAgICAgICAgbGFzdFNwYWNlV29yZFNwYWNpbmcgPSBhcHBseVdvcmRTcGFj
aW5nID8gd29yZFNwYWNpbmcgOiAwOwotICAgICAgICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVh
c3VyZW1lbnQgPSAoYXBwbHlXb3JkU3BhY2luZyAmJiB3b3JkTWVhc3VyZW1lbnRzLmxhc3QoKS53
aWR0aCkgPyB3b3JkU3BhY2luZyA6IDA7Ci0gICAgICAgICAgICBsYXN0U3BhY2UgPSBtX2N1cnJl
bnQubV9wb3M7IC8vIGUuZy4sICJGb28gICAgZ29vIiwgZG9uJ3QgYWRkIGluIGFueSBvZiB0aGUg
aWdub3JlZCBzcGFjZXMuCi0gICAgICAgICAgICBzdG9wSWdub3JpbmdTcGFjZXMobV9saW5lTWlk
cG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQu
bV9wb3MpKTsKLSAgICAgICAgfQotI2lmIEVOQUJMRShTVkcpCi0gICAgICAgIGlmIChpc1NWR1Rl
eHQgJiYgbV9jdXJyZW50Lm1fcG9zID4gMCkgewotICAgICAgICAgICAgLy8gRm9yY2UgY3JlYXRp
b24gb2YgbmV3IElubGluZUJveGVzIGZvciBlYWNoIGFic29sdXRlIHBvc2l0aW9uZWQgY2hhcmFj
dGVyICh0aG9zZSB0aGF0IHN0YXJ0IG5ldyB0ZXh0IGNodW5rcykuCi0gICAgICAgICAgICBpZiAo
dG9SZW5kZXJTVkdJbmxpbmVUZXh0KHJlbmRlclRleHQpLT5jaGFyYWN0ZXJTdGFydHNOZXdUZXh0
Q2h1bmsobV9jdXJyZW50Lm1fcG9zKSkKLSAgICAgICAgICAgICAgICBlbnN1cmVDaGFyYWN0ZXJH
ZXRzTGluZUJveChtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQpOwotICAgICAgICB9Ci0j
ZW5kaWYKLQotICAgICAgICBpZiAobV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhcHJldmlv
dXNDaGFyYWN0ZXJJc1NwYWNlKSB7Ci0gICAgICAgICAgICBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2Vz
Lm1fb2JqID0gbV9jdXJyZW50Lm1fb2JqOwotICAgICAgICAgICAgbV9zdGFydE9mSWdub3JlZFNw
YWNlcy5tX3BvcyA9IG1fY3VycmVudC5tX3BvczsKLSAgICAgICAgICAgIC8vIFNwYWNlcyBhZnRl
ciByaWdodC1hbGlnbmVkIHRleHQgYW5kIGJlZm9yZSBhIGxpbmUtYnJlYWsgZ2V0IGNvbGxhcHNl
ZCBhd2F5IGNvbXBsZXRlbHkgc28gdGhhdCB0aGUgdHJhaWxpbmcKLSAgICAgICAgICAgIC8vIHNw
YWNlIGRvZXNuJ3Qgc2VlbSB0byBwdXNoIHRoZSB0ZXh0IG91dCBmcm9tIHRoZSByaWdodC1oYW5k
IGVkZ2UuCi0gICAgICAgICAgICAvLyBGSVhNRTogRG8gdGhpcyByZWdhcmRsZXNzIG9mIHRoZSBj
b250YWluZXIncyBhbGlnbm1lbnQgLSB3aWxsIHJlcXVpcmUgcmViYXNlbGluaW5nIGEgbG90IG9m
IHRlc3QgcmVzdWx0cy4KLSAgICAgICAgICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2Jq
ZWN0LT5pc0JSKCkgJiYgKG1fYmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBSSUdIVCB8fCBtX2Js
b2NrU3R5bGUudGV4dEFsaWduKCkgPT0gV0VCS0lUX1JJR0hUKSkgewotICAgICAgICAgICAgICAg
IG1fc3RhcnRPZklnbm9yZWRTcGFjZXMubV9wb3MtLTsKLSAgICAgICAgICAgICAgICAvLyBJZiB0
aGVyZSdzIGp1c3QgYSBzaW5nbGUgdHJhaWxpbmcgc3BhY2Ugc3RhcnQgaWdub3JpbmcgaXQgbm93
IHNvIGl0IGNvbGxhcHNlcyBhd2F5LgotICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnQubV9w
b3MgPT0gcmVuZGVyVGV4dC0+dGV4dExlbmd0aCgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAg
c3RhcnRJZ25vcmluZ1NwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX3N0YXJ0T2ZJZ25vcmVk
U3BhY2VzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbV9jdXJy
ZW50Q2hhcmFjdGVySXNTcGFjZSAmJiBwcmV2aW91c0NoYXJhY3RlcklzV1MpIHsKLSAgICAgICAg
ICAgIGlmIChtX2F1dG9XcmFwICYmIG1fY3VycmVudFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRl
U3BhY2UoKSkKLSAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8obV9jdXJyZW50Lm1f
b2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2FibGVQb3NpdGlvbik7
Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobV9jb2xsYXBzZVdoaXRlU3BhY2UgJiYgbV9jdXJy
ZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhbV9pZ25vcmluZ1NwYWNlcykKLSAgICAgICAgICAgIG1f
dHJhaWxpbmdPYmplY3RzLnNldFRyYWlsaW5nV2hpdGVzcGFjZSh0b1JlbmRlclRleHQobV9jdXJy
ZW50Lm1fb2JqKSk7Ci0gICAgICAgIGVsc2UgaWYgKCFtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VX
aGl0ZVNwYWNlKCkgfHwgIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpCi0gICAgICAgICAgICBt
X3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOwotCi0gICAgICAgIG1fYXRTdGFydCA9IGZhbHNlOwot
ICAgICAgICBuZXh0Q2hhcmFjdGVyKGMsIGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJh
Y3Rlcik7Ci0gICAgfQotCi0gICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9y
LnNldFByaW9yQ29udGV4dChsYXN0Q2hhcmFjdGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpOwot
Ci0gICAgd29yZE1lYXN1cmVtZW50cy5ncm93KHdvcmRNZWFzdXJlbWVudHMuc2l6ZSgpICsgMSk7
Ci0gICAgV29yZE1lYXN1cmVtZW50JiB3b3JkTWVhc3VyZW1lbnQgPSB3b3JkTWVhc3VyZW1lbnRz
Lmxhc3QoKTsKLSAgICB3b3JkTWVhc3VyZW1lbnQucmVuZGVyZXIgPSByZW5kZXJUZXh0OwotCi0g
ICAgLy8gSU1QT1JUQU5UOiBjdXJyZW50Lm1fcG9zIGlzID4gbGVuZ3RoIGhlcmUhCi0gICAgZmxv
YXQgYWRkaXRpb25hbFRlbXBXaWR0aCA9IG1faWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRo
KHJlbmRlclRleHQsIGxhc3RTcGFjZSwgbV9jdXJyZW50Lm1fcG9zIC0gbGFzdFNwYWNlLCBmb250
LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNw
YWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91dCk7Ci0gICAgd29y
ZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0ID0gbGFzdFNwYWNlOwotICAgIHdvcmRNZWFzdXJlbWVu
dC5lbmRPZmZzZXQgPSBtX2N1cnJlbnQubV9wb3M7Ci0gICAgd29yZE1lYXN1cmVtZW50LndpZHRo
ID0gbV9pZ25vcmluZ1NwYWNlcyA/IDAgOiBhZGRpdGlvbmFsVGVtcFdpZHRoICsgd29yZFNwYWNp
bmdGb3JXb3JkTWVhc3VyZW1lbnQ7Ci0gICAgYWRkaXRpb25hbFRlbXBXaWR0aCArPSBsYXN0U3Bh
Y2VXb3JkU3BhY2luZzsKLQotICAgIGZsb2F0IGlubGluZUxvZ2ljYWxUZW1wV2lkdGggPSBpbmxp
bmVMb2dpY2FsV2lkdGgobV9jdXJyZW50Lm1fb2JqLCAhbV9hcHBsaWVkU3RhcnRXaWR0aCwgbV9p
bmNsdWRlRW5kV2lkdGgpOwotICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChhZGRpdGlv
bmFsVGVtcFdpZHRoICsgaW5saW5lTG9naWNhbFRlbXBXaWR0aCk7Ci0KLSAgICBpZiAod29yZE1l
YXN1cmVtZW50LmZhbGxiYWNrRm9udHMuaXNFbXB0eSgpICYmICFmYWxsYmFja0ZvbnRzLmlzRW1w
dHkoKSkKLSAgICAgICAgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuc3dhcChmYWxsYmFj
a0ZvbnRzKTsKLSAgICBmYWxsYmFja0ZvbnRzLmNsZWFyKCk7Ci0KLSAgICBpZiAobV9jb2xsYXBz
ZVdoaXRlU3BhY2UgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiBhZGRpdGlvbmFsVGVt
cFdpZHRoKQotICAgICAgICBtX3dpZHRoLnNldFRyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKGFkZGl0
aW9uYWxUZW1wV2lkdGgsIGlubGluZUxvZ2ljYWxUZW1wV2lkdGgpOwotCi0gICAgbV9pbmNsdWRl
RW5kV2lkdGggPSBmYWxzZTsKLQotICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lKCkpIHsKLSAg
ICAgICAgaWYgKGNhbkh5cGhlbmF0ZSkKLSAgICAgICAgICAgIHRyeUh5cGhlbmF0aW5nKHJlbmRl
clRleHQsIGZvbnQsIHN0eWxlLmxvY2FsZSgpLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywg
bV9ibG9ja1N0eWxlLmh5cGhlbmF0aW9uTGltaXRMaW5lcygpLCBzdHlsZS5oeXBoZW5hdGlvbkxp
bWl0QmVmb3JlKCksIHN0eWxlLmh5cGhlbmF0aW9uTGltaXRBZnRlcigpLCBsYXN0U3BhY2UsIG1f
Y3VycmVudC5tX3BvcywgbV93aWR0aC5jdXJyZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lk
dGgsIG1fd2lkdGguYXZhaWxhYmxlV2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hp
dGVTcGFjZSwgbGFzdFNwYWNlV29yZFNwYWNpbmcsIG1fbGluZUJyZWFrLCBtX2N1cnJlbnQubV9u
ZXh0QnJlYWthYmxlUG9zaXRpb24sIG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKLQotICAg
ICAgICBpZiAoIWh5cGhlbmF0ZWQgJiYgbV9saW5lQnJlYWsucHJldmlvdXNJblNhbWVOb2RlKCkg
PT0gc29mdEh5cGhlbiAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUpIHsKLSAgICAg
ICAgICAgIGh5cGhlbmF0ZWQgPSB0cnVlOwotICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCB0ZXh0
QmVnaW5zV2l0aEJyZWFrYWJsZVBvc2l0aW9uKFJlbmRlck9iamVjdCogbmV4dCkKLXsKLSAgICBB
U1NFUlQobmV4dC0+aXNUZXh0KCkpOwotICAgIFJlbmRlclRleHQqIG5leHRUZXh0ID0gdG9SZW5k
ZXJUZXh0KG5leHQpOwotICAgIGlmICghbmV4dFRleHQtPnRleHRMZW5ndGgoKSkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIFVDaGFyIGMgPSBuZXh0VGV4dC0+Y2hhcmFjdGVyQXQoMCk7Ci0g
ICAgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCAoYyA9PSAnXG4nICYmICFuZXh0VGV4
dC0+cHJlc2VydmVzTmV3bGluZSgpKTsKLX0KLQotaW5saW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0
OjpjYW5CcmVha0F0VGhpc1Bvc2l0aW9uKCkKLXsKLSAgICAvLyBJZiB3ZSBhcmUgbm8td3JhcCBh
bmQgaGF2ZSBmb3VuZCBhIGxpbmUtYnJlYWtpbmcgb3Bwb3J0dW5pdHkgYWxyZWFkeSB0aGVuIHdl
IHNob3VsZCB0YWtlIGl0LgotICAgIGlmIChtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgJiYgIW1f
d2lkdGguZml0c09uTGluZShtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKSAmJiBtX2N1cnJXUyA9
PSBOT1dSQVApCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gQXZvaWQgYnJlYWtpbmcg
YmVmb3JlIGVtcHR5IGlubGluZXMuCi0gICAgaWYgKG1fbmV4dE9iamVjdCAmJiBtX25leHRPYmpl
Y3QtPmlzUmVuZGVySW5saW5lKCkgJiYgaXNFbXB0eUlubGluZSh0b1JlbmRlcklubGluZSgqbV9u
ZXh0T2JqZWN0KSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIFJldHVybiBlYXJs
eSBpZiB3ZSBhdXRvd3JhcCBhbmQgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIGEgc3BhY2UgYXMg
d2Ugd2lsbCBhbHdheXMgd2FudCB0byBicmVhayBhdCBzdWNoIGEgcG9zaXRpb24uCi0gICAgaWYg
KG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKLSAgICAgICAgcmV0dXJu
IHRydWU7Ci0KLSAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1fbmV4dE9iamVjdC0+aXNMaW5lQnJl
YWtPcHBvcnR1bml0eSgpKQotICAgICAgICByZXR1cm4gbV9hdXRvV3JhcDsKLQotICAgIGJvb2wg
bmV4dElzQXV0b1dyYXBwaW5nVGV4dCA9IChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5p
c1RleHQoKSAmJiAobV9hdXRvV3JhcCB8fCBtX25leHRPYmplY3QtPnN0eWxlKCkuYXV0b1dyYXAo
KSkpOwotICAgIGlmICghbmV4dElzQXV0b1dyYXBwaW5nVGV4dCkKLSAgICAgICAgcmV0dXJuIG1f
YXV0b1dyYXA7Ci0gICAgYm9vbCBjdXJyZW50SXNUZXh0T3JFbXB0eUlubGluZSA9IG1fY3VycmVu
dC5tX29iai0+aXNUZXh0KCkgfHwgKG1fY3VycmVudC5tX29iai0+aXNSZW5kZXJJbmxpbmUoKSAm
JiBpc0VtcHR5SW5saW5lKHRvUmVuZGVySW5saW5lKCptX2N1cnJlbnQubV9vYmopKSk7Ci0gICAg
aWYgKCFjdXJyZW50SXNUZXh0T3JFbXB0eUlubGluZSkKLSAgICAgICAgcmV0dXJuIG1fYXV0b1dy
YXA7Ci0KLSAgICBib29sIGNhbkJyZWFrSGVyZSA9ICFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNl
ICYmIHRleHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRpb24obV9uZXh0T2JqZWN0KTsKLQotICAg
IC8vIFNlZSBpZiBhdHRlbXB0aW5nIHRvIGZpdCBiZWxvdyBmbG9hdHMgY3JlYXRlcyBtb3JlIGF2
YWlsYWJsZSB3aWR0aCBvbiB0aGUgbGluZS4KLSAgICBpZiAoIW1fd2lkdGguZml0c09uTGluZSgp
ICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpCi0gICAgICAgIG1fd2lkdGguZml0QmVsb3dG
bG9hdHMoKTsKLQotICAgIGJvb2wgY2FuUGxhY2VPbkxpbmUgPSBtX3dpZHRoLmZpdHNPbkxpbmUo
KSB8fCAhbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lOwotCi0gICAgaWYgKGNhblBsYWNlT25M
aW5lICYmIGNhbkJyZWFrSGVyZSkKLSAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lk
dGgobV9uZXh0T2JqZWN0KTsKLQotICAgIHJldHVybiBjYW5CcmVha0hlcmU7Ci19Ci0KLWlubGlu
ZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6Y29tbWl0QW5kVXBkYXRlTGluZUJyZWFrSWZOZWVkZWQo
KQotewotICAgIGJvb2wgY2hlY2tGb3JCcmVhayA9IGNhbkJyZWFrQXRUaGlzUG9zaXRpb24oKTsK
LQotICAgIGlmIChjaGVja0ZvckJyZWFrICYmICFtX3dpZHRoLmZpdHNPbkxpbmUobV9pZ25vcmlu
Z1NwYWNlcykpIHsKLSAgICAgICAgLy8gaWYgd2UgaGF2ZSBmbG9hdHMsIHRyeSB0byBnZXQgYmVs
b3cgdGhlbS4KLSAgICAgICAgaWYgKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgIW1faWdu
b3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50U3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpKQotICAg
ICAgICAgICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKLQotICAgICAgICBpZiAobV93aWR0
aC5jb21taXR0ZWRXaWR0aCgpKSB7Ci0gICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKLSAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1fd2lkdGguZml0QmVsb3dGbG9h
dHMoKTsKLQotICAgICAgICAvLyB8d2lkdGh8IG1heSBoYXZlIGJlZW4gYWRqdXN0ZWQgYmVjYXVz
ZSB3ZSBnb3Qgc2hvdmVkIGRvd24gcGFzdCBhIGZsb2F0ICh0aHVzCi0gICAgICAgIC8vIGdpdmlu
ZyB1cyBtb3JlIHJvb20pLCBzbyB3ZSBuZWVkIHRvIHJldGVzdCwgYW5kIG9ubHkganVtcCB0bwot
ICAgICAgICAvLyB0aGUgZW5kIGxhYmVsIGlmIHdlIHN0aWxsIGRvbid0IGZpdCBvbiB0aGUgbGlu
ZS4gLWR3aAotICAgICAgICBpZiAoIW1fd2lkdGguZml0c09uTGluZShtX2lnbm9yaW5nU3BhY2Vz
KSkgewotICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fYmxvY2tTdHlsZS5hdXRvV3JhcCgpICYmICFtX3dp
ZHRoLmZpdHNPbkxpbmUoKSAmJiAhbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpKSB7Ci0gICAgICAg
IC8vIElmIHRoZSBjb250YWluZXIgYXV0b3dyYXBzIGJ1dCB0aGUgY3VycmVudCBjaGlsZCBkb2Vz
IG5vdCB0aGVuIHdlIHN0aWxsIG5lZWQgdG8gZW5zdXJlIHRoYXQgaXQKLSAgICAgICAgLy8gd3Jh
cHMgYW5kIG1vdmVzIGJlbG93IGFueSBmbG9hdHMuCi0gICAgICAgIG1fd2lkdGguZml0QmVsb3dG
bG9hdHMoKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1fY3VycmVudC5tX29iai0+aXNGbG9hdGluZ09y
T3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7Ci0gICAgICAgIG1fbGFzdE9iamVjdCA9IG1fY3VycmVu
dC5tX29iajsKLSAgICAgICAgaWYgKG1fbGFzdE9iamVjdC0+aXNSZXBsYWNlZCgpICYmIG1fYXV0
b1dyYXAgJiYgKCFtX2xhc3RPYmplY3QtPmlzSW1hZ2UoKSB8fCBtX2FsbG93SW1hZ2VzVG9CcmVh
aykgJiYgKCFtX2xhc3RPYmplY3QtPmlzTGlzdE1hcmtlcigpIHx8IHRvUmVuZGVyTGlzdE1hcmtl
cigqbV9sYXN0T2JqZWN0KS5pc0luc2lkZSgpKSkgewotICAgICAgICAgICAgbV93aWR0aC5jb21t
aXQoKTsKLSAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUb1N0YXJ0T2YobV9uZXh0T2JqZWN0
KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotSW5saW5lSXRlcmF0b3IgQnJlYWtpbmdDb250ZXh0
OjpoYW5kbGVFbmRPZkxpbmUoKQotewotI2lmIEVOQUJMRShDU1NfU0hBUEVTKQotICAgIFNoYXBl
SW5zaWRlSW5mbyogc2hhcGVJbmZvID0gbV9ibG9jay5sYXlvdXRTaGFwZUluc2lkZUluZm8oKTsK
LSAgICBib29sIHNlZ21lbnRBbGxvd3NPdmVyZmxvdyA9ICFzaGFwZUluZm8gfHwgIXNoYXBlSW5m
by0+aGFzU2VnbWVudHMoKTsKLSNlbHNlCi0gICAgYm9vbCBzZWdtZW50QWxsb3dzT3ZlcmZsb3cg
PSB0cnVlOwotI2VuZGlmCi0gICAgaWYgKHNlZ21lbnRBbGxvd3NPdmVyZmxvdykgewotICAgICAg
ICBpZiAobV9saW5lQnJlYWsgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigpKSB7Ci0gICAgICAgICAg
ICBpZiAoIW1fbGluZUJyZWFrLm1fb2JqIHx8ICFtX2xpbmVCcmVhay5tX29iai0+aXNCUigpKSB7
Ci0gICAgICAgICAgICAgICAgLy8gd2UganVzdCBhZGQgYXMgbXVjaCBhcyBwb3NzaWJsZQotICAg
ICAgICAgICAgICAgIGlmIChtX2Jsb2NrU3R5bGUud2hpdGVTcGFjZSgpID09IFBSRSAmJiAhbV9j
dXJyZW50Lm1fcG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyht
X2xhc3RPYmplY3QsIG1fbGFzdE9iamVjdC0+aXNUZXh0KCkgPyBtX2xhc3RPYmplY3QtPmxlbmd0
aCgpIDogMCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtX2xpbmVCcmVhay5tX29iaikg
ewotICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBldmVyIGJyZWFrIGluIHRoZSBtaWRkbGUg
b2YgYSB3b3JkIGlmIHdlIGNhbiBoZWxwIGl0LgotICAgICAgICAgICAgICAgICAgICAvLyBUaGVy
ZSdzIG5vIHJvb20gYXQgYWxsLiBXZSBqdXN0IGhhdmUgdG8gYmUgb24gdGhpcyBsaW5lLAotICAg
ICAgICAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCB3ZSdsbCBzcGlsbCBvdXQuCi0gICAgICAg
ICAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQubV9vYmosIG1fY3VycmVu
dC5tX3Bvcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAg
Ly8gbWFrZSBzdXJlIHdlIGNvbnN1bWUgYXQgbGVhc3Qgb25lIGNoYXIvb2JqZWN0LgotICAgICAg
ICAgICAgaWYgKG1fbGluZUJyZWFrID09IG1fcmVzb2x2ZXIucG9zaXRpb24oKSkKLSAgICAgICAg
ICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKLSAgICAgICAgfSBlbHNlIGlmICghbV9j
dXJyZW50Lm1fcG9zICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgJiYgbV93aWR0aC51bmNv
bW1pdHRlZFdpZHRoKCkgJiYgIW1faGFkVW5jb21taXR0ZWRXaWR0aEJlZm9yZUN1cnJlbnQpIHsK
LSAgICAgICAgICAgIC8vIERvIG5vdCBwdXNoIHRoZSBjdXJyZW50IG9iamVjdCB0byB0aGUgbmV4
dCBsaW5lLCB3aGVuIHRoaXMgbGluZSBoYXMgc29tZSBjb250ZW50LCBidXQgaXQgaXMgc3RpbGwg
Y29uc2lkZXJlZCBlbXB0eS4KLSAgICAgICAgICAgIC8vIEVtcHR5IGlubGluZSBlbGVtZW50cyBs
aWtlIDxzcGFuPjwvc3Bhbj4gY2FuIHByb2R1Y2Ugc3VjaCBsaW5lcyBhbmQgbm93IHdlIGp1c3Qg
aWdub3JlIHRoZXNlIGJyZWFrIG9wcG9ydHVuaXRpZXMKLSAgICAgICAgICAgIC8vIGF0IHRoZSBz
dGFydCBvZiBhIGxpbmUsIGlmIG5vIHdpZHRoIGhhcyBiZWVuIGNvbW1pdHRlZCB5ZXQuCi0gICAg
ICAgICAgICAvLyBCZWhhdmUgYXMgaWYgaXQgd2FzIGFjdHVhbGx5IGVtcHR5IGFuZCBjb25zdW1l
IGF0IGxlYXN0IG9uZSBvYmplY3QuCi0gICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQo
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFNhbml0eSBjaGVjayBvdXIgbWlkcG9pbnRz
LgotICAgIGNoZWNrTWlkcG9pbnRzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fbGluZUJyZWFrKTsK
LQotICAgIG1fdHJhaWxpbmdPYmplY3RzLnVwZGF0ZU1pZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMo
bV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5lQnJlYWssIFRyYWlsaW5nT2JqZWN0czo6Q29sbGFw
c2VGaXJzdFNwYWNlKTsKLQotICAgIC8vIFdlIG1pZ2h0IGhhdmUgbWFkZSBsaW5lQnJlYWsgYW4g
aXRlcmF0b3IgdGhhdCBwb2ludHMgcGFzdCB0aGUgZW5kCi0gICAgLy8gb2YgdGhlIG9iamVjdC4g
RG8gdGhpcyBhZGp1c3RtZW50IHRvIG1ha2UgaXQgcG9pbnQgdG8gdGhlIHN0YXJ0Ci0gICAgLy8g
b2YgdGhlIG5leHQgb2JqZWN0IGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW5nIHRoZSByZXN0IG9m
IHRoZQotICAgIC8vIGNvZGUuCi0gICAgaWYgKG1fbGluZUJyZWFrLm1fcG9zID4gMCkgewotICAg
ICAgICBtX2xpbmVCcmVhay5tX3Bvcy0tOwotICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQo
KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbV9saW5lQnJlYWs7Ci19Ci0KIElubGluZUl0ZXJhdG9y
IExpbmVCcmVha2VyOjpuZXh0U2VnbWVudEJyZWFrKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2
ZXIsIExpbmVJbmZvJiBsaW5lSW5mbywgUmVuZGVyVGV4dEluZm8mIHJlbmRlclRleHRJbmZvLCBG
bG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgdW5zaWduZWQgY29uc2Vj
dXRpdmVIeXBoZW5hdGVkTGluZXMsIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMp
CiB7CiAgICAgcmVzZXQoKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9s
aW5lL0JyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9saW5lL0JyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi5jMzk4Mzg2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oCkBAIC0w
LDAgKzEsMTI0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBMYXJzIEtub2xsIChrbm9s
bEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA2LCAyMDA3LCAyMDA4
LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0IHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTMgQ2hhbmdTZW9rIE9oIDxzaGl2YW1pZG93QGdtYWlsLmNvbT4KKyAqIENv
cHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluYy4gQWxsIHJpZ2h0IHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8K
KworI2lmbmRlZiBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzX2gKKyNkZWZpbmUgQnJlYWtp
bmdDb250ZXh0SW5saW5lSGVhZGVyc19oCisKKyNpbmNsdWRlICJIeXBoZW5hdGlvbi5oIgorI2lu
Y2x1ZGUgIkxpbmVCcmVha2VyLmgiCisjaW5jbHVkZSAiTGluZUluZm8uaCIKKyNpbmNsdWRlICJM
aW5lV2lkdGguaCIKKyNpbmNsdWRlICJSZW5kZXJDb21iaW5lVGV4dC5oIgorI2luY2x1ZGUgIlJl
bmRlckNvdW50ZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJJbmxpbmUuaCIKKyNpbmNsdWRlICJSZW5k
ZXJMaXN0TWFya2VyLmgiCisjaW5jbHVkZSAiUmVuZGVyUnVieVJ1bi5oIgorI2luY2x1ZGUgImJy
ZWFrX2xpbmVzLmgiCisjaW5jbHVkZSA8d3RmL3VuaWNvZGUvQ2hhcmFjdGVyTmFtZXMuaD4KKwor
I2lmIEVOQUJMRShTVkcpCisjaW5jbHVkZSAiUmVuZGVyU1ZHSW5saW5lVGV4dC5oIgorI2VuZGlm
CisKKyNpZiBFTkFCTEUoQ1NTX1NIQVBFUykKKyNpbmNsdWRlICJTaGFwZUluc2lkZUluZm8uaCIK
KyNlbmRpZgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFdlIGRvbid0IGxldCBvdXIgbGlu
ZSBib3ggdHJlZSBmb3IgYSBzaW5nbGUgbGluZSBnZXQgYW55IGRlZXBlciB0aGFuIHRoaXMuCitj
b25zdCB1bnNpZ25lZCBjTWF4TGluZURlcHRoID0gMjAwOworCitjbGFzcyBXb3JkTWVhc3VyZW1l
bnQgeworcHVibGljOgorICAgIFdvcmRNZWFzdXJlbWVudCgpCisgICAgICAgIDogcmVuZGVyZXIo
MCkKKyAgICAgICAgLCB3aWR0aCgwKQorICAgICAgICAsIHN0YXJ0T2Zmc2V0KDApCisgICAgICAg
ICwgZW5kT2Zmc2V0KDApCisgICAgeworICAgIH0KKworICAgIFJlbmRlclRleHQqIHJlbmRlcmVy
OworICAgIGZsb2F0IHdpZHRoOworICAgIGludCBzdGFydE9mZnNldDsKKyAgICBpbnQgZW5kT2Zm
c2V0OworICAgIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiBmYWxsYmFja0ZvbnRzOwor
fTsKKworY2xhc3MgVHJhaWxpbmdPYmplY3RzIHsKK3B1YmxpYzoKKyAgICBUcmFpbGluZ09iamVj
dHMoKTsKKyAgICB2b2lkIHNldFRyYWlsaW5nV2hpdGVzcGFjZShSZW5kZXJUZXh0Kik7CisgICAg
dm9pZCBjbGVhcigpOworICAgIHZvaWQgYXBwZW5kQm94SWZOZWVkZWQoUmVuZGVyQm94TW9kZWxP
YmplY3QqKTsKKworICAgIGVudW0gQ29sbGFwc2VGaXJzdFNwYWNlT3JOb3QgeyBEb05vdENvbGxh
cHNlRmlyc3RTcGFjZSwgQ29sbGFwc2VGaXJzdFNwYWNlIH07CisKKyAgICB2b2lkIHVwZGF0ZU1p
ZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMoTGluZU1pZHBvaW50U3RhdGUmLCBjb25zdCBJbmxpbmVJ
dGVyYXRvciYgbEJyZWFrLCBDb2xsYXBzZUZpcnN0U3BhY2VPck5vdCk7CisKK3ByaXZhdGU6Cisg
ICAgUmVuZGVyVGV4dCogbV93aGl0ZXNwYWNlOworICAgIFZlY3RvcjxSZW5kZXJCb3hNb2RlbE9i
amVjdCosIDQ+IG1fYm94ZXM7Cit9OworCitUcmFpbGluZ09iamVjdHM6OlRyYWlsaW5nT2JqZWN0
cygpCisgICAgOiBtX3doaXRlc3BhY2UoMCkKK3sKK30KKworaW5saW5lIHZvaWQgVHJhaWxpbmdP
YmplY3RzOjpzZXRUcmFpbGluZ1doaXRlc3BhY2UoUmVuZGVyVGV4dCogd2hpdGVzcGFjZSkKK3sK
KyAgICBBU1NFUlQod2hpdGVzcGFjZSk7CisgICAgbV93aGl0ZXNwYWNlID0gd2hpdGVzcGFjZTsK
K30KKworaW5saW5lIHZvaWQgVHJhaWxpbmdPYmplY3RzOjpjbGVhcigpCit7CisgICAgbV93aGl0
ZXNwYWNlID0gMDsKKyAgICBtX2JveGVzLnNocmluaygwKTsgLy8gVXNlIHNocmluaygwKSBpbnN0
ZWFkIG9mIGNsZWFyKCkgdG8gcmV0YWluIG91ciBjYXBhY2l0eS4KK30KKworaW5saW5lIHZvaWQg
VHJhaWxpbmdPYmplY3RzOjphcHBlbmRCb3hJZk5lZWRlZChSZW5kZXJCb3hNb2RlbE9iamVjdCog
Ym94KQoreworICAgIGlmIChtX3doaXRlc3BhY2UpCisgICAgICAgIG1fYm94ZXMuYXBwZW5kKGJv
eCk7Cit9CisKKy8vIERvbid0IGNhbGwgdGhpcyBkaXJlY3RseS4gVXNlIG9uZSBvZiB0aGUgZGVz
Y3JpcHRpdmUgaGVscGVyIGZ1bmN0aW9ucyBiZWxvdy4KK2lubGluZSB2b2lkIGRlcHJlY2F0ZWRB
ZGRNaWRwb2ludChMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIGNvbnN0IElu
bGluZUl0ZXJhdG9yJiBtaWRwb2ludCkKK3sKKyAgICBpZiAobGluZU1pZHBvaW50U3RhdGUubWlk
cG9pbnRzLnNpemUoKSA8PSBsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMpCisgICAgICAg
IGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50cy5ncm93KGxpbmVNaWRwb2ludFN0YXRlLm51bU1p
ZHBvaW50cyArIDEwKTsKKworICAgIElubGluZUl0ZXJhdG9yKiBtaWRwb2ludHMgPSBsaW5lTWlk
cG9pbnRTdGF0ZS5taWRwb2ludHMuZGF0YSgpOworICAgIG1pZHBvaW50c1tsaW5lTWlkcG9pbnRT
dGF0ZS5udW1NaWRwb2ludHMrK10gPSBtaWRwb2ludDsKK30KKworaW5saW5lIHZvaWQgc3RhcnRJ
Z25vcmluZ1NwYWNlcyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIGNvbnN0
IElubGluZUl0ZXJhdG9yJiBtaWRwb2ludCkKK3sKKyAgICBBU1NFUlQoIShsaW5lTWlkcG9pbnRT
dGF0ZS5udW1NaWRwb2ludHMgJSAyKSk7CisgICAgZGVwcmVjYXRlZEFkZE1pZHBvaW50KGxpbmVN
aWRwb2ludFN0YXRlLCBtaWRwb2ludCk7Cit9CisKK2lubGluZSB2b2lkIHN0b3BJZ25vcmluZ1Nw
YWNlcyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIGNvbnN0IElubGluZUl0
ZXJhdG9yJiBtaWRwb2ludCkKK3sKKyAgICBBU1NFUlQobGluZU1pZHBvaW50U3RhdGUubnVtTWlk
cG9pbnRzICUgMik7CisgICAgZGVwcmVjYXRlZEFkZE1pZHBvaW50KGxpbmVNaWRwb2ludFN0YXRl
LCBtaWRwb2ludCk7Cit9CisKKy8vIFdoZW4gaWdub3Jpbmcgc3BhY2VzLCB0aGlzIG5lZWRzIHRv
IGJlIGNhbGxlZCBmb3Igb2JqZWN0cyB0aGF0IG5lZWQgbGluZSBib3hlcyBzdWNoIGFzIFJlbmRl
cklubGluZXMgb3IKKy8vIGhhcmQgbGluZSBicmVha3MgdG8gZW5zdXJlIHRoYXQgdGhleSdyZSBu
b3QgaWdub3JlZC4KK2lubGluZSB2b2lkIGVuc3VyZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2Vz
KExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgUmVuZGVyT2JqZWN0KiByZW5k
ZXJlcikKK3sKKyAgICBJbmxpbmVJdGVyYXRvciBtaWRwb2ludCgwLCByZW5kZXJlciwgMCk7Cisg
ICAgc3RvcElnbm9yaW5nU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBtaWRwb2ludCk7CisgICAg
c3RhcnRJZ25vcmluZ1NwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwgbWlkcG9pbnQpOworfQorCit2
b2lkIFRyYWlsaW5nT2JqZWN0czo6dXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxpbmdCb3hlcyhMaW5l
TWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBs
QnJlYWssIENvbGxhcHNlRmlyc3RTcGFjZU9yTm90IGNvbGxhcHNlRmlyc3RTcGFjZSkKK3sKKyAg
ICBpZiAoIW1fd2hpdGVzcGFjZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhpcyBvYmpl
Y3QgaXMgZWl0aGVyIGdvaW5nIHRvIGJlIHBhcnQgb2YgdGhlIGxhc3QgbWlkcG9pbnQsIG9yIGl0
IGlzIGdvaW5nIHRvIGJlIHRoZSBhY3R1YWwgZW5kcG9pbnQuCisgICAgLy8gSW4gYm90aCBjYXNl
cyB3ZSBqdXN0IGRlY3JlYXNlIG91ciBwb3MgYnkgMSBsZXZlbCB0byBleGNsdWRlIHRoZSBzcGFj
ZSwgYWxsb3dpbmcgaXQgdG8gLSBpbiBlZmZlY3QgLSBjb2xsYXBzZSBpbnRvIHRoZSBuZXdsaW5l
LgorICAgIGlmIChsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgJSAyKSB7CisgICAgICAg
IC8vIEZpbmQgdGhlIHRyYWlsaW5nIHNwYWNlIG9iamVjdCdzIG1pZHBvaW50LgorICAgICAgICBp
bnQgdHJhaWxpbmdTcGFjZU1pZHBvaW50ID0gbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRz
IC0gMTsKKyAgICAgICAgZm9yICggOyB0cmFpbGluZ1NwYWNlTWlkcG9pbnQgPiAwICYmIGxpbmVN
aWRwb2ludFN0YXRlLm1pZHBvaW50c1t0cmFpbGluZ1NwYWNlTWlkcG9pbnRdLm1fb2JqICE9IG1f
d2hpdGVzcGFjZTsgLS10cmFpbGluZ1NwYWNlTWlkcG9pbnQpIHsgfQorICAgICAgICBBU1NFUlQo
dHJhaWxpbmdTcGFjZU1pZHBvaW50ID49IDApOworICAgICAgICBpZiAoY29sbGFwc2VGaXJzdFNw
YWNlID09IENvbGxhcHNlRmlyc3RTcGFjZSkKKyAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRl
Lm1pZHBvaW50c1t0cmFpbGluZ1NwYWNlTWlkcG9pbnRdLm1fcG9zLS07CisKKyAgICAgICAgLy8g
Tm93IG1ha2Ugc3VyZSBldmVyeSBzaW5nbGUgdHJhaWxpbmdQb3NpdGlvbmVkQm94IGZvbGxvd2lu
ZyB0aGUgdHJhaWxpbmdTcGFjZU1pZHBvaW50IHByb3Blcmx5IHN0b3BzIGFuZCBzdGFydHMKKyAg
ICAgICAgLy8gaWdub3Jpbmcgc3BhY2VzLgorICAgICAgICBzaXplX3QgY3VycmVudE1pZHBvaW50
ID0gdHJhaWxpbmdTcGFjZU1pZHBvaW50ICsgMTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBtX2JveGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudE1pZHBv
aW50ID49IGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cykgeworICAgICAgICAgICAgICAg
IC8vIFdlIGRvbid0IGhhdmUgYSBtaWRwb2ludCBmb3IgdGhpcyBib3ggeWV0LgorICAgICAgICAg
ICAgICAgIGVuc3VyZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRl
LCBtX2JveGVzW2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQVNT
RVJUKGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50c1tjdXJyZW50TWlkcG9pbnRdLm1fb2JqID09
IG1fYm94ZXNbaV0pOworICAgICAgICAgICAgICAgIEFTU0VSVChsaW5lTWlkcG9pbnRTdGF0ZS5t
aWRwb2ludHNbY3VycmVudE1pZHBvaW50ICsgMV0ubV9vYmogPT0gbV9ib3hlc1tpXSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50TWlkcG9pbnQgKz0gMjsKKyAgICAgICAgfQor
ICAgIH0gZWxzZSBpZiAoIWxCcmVhay5tX29iaikgeworICAgICAgICBBU1NFUlQobV93aGl0ZXNw
YWNlLT5pc1RleHQoKSk7CisgICAgICAgIEFTU0VSVChjb2xsYXBzZUZpcnN0U3BhY2UgPT0gQ29s
bGFwc2VGaXJzdFNwYWNlKTsKKyAgICAgICAgLy8gQWRkIGEgbmV3IGVuZCBtaWRwb2ludCB0aGF0
IHN0b3BzIHJpZ2h0IGF0IHRoZSB2ZXJ5IGVuZC4KKyAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0g
bV93aGl0ZXNwYWNlLT50ZXh0TGVuZ3RoKCk7CisgICAgICAgIHVuc2lnbmVkIHBvcyA9IGxlbmd0
aCA+PSAyID8gbGVuZ3RoIC0gMiA6IFVJTlRfTUFYOworICAgICAgICBJbmxpbmVJdGVyYXRvciBl
bmRNaWQoMCwgbV93aGl0ZXNwYWNlLCBwb3MpOworICAgICAgICBzdGFydElnbm9yaW5nU3BhY2Vz
KGxpbmVNaWRwb2ludFN0YXRlLCBlbmRNaWQpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSA8IG1fYm94ZXMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBlbnN1cmVMaW5lQm94SW5zaWRl
SWdub3JlZFNwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwgbV9ib3hlc1tpXSk7CisgICAgfQorfQor
CitjbGFzcyBCcmVha2luZ0NvbnRleHQgeworcHVibGljOgorICAgIEJyZWFraW5nQ29udGV4dChM
aW5lQnJlYWtlciYgbGluZUJyZWFrZXIsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIExp
bmVJbmZvJiBpbkxpbmVJbmZvLCBMaW5lV2lkdGgmIGxpbmVXaWR0aCwgUmVuZGVyVGV4dEluZm8m
IGluUmVuZGVyVGV4dEluZm8sIEZsb2F0aW5nT2JqZWN0KiBpbkxhc3RGbG9hdEZyb21QcmV2aW91
c0xpbmUsIGJvb2wgYXBwbGllZFN0YXJ0V2lkdGgsIFJlbmRlckJsb2NrRmxvdyYgYmxvY2spCisg
ICAgICAgIDogbV9saW5lQnJlYWtlcihsaW5lQnJlYWtlcikKKyAgICAgICAgLCBtX3Jlc29sdmVy
KHJlc29sdmVyKQorICAgICAgICAsIG1fY3VycmVudChyZXNvbHZlci5wb3NpdGlvbigpKQorICAg
ICAgICAsIG1fbGluZUJyZWFrKHJlc29sdmVyLnBvc2l0aW9uKCkpCisgICAgICAgICwgbV9ibG9j
ayhibG9jaykKKyAgICAgICAgLCBtX2xhc3RPYmplY3QobV9jdXJyZW50Lm1fb2JqKQorICAgICAg
ICAsIG1fbmV4dE9iamVjdCgwKQorICAgICAgICAsIG1fY3VycmVudFN0eWxlKDApCisgICAgICAg
ICwgbV9ibG9ja1N0eWxlKGJsb2NrLnN0eWxlKCkpCisgICAgICAgICwgbV9saW5lSW5mbyhpbkxp
bmVJbmZvKQorICAgICAgICAsIG1fcmVuZGVyVGV4dEluZm8oaW5SZW5kZXJUZXh0SW5mbykKKyAg
ICAgICAgLCBtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUoaW5MYXN0RmxvYXRGcm9tUHJldmlv
dXNMaW5lKQorICAgICAgICAsIG1fd2lkdGgobGluZVdpZHRoKQorICAgICAgICAsIG1fY3VycldT
KE5PUk1BTCkKKyAgICAgICAgLCBtX2xhc3RXUyhOT1JNQUwpCisgICAgICAgICwgbV9wcmVzZXJ2
ZXNOZXdsaW5lKGZhbHNlKQorICAgICAgICAsIG1fYXRTdGFydCh0cnVlKQorICAgICAgICAsIG1f
aWdub3JpbmdTcGFjZXMoZmFsc2UpCisgICAgICAgICwgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFj
ZShmYWxzZSkKKyAgICAgICAgLCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTKGZhbHNlKQorICAgICAg
ICAsIG1fYXBwbGllZFN0YXJ0V2lkdGgoYXBwbGllZFN0YXJ0V2lkdGgpCisgICAgICAgICwgbV9p
bmNsdWRlRW5kV2lkdGgodHJ1ZSkKKyAgICAgICAgLCBtX2F1dG9XcmFwKGZhbHNlKQorICAgICAg
ICAsIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZShmYWxzZSkKKyAgICAgICAgLCBtX2Zsb2F0
c0ZpdE9uTGluZSh0cnVlKQorICAgICAgICAsIG1fY29sbGFwc2VXaGl0ZVNwYWNlKGZhbHNlKQor
ICAgICAgICAsIG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGgobV9saW5lSW5mby5wcmV2aW91c0xpbmVC
cm9rZUNsZWFubHkoKSkKKyAgICAgICAgLCBtX2FsbG93SW1hZ2VzVG9CcmVhayghYmxvY2suZG9j
dW1lbnQoKS5pblF1aXJrc01vZGUoKSB8fCAhYmxvY2suaXNUYWJsZUNlbGwoKSB8fCAhbV9ibG9j
a1N0eWxlLmxvZ2ljYWxXaWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCisgICAgICAgICwgbV9h
dEVuZChmYWxzZSkKKyAgICAgICAgLCBtX2hhZFVuY29tbWl0dGVkV2lkdGhCZWZvcmVDdXJyZW50
KGZhbHNlKQorICAgICAgICAsIG1fbGluZU1pZHBvaW50U3RhdGUocmVzb2x2ZXIubWlkcG9pbnRT
dGF0ZSgpKQorICAgIHsKKyAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xpbmVCcm9rZUNs
ZWFubHkoZmFsc2UpOworICAgIH0KKworICAgIFJlbmRlck9iamVjdCogY3VycmVudE9iamVjdCgp
IHsgcmV0dXJuIG1fY3VycmVudC5tX29iajsgfQorICAgIElubGluZUl0ZXJhdG9yIGxpbmVCcmVh
aygpIHsgcmV0dXJuIG1fbGluZUJyZWFrOyB9CisgICAgSW5saW5lSXRlcmF0b3ImIGxpbmVCcmVh
a1JlZigpIHtyZXR1cm4gbV9saW5lQnJlYWs7IH0KKyAgICBMaW5lV2lkdGgmIGxpbmVXaWR0aCgp
IHsgcmV0dXJuIG1fd2lkdGg7IH0KKyAgICBib29sIGF0RW5kKCkgeyByZXR1cm4gbV9hdEVuZDsg
fQorCisgICAgdm9pZCBpbml0aWFsaXplRm9yQ3VycmVudE9iamVjdCgpOworCisgICAgdm9pZCBp
bmNyZW1lbnQoKTsKKworICAgIHZvaWQgaGFuZGxlQlIoRUNsZWFyJik7CisgICAgdm9pZCBoYW5k
bGVPdXRPZkZsb3dQb3NpdGlvbmVkKFZlY3RvcjxSZW5kZXJCb3gqPiYgcG9zaXRpb25lZE9iamVj
dHMpOworICAgIHZvaWQgaGFuZGxlRmxvYXQoKTsKKyAgICB2b2lkIGhhbmRsZUVtcHR5SW5saW5l
KCk7CisgICAgdm9pZCBoYW5kbGVSZXBsYWNlZCgpOworICAgIGJvb2wgaGFuZGxlVGV4dChXb3Jk
TWVhc3VyZW1lbnRzJiwgYm9vbCYgaHlwaGVuYXRlZCwgdW5zaWduZWQmIGNvbnNlY3V0aXZlSHlw
aGVuYXRlZExpbmVzKTsKKyAgICBib29sIGNhbkJyZWFrQXRUaGlzUG9zaXRpb24oKTsKKyAgICB2
b2lkIGNvbW1pdEFuZFVwZGF0ZUxpbmVCcmVha0lmTmVlZGVkKCk7CisgICAgSW5saW5lSXRlcmF0
b3IgaGFuZGxlRW5kT2ZMaW5lKCk7CisKKyAgICB2b2lkIGNsZWFyTGluZUJyZWFrSWZGaXRzT25M
aW5lKGJvb2wgaWdub3JpbmdUcmFpbGluZ1NwYWNlID0gZmFsc2UpCisgICAgeworICAgICAgICBp
ZiAobV93aWR0aC5maXRzT25MaW5lKGlnbm9yaW5nVHJhaWxpbmdTcGFjZSkgfHwgbV9sYXN0V1Mg
PT0gTk9XUkFQKQorICAgICAgICAgICAgbV9saW5lQnJlYWsuY2xlYXIoKTsKKyAgICB9CisKKyAg
ICB2b2lkIGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRoKFJlbmRlck9iamVjdCogb2JqZWN0
LCB1bnNpZ25lZCBvZmZzZXQgPSAwLCBpbnQgbmV4dEJyZWFrID0gLTEpCisgICAgeworICAgICAg
ICBtX3dpZHRoLmNvbW1pdCgpOworICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8ob2JqZWN0LCBv
ZmZzZXQsIG5leHRCcmVhayk7CisgICAgfQorCitwcml2YXRlOgorICAgIExpbmVCcmVha2VyJiBt
X2xpbmVCcmVha2VyOworICAgIElubGluZUJpZGlSZXNvbHZlciYgbV9yZXNvbHZlcjsKKworICAg
IElubGluZUl0ZXJhdG9yIG1fY3VycmVudDsKKyAgICBJbmxpbmVJdGVyYXRvciBtX2xpbmVCcmVh
azsKKyAgICBJbmxpbmVJdGVyYXRvciBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzOworCisgICAgUmVu
ZGVyQmxvY2tGbG93JiBtX2Jsb2NrOworICAgIFJlbmRlck9iamVjdCogbV9sYXN0T2JqZWN0Owor
ICAgIFJlbmRlck9iamVjdCogbV9uZXh0T2JqZWN0OworCisgICAgUmVuZGVyU3R5bGUqIG1fY3Vy
cmVudFN0eWxlOworCisgICAgLy8gRmlyZWZveCBhbmQgT3BlcmEgd2lsbCBhbGxvdyBhIHRhYmxl
IGNlbGwgdG8gZ3JvdyB0byBmaXQgYW4gaW1hZ2UgaW5zaWRlIGl0IHVuZGVyCisgICAgLy8gdmVy
eSBzcGVjaWZpYyBjaXJjdW1zdGFuY2VzIChpbiBvcmRlciB0byBtYXRjaCBjb21tb24gV2luSUUg
cmVuZGVyaW5ncykuCisgICAgLy8gTm90IHN1cHBvcnRpbmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQg
dXMgdG8gbWlzLXJlbmRlciBzb21lIHJlYWwgc2l0ZXMuIChTZWUgQnVnemlsbGEgMTA1MTcuKQor
ICAgIFJlbmRlclN0eWxlJiBtX2Jsb2NrU3R5bGU7CisKKyAgICBMaW5lSW5mbyYgbV9saW5lSW5m
bzsKKworICAgIFJlbmRlclRleHRJbmZvJiBtX3JlbmRlclRleHRJbmZvOworCisgICAgRmxvYXRp
bmdPYmplY3QqIG1fbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZTsKKworICAgIExpbmVXaWR0aCBt
X3dpZHRoOworCisgICAgRVdoaXRlU3BhY2UgbV9jdXJyV1M7CisgICAgRVdoaXRlU3BhY2UgbV9s
YXN0V1M7CisKKyAgICBib29sIG1fcHJlc2VydmVzTmV3bGluZTsKKyAgICBib29sIG1fYXRTdGFy
dDsKKworICAgIC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBvbmx5IGlmIHdoaXRlc3BhY2UgaXNu
J3Qgc2V0IHRvIFBSRSwgYW5kIGl0IHRlbGxzIHVzIHdoZXRoZXIKKyAgICAvLyBvciBub3Qgd2Ug
YXJlIGN1cnJlbnRseSBpZ25vcmluZyB3aGl0ZXNwYWNlLgorICAgIGJvb2wgbV9pZ25vcmluZ1Nw
YWNlczsKKworICAgIC8vIFRoaXMgdmFyaWFibGUgdHJhY2tzIHdoZXRoZXIgdGhlIHZlcnkgbGFz
dCBjaGFyYWN0ZXIgd2Ugc2F3IHdhcyBhIHNwYWNlLiBXZSB1c2UKKyAgICAvLyB0aGlzIHRvIGRl
dGVjdCB3aGVuIHdlIGVuY291bnRlciBhIHNlY29uZCBzcGFjZSBzbyB3ZSBrbm93IHdlIGhhdmUg
dG8gdGVybWluYXRlCisgICAgLy8gYSBydW4uCisgICAgYm9vbCBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlOworICAgIGJvb2wgbV9jdXJyZW50Q2hhcmFjdGVySXNXUzsKKyAgICBib29sIG1fYXBw
bGllZFN0YXJ0V2lkdGg7CisgICAgYm9vbCBtX2luY2x1ZGVFbmRXaWR0aDsKKyAgICBib29sIG1f
YXV0b1dyYXA7CisgICAgYm9vbCBtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmU7CisgICAgYm9v
bCBtX2Zsb2F0c0ZpdE9uTGluZTsKKyAgICBib29sIG1fY29sbGFwc2VXaGl0ZVNwYWNlOworICAg
IGJvb2wgbV9zdGFydGluZ05ld1BhcmFncmFwaDsKKyAgICBib29sIG1fYWxsb3dJbWFnZXNUb0Jy
ZWFrOworICAgIGJvb2wgbV9hdEVuZDsKKyAgICBib29sIG1faGFkVW5jb21taXR0ZWRXaWR0aEJl
Zm9yZUN1cnJlbnQ7CisKKyAgICBMaW5lTWlkcG9pbnRTdGF0ZSYgbV9saW5lTWlkcG9pbnRTdGF0
ZTsKKworICAgIFRyYWlsaW5nT2JqZWN0cyBtX3RyYWlsaW5nT2JqZWN0czsKK307CisKK2lubGlu
ZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aW5pdGlhbGl6ZUZvckN1cnJlbnRPYmplY3QoKQorewor
ICAgIG1faGFkVW5jb21taXR0ZWRXaWR0aEJlZm9yZUN1cnJlbnQgPSAhIW1fd2lkdGgudW5jb21t
aXR0ZWRXaWR0aCgpOworCisgICAgbV9jdXJyZW50U3R5bGUgPSAmbV9jdXJyZW50Lm1fb2JqLT5z
dHlsZSgpOworCisgICAgQVNTRVJUKG1fY3VycmVudFN0eWxlKTsKKworICAgIG1fbmV4dE9iamVj
dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMobV9ibG9jaywgbV9jdXJyZW50Lm1fb2Jq
KTsKKyAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1fbmV4dE9iamVjdC0+cGFyZW50KCkgJiYgIW1f
bmV4dE9iamVjdC0+cGFyZW50KCktPmlzRGVzY2VuZGFudE9mKG1fY3VycmVudC5tX29iai0+cGFy
ZW50KCkpKQorICAgICAgICBtX2luY2x1ZGVFbmRXaWR0aCA9IHRydWU7CisKKyAgICBtX2N1cnJX
UyA9IG1fY3VycmVudC5tX29iai0+aXNSZXBsYWNlZCgpID8gbV9jdXJyZW50Lm1fb2JqLT5wYXJl
bnQoKS0+c3R5bGUoKS53aGl0ZVNwYWNlKCkgOiBtX2N1cnJlbnRTdHlsZS0+d2hpdGVTcGFjZSgp
OworICAgIG1fbGFzdFdTID0gbV9sYXN0T2JqZWN0LT5pc1JlcGxhY2VkKCkgPyBtX2xhc3RPYmpl
Y3QtPnBhcmVudCgpLT5zdHlsZSgpLndoaXRlU3BhY2UoKSA6IG1fbGFzdE9iamVjdC0+c3R5bGUo
KS53aGl0ZVNwYWNlKCk7CisKKyAgICBtX2F1dG9XcmFwID0gUmVuZGVyU3R5bGU6OmF1dG9XcmFw
KG1fY3VycldTKTsKKyAgICBtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUgPSBtX2F1dG9XcmFw
V2FzRXZlclRydWVPbkxpbmUgfHwgbV9hdXRvV3JhcDsKKworI2lmIEVOQUJMRShTVkcpCisgICAg
bV9wcmVzZXJ2ZXNOZXdsaW5lID0gbV9jdXJyZW50Lm1fb2JqLT5pc1NWR0lubGluZVRleHQoKSA/
IGZhbHNlIDogUmVuZGVyU3R5bGU6OnByZXNlcnZlTmV3bGluZShtX2N1cnJXUyk7CisjZWxzZQor
ICAgIG1fcHJlc2VydmVzTmV3bGluZSA9IFJlbmRlclN0eWxlOjpwcmVzZXJ2ZU5ld2xpbmUobV9j
dXJyV1MpOworI2VuZGlmCisKKyAgICBtX2NvbGxhcHNlV2hpdGVTcGFjZSA9IFJlbmRlclN0eWxl
Ojpjb2xsYXBzZVdoaXRlU3BhY2UobV9jdXJyV1MpOworfQorCitpbmxpbmUgdm9pZCBCcmVha2lu
Z0NvbnRleHQ6OmluY3JlbWVudCgpCit7CisgICAgLy8gQ2xlYXIgb3V0IG91ciBjaGFyYWN0ZXIg
c3BhY2UgYm9vbCwgc2luY2UgaW5saW5lIDxwcmU+cyBkb24ndCBjb2xsYXBzZSB3aGl0ZXNwYWNl
CisgICAgLy8gd2l0aCBhZGphY2VudCBpbmxpbmUgbm9ybWFsL25vd3JhcCBzcGFucy4KKyAgICBp
ZiAoIW1fY29sbGFwc2VXaGl0ZVNwYWNlKQorICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1Nw
YWNlID0gZmFsc2U7CisKKyAgICBtX2N1cnJlbnQubW92ZVRvU3RhcnRPZihtX25leHRPYmplY3Qp
OworICAgIG1fYXRTdGFydCA9IGZhbHNlOworfQorCitpbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRl
eHQ6OmhhbmRsZUJSKEVDbGVhciYgY2xlYXIpCit7CisgICAgaWYgKG1fd2lkdGguZml0c09uTGlu
ZSgpKSB7CisgICAgICAgIFJlbmRlck9iamVjdCogYnIgPSBtX2N1cnJlbnQubV9vYmo7CisgICAg
ICAgIG1fbGluZUJyZWFrLm1vdmVUb1N0YXJ0T2YoYnIpOworICAgICAgICBtX2xpbmVCcmVhay5p
bmNyZW1lbnQoKTsKKworICAgICAgICAvLyBBIDxicj4gYWx3YXlzIGJyZWFrcyBhIGxpbmUsIHNv
IGRvbid0IGxldCB0aGUgbGluZSBiZSBjb2xsYXBzZWQKKyAgICAgICAgLy8gYXdheS4gQWxzbywg
dGhlIHNwYWNlIGF0IHRoZSBlbmQgb2YgYSBsaW5lIHdpdGggYSA8YnI+IGRvZXMgbm90CisgICAg
ICAgIC8vIGdldCBjb2xsYXBzZWQgYXdheS4gSXQgb25seSBkb2VzIHRoaXMgaWYgdGhlIHByZXZp
b3VzIGxpbmUgYnJva2UKKyAgICAgICAgLy8gY2xlYW5seS4gT3RoZXJ3aXNlIHRoZSA8YnI+IGhh
cyBubyBlZmZlY3Qgb24gd2hldGhlciB0aGUgbGluZSBpcworICAgICAgICAvLyBlbXB0eSBvciBu
b3QuCisgICAgICAgIGlmIChtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoKQorICAgICAgICAgICAgbV9s
aW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKKyAgICAgICAgbV90
cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKKyAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xp
bmVCcm9rZUNsZWFubHkodHJ1ZSk7CisKKyAgICAgICAgLy8gQSA8YnI+IHdpdGggY2xlYXJhbmNl
IGFsd2F5cyBuZWVkcyBhIGxpbmVib3ggaW4gY2FzZSB0aGUgbGluZXMgYmVsb3cgaXQgZ2V0IGRp
cnRpZWQgbGF0ZXIgYW5kCisgICAgICAgIC8vIG5lZWQgdG8gY2hlY2sgZm9yIGZsb2F0cyB0byBj
bGVhciAtIHNvIGlmIHdlJ3JlIGlnbm9yaW5nIHNwYWNlcywgc3RvcCBpZ25vcmluZyB0aGVtIGFu
ZCBhZGQgYQorICAgICAgICAvLyBydW4gZm9yIHRoaXMgb2JqZWN0LgorICAgICAgICBpZiAobV9p
Z25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y2xlYXIoKSAhPSBDTk9ORSkKKyAgICAg
ICAgICAgIGVuc3VyZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2VzKG1fbGluZU1pZHBvaW50U3Rh
dGUsIGJyKTsKKyAgICAgICAgLy8gSWYgd2Ugd2VyZSBwcmVjZWRlZCBieSBjb2xsYXBzaW5nIHNw
YWNlIGFuZCBhcmUgaW4gYSByaWdodC1hbGlnbmVkIGNvbnRhaW5lciB3ZSBuZWVkIHRvIGVuc3Vy
ZSB0aGUgc3BhY2UgZ2V0cworICAgICAgICAvLyBjb2xsYXBzZWQgYXdheSBzbyB0aGF0IGl0IGRv
ZXNuJ3QgcHVzaCB0aGUgdGV4dCBvdXQgZnJvbSB0aGUgY29udGFpbmVyJ3MgcmlnaHQtaGFuZCBl
ZGdlLgorICAgICAgICAvLyBGSVhNRTogRG8gdGhpcyByZWdhcmRsZXNzIG9mIHRoZSBjb250YWlu
ZXIncyBhbGlnbm1lbnQgLSB3aWxsIHJlcXVpcmUgcmViYXNlbGluaW5nIGEgbG90IG9mIHRlc3Qg
cmVzdWx0cy4KKyAgICAgICAgZWxzZSBpZiAobV9pZ25vcmluZ1NwYWNlcyAmJiAobV9ibG9ja1N0
eWxlLnRleHRBbGlnbigpID09IFJJR0hUIHx8IG1fYmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBX
RUJLSVRfUklHSFQpKQorICAgICAgICAgICAgc3RvcElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBv
aW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1f
cG9zKSk7CisKKyAgICAgICAgaWYgKCFtX2xpbmVJbmZvLmlzRW1wdHkoKSkKKyAgICAgICAgICAg
IGNsZWFyID0gbV9jdXJyZW50U3R5bGUtPmNsZWFyKCk7CisgICAgfQorICAgIG1fYXRFbmQgPSB0
cnVlOworfQorCitpbmxpbmUgTGF5b3V0VW5pdCBib3JkZXJQYWRkaW5nTWFyZ2luU3RhcnQoY29u
c3QgUmVuZGVySW5saW5lJiBjaGlsZCkKK3sKKyAgICByZXR1cm4gY2hpbGQubWFyZ2luU3RhcnQo
KSArIGNoaWxkLnBhZGRpbmdTdGFydCgpICsgY2hpbGQuYm9yZGVyU3RhcnQoKTsKK30KKworaW5s
aW5lIExheW91dFVuaXQgYm9yZGVyUGFkZGluZ01hcmdpbkVuZChjb25zdCBSZW5kZXJJbmxpbmUm
IGNoaWxkKQoreworICAgIHJldHVybiBjaGlsZC5tYXJnaW5FbmQoKSArIGNoaWxkLnBhZGRpbmdF
bmQoKSArIGNoaWxkLmJvcmRlckVuZCgpOworfQorCitpbmxpbmUgYm9vbCBzaG91bGRBZGRCb3Jk
ZXJQYWRkaW5nTWFyZ2luKFJlbmRlck9iamVjdCogY2hpbGQpCit7CisgICAgLy8gV2hlbiBkZWNp
ZGluZyB3aGV0aGVyIHdlJ3JlIGF0IHRoZSBlZGdlIG9mIGFuIGlubGluZSwgYWRqYWNlbnQgY29s
bGFwc2VkIHdoaXRlc3BhY2UgaXMgdGhlIHNhbWUgYXMgbm8gc2libGluZyBhdCBhbGwuCisgICAg
cmV0dXJuICFjaGlsZCB8fCAoY2hpbGQtPmlzVGV4dCgpICYmICF0b1JlbmRlclRleHQoY2hpbGQp
LT50ZXh0TGVuZ3RoKCkpOworfQorCitpbmxpbmUgUmVuZGVyT2JqZWN0KiBwcmV2aW91c0luRmxv
d1NpYmxpbmcoUmVuZGVyT2JqZWN0KiBjaGlsZCkKK3sKKyAgICBjaGlsZCA9IGNoaWxkLT5wcmV2
aW91c1NpYmxpbmcoKTsKKyAgICB3aGlsZSAoY2hpbGQgJiYgY2hpbGQtPmlzT3V0T2ZGbG93UG9z
aXRpb25lZCgpKQorICAgICAgICBjaGlsZCA9IGNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKTsKKyAg
ICByZXR1cm4gY2hpbGQ7Cit9CisKK0xheW91dFVuaXQgaW5saW5lTG9naWNhbFdpZHRoKFJlbmRl
ck9iamVjdCogY2hpbGQsIGJvb2wgY2hlY2tTdGFydEVkZ2UgPSB0cnVlLCBib29sIGNoZWNrRW5k
RWRnZSA9IHRydWUpCit7CisgICAgdW5zaWduZWQgbGluZURlcHRoID0gMTsKKyAgICBMYXlvdXRV
bml0IGV4dHJhV2lkdGggPSAwOworICAgIFJlbmRlckVsZW1lbnQqIHBhcmVudCA9IGNoaWxkLT5w
YXJlbnQoKTsKKyAgICB3aGlsZSAocGFyZW50LT5pc1JlbmRlcklubGluZSgpICYmIGxpbmVEZXB0
aCsrIDwgY01heExpbmVEZXB0aCkgeworICAgICAgICBjb25zdCBSZW5kZXJJbmxpbmUmIHBhcmVu
dEFzUmVuZGVySW5saW5lID0gdG9SZW5kZXJJbmxpbmUoKnBhcmVudCk7CisgICAgICAgIGlmICgh
aXNFbXB0eUlubGluZShwYXJlbnRBc1JlbmRlcklubGluZSkpIHsKKyAgICAgICAgICAgIGNoZWNr
U3RhcnRFZGdlID0gY2hlY2tTdGFydEVkZ2UgJiYgc2hvdWxkQWRkQm9yZGVyUGFkZGluZ01hcmdp
bihwcmV2aW91c0luRmxvd1NpYmxpbmcoY2hpbGQpKTsKKyAgICAgICAgICAgIGlmIChjaGVja1N0
YXJ0RWRnZSkKKyAgICAgICAgICAgICAgICBleHRyYVdpZHRoICs9IGJvcmRlclBhZGRpbmdNYXJn
aW5TdGFydChwYXJlbnRBc1JlbmRlcklubGluZSk7CisgICAgICAgICAgICBjaGVja0VuZEVkZ2Ug
PSBjaGVja0VuZEVkZ2UgJiYgc2hvdWxkQWRkQm9yZGVyUGFkZGluZ01hcmdpbihjaGlsZC0+bmV4
dFNpYmxpbmcoKSk7CisgICAgICAgICAgICBpZiAoY2hlY2tFbmRFZGdlKQorICAgICAgICAgICAg
ICAgIGV4dHJhV2lkdGggKz0gYm9yZGVyUGFkZGluZ01hcmdpbkVuZChwYXJlbnRBc1JlbmRlcklu
bGluZSk7CisgICAgICAgICAgICBpZiAoIWNoZWNrU3RhcnRFZGdlICYmICFjaGVja0VuZEVkZ2Up
CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhV2lkdGg7CisgICAgICAgIH0KKyAgICAgICAg
Y2hpbGQgPSBwYXJlbnQ7CisgICAgICAgIHBhcmVudCA9IGNoaWxkLT5wYXJlbnQoKTsKKyAgICB9
CisgICAgcmV0dXJuIGV4dHJhV2lkdGg7Cit9CisKK2lubGluZSB2b2lkIEJyZWFraW5nQ29udGV4
dDo6aGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZChWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9u
ZWRPYmplY3RzKQoreworICAgIC8vIElmIG91ciBvcmlnaW5hbCBkaXNwbGF5IHdhc24ndCBhbiBp
bmxpbmUgdHlwZSwgdGhlbiB3ZSBjYW4KKyAgICAvLyBnbyBhaGVhZCBhbmQgZGV0ZXJtaW5lIG91
ciBzdGF0aWMgaW5saW5lIHBvc2l0aW9uIG5vdy4KKyAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVu
ZGVyQm94KG1fY3VycmVudC5tX29iaik7CisgICAgYm9vbCBpc0lubGluZVR5cGUgPSBib3gtPnN0
eWxlKCkuaXNPcmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCk7CisgICAgaWYgKCFpc0lubGluZVR5
cGUpCisgICAgICAgIG1fYmxvY2suc2V0U3RhdGljSW5saW5lUG9zaXRpb25Gb3JDaGlsZCgqYm94
LCBtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQoKSwgbV9ibG9jay5zdGFydE9mZnNldEZvckNvbnRlbnQo
bV9ibG9jay5sb2dpY2FsSGVpZ2h0KCkpKTsKKyAgICBlbHNlIHsKKyAgICAgICAgLy8gSWYgb3Vy
IG9yaWdpbmFsIGRpc3BsYXkgd2FzIGFuIElOTElORSB0eXBlLCB0aGVuIHdlIGNhbiBnbyBhaGVh
ZAorICAgICAgICAvLyBhbmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMgeSBwb3NpdGlvbiBub3cuCisg
ICAgICAgIGJveC0+bGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlvbihtX2Jsb2NrLmxvZ2lj
YWxIZWlnaHQoKSk7CisgICAgfQorCisgICAgLy8gSWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCB3
ZSBoYXZlIHRvIHN0b3AgYW5kIGluY2x1ZGUgdGhpcyBvYmplY3QgYW5kCisgICAgLy8gdGhlbiBz
dGFydCBpZ25vcmluZyBzcGFjZXMgYWdhaW4uCisgICAgaWYgKGlzSW5saW5lVHlwZSB8fCBib3gt
PmNvbnRhaW5lcigpLT5pc1JlbmRlcklubGluZSgpKSB7CisgICAgICAgIGlmIChtX2lnbm9yaW5n
U3BhY2VzKQorICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9s
aW5lTWlkcG9pbnRTdGF0ZSwgYm94KTsKKyAgICAgICAgbV90cmFpbGluZ09iamVjdHMuYXBwZW5k
Qm94SWZOZWVkZWQoYm94KTsKKyAgICB9IGVsc2UKKyAgICAgICAgcG9zaXRpb25lZE9iamVjdHMu
YXBwZW5kKGJveCk7CisKKyAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoaW5saW5lTG9n
aWNhbFdpZHRoKGJveCkpOworICAgIC8vIFJlc2V0IHByaW9yIGxpbmUgYnJlYWsgY29udGV4dCBj
aGFyYWN0ZXJzLgorICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNl
dFByaW9yQ29udGV4dCgpOworfQorCitpbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmhhbmRs
ZUZsb2F0KCkKK3sKKyAgICBSZW5kZXJCb3gmIGZsb2F0Qm94ID0gdG9SZW5kZXJCb3goKm1fY3Vy
cmVudC5tX29iaik7CisgICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gbV9ibG9j
ay5pbnNlcnRGbG9hdGluZ09iamVjdChmbG9hdEJveCk7CisgICAgLy8gY2hlY2sgaWYgaXQgZml0
cyBpbiB0aGUgY3VycmVudCBsaW5lLgorICAgIC8vIElmIGl0IGRvZXMsIHBvc2l0aW9uIGl0IG5v
dywgb3RoZXJ3aXNlLCBwb3NpdGlvbgorICAgIC8vIGl0IGFmdGVyIG1vdmluZyB0byBuZXh0IGxp
bmUgKGluIG5ld0xpbmUoKSBmdW5jKQorICAgIC8vIEZJWE1FOiBCdWcgMTEwMzcyOiBQcm9wZXJs
eSBwb3NpdGlvbiBtdWx0aXBsZSBzdGFja2VkIGZsb2F0cyB3aXRoIG5vbi1yZWN0YW5ndWxhciBz
aGFwZSBvdXRzaWRlLgorICAgIGlmIChtX2Zsb2F0c0ZpdE9uTGluZSAmJiBtX3dpZHRoLmZpdHNP
bkxpbmVFeGNsdWRpbmdUcmFpbGluZ1doaXRlc3BhY2UobV9ibG9jay5sb2dpY2FsV2lkdGhGb3JG
bG9hdChmbG9hdGluZ09iamVjdCkpKSB7CisgICAgICAgIG1fYmxvY2sucG9zaXRpb25OZXdGbG9h
dE9uTGluZShmbG9hdGluZ09iamVjdCwgbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBtX2xp
bmVJbmZvLCBtX3dpZHRoKTsKKyAgICAgICAgaWYgKG1fbGluZUJyZWFrLm1fb2JqID09IG1fY3Vy
cmVudC5tX29iaikgeworICAgICAgICAgICAgQVNTRVJUKCFtX2xpbmVCcmVhay5tX3Bvcyk7Cisg
ICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAgfQorICAgIH0gZWxz
ZQorICAgICAgICBtX2Zsb2F0c0ZpdE9uTGluZSA9IGZhbHNlOworICAgIC8vIFVwZGF0ZSBwcmlv
ciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVycywgdXNpbmcgVStGRkZEIChPQkpFQ1QgUkVQ
TEFDRU1FTlQgQ0hBUkFDVEVSKSBmb3IgZmxvYXRpbmcgZWxlbWVudC4KKyAgICBtX3JlbmRlclRl
eHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IudXBkYXRlUHJpb3JDb250ZXh0KHJlcGxhY2VtZW50
Q2hhcmFjdGVyKTsKK30KKworLy8gVGhpcyBpcyBjdXJyZW50bHkganVzdCB1c2VkIGZvciBsaXN0
IG1hcmtlcnMgYW5kIGlubGluZSBmbG93cyB0aGF0IGhhdmUgbGluZSBib3hlcy4gTmVpdGhlciBz
aG91bGQKKy8vIGhhdmUgYW4gZWZmZWN0IG9uIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIHRo
ZSBsaW5lLgoraW5saW5lIGJvb2wgc2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0
KFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIFJlbmRlck9iamVjdCogbywgTGluZU1pZHBvaW50U3Rh
dGUmIGxpbmVNaWRwb2ludFN0YXRlKQoreworICAgIFJlbmRlck9iamVjdCogbmV4dCA9IGJpZGlO
ZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ssIG8pOworICAgIHdoaWxlIChuZXh0ICYmIG5l
eHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgbmV4dCA9IGJp
ZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ssIG5leHQpOworCisgICAgaWYgKG5leHQg
JiYgbmV4dC0+aXNUZXh0KCkgJiYgdG9SZW5kZXJUZXh0KG5leHQpLT50ZXh0TGVuZ3RoKCkgPiAw
KSB7CisgICAgICAgIFJlbmRlclRleHQqIG5leHRUZXh0ID0gdG9SZW5kZXJUZXh0KG5leHQpOwor
ICAgICAgICBVQ2hhciBuZXh0Q2hhciA9IG5leHRUZXh0LT5jaGFyYWN0ZXJBdCgwKTsKKyAgICAg
ICAgaWYgKG5leHRUZXh0LT5zdHlsZSgpLmlzQ29sbGFwc2libGVXaGl0ZVNwYWNlKG5leHRDaGFy
KSkgeworICAgICAgICAgICAgc3RhcnRJZ25vcmluZ1NwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwg
SW5saW5lSXRlcmF0b3IoMCwgbywgMCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSB2b2lkIEJyZWFr
aW5nQ29udGV4dDo6aGFuZGxlRW1wdHlJbmxpbmUoKQoreworICAgIFJlbmRlcklubGluZSYgZmxv
d0JveCA9IHRvUmVuZGVySW5saW5lKCptX2N1cnJlbnQubV9vYmopOworCisgICAgLy8gVGhpcyBz
aG91bGQgb25seSBlbmQgdXAgYmVpbmcgY2FsbGVkIG9uIGVtcHR5IGlubGluZXMKKyAgICBBU1NF
UlQoaXNFbXB0eUlubGluZShmbG93Qm94KSk7CisKKyAgICAvLyBOb3cgdGhhdCBzb21lIGlubGlu
ZSBmbG93cyBoYXZlIGxpbmUgYm94ZXMsIGlmIHdlIGFyZSBhbHJlYWR5IGlnbm9yaW5nIHNwYWNl
cywgd2UgbmVlZAorICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHN0b3AgdG8gaW5jbHVkZSB0
aGlzIG9iamVjdCBhbmQgdGhlbiBzdGFydCBpZ25vcmluZyBzcGFjZXMgYWdhaW4uCisgICAgLy8g
SWYgdGhpcyBvYmplY3QgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLCB3ZSBuZWVkIHRvIGJl
aGF2ZSBsaWtlIGxpc3QgbWFya2VycyBhbmQKKyAgICAvLyBzdGFydCBpZ25vcmluZyBzcGFjZXMu
CisgICAgYm9vbCByZXF1aXJlc0xpbmVCb3ggPSBhbHdheXNSZXF1aXJlc0xpbmVCb3goZmxvd0Jv
eCk7CisgICAgaWYgKHJlcXVpcmVzTGluZUJveCB8fCByZXF1aXJlc0xpbmVCb3hGb3JDb250ZW50
KGZsb3dCb3gsIG1fbGluZUluZm8pKSB7CisgICAgICAgIC8vIEFuIGVtcHR5IGlubGluZSB0aGF0
IG9ubHkgaGFzIGxpbmUtaGVpZ2h0LCB2ZXJ0aWNhbC1hbGlnbiBvciBmb250LW1ldHJpY3Mgd2ls
bCBvbmx5IGdldCBhCisgICAgICAgIC8vIGxpbmUgYm94IHRvIGFmZmVjdCB0aGUgaGVpZ2h0IG9m
IHRoZSBsaW5lIGlmIHRoZSByZXN0IG9mIHRoZSBsaW5lIGlzIG5vdCBlbXB0eS4KKyAgICAgICAg
aWYgKHJlcXVpcmVzTGluZUJveCkKKyAgICAgICAgICAgIG1fbGluZUluZm8uc2V0RW1wdHkoZmFs
c2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7CisgICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzKSB7
CisgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOworICAgICAgICAgICAgZW5z
dXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9jdXJy
ZW50Lm1fb2JqKTsKKyAgICAgICAgfSBlbHNlIGlmIChtX2Jsb2NrU3R5bGUuY29sbGFwc2VXaGl0
ZVNwYWNlKCkgJiYgbV9yZXNvbHZlci5wb3NpdGlvbigpLm1fb2JqID09IG1fY3VycmVudC5tX29i
agorICAgICAgICAgICAgJiYgc2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0KG1f
YmxvY2ssIG1fY3VycmVudC5tX29iaiwgbV9saW5lTWlkcG9pbnRTdGF0ZSkpIHsKKyAgICAgICAg
ICAgIC8vIExpa2Ugd2l0aCBsaXN0IG1hcmtlcnMsIHdlIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcyB0
byBtYWtlIHN1cmUgdGhhdCBhbnkKKyAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgc3BhY2VzIHdl
IHNlZSB3aWxsIGJlIGRpc2NhcmRlZC4KKyAgICAgICAgICAgIG1fY3VycmVudENoYXJhY3Rlcklz
U3BhY2UgPSB0cnVlOworICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyA9IHRydWU7
CisgICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlCisg
ICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5hcHBlbmRCb3hJZk5lZWRlZCgmZmxvd0JveCk7
CisgICAgfQorCisgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlubGluZUxvZ2ljYWxX
aWR0aChtX2N1cnJlbnQubV9vYmopICsgYm9yZGVyUGFkZGluZ01hcmdpblN0YXJ0KGZsb3dCb3gp
ICsgYm9yZGVyUGFkZGluZ01hcmdpbkVuZChmbG93Qm94KSk7Cit9CisKK2lubGluZSB2b2lkIEJy
ZWFraW5nQ29udGV4dDo6aGFuZGxlUmVwbGFjZWQoKQoreworICAgIFJlbmRlckJveCYgcmVwbGFj
ZWRCb3ggPSB0b1JlbmRlckJveCgqbV9jdXJyZW50Lm1fb2JqKTsKKworICAgIGlmIChtX2F0U3Rh
cnQpCisgICAgICAgIG1fd2lkdGgudXBkYXRlQXZhaWxhYmxlV2lkdGgocmVwbGFjZWRCb3gubG9n
aWNhbEhlaWdodCgpKTsKKworICAgIC8vIEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVp
dGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLgorICAgIGlmICgobV9hdXRvV3JhcCB8fCBSZW5k
ZXJTdHlsZTo6YXV0b1dyYXAobV9sYXN0V1MpKSAmJiAoIW1fY3VycmVudC5tX29iai0+aXNJbWFn
ZSgpIHx8IG1fYWxsb3dJbWFnZXNUb0JyZWFrKSkgeworICAgICAgICBtX3dpZHRoLmNvbW1pdCgp
OworICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG9TdGFydE9mKG1fY3VycmVudC5tX29iaik7Cisg
ICAgfQorCisgICAgaWYgKG1faWdub3JpbmdTcGFjZXMpCisgICAgICAgIHN0b3BJZ25vcmluZ1Nw
YWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJlbnQubV9v
YmosIDApKTsKKworICAgIG1fbGluZUluZm8uc2V0RW1wdHkoZmFsc2UsICZtX2Jsb2NrLCAmbV93
aWR0aCk7CisgICAgbV9pZ25vcmluZ1NwYWNlcyA9IGZhbHNlOworICAgIG1fY3VycmVudENoYXJh
Y3RlcklzU3BhY2UgPSBmYWxzZTsKKyAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTID0gZmFsc2U7
CisgICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKKworICAgIC8vIE9wdGltaXplIGZvciBh
IGNvbW1vbiBjYXNlLiBJZiB3ZSBjYW4ndCBmaW5kIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIGxpc3QK
KyAgICAvLyBpdGVtLCB0aGVuIHRoaXMgaXMgYWxsIG1vb3QuCisgICAgTGF5b3V0VW5pdCByZXBs
YWNlZExvZ2ljYWxXaWR0aCA9IG1fYmxvY2subG9naWNhbFdpZHRoRm9yQ2hpbGQocmVwbGFjZWRC
b3gpICsgbV9ibG9jay5tYXJnaW5TdGFydEZvckNoaWxkKHJlcGxhY2VkQm94KSArIG1fYmxvY2su
bWFyZ2luRW5kRm9yQ2hpbGQocmVwbGFjZWRCb3gpICsgaW5saW5lTG9naWNhbFdpZHRoKG1fY3Vy
cmVudC5tX29iaik7CisgICAgaWYgKG1fY3VycmVudC5tX29iai0+aXNMaXN0TWFya2VyKCkpIHsK
KyAgICAgICAgaWYgKG1fYmxvY2tTdHlsZS5jb2xsYXBzZVdoaXRlU3BhY2UoKSAmJiBzaG91bGRT
a2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QobV9ibG9jaywgbV9jdXJyZW50Lm1fb2JqLCBt
X2xpbmVNaWRwb2ludFN0YXRlKSkgeworICAgICAgICAgICAgLy8gTGlrZSB3aXRoIGlubGluZSBm
bG93cywgd2Ugc3RhcnQgaWdub3Jpbmcgc3BhY2VzIHRvIG1ha2Ugc3VyZSB0aGF0IGFueQorICAg
ICAgICAgICAgLy8gYWRkaXRpb25hbCBzcGFjZXMgd2Ugc2VlIHdpbGwgYmUgZGlzY2FyZGVkLgor
ICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IHRydWU7CisgICAgICAgICAg
ICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTID0gZmFsc2U7CisgICAgICAgICAgICBtX2lnbm9yaW5n
U3BhY2VzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9SZW5kZXJMaXN0TWFya2Vy
KCptX2N1cnJlbnQubV9vYmopLmlzSW5zaWRlKCkpCisgICAgICAgICAgICBtX3dpZHRoLmFkZFVu
Y29tbWl0dGVkV2lkdGgocmVwbGFjZWRMb2dpY2FsV2lkdGgpOworICAgIH0gZWxzZQorICAgICAg
ICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgocmVwbGFjZWRMb2dpY2FsV2lkdGgpOworICAg
IGlmIChtX2N1cnJlbnQubV9vYmotPmlzUnVieVJ1bigpKQorICAgICAgICBtX3dpZHRoLmFwcGx5
T3ZlcmhhbmcodG9SZW5kZXJSdWJ5UnVuKG1fY3VycmVudC5tX29iaiksIG1fbGFzdE9iamVjdCwg
bV9uZXh0T2JqZWN0KTsKKyAgICAvLyBVcGRhdGUgcHJpb3IgbGluZSBicmVhayBjb250ZXh0IGNo
YXJhY3RlcnMsIHVzaW5nIFUrRkZGRCAoT0JKRUNUIFJFUExBQ0VNRU5UIENIQVJBQ1RFUikgZm9y
IHJlcGxhY2VkIGVsZW1lbnQuCisgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJh
dG9yLnVwZGF0ZVByaW9yQ29udGV4dChyZXBsYWNlbWVudENoYXJhY3Rlcik7Cit9CisKK2lubGlu
ZSBmbG9hdCBmaXJzdFBvc2l0aXZlV2lkdGgoY29uc3QgV29yZE1lYXN1cmVtZW50cyYgd29yZE1l
YXN1cmVtZW50cykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdvcmRNZWFzdXJlbWVu
dHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHdvcmRNZWFzdXJlbWVudHNbaV0ud2lkdGgg
PiAwKQorICAgICAgICAgICAgcmV0dXJuIHdvcmRNZWFzdXJlbWVudHNbaV0ud2lkdGg7CisgICAg
fQorICAgIHJldHVybiAwOworfQorCisjaWYgRU5BQkxFKENTU19TSEFQRVMpCitpbmxpbmUgdm9p
ZCB1cGRhdGVTZWdtZW50c0ZvclNoYXBlcyhSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBjb25zdCBG
bG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgY29uc3QgV29yZE1lYXN1
cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cywgTGluZVdpZHRoJiB3aWR0aCwgYm9vbCBpc0ZpcnN0
TGluZSkKK3sKKyAgICBBU1NFUlQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7CisKKyAgICBT
aGFwZUluc2lkZUluZm8qIHNoYXBlSW5zaWRlSW5mbyA9IGJsb2NrLmxheW91dFNoYXBlSW5zaWRl
SW5mbygpOworICAgIGlmICghbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZS0+aXNQbGFjZWQoKSB8
fCAhc2hhcGVJbnNpZGVJbmZvKQorICAgICAgICByZXR1cm47CisKKyAgICBib29sIGlzSG9yaXpv
bnRhbFdyaXRpbmdNb2RlID0gYmxvY2suaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKTsKKyAgICBM
YXlvdXRVbml0IGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWluZXIgPSBibG9jay5sb2dpY2Fs
T2Zmc2V0RnJvbVNoYXBlQW5jZXN0b3JDb250YWluZXIoc2hhcGVJbnNpZGVJbmZvLT5vd25lcigp
KS5oZWlnaHQoKTsKKworICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxUb3AgPSBibG9jay5sb2dp
Y2FsSGVpZ2h0KCkgKyBsb2dpY2FsT2Zmc2V0RnJvbVNoYXBlQ29udGFpbmVyOworICAgIExheW91
dFVuaXQgbGluZUxvZ2ljYWxIZWlnaHQgPSBibG9jay5saW5lSGVpZ2h0KGlzRmlyc3RMaW5lLCBp
c0hvcml6b250YWxXcml0aW5nTW9kZSA/IEhvcml6b250YWxMaW5lIDogVmVydGljYWxMaW5lLCBQ
b3NpdGlvbk9mSW50ZXJpb3JMaW5lQm94ZXMpOworICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxC
b3R0b20gPSBsaW5lTG9naWNhbFRvcCArIGxpbmVMb2dpY2FsSGVpZ2h0OworCisgICAgTGF5b3V0
VW5pdCBmbG9hdExvZ2ljYWxUb3AgPSBibG9jay5sb2dpY2FsVG9wRm9yRmxvYXQobGFzdEZsb2F0
RnJvbVByZXZpb3VzTGluZSk7CisgICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxCb3R0b20gPSBi
bG9jay5sb2dpY2FsQm90dG9tRm9yRmxvYXQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7CisK
KyAgICBib29sIGxpbmVPdmVybGFwc1dpdGhGbG9hdCA9IChmbG9hdExvZ2ljYWxUb3AgPCBsaW5l
TG9naWNhbEJvdHRvbSkgJiYgKGxpbmVMb2dpY2FsVG9wIDwgZmxvYXRMb2dpY2FsQm90dG9tKTsK
KyAgICBpZiAoIWxpbmVPdmVybGFwc1dpdGhGbG9hdCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
ZmxvYXQgbWluU2VnbWVudFdpZHRoID0gZmlyc3RQb3NpdGl2ZVdpZHRoKHdvcmRNZWFzdXJlbWVu
dHMpOworCisgICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxXaWR0aCA9IGJsb2NrLmxvZ2ljYWxX
aWR0aEZvckZsb2F0KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpOworICAgIExheW91dFVuaXQg
YXZhaWxhYmxlTG9naWNhbFdpZHRoID0gYmxvY2subG9naWNhbFdpZHRoKCkgLSBibG9jay5sb2dp
Y2FsUmlnaHRGb3JGbG9hdChsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKTsKKyAgICBpZiAoYXZh
aWxhYmxlTG9naWNhbFdpZHRoIDwgbWluU2VnbWVudFdpZHRoKQorICAgICAgICBibG9jay5zZXRM
b2dpY2FsSGVpZ2h0KGZsb2F0TG9naWNhbEJvdHRvbSk7CisKKyAgICBpZiAoYmxvY2subG9naWNh
bEhlaWdodCgpIDwgZmxvYXRMb2dpY2FsVG9wKSB7CisgICAgICAgIHNoYXBlSW5zaWRlSW5mby0+
YWRqdXN0TG9naWNhbExpbmVUb3AobWluU2VnbWVudFdpZHRoICsgZmxvYXRMb2dpY2FsV2lkdGgp
OworICAgICAgICBibG9jay5zZXRMb2dpY2FsSGVpZ2h0KHNoYXBlSW5zaWRlSW5mby0+bG9naWNh
bExpbmVUb3AoKSAtIGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWluZXIpOworICAgIH0KKwor
ICAgIGxpbmVMb2dpY2FsVG9wID0gYmxvY2subG9naWNhbEhlaWdodCgpICsgbG9naWNhbE9mZnNl
dEZyb21TaGFwZUNvbnRhaW5lcjsKKworICAgIHNoYXBlSW5zaWRlSW5mby0+dXBkYXRlU2VnbWVu
dHNGb3JMaW5lKGxpbmVMb2dpY2FsVG9wLCBsaW5lTG9naWNhbEhlaWdodCk7CisgICAgd2lkdGgu
dXBkYXRlQ3VycmVudFNoYXBlU2VnbWVudCgpOworICAgIHdpZHRoLnVwZGF0ZUF2YWlsYWJsZVdp
ZHRoKCk7Cit9CisjZW5kaWYKKworaW5saW5lIGJvb2wgaXRlcmF0b3JJc0JleW9uZEVuZE9mUmVu
ZGVyQ29tYmluZVRleHQoY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0ZXIsIFJlbmRlckNvbWJpbmVU
ZXh0JiByZW5kZXJlcikKK3sKKyAgICByZXR1cm4gaXRlci5tX29iaiA9PSAmcmVuZGVyZXIgJiYg
aXRlci5tX3BvcyA+PSByZW5kZXJlci50ZXh0TGVuZ3RoKCk7Cit9CisKK2lubGluZSB2b2lkIG5l
eHRDaGFyYWN0ZXIoVUNoYXImIGN1cnJlbnRDaGFyYWN0ZXIsIFVDaGFyJiBsYXN0Q2hhcmFjdGVy
LCBVQ2hhciYgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyKQoreworICAgIHNlY29uZFRvTGFzdENoYXJh
Y3RlciA9IGxhc3RDaGFyYWN0ZXI7CisgICAgbGFzdENoYXJhY3RlciA9IGN1cnJlbnRDaGFyYWN0
ZXI7Cit9CisKKy8vIEZJWE1FOiBEb24ndCBsZXQgY291bnRlcnMgbWFyayB0aGVtc2VsdmVzIGFz
IG5lZWRpbmcgcHJlZiB3aWR0aCByZWNhbGNzIGR1cmluZyBsYXlvdXQKKy8vIHNvIHdlIGRvbid0
IG5lZWQgdGhpcyBoYWNrLgoraW5saW5lIHZvaWQgdXBkYXRlQ291bnRlcklmTmVlZGVkKFJlbmRl
clRleHQmIHJlbmRlclRleHQpCit7CisgICAgaWYgKCFyZW5kZXJUZXh0LnByZWZlcnJlZExvZ2lj
YWxXaWR0aHNEaXJ0eSgpIHx8ICFyZW5kZXJUZXh0LmlzQ291bnRlcigpKQorICAgICAgICByZXR1
cm47CisgICAgdG9SZW5kZXJDb3VudGVyKHJlbmRlclRleHQpLnVwZGF0ZUNvdW50ZXIoKTsKK30K
KworaW5saW5lIGZsb2F0IG1lYXN1cmVIeXBoZW5XaWR0aChSZW5kZXJUZXh0KiByZW5kZXJlciwg
Y29uc3QgRm9udCYgZm9udCwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFj
a0ZvbnRzID0gMCkKK3sKKyAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSByZW5kZXJlci0+
c3R5bGUoKTsKKyAgICByZXR1cm4gZm9udC53aWR0aChSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4
dFJ1bihyZW5kZXJlciwgZm9udCwgc3R5bGUuaHlwaGVuU3RyaW5nKCkuc3RyaW5nKCksIHN0eWxl
KSwgZmFsbGJhY2tGb250cyk7Cit9CisKK0FMV0FZU19JTkxJTkUgZmxvYXQgdGV4dFdpZHRoKFJl
bmRlclRleHQqIHRleHQsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbiwgY29uc3QgRm9udCYg
Zm9udCwgZmxvYXQgeFBvcywgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNw
YWNlLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4mIGZhbGxiYWNrRm9udHMsIFRleHRM
YXlvdXQqIGxheW91dCA9IDApCit7CisgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gdGV4
dC0+c3R5bGUoKTsKKworICAgIEdseXBoT3ZlcmZsb3cgZ2x5cGhPdmVyZmxvdzsKKyAgICBpZiAo
aXNGaXhlZFBpdGNoIHx8ICghZnJvbSAmJiBsZW4gPT0gdGV4dC0+dGV4dExlbmd0aCgpKSB8fCBz
dHlsZS5oYXNUZXh0Q29tYmluZSgpKQorICAgICAgICByZXR1cm4gdGV4dC0+d2lkdGgoZnJvbSwg
bGVuLCBmb250LCB4UG9zLCAmZmFsbGJhY2tGb250cywgJmdseXBoT3ZlcmZsb3cpOworCisgICAg
aWYgKGxheW91dCkKKyAgICAgICAgcmV0dXJuIEZvbnQ6OndpZHRoKCpsYXlvdXQsIGZyb20sIGxl
biwgJmZhbGxiYWNrRm9udHMpOworCisgICAgVGV4dFJ1biBydW4gPSBSZW5kZXJCbG9jazo6Y29u
c3RydWN0VGV4dFJ1bih0ZXh0LCBmb250LCB0ZXh0LCBmcm9tLCBsZW4sIHN0eWxlKTsKKyAgICBy
dW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LT50ZXh0TGVuZ3RoKCkgLSBmcm9tKTsKKyAgICBB
U1NFUlQocnVuLmNoYXJhY3RlcnNMZW5ndGgoKSA+PSBydW4ubGVuZ3RoKCkpOworCisgICAgcnVu
LnNldENoYXJhY3RlclNjYW5Gb3JDb2RlUGF0aCghdGV4dC0+Y2FuVXNlU2ltcGxlRm9udENvZGVQ
YXRoKCkpOworICAgIHJ1bi5zZXRUYWJTaXplKCFjb2xsYXBzZVdoaXRlU3BhY2UsIHN0eWxlLnRh
YlNpemUoKSk7CisgICAgcnVuLnNldFhQb3MoeFBvcyk7CisgICAgcmV0dXJuIGZvbnQud2lkdGgo
cnVuLCAmZmFsbGJhY2tGb250cywgJmdseXBoT3ZlcmZsb3cpOworfQorCisvLyBBZGRpbmcgYSBw
YWlyIG9mIG1pZHBvaW50cyBiZWZvcmUgYSBjaGFyYWN0ZXIgd2lsbCBzcGxpdCBpdCBvdXQgaW50
byBhIG5ldyBsaW5lIGJveC4KK2lubGluZSB2b2lkIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94
KExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3ImIHRl
eHRQYXJhZ3JhcGhTZXBhcmF0b3IpCit7CisgICAgSW5saW5lSXRlcmF0b3IgbWlkcG9pbnQoMCwg
dGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX29iaiwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX3Bv
cyk7CisgICAgc3RhcnRJZ25vcmluZ1NwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRl
cmF0b3IoMCwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX29iaiwgdGV4dFBhcmFncmFwaFNlcGFy
YXRvci5tX3BvcyAtIDEpKTsKKyAgICBzdG9wSWdub3JpbmdTcGFjZXMobGluZU1pZHBvaW50U3Rh
dGUsIElubGluZUl0ZXJhdG9yKDAsIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IubV9vYmosIHRleHRQ
YXJhZ3JhcGhTZXBhcmF0b3IubV9wb3MpKTsKK30KKwordm9pZCB0cnlIeXBoZW5hdGluZyhSZW5k
ZXJUZXh0KiB0ZXh0LCBjb25zdCBGb250JiBmb250LCBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2Fs
ZUlkZW50aWZpZXIsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBpbnQgY29u
c2VjdXRpdmVIeXBoZW5hdGVkTGluZXNMaW1pdCwgaW50IG1pbmltdW1QcmVmaXhMaW1pdCwgaW50
IG1pbmltdW1TdWZmaXhMaW1pdCwgdW5zaWduZWQgbGFzdFNwYWNlLCB1bnNpZ25lZCBwb3MsIGZs
b2F0IHhQb3MsIGludCBhdmFpbGFibGVXaWR0aCwgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29s
bGFwc2VXaGl0ZVNwYWNlLCBpbnQgbGFzdFNwYWNlV29yZFNwYWNpbmcsIElubGluZUl0ZXJhdG9y
JiBsaW5lQnJlYWssIGludCBuZXh0QnJlYWthYmxlLCBib29sJiBoeXBoZW5hdGVkKQoreworICAg
IC8vIE1hcCAnaHlwaGVuYXRlLWxpbWl0LXtiZWZvcmUsYWZ0ZXJ9OiBhdXRvOycgdG8gMi4KKyAg
ICB1bnNpZ25lZCBtaW5pbXVtUHJlZml4TGVuZ3RoOworICAgIHVuc2lnbmVkIG1pbmltdW1TdWZm
aXhMZW5ndGg7CisKKyAgICBpZiAobWluaW11bVByZWZpeExpbWl0IDwgMCkKKyAgICAgICAgbWlu
aW11bVByZWZpeExlbmd0aCA9IDI7CisgICAgZWxzZQorICAgICAgICBtaW5pbXVtUHJlZml4TGVu
Z3RoID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG1pbmltdW1QcmVmaXhMaW1pdCk7CisKKyAgICBp
ZiAobWluaW11bVN1ZmZpeExpbWl0IDwgMCkKKyAgICAgICAgbWluaW11bVN1ZmZpeExlbmd0aCA9
IDI7CisgICAgZWxzZQorICAgICAgICBtaW5pbXVtU3VmZml4TGVuZ3RoID0gc3RhdGljX2Nhc3Q8
dW5zaWduZWQ+KG1pbmltdW1TdWZmaXhMaW1pdCk7CisKKyAgICBpZiAocG9zIC0gbGFzdFNwYWNl
IDw9IG1pbmltdW1TdWZmaXhMZW5ndGgpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0ID49IDAgJiYgY29uc2VjdXRpdmVIeXBoZW5hdGVk
TGluZXMgPj0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVz
TGltaXQpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbnQgaHlwaGVuV2lkdGggPSBtZWFzdXJl
SHlwaGVuV2lkdGgodGV4dCwgZm9udCk7CisKKyAgICBmbG9hdCBtYXhQcmVmaXhXaWR0aCA9IGF2
YWlsYWJsZVdpZHRoIC0geFBvcyAtIGh5cGhlbldpZHRoIC0gbGFzdFNwYWNlV29yZFNwYWNpbmc7
CisgICAgLy8gSWYgdGhlIG1heGltdW0gd2lkdGggYXZhaWxhYmxlIGZvciB0aGUgcHJlZml4IGJl
Zm9yZSB0aGUgaHlwaGVuIGlzIHNtYWxsLCB0aGVuIGl0IGlzIHZlcnkgdW5saWtlbHkKKyAgICAv
LyB0aGF0IGFuIGh5cGhlbmF0aW9uIG9wcG9ydHVuaXR5IGV4aXN0cywgc28gZG8gbm90IGJvdGhl
ciB0byBsb29rIGZvciBpdC4KKyAgICBpZiAobWF4UHJlZml4V2lkdGggPD0gZm9udC5waXhlbFNp
emUoKSAqIDUgLyA0KQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBSZW5kZXJTdHlsZSYg
c3R5bGUgPSB0ZXh0LT5zdHlsZSgpOworICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNv
bnN0cnVjdFRleHRSdW4odGV4dCwgZm9udCwgdGV4dCwgbGFzdFNwYWNlLCBwb3MgLSBsYXN0U3Bh
Y2UsIHN0eWxlKTsKKyAgICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LT50ZXh0TGVuZ3Ro
KCkgLSBsYXN0U3BhY2UpOworICAgIEFTU0VSVChydW4uY2hhcmFjdGVyc0xlbmd0aCgpID49IHJ1
bi5sZW5ndGgoKSk7CisKKyAgICBydW4uc2V0VGFiU2l6ZSghY29sbGFwc2VXaGl0ZVNwYWNlLCBz
dHlsZS50YWJTaXplKCkpOworICAgIHJ1bi5zZXRYUG9zKHhQb3MgKyBsYXN0U3BhY2VXb3JkU3Bh
Y2luZyk7CisKKyAgICB1bnNpZ25lZCBwcmVmaXhMZW5ndGggPSBmb250Lm9mZnNldEZvclBvc2l0
aW9uKHJ1biwgbWF4UHJlZml4V2lkdGgsIGZhbHNlKTsKKyAgICBpZiAocHJlZml4TGVuZ3RoIDwg
bWluaW11bVByZWZpeExlbmd0aCkKKyAgICAgICAgcmV0dXJuOworCisgICAgcHJlZml4TGVuZ3Ro
ID0gbGFzdEh5cGhlbkxvY2F0aW9uKHRleHQtPmNoYXJhY3RlcnMoKSArIGxhc3RTcGFjZSwgcG9z
IC0gbGFzdFNwYWNlLCBzdGQ6Om1pbihwcmVmaXhMZW5ndGgsIHBvcyAtIGxhc3RTcGFjZSAtIG1p
bmltdW1TdWZmaXhMZW5ndGgpICsgMSwgbG9jYWxlSWRlbnRpZmllcik7CisgICAgaWYgKCFwcmVm
aXhMZW5ndGggfHwgcHJlZml4TGVuZ3RoIDwgbWluaW11bVByZWZpeExlbmd0aCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gV2hlbiBsYXN0U2FwY2UgaXMgYSBzcGFjZSwgd2hpY2ggaXQgYWx3
YXlzIGlzIGV4Y2VwdCBzb21ldGltZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgb3IgYWZ0
ZXIgY29sbGFwc2VkCisgICAgLy8gc3BhY2UsIGl0IHNob3VsZCBub3QgY291bnQgdG93YXJkcyBo
eXBoZW5hdGUtbGltaXQtYmVmb3JlLgorICAgIGlmIChwcmVmaXhMZW5ndGggPT0gbWluaW11bVBy
ZWZpeExlbmd0aCkgeworICAgICAgICBVQ2hhciBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9IHRleHQt
PmNoYXJhY3RlckF0KGxhc3RTcGFjZSk7CisgICAgICAgIGlmIChjaGFyYWN0ZXJBdExhc3RTcGFj
ZSA9PSAnICcgfHwgY2hhcmFjdGVyQXRMYXN0U3BhY2UgPT0gJ1xuJyB8fCBjaGFyYWN0ZXJBdExh
c3RTcGFjZSA9PSAnXHQnIHx8IGNoYXJhY3RlckF0TGFzdFNwYWNlID09IG5vQnJlYWtTcGFjZSkK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlQocG9zIC0gbGFzdFNwYWNl
IC0gcHJlZml4TGVuZ3RoID49IG1pbmltdW1TdWZmaXhMZW5ndGgpOworCisjaWYgIUFTU0VSVF9E
SVNBQkxFRAorICAgIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiBmYWxsYmFja0ZvbnRz
OworICAgIGZsb2F0IHByZWZpeFdpZHRoID0gaHlwaGVuV2lkdGggKyB0ZXh0V2lkdGgodGV4dCwg
bGFzdFNwYWNlLCBwcmVmaXhMZW5ndGgsIGZvbnQsIHhQb3MsIGlzRml4ZWRQaXRjaCwgY29sbGFw
c2VXaGl0ZVNwYWNlLCBmYWxsYmFja0ZvbnRzKSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAg
IEFTU0VSVCh4UG9zICsgcHJlZml4V2lkdGggPD0gYXZhaWxhYmxlV2lkdGgpOworI2Vsc2UKKyAg
ICBVTlVTRURfUEFSQU0oaXNGaXhlZFBpdGNoKTsKKyNlbmRpZgorCisgICAgbGluZUJyZWFrLm1v
dmVUbyh0ZXh0LCBsYXN0U3BhY2UgKyBwcmVmaXhMZW5ndGgsIG5leHRCcmVha2FibGUpOworICAg
IGh5cGhlbmF0ZWQgPSB0cnVlOworfQorCitpbmxpbmUgYm9vbCBCcmVha2luZ0NvbnRleHQ6Omhh
bmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cywgYm9vbCYgaHlwaGVu
YXRlZCwgIHVuc2lnbmVkJiBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcykKK3sKKyAgICBpZiAo
IW1fY3VycmVudC5tX3BvcykKKyAgICAgICAgbV9hcHBsaWVkU3RhcnRXaWR0aCA9IGZhbHNlOwor
CisgICAgUmVuZGVyVGV4dCogcmVuZGVyVGV4dCA9IHRvUmVuZGVyVGV4dChtX2N1cnJlbnQubV9v
YmopOworCisjaWYgRU5BQkxFKFNWRykKKyAgICBib29sIGlzU1ZHVGV4dCA9IHJlbmRlclRleHQt
PmlzU1ZHSW5saW5lVGV4dCgpOworI2VuZGlmCisKKyAgICAvLyBJZiB3ZSBoYXZlIGxlZnQgYSBu
by13cmFwIGlubGluZSBhbmQgZW50ZXJlZCBhbiBhdXRvd3JhcCBpbmxpbmUgd2hpbGUgaWdub3Jp
bmcgc3BhY2VzCisgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIG1hcmsgdGhlIHN0YXJ0IG9mIHRoZSBh
dXRvd3JhcCBpbmxpbmUgYXMgYSBwb3RlbnRpYWwgbGluZWJyZWFrIG5vdy4KKyAgICBpZiAobV9h
dXRvV3JhcCAmJiAhUmVuZGVyU3R5bGU6OmF1dG9XcmFwKG1fbGFzdFdTKSAmJiBtX2lnbm9yaW5n
U3BhY2VzKQorICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aChtX2N1cnJlbnQu
bV9vYmopOworCisgICAgaWYgKHJlbmRlclRleHQtPnN0eWxlKCkuaGFzVGV4dENvbWJpbmUoKSAm
JiBtX2N1cnJlbnQubV9vYmotPmlzQ29tYmluZVRleHQoKSAmJiAhdG9SZW5kZXJDb21iaW5lVGV4
dCgqbV9jdXJyZW50Lm1fb2JqKS5pc0NvbWJpbmVkKCkpIHsKKyAgICAgICAgUmVuZGVyQ29tYmlu
ZVRleHQmIGNvbWJpbmVSZW5kZXJlciA9IHRvUmVuZGVyQ29tYmluZVRleHQoKm1fY3VycmVudC5t
X29iaik7CisgICAgICAgIGNvbWJpbmVSZW5kZXJlci5jb21iaW5lVGV4dCgpOworICAgICAgICAv
LyBUaGUgbGVuZ3RoIG9mIHRoZSByZW5kZXJlcidzIHRleHQgbWF5IGhhdmUgY2hhbmdlZC4gSW5j
cmVtZW50IHN0YWxlIGl0ZXJhdG9yIHBvc2l0aW9ucworICAgICAgICBpZiAoaXRlcmF0b3JJc0Jl
eW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQobV9saW5lQnJlYWssIGNvbWJpbmVSZW5kZXJlcikp
IHsKKyAgICAgICAgICAgIEFTU0VSVChpdGVyYXRvcklzQmV5b25kRW5kT2ZSZW5kZXJDb21iaW5l
VGV4dChtX3Jlc29sdmVyLnBvc2l0aW9uKCksIGNvbWJpbmVSZW5kZXJlcikpOworICAgICAgICAg
ICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7CisgICAgICAgICAgICBtX3Jlc29sdmVyLmluY3Jl
bWVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxl
ID0gbGluZVN0eWxlKCpyZW5kZXJUZXh0LT5wYXJlbnQoKSwgbV9saW5lSW5mbyk7CisgICAgY29u
c3QgRm9udCYgZm9udCA9IHN0eWxlLmZvbnQoKTsKKyAgICBib29sIGlzRml4ZWRQaXRjaCA9IGZv
bnQuaXNGaXhlZFBpdGNoKCk7CisgICAgYm9vbCBjYW5IeXBoZW5hdGUgPSBzdHlsZS5oeXBoZW5z
KCkgPT0gSHlwaGVuc0F1dG8gJiYgV2ViQ29yZTo6Y2FuSHlwaGVuYXRlKHN0eWxlLmxvY2FsZSgp
KTsKKworICAgIHVuc2lnbmVkIGxhc3RTcGFjZSA9IG1fY3VycmVudC5tX3BvczsKKyAgICBmbG9h
dCB3b3JkU3BhY2luZyA9IG1fY3VycmVudFN0eWxlLT53b3JkU3BhY2luZygpOworICAgIGZsb2F0
IGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gMDsKKyAgICBmbG9hdCB3b3JkU3BhY2luZ0ZvcldvcmRN
ZWFzdXJlbWVudCA9IDA7CisKKyAgICBmbG9hdCB3cmFwVyA9IG1fd2lkdGgudW5jb21taXR0ZWRX
aWR0aCgpICsgaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaiwgIW1fYXBwbGllZFN0
YXJ0V2lkdGgsIHRydWUpOworICAgIGZsb2F0IGNoYXJXaWR0aCA9IDA7CisgICAgYm9vbCBicmVh
a05CU1AgPSBtX2F1dG9XcmFwICYmIG1fY3VycmVudFN0eWxlLT5uYnNwTW9kZSgpID09IFNQQUNF
OworICAgIC8vIEF1dG8td3JhcHBpbmcgdGV4dCBzaG91bGQgd3JhcCBpbiB0aGUgbWlkZGxlIG9m
IGEgd29yZCBvbmx5IGlmIGl0IGNvdWxkIG5vdCB3cmFwIGJlZm9yZSB0aGUgd29yZCwKKyAgICAv
LyB3aGljaCBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSB3b3JkIGlzIHRoZSBmaXJzdCB0aGluZyBv
biB0aGUgbGluZSwgdGhhdCBpcywgaWYgfHd8IGlzIHplcm8uCisgICAgYm9vbCBicmVha1dvcmRz
ID0gbV9jdXJyZW50U3R5bGUtPmJyZWFrV29yZHMoKSAmJiAoKG1fYXV0b1dyYXAgJiYgIW1fd2lk
dGguY29tbWl0dGVkV2lkdGgoKSkgfHwgbV9jdXJyV1MgPT0gUFJFKTsKKyAgICBib29sIG1pZFdv
cmRCcmVhayA9IGZhbHNlOworICAgIGJvb2wgYnJlYWtBbGwgPSBtX2N1cnJlbnRTdHlsZS0+d29y
ZEJyZWFrKCkgPT0gQnJlYWtBbGxXb3JkQnJlYWsgJiYgbV9hdXRvV3JhcDsKKyAgICBmbG9hdCBo
eXBoZW5XaWR0aCA9IDA7CisjaWYgRU5BQkxFKFNWRykKKyAgICBpZiAoaXNTVkdUZXh0KSB7Cisg
ICAgICAgIGJyZWFrV29yZHMgPSBmYWxzZTsKKyAgICAgICAgYnJlYWtBbGwgPSBmYWxzZTsKKyAg
ICB9CisjZW5kaWYKKworICAgIGlmIChtX3JlbmRlclRleHRJbmZvLm1fdGV4dCAhPSByZW5kZXJU
ZXh0KSB7CisgICAgICAgIHVwZGF0ZUNvdW50ZXJJZk5lZWRlZCgqcmVuZGVyVGV4dCk7CisgICAg
ICAgIG1fcmVuZGVyVGV4dEluZm8ubV90ZXh0ID0gcmVuZGVyVGV4dDsKKyAgICAgICAgbV9yZW5k
ZXJUZXh0SW5mby5tX2ZvbnQgPSAmZm9udDsKKyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xh
eW91dCA9IGZvbnQuY3JlYXRlTGF5b3V0KHJlbmRlclRleHQsIG1fd2lkdGguY3VycmVudFdpZHRo
KCksIG1fY29sbGFwc2VXaGl0ZVNwYWNlKTsKKyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xp
bmVCcmVha0l0ZXJhdG9yLnJlc2V0U3RyaW5nQW5kUmVsZWFzZUl0ZXJhdG9yKHJlbmRlclRleHQt
PnRleHQoKSwgc3R5bGUubG9jYWxlKCkpOworICAgIH0gZWxzZSBpZiAobV9yZW5kZXJUZXh0SW5m
by5tX2xheW91dCAmJiBtX3JlbmRlclRleHRJbmZvLm1fZm9udCAhPSAmZm9udCkgeworICAgICAg
ICBtX3JlbmRlclRleHRJbmZvLm1fZm9udCA9ICZmb250OworICAgICAgICBtX3JlbmRlclRleHRJ
bmZvLm1fbGF5b3V0ID0gZm9udC5jcmVhdGVMYXlvdXQocmVuZGVyVGV4dCwgbV93aWR0aC5jdXJy
ZW50V2lkdGgoKSwgbV9jb2xsYXBzZVdoaXRlU3BhY2UpOworICAgIH0KKworICAgIFRleHRMYXlv
dXQqIHRleHRMYXlvdXQgPSBtX3JlbmRlclRleHRJbmZvLm1fbGF5b3V0LmdldCgpOworCisgICAg
Ly8gTm9uLXplcm8gb25seSB3aGVuIGtlcm5pbmcgaXMgZW5hYmxlZCBhbmQgVGV4dExheW91dCBp
c24ndCB1c2VkLCBpbiB3aGljaCBjYXNlIHdlIG1lYXN1cmUKKyAgICAvLyB3b3JkcyB3aXRoIHRo
ZWlyIHRyYWlsaW5nIHNwYWNlLCB0aGVuIHN1YnRyYWN0IGl0cyB3aWR0aC4KKyAgICBIYXNoU2V0
PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4gZmFsbGJhY2tGb250czsKKyAgICBmbG9hdCB3b3JkVHJh
aWxpbmdTcGFjZVdpZHRoID0gKGZvbnQudHlwZXNldHRpbmdGZWF0dXJlcygpICYgS2VybmluZykg
JiYgIXRleHRMYXlvdXQgPyBmb250LndpZHRoKFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVu
KHJlbmRlclRleHQsIGZvbnQsICZzcGFjZSwgMSwgc3R5bGUpLCAmZmFsbGJhY2tGb250cykgKyB3
b3JkU3BhY2luZyA6IDA7CisKKyAgICBVQ2hhciBsYXN0Q2hhcmFjdGVyID0gbV9yZW5kZXJUZXh0
SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLmxhc3RDaGFyYWN0ZXIoKTsKKyAgICBVQ2hhciBzZWNv
bmRUb0xhc3RDaGFyYWN0ZXIgPSBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3Iu
c2Vjb25kVG9MYXN0Q2hhcmFjdGVyKCk7CisgICAgZm9yICg7IG1fY3VycmVudC5tX3BvcyA8IHJl
bmRlclRleHQtPnRleHRMZW5ndGgoKTsgbV9jdXJyZW50LmZhc3RJbmNyZW1lbnRJblRleHROb2Rl
KCkpIHsKKyAgICAgICAgYm9vbCBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UgPSBtX2N1cnJlbnRD
aGFyYWN0ZXJJc1NwYWNlOworICAgICAgICBib29sIHByZXZpb3VzQ2hhcmFjdGVySXNXUyA9IG1f
Y3VycmVudENoYXJhY3RlcklzV1M7CisgICAgICAgIFVDaGFyIGMgPSBtX2N1cnJlbnQuY3VycmVu
dCgpOworICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlID0gYyA9PSAnICcgfHwgYyA9
PSAnXHQnIHx8ICghbV9wcmVzZXJ2ZXNOZXdsaW5lICYmIChjID09ICdcbicpKTsKKworICAgICAg
ICBpZiAoIW1fY29sbGFwc2VXaGl0ZVNwYWNlIHx8ICFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNl
KQorICAgICAgICAgICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dp
ZHRoKTsKKworICAgICAgICBpZiAoYyA9PSBzb2Z0SHlwaGVuICYmIG1fYXV0b1dyYXAgJiYgIWh5
cGhlbldpZHRoICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkgeworICAgICAgICAg
ICAgaHlwaGVuV2lkdGggPSBtZWFzdXJlSHlwaGVuV2lkdGgocmVuZGVyVGV4dCwgZm9udCwgJmZh
bGxiYWNrRm9udHMpOworICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGh5
cGhlbldpZHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgYXBwbHlXb3JkU3BhY2luZyA9
IGZhbHNlOworCisgICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSBtX2N1cnJlbnRDaGFy
YWN0ZXJJc1NwYWNlIHx8IChicmVha05CU1AgJiYgYyA9PSBub0JyZWFrU3BhY2UpOworCisgICAg
ICAgIGlmICgoYnJlYWtBbGwgfHwgYnJlYWtXb3JkcykgJiYgIW1pZFdvcmRCcmVhayAmJiAoIW1f
Y3VycmVudENoYXJhY3RlcklzU3BhY2UgfHwgc3R5bGUud2hpdGVTcGFjZSgpICE9IFBSRV9XUkFQ
KSkgeworICAgICAgICAgICAgd3JhcFcgKz0gY2hhcldpZHRoOworICAgICAgICAgICAgYm9vbCBt
aWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPSBVMTZfSVNfTEVBRChjKSAmJiBtX2N1
cnJlbnQubV9wb3MgKyAxIDwgcmVuZGVyVGV4dC0+dGV4dExlbmd0aCgpICYmIFUxNl9JU19UUkFJ
TCgoKnJlbmRlclRleHQpW21fY3VycmVudC5tX3BvcyArIDFdKTsKKyAgICAgICAgICAgIGNoYXJX
aWR0aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBtX2N1cnJlbnQubV9wb3MsIG1pZFdvcmRCcmVh
a0lzQmVmb3JlU3Vycm9nYXRlUGFpciA/IDIgOiAxLCBmb250LCBtX3dpZHRoLmNvbW1pdHRlZFdp
ZHRoKCkgKyB3cmFwVywgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgZmFsbGJh
Y2tGb250cywgdGV4dExheW91dCk7CisgICAgICAgICAgICBtaWRXb3JkQnJlYWsgPSBtX3dpZHRo
LmNvbW1pdHRlZFdpZHRoKCkgKyB3cmFwVyArIGNoYXJXaWR0aCA+IG1fd2lkdGguYXZhaWxhYmxl
V2lkdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgYmV0d2VlbldvcmRzID0gYyA9PSAn
XG4nIHx8IChtX2N1cnJXUyAhPSBQUkUgJiYgIW1fYXRTdGFydCAmJiBpc0JyZWFrYWJsZShtX3Jl
bmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IsIG1fY3VycmVudC5tX3BvcywgbV9jdXJy
ZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBicmVha05CU1ApCisgICAgICAgICAgICAmJiAo
c3R5bGUuaHlwaGVucygpICE9IEh5cGhlbnNOb25lIHx8IChtX2N1cnJlbnQucHJldmlvdXNJblNh
bWVOb2RlKCkgIT0gc29mdEh5cGhlbikpKTsKKworICAgICAgICBpZiAoYmV0d2VlbldvcmRzIHx8
IG1pZFdvcmRCcmVhaykgeworICAgICAgICAgICAgYm9vbCBzdG9wcGVkSWdub3JpbmdTcGFjZXMg
PSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzKSB7CisgICAgICAgICAg
ICAgICAgbGFzdFNwYWNlV29yZFNwYWNpbmcgPSAwOworICAgICAgICAgICAgICAgIGlmICghbV9j
dXJyZW50Q2hhcmFjdGVySXNTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGln
bm9yaW5nIHNwYWNlcyBhbmQgYmVnaW4gYXQgdGhpcworICAgICAgICAgICAgICAgICAgICAvLyBu
ZXcgcG9pbnQuCisgICAgICAgICAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSBmYWxzZTsK
KyAgICAgICAgICAgICAgICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAwOwor
ICAgICAgICAgICAgICAgICAgICBsYXN0U3BhY2UgPSBtX2N1cnJlbnQubV9wb3M7IC8vIGUuZy4s
ICJGb28gICAgZ29vIiwgZG9uJ3QgYWRkIGluIGFueSBvZiB0aGUgaWdub3JlZCBzcGFjZXMuCisg
ICAgICAgICAgICAgICAgICAgIHN0b3BJZ25vcmluZ1NwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRl
LCBJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3BvcykpOwor
ICAgICAgICAgICAgICAgICAgICBzdG9wcGVkSWdub3JpbmdTcGFjZXMgPSB0cnVlOworICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEp1c3Qga2VlcCBpZ25v
cmluZyB0aGVzZSBzcGFjZXMuCisgICAgICAgICAgICAgICAgICAgIG5leHRDaGFyYWN0ZXIoYywg
bGFzdENoYXJhY3Rlciwgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyKTsKKyAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICB3b3JkTWVhc3VyZW1lbnRzLmdyb3cod29yZE1lYXN1cmVtZW50cy5zaXplKCkgKyAxKTsK
KyAgICAgICAgICAgIFdvcmRNZWFzdXJlbWVudCYgd29yZE1lYXN1cmVtZW50ID0gd29yZE1lYXN1
cmVtZW50cy5sYXN0KCk7CisKKyAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9
IHJlbmRlclRleHQ7CisgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9j
dXJyZW50Lm1fcG9zOworICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0ID0g
bGFzdFNwYWNlOworCisgICAgICAgICAgICBmbG9hdCBhZGRpdGlvbmFsVGVtcFdpZHRoOworICAg
ICAgICAgICAgaWYgKHdvcmRUcmFpbGluZ1NwYWNlV2lkdGggJiYgYyA9PSAnICcpCisgICAgICAg
ICAgICAgICAgYWRkaXRpb25hbFRlbXBXaWR0aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBsYXN0
U3BhY2UsIG1fY3VycmVudC5tX3BvcyArIDEgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3Vy
cmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFz
dXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSAtIHdvcmRUcmFpbGluZ1NwYWNlV2lk
dGg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWRkaXRpb25hbFRlbXBXaWR0
aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVudC5tX3BvcyAtIGxh
c3RTcGFjZSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2Nv
bGxhcHNlV2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlv
dXQpOworCisgICAgICAgICAgICBpZiAod29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuaXNF
bXB0eSgpICYmICFmYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICB3b3Jk
TWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5zd2FwKGZhbGxiYWNrRm9udHMpOworICAgICAgICAg
ICAgZmFsbGJhY2tGb250cy5jbGVhcigpOworCisgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQu
d2lkdGggPSBhZGRpdGlvbmFsVGVtcFdpZHRoICsgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1l
bnQ7CisgICAgICAgICAgICBhZGRpdGlvbmFsVGVtcFdpZHRoICs9IGxhc3RTcGFjZVdvcmRTcGFj
aW5nOworICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxU
ZW1wV2lkdGgpOworCisgICAgICAgICAgICBpZiAobV9jb2xsYXBzZVdoaXRlU3BhY2UgJiYgcHJl
dmlvdXNDaGFyYWN0ZXJJc1NwYWNlICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgYWRk
aXRpb25hbFRlbXBXaWR0aCkKKyAgICAgICAgICAgICAgICBtX3dpZHRoLnNldFRyYWlsaW5nV2hp
dGVzcGFjZVdpZHRoKGFkZGl0aW9uYWxUZW1wV2lkdGgpOworCisgICAgICAgICAgICBpZiAoIW1f
YXBwbGllZFN0YXJ0V2lkdGgpIHsKKyAgICAgICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0
dGVkV2lkdGgoaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaiwgdHJ1ZSwgZmFsc2Up
KTsKKyAgICAgICAgICAgICAgICBtX2FwcGxpZWRTdGFydFdpZHRoID0gdHJ1ZTsKKyAgICAgICAg
ICAgIH0KKworI2lmIEVOQUJMRShDU1NfU0hBUEVTKQorICAgICAgICAgICAgaWYgKG1fbGFzdEZs
b2F0RnJvbVByZXZpb3VzTGluZSkKKyAgICAgICAgICAgICAgICB1cGRhdGVTZWdtZW50c0ZvclNo
YXBlcyhtX2Jsb2NrLCBtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHdvcmRNZWFzdXJlbWVu
dHMsIG1fd2lkdGgsIG1fbGluZUluZm8uaXNGaXJzdExpbmUoKSk7CisjZW5kaWYKKyAgICAgICAg
ICAgIGFwcGx5V29yZFNwYWNpbmcgPSB3b3JkU3BhY2luZyAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlOworCisgICAgICAgICAgICBpZiAoIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiBt
X2F1dG9XcmFwICYmICFtX3dpZHRoLmZpdHNPbkxpbmUoKSkKKyAgICAgICAgICAgICAgICBtX3dp
ZHRoLmZpdEJlbG93RmxvYXRzKCk7CisKKyAgICAgICAgICAgIGlmIChtX2F1dG9XcmFwIHx8IGJy
ZWFrV29yZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBicmVhayBvbmx5IGFmdGVyIHdo
aXRlLXNwYWNlLCBjb25zaWRlciB0aGUgY3VycmVudCBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAg
ICAvLyBhcyBjYW5kaWRhdGUgd2lkdGggZm9yIHRoaXMgbGluZS4KKyAgICAgICAgICAgICAgICBi
b29sIGxpbmVXYXNUb29XaWRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1fd2lkdGgu
Zml0c09uTGluZSgpICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgbV9jdXJyZW50U3R5
bGUtPmJyZWFrT25seUFmdGVyV2hpdGVTcGFjZSgpICYmICFtaWRXb3JkQnJlYWspIHsKKyAgICAg
ICAgICAgICAgICAgICAgZmxvYXQgY2hhcldpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIG1f
Y3VycmVudC5tX3BvcywgMSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBp
dGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMs
IHRleHRMYXlvdXQpICsgKGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDApOworICAg
ICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBsaW5lIGlzIHRvbyBiaWcgZXZlbiB3aXRob3V0
IHRoZSBleHRyYSBzcGFjZQorICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRo
ZSBsaW5lLiBJZiBpdCBpcyBub3QsIGRvIG5vdGhpbmcuCisgICAgICAgICAgICAgICAgICAgIC8v
IElmIHRoZSBsaW5lIG5lZWRzIHRoZSBleHRyYSB3aGl0ZXNwYWNlIHRvIGJlIHRvbyBsb25nLAor
ICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIG1vdmUgdGhlIGxpbmUgYnJlYWsgdG8gdGhlIHNw
YWNlIGFuZCBza2lwIGFsbAorICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHdoaXRl
c3BhY2UuCisgICAgICAgICAgICAgICAgICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lSW5jbHVk
aW5nRXh0cmFXaWR0aChjaGFyV2lkdGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5l
V2FzVG9vV2lkZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5t
b3ZlVG8obV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRC
cmVha2FibGVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVha2Vy
LnNraXBUcmFpbGluZ1doaXRlc3BhY2UobV9saW5lQnJlYWssIG1fbGluZUluZm8pOworICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChs
aW5lV2FzVG9vV2lkZSB8fCAhbV93aWR0aC5maXRzT25MaW5lKCkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKGNhbkh5cGhlbmF0ZSAmJiAhbV93aWR0aC5maXRzT25MaW5lKCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHRyeUh5cGhlbmF0aW5nKHJlbmRlclRleHQsIGZvbnQsIHN0eWxl
LmxvY2FsZSgpLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgbV9ibG9ja1N0eWxlLmh5cGhl
bmF0aW9uTGltaXRMaW5lcygpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCksIHN0eWxl
Lmh5cGhlbmF0aW9uTGltaXRBZnRlcigpLCBsYXN0U3BhY2UsIG1fY3VycmVudC5tX3BvcywgbV93
aWR0aC5jdXJyZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lkdGgsIG1fd2lkdGguYXZhaWxh
YmxlV2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgbGFzdFNwYWNl
V29yZFNwYWNpbmcsIG1fbGluZUJyZWFrLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRp
b24sIG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGlmIChtX2xpbmVCcmVha2VyLm1faHlwaGVuYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG1fYXRFbmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWsuYXRUZXh0UGFyYWdyYXBoU2Vw
YXJhdG9yKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcHBlZElnbm9yaW5n
U3BhY2VzICYmIG1fY3VycmVudC5tX3BvcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9jdXJy
ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xpbmVCcm9rZUNs
ZWFubHkodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5k
T2Zmc2V0ID0gbV9saW5lQnJlYWsubV9wb3M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAgICAgaWYgKG1fbGluZUJyZWFrLm1fb2JqICYmIG1fbGluZUJyZWFrLm1fcG9z
ICYmIG1fbGluZUJyZWFrLm1fb2JqLT5pc1RleHQoKSAmJiB0b1JlbmRlclRleHQobV9saW5lQnJl
YWsubV9vYmopLT50ZXh0TGVuZ3RoKCkgJiYgdG9SZW5kZXJUZXh0KG1fbGluZUJyZWFrLm1fb2Jq
KS0+Y2hhcmFjdGVyQXQobV9saW5lQnJlYWsubV9wb3MgLSAxKSA9PSBzb2Z0SHlwaGVuICYmIHN0
eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGh5
cGhlbmF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWsubV9w
b3MgJiYgbV9saW5lQnJlYWsubV9wb3MgIT0gKHVuc2lnbmVkKXdvcmRNZWFzdXJlbWVudC5lbmRP
ZmZzZXQgJiYgIXdvcmRNZWFzdXJlbWVudC53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKGNoYXJXaWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRNZWFz
dXJlbWVudC5lbmRPZmZzZXQgPSBtX2xpbmVCcmVhay5tX3BvczsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQud2lkdGggPSBjaGFyV2lkdGg7CisgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgLy8gRGlkbid0IGZpdC4gSnVtcCB0byB0aGUgZW5kIHVubGVzcyB0aGVyZSdzIHN0aWxsIGFu
IG9wcG9ydHVuaXR5IHRvIGNvbGxhcHNlIHdoaXRlc3BhY2UuCisgICAgICAgICAgICAgICAgICAg
IGlmIChtX2lnbm9yaW5nU3BhY2VzIHx8ICFtX2NvbGxhcHNlV2hpdGVTcGFjZSB8fCAhbV9jdXJy
ZW50Q2hhcmFjdGVySXNTcGFjZSB8fCAhcHJldmlvdXNDaGFyYWN0ZXJJc1NwYWNlKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmV0d2VlbldvcmRzIHx8IChtaWRX
b3JkQnJlYWsgJiYgIW1fYXV0b1dyYXApKQorICAgICAgICAgICAgICAgICAgICAgICAgbV93aWR0
aC5hZGRVbmNvbW1pdHRlZFdpZHRoKC1hZGRpdGlvbmFsVGVtcFdpZHRoKTsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKGh5cGhlbldpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBT
dWJ0cmFjdCB0aGUgd2lkdGggb2YgdGhlIHNvZnQgaHlwaGVuIG91dCBzaW5jZSB3ZSBmaXQgb24g
YSBsaW5lLgorICAgICAgICAgICAgICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdp
ZHRoKC1oeXBoZW5XaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoeXBoZW5XaWR0aCA9
IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGlmIChjID09ICdcbicgJiYgbV9wcmVzZXJ2ZXNOZXdsaW5lKSB7
CisgICAgICAgICAgICAgICAgaWYgKCFzdG9wcGVkSWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50
Lm1fcG9zID4gMCkKKyAgICAgICAgICAgICAgICAgICAgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVC
b3gobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9jdXJyZW50KTsKKyAgICAgICAgICAgICAgICBtX2xp
bmVCcmVhay5tb3ZlVG8obV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVu
dC5tX25leHRCcmVha2FibGVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsu
aW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xpbmVC
cm9rZUNsZWFubHkodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGlmIChtX2F1dG9XcmFwICYmIGJldHdlZW5Xb3Jkcykgewor
ICAgICAgICAgICAgICAgIG1fd2lkdGguY29tbWl0KCk7CisgICAgICAgICAgICAgICAgd3JhcFcg
PSAwOworICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQubV9vYmos
IG1fY3VycmVudC5tX3BvcywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uKTsKKyAg
ICAgICAgICAgICAgICAvLyBBdXRvLXdyYXBwaW5nIHRleHQgc2hvdWxkIG5vdCB3cmFwIGluIHRo
ZSBtaWRkbGUgb2YgYSB3b3JkIG9uY2UgaXQgaGFzIGhhZCBhbgorICAgICAgICAgICAgICAgIC8v
IG9wcG9ydHVuaXR5IHRvIGJyZWFrIGFmdGVyIGEgd29yZC4KKyAgICAgICAgICAgICAgICBicmVh
a1dvcmRzID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtaWRXb3Jk
QnJlYWsgJiYgIVUxNl9JU19UUkFJTChjKSAmJiAhKFVfR0VUX0dDX01BU0soYykgJiBVX0dDX01f
TUFTSykpIHsKKyAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIGFzIGEgYnJlYWthYmxl
IHBvc2l0aW9uIGluIGNhc2UKKyAgICAgICAgICAgICAgICAvLyBhZGRpbmcgdGhlIGVuZCB3aWR0
aCBmb3JjZXMgYSBicmVhay4KKyAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8obV9j
dXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2FibGVQ
b3NpdGlvbik7CisgICAgICAgICAgICAgICAgbWlkV29yZEJyZWFrICY9IChicmVha1dvcmRzIHx8
IGJyZWFrQWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJldHdlZW5Xb3Jk
cykgeworICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gYXBwbHlXb3JkU3Bh
Y2luZyA/IHdvcmRTcGFjaW5nIDogMDsKKyAgICAgICAgICAgICAgICB3b3JkU3BhY2luZ0Zvcldv
cmRNZWFzdXJlbWVudCA9IChhcHBseVdvcmRTcGFjaW5nICYmIHdvcmRNZWFzdXJlbWVudC53aWR0
aCkgPyB3b3JkU3BhY2luZyA6IDA7CisgICAgICAgICAgICAgICAgbGFzdFNwYWNlID0gbV9jdXJy
ZW50Lm1fcG9zOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1faWdub3JpbmdT
cGFjZXMgJiYgbV9jdXJyZW50U3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpKSB7CisgICAgICAg
ICAgICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgbmV3bGluZSwgb3IgaWYgd2UgZW5jb3VudGVy
IGEKKyAgICAgICAgICAgICAgICAvLyBzZWNvbmQgc3BhY2UsIHdlIG5lZWQgdG8gZ28gYWhlYWQg
YW5kIGJyZWFrIHVwIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBydW4gYW5kIGVudGVyIGEgbW9k
ZSB3aGVyZSB3ZSBzdGFydCBjb2xsYXBzaW5nIHNwYWNlcy4KKyAgICAgICAgICAgICAgICBpZiAo
bV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UpIHsK
KyAgICAgICAgICAgICAgICAgICAgbV9pZ25vcmluZ1NwYWNlcyA9IHRydWU7CisKKyAgICAgICAg
ICAgICAgICAgICAgLy8gV2UganVzdCBlbnRlcmVkIGEgbW9kZSB3aGVyZSB3ZSBhcmUgaWdub3Jp
bmcKKyAgICAgICAgICAgICAgICAgICAgLy8gc3BhY2VzLiBDcmVhdGUgYSBtaWRwb2ludCB0byB0
ZXJtaW5hdGUgdGhlIHJ1bgorICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHNlY29u
ZCBzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgc3RhcnRJZ25vcmluZ1NwYWNlcyhtX2xpbmVN
aWRwb2ludFN0YXRlLCBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzKTsKKyAgICAgICAgICAgICAgICAg
ICAgbV90cmFpbGluZ09iamVjdHMudXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxpbmdCb3hlcyhtX2xp
bmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigpLCBUcmFpbGluZ09iamVjdHM6OkRvTm90
Q29sbGFwc2VGaXJzdFNwYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0gZWxzZSBpZiAobV9pZ25vcmluZ1NwYWNlcykgeworICAgICAgICAgICAgLy8gU3Rv
cCBpZ25vcmluZyBzcGFjZXMgYW5kIGJlZ2luIGF0IHRoaXMKKyAgICAgICAgICAgIC8vIG5ldyBw
b2ludC4KKyAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSBmYWxzZTsKKyAgICAgICAgICAg
IGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFjaW5nIDog
MDsKKyAgICAgICAgICAgIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50ID0gKGFwcGx5V29y
ZFNwYWNpbmcgJiYgd29yZE1lYXN1cmVtZW50cy5sYXN0KCkud2lkdGgpID8gd29yZFNwYWNpbmcg
OiAwOworICAgICAgICAgICAgbGFzdFNwYWNlID0gbV9jdXJyZW50Lm1fcG9zOyAvLyBlLmcuLCAi
Rm9vICAgIGdvbyIsIGRvbid0IGFkZCBpbiBhbnkgb2YgdGhlIGlnbm9yZWQgc3BhY2VzLgorICAg
ICAgICAgICAgc3RvcElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0
ZXJhdG9yKDAsIG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1fcG9zKSk7CisgICAgICAgIH0K
KyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBpZiAoaXNTVkdUZXh0ICYmIG1fY3VycmVudC5tX3Bv
cyA+IDApIHsKKyAgICAgICAgICAgIC8vIEZvcmNlIGNyZWF0aW9uIG9mIG5ldyBJbmxpbmVCb3hl
cyBmb3IgZWFjaCBhYnNvbHV0ZSBwb3NpdGlvbmVkIGNoYXJhY3RlciAodGhvc2UgdGhhdCBzdGFy
dCBuZXcgdGV4dCBjaHVua3MpLgorICAgICAgICAgICAgaWYgKHRvUmVuZGVyU1ZHSW5saW5lVGV4
dChyZW5kZXJUZXh0KS0+Y2hhcmFjdGVyU3RhcnRzTmV3VGV4dENodW5rKG1fY3VycmVudC5tX3Bv
cykpCisgICAgICAgICAgICAgICAgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gobV9saW5lTWlk
cG9pbnRTdGF0ZSwgbV9jdXJyZW50KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYg
KG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgIXByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSkg
eworICAgICAgICAgICAgbV9zdGFydE9mSWdub3JlZFNwYWNlcy5tX29iaiA9IG1fY3VycmVudC5t
X29iajsKKyAgICAgICAgICAgIG1fc3RhcnRPZklnbm9yZWRTcGFjZXMubV9wb3MgPSBtX2N1cnJl
bnQubV9wb3M7CisgICAgICAgICAgICAvLyBTcGFjZXMgYWZ0ZXIgcmlnaHQtYWxpZ25lZCB0ZXh0
IGFuZCBiZWZvcmUgYSBsaW5lLWJyZWFrIGdldCBjb2xsYXBzZWQgYXdheSBjb21wbGV0ZWx5IHNv
IHRoYXQgdGhlIHRyYWlsaW5nCisgICAgICAgICAgICAvLyBzcGFjZSBkb2Vzbid0IHNlZW0gdG8g
cHVzaCB0aGUgdGV4dCBvdXQgZnJvbSB0aGUgcmlnaHQtaGFuZCBlZGdlLgorICAgICAgICAgICAg
Ly8gRklYTUU6IERvIHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgY29udGFpbmVyJ3MgYWxpZ25tZW50
IC0gd2lsbCByZXF1aXJlIHJlYmFzZWxpbmluZyBhIGxvdCBvZiB0ZXN0IHJlc3VsdHMuCisgICAg
ICAgICAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1fbmV4dE9iamVjdC0+aXNCUigpICYmIChtX2Js
b2NrU3R5bGUudGV4dEFsaWduKCkgPT0gUklHSFQgfHwgbV9ibG9ja1N0eWxlLnRleHRBbGlnbigp
ID09IFdFQktJVF9SSUdIVCkpIHsKKyAgICAgICAgICAgICAgICBtX3N0YXJ0T2ZJZ25vcmVkU3Bh
Y2VzLm1fcG9zLS07CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBqdXN0IGEgc2luZ2xl
IHRyYWlsaW5nIHNwYWNlIHN0YXJ0IGlnbm9yaW5nIGl0IG5vdyBzbyBpdCBjb2xsYXBzZXMgYXdh
eS4KKyAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50Lm1fcG9zID09IHJlbmRlclRleHQtPnRl
eHRMZW5ndGgoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0SWdub3JpbmdTcGFjZXMo
bV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9zdGFydE9mSWdub3JlZFNwYWNlcyk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2Ug
JiYgcHJldmlvdXNDaGFyYWN0ZXJJc1dTKSB7CisgICAgICAgICAgICBpZiAobV9hdXRvV3JhcCAm
JiBtX2N1cnJlbnRTdHlsZS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkpCisgICAgICAgICAg
ICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1fcG9z
LCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKG1fY29sbGFwc2VXaGl0ZVNwYWNlICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2Ug
JiYgIW1faWdub3JpbmdTcGFjZXMpCisgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5zZXRU
cmFpbGluZ1doaXRlc3BhY2UodG9SZW5kZXJUZXh0KG1fY3VycmVudC5tX29iaikpOworICAgICAg
ICBlbHNlIGlmICghbV9jdXJyZW50U3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpIHx8ICFtX2N1
cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQorICAgICAgICAgICAgbV90cmFpbGluZ09iamVjdHMuY2xl
YXIoKTsKKworICAgICAgICBtX2F0U3RhcnQgPSBmYWxzZTsKKyAgICAgICAgbmV4dENoYXJhY3Rl
cihjLCBsYXN0Q2hhcmFjdGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpOworICAgIH0KKworICAg
IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5zZXRQcmlvckNvbnRleHQobGFz
dENoYXJhY3Rlciwgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyKTsKKworICAgIHdvcmRNZWFzdXJlbWVu
dHMuZ3Jvdyh3b3JkTWVhc3VyZW1lbnRzLnNpemUoKSArIDEpOworICAgIFdvcmRNZWFzdXJlbWVu
dCYgd29yZE1lYXN1cmVtZW50ID0gd29yZE1lYXN1cmVtZW50cy5sYXN0KCk7CisgICAgd29yZE1l
YXN1cmVtZW50LnJlbmRlcmVyID0gcmVuZGVyVGV4dDsKKworICAgIC8vIElNUE9SVEFOVDogY3Vy
cmVudC5tX3BvcyBpcyA+IGxlbmd0aCBoZXJlIQorICAgIGZsb2F0IGFkZGl0aW9uYWxUZW1wV2lk
dGggPSBtX2lnbm9yaW5nU3BhY2VzID8gMCA6IHRleHRXaWR0aChyZW5kZXJUZXh0LCBsYXN0U3Bh
Y2UsIG1fY3VycmVudC5tX3BvcyAtIGxhc3RTcGFjZSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lk
dGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50
LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOworICAgIHdvcmRNZWFzdXJlbWVudC5zdGFydE9m
ZnNldCA9IGxhc3RTcGFjZTsKKyAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9jdXJy
ZW50Lm1fcG9zOworICAgIHdvcmRNZWFzdXJlbWVudC53aWR0aCA9IG1faWdub3JpbmdTcGFjZXMg
PyAwIDogYWRkaXRpb25hbFRlbXBXaWR0aCArIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50
OworICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggKz0gbGFzdFNwYWNlV29yZFNwYWNpbmc7CisKKyAg
ICBmbG9hdCBpbmxpbmVMb2dpY2FsVGVtcFdpZHRoID0gaW5saW5lTG9naWNhbFdpZHRoKG1fY3Vy
cmVudC5tX29iaiwgIW1fYXBwbGllZFN0YXJ0V2lkdGgsIG1faW5jbHVkZUVuZFdpZHRoKTsKKyAg
ICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0aCArIGlubGlu
ZUxvZ2ljYWxUZW1wV2lkdGgpOworCisgICAgaWYgKHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0Zv
bnRzLmlzRW1wdHkoKSAmJiAhZmFsbGJhY2tGb250cy5pc0VtcHR5KCkpCisgICAgICAgIHdvcmRN
ZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLnN3YXAoZmFsbGJhY2tGb250cyk7CisgICAgZmFsbGJh
Y2tGb250cy5jbGVhcigpOworCisgICAgaWYgKG1fY29sbGFwc2VXaGl0ZVNwYWNlICYmIG1fY3Vy
cmVudENoYXJhY3RlcklzU3BhY2UgJiYgYWRkaXRpb25hbFRlbXBXaWR0aCkKKyAgICAgICAgbV93
aWR0aC5zZXRUcmFpbGluZ1doaXRlc3BhY2VXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoLCBpbmxp
bmVMb2dpY2FsVGVtcFdpZHRoKTsKKworICAgIG1faW5jbHVkZUVuZFdpZHRoID0gZmFsc2U7CisK
KyAgICBpZiAoIW1fd2lkdGguZml0c09uTGluZSgpKSB7CisgICAgICAgIGlmIChjYW5IeXBoZW5h
dGUpCisgICAgICAgICAgICB0cnlIeXBoZW5hdGluZyhyZW5kZXJUZXh0LCBmb250LCBzdHlsZS5s
b2NhbGUoKSwgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5h
dGlvbkxpbWl0TGluZXMoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpLCBzdHlsZS5o
eXBoZW5hdGlvbkxpbWl0QWZ0ZXIoKSwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MsIG1fd2lk
dGguY3VycmVudFdpZHRoKCkgLSBhZGRpdGlvbmFsVGVtcFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJs
ZVdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdv
cmRTcGFjaW5nLCBtX2xpbmVCcmVhaywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9u
LCBtX2xpbmVCcmVha2VyLm1faHlwaGVuYXRlZCk7CisKKyAgICAgICAgaWYgKCFoeXBoZW5hdGVk
ICYmIG1fbGluZUJyZWFrLnByZXZpb3VzSW5TYW1lTm9kZSgpID09IHNvZnRIeXBoZW4gJiYgc3R5
bGUuaHlwaGVucygpICE9IEh5cGhlbnNOb25lKSB7CisgICAgICAgICAgICBoeXBoZW5hdGVkID0g
dHJ1ZTsKKyAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAg
IHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgdGV4dEJlZ2luc1dpdGhCcmVha2FibGVQ
b3NpdGlvbihSZW5kZXJPYmplY3QqIG5leHQpCit7CisgICAgQVNTRVJUKG5leHQtPmlzVGV4dCgp
KTsKKyAgICBSZW5kZXJUZXh0KiBuZXh0VGV4dCA9IHRvUmVuZGVyVGV4dChuZXh0KTsKKyAgICBp
ZiAoIW5leHRUZXh0LT50ZXh0TGVuZ3RoKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBV
Q2hhciBjID0gbmV4dFRleHQtPmNoYXJhY3RlckF0KDApOworICAgIHJldHVybiBjID09ICcgJyB8
fCBjID09ICdcdCcgfHwgKGMgPT0gJ1xuJyAmJiAhbmV4dFRleHQtPnByZXNlcnZlc05ld2xpbmUo
KSk7Cit9CisKK2lubGluZSBib29sIEJyZWFraW5nQ29udGV4dDo6Y2FuQnJlYWtBdFRoaXNQb3Np
dGlvbigpCit7CisgICAgLy8gSWYgd2UgYXJlIG5vLXdyYXAgYW5kIGhhdmUgZm91bmQgYSBsaW5l
LWJyZWFraW5nIG9wcG9ydHVuaXR5IGFscmVhZHkgdGhlbiB3ZSBzaG91bGQgdGFrZSBpdC4KKyAg
ICBpZiAobV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICYmICFtX3dpZHRoLmZpdHNPbkxpbmUobV9j
dXJyZW50Q2hhcmFjdGVySXNTcGFjZSkgJiYgbV9jdXJyV1MgPT0gTk9XUkFQKQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKworICAgIC8vIEF2b2lkIGJyZWFraW5nIGJlZm9yZSBlbXB0eSBpbmxpbmVz
LgorICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5pc1JlbmRlcklubGluZSgp
ICYmIGlzRW1wdHlJbmxpbmUodG9SZW5kZXJJbmxpbmUoKm1fbmV4dE9iamVjdCkpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBSZXR1cm4gZWFybHkgaWYgd2UgYXV0b3dyYXAgYW5k
IHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBhIHNwYWNlIGFzIHdlIHdpbGwgYWx3YXlzIHdhbnQg
dG8gYnJlYWsgYXQgc3VjaCBhIHBvc2l0aW9uLgorICAgIGlmIChtX2F1dG9XcmFwICYmIG1fY3Vy
cmVudENoYXJhY3RlcklzU3BhY2UpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKG1f
bmV4dE9iamVjdCAmJiBtX25leHRPYmplY3QtPmlzTGluZUJyZWFrT3Bwb3J0dW5pdHkoKSkKKyAg
ICAgICAgcmV0dXJuIG1fYXV0b1dyYXA7CisKKyAgICBib29sIG5leHRJc0F1dG9XcmFwcGluZ1Rl
eHQgPSAobV9uZXh0T2JqZWN0ICYmIG1fbmV4dE9iamVjdC0+aXNUZXh0KCkgJiYgKG1fYXV0b1dy
YXAgfHwgbV9uZXh0T2JqZWN0LT5zdHlsZSgpLmF1dG9XcmFwKCkpKTsKKyAgICBpZiAoIW5leHRJ
c0F1dG9XcmFwcGluZ1RleHQpCisgICAgICAgIHJldHVybiBtX2F1dG9XcmFwOworICAgIGJvb2wg
Y3VycmVudElzVGV4dE9yRW1wdHlJbmxpbmUgPSBtX2N1cnJlbnQubV9vYmotPmlzVGV4dCgpIHx8
IChtX2N1cnJlbnQubV9vYmotPmlzUmVuZGVySW5saW5lKCkgJiYgaXNFbXB0eUlubGluZSh0b1Jl
bmRlcklubGluZSgqbV9jdXJyZW50Lm1fb2JqKSkpOworICAgIGlmICghY3VycmVudElzVGV4dE9y
RW1wdHlJbmxpbmUpCisgICAgICAgIHJldHVybiBtX2F1dG9XcmFwOworCisgICAgYm9vbCBjYW5C
cmVha0hlcmUgPSAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiB0ZXh0QmVnaW5zV2l0aEJy
ZWFrYWJsZVBvc2l0aW9uKG1fbmV4dE9iamVjdCk7CisKKyAgICAvLyBTZWUgaWYgYXR0ZW1wdGlu
ZyB0byBmaXQgYmVsb3cgZmxvYXRzIGNyZWF0ZXMgbW9yZSBhdmFpbGFibGUgd2lkdGggb24gdGhl
IGxpbmUuCisgICAgaWYgKCFtX3dpZHRoLmZpdHNPbkxpbmUoKSAmJiAhbV93aWR0aC5jb21taXR0
ZWRXaWR0aCgpKQorICAgICAgICBtX3dpZHRoLmZpdEJlbG93RmxvYXRzKCk7CisKKyAgICBib29s
IGNhblBsYWNlT25MaW5lID0gbV93aWR0aC5maXRzT25MaW5lKCkgfHwgIW1fYXV0b1dyYXBXYXNF
dmVyVHJ1ZU9uTGluZTsKKworICAgIGlmIChjYW5QbGFjZU9uTGluZSAmJiBjYW5CcmVha0hlcmUp
CisgICAgICAgIGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRoKG1fbmV4dE9iamVjdCk7CisK
KyAgICByZXR1cm4gY2FuQnJlYWtIZXJlOworfQorCitpbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRl
eHQ6OmNvbW1pdEFuZFVwZGF0ZUxpbmVCcmVha0lmTmVlZGVkKCkKK3sKKyAgICBib29sIGNoZWNr
Rm9yQnJlYWsgPSBjYW5CcmVha0F0VGhpc1Bvc2l0aW9uKCk7CisKKyAgICBpZiAoY2hlY2tGb3JC
cmVhayAmJiAhbV93aWR0aC5maXRzT25MaW5lKG1faWdub3JpbmdTcGFjZXMpKSB7CisgICAgICAg
IC8vIGlmIHdlIGhhdmUgZmxvYXRzLCB0cnkgdG8gZ2V0IGJlbG93IHRoZW0uCisgICAgICAgIGlm
IChtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3Vy
cmVudFN0eWxlLT5jb2xsYXBzZVdoaXRlU3BhY2UoKSkKKyAgICAgICAgICAgIG1fdHJhaWxpbmdP
YmplY3RzLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSkg
eworICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKworICAgICAgICBtX3dpZHRoLmZpdEJlbG93RmxvYXRzKCk7CisKKyAgICAgICAgLy8g
fHdpZHRofCBtYXkgaGF2ZSBiZWVuIGFkanVzdGVkIGJlY2F1c2Ugd2UgZ290IHNob3ZlZCBkb3du
IHBhc3QgYSBmbG9hdCAodGh1cworICAgICAgICAvLyBnaXZpbmcgdXMgbW9yZSByb29tKSwgc28g
d2UgbmVlZCB0byByZXRlc3QsIGFuZCBvbmx5IGp1bXAgdG8KKyAgICAgICAgLy8gdGhlIGVuZCBs
YWJlbCBpZiB3ZSBzdGlsbCBkb24ndCBmaXQgb24gdGhlIGxpbmUuIC1kd2gKKyAgICAgICAgaWYg
KCFtX3dpZHRoLmZpdHNPbkxpbmUobV9pZ25vcmluZ1NwYWNlcykpIHsKKyAgICAgICAgICAgIG1f
YXRFbmQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNl
IGlmIChtX2Jsb2NrU3R5bGUuYXV0b1dyYXAoKSAmJiAhbV93aWR0aC5maXRzT25MaW5lKCkgJiYg
IW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSkgeworICAgICAgICAvLyBJZiB0aGUgY29udGFpbmVy
IGF1dG93cmFwcyBidXQgdGhlIGN1cnJlbnQgY2hpbGQgZG9lcyBub3QgdGhlbiB3ZSBzdGlsbCBu
ZWVkIHRvIGVuc3VyZSB0aGF0IGl0CisgICAgICAgIC8vIHdyYXBzIGFuZCBtb3ZlcyBiZWxvdyBh
bnkgZmxvYXRzLgorICAgICAgICBtX3dpZHRoLmZpdEJlbG93RmxvYXRzKCk7CisgICAgfQorCisg
ICAgaWYgKCFtX2N1cnJlbnQubV9vYmotPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQo
KSkgeworICAgICAgICBtX2xhc3RPYmplY3QgPSBtX2N1cnJlbnQubV9vYmo7CisgICAgICAgIGlm
IChtX2xhc3RPYmplY3QtPmlzUmVwbGFjZWQoKSAmJiBtX2F1dG9XcmFwICYmICghbV9sYXN0T2Jq
ZWN0LT5pc0ltYWdlKCkgfHwgbV9hbGxvd0ltYWdlc1RvQnJlYWspICYmICghbV9sYXN0T2JqZWN0
LT5pc0xpc3RNYXJrZXIoKSB8fCB0b1JlbmRlckxpc3RNYXJrZXIoKm1fbGFzdE9iamVjdCkuaXNJ
bnNpZGUoKSkpIHsKKyAgICAgICAgICAgIG1fd2lkdGguY29tbWl0KCk7CisgICAgICAgICAgICBt
X2xpbmVCcmVhay5tb3ZlVG9TdGFydE9mKG1fbmV4dE9iamVjdCk7CisgICAgICAgIH0KKyAgICB9
Cit9CisKK2lubGluZSB2b2lkIGNoZWNrTWlkcG9pbnRzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5l
TWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3ImIGxCcmVhaykKK3sKKyAgICAvLyBDaGVjayB0
byBzZWUgaWYgb3VyIGxhc3QgbWlkcG9pbnQgaXMgYSBzdGFydCBwb2ludCBiZXlvbmQgdGhlIGxp
bmUgYnJlYWsuIElmIHNvLAorICAgIC8vIHNoYXZlIGl0IG9mZiB0aGUgbGlzdCwgYW5kIHNoYXZl
IG9mZiBhIHRyYWlsaW5nIHNwYWNlIGlmIHRoZSBwcmV2aW91cyBlbmQgcG9pbnQgZG9lc24ndAor
ICAgIC8vIHByZXNlcnZlIHdoaXRlc3BhY2UuCisgICAgaWYgKGxCcmVhay5tX29iaiAmJiBsaW5l
TWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgJiYgIShsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRw
b2ludHMgJSAyKSkgeworICAgICAgICBJbmxpbmVJdGVyYXRvciogbWlkcG9pbnRzID0gbGluZU1p
ZHBvaW50U3RhdGUubWlkcG9pbnRzLmRhdGEoKTsKKyAgICAgICAgSW5saW5lSXRlcmF0b3ImIGVu
ZHBvaW50ID0gbWlkcG9pbnRzW2xpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAtIDJdOwor
ICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgc3RhcnRwb2ludCA9IG1pZHBvaW50c1tsaW5l
TWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxXTsKKyAgICAgICAgSW5saW5lSXRlcmF0b3Ig
Y3VycnBvaW50ID0gZW5kcG9pbnQ7CisgICAgICAgIHdoaWxlICghY3VycnBvaW50LmF0RW5kKCkg
JiYgY3VycnBvaW50ICE9IHN0YXJ0cG9pbnQgJiYgY3VycnBvaW50ICE9IGxCcmVhaykKKyAgICAg
ICAgICAgIGN1cnJwb2ludC5pbmNyZW1lbnQoKTsKKyAgICAgICAgaWYgKGN1cnJwb2ludCA9PSBs
QnJlYWspIHsKKyAgICAgICAgICAgIC8vIFdlIGhpdCB0aGUgbGluZSBicmVhayBiZWZvcmUgdGhl
IHN0YXJ0IHBvaW50LiBTaGF2ZSBvZmYgdGhlIHN0YXJ0IHBvaW50LgorICAgICAgICAgICAgbGlu
ZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzLS07CisgICAgICAgICAgICBpZiAoZW5kcG9pbnQu
bV9vYmotPnN0eWxlKCkuY29sbGFwc2VXaGl0ZVNwYWNlKCkgJiYgZW5kcG9pbnQubV9vYmotPmlz
VGV4dCgpKQorICAgICAgICAgICAgICAgIGVuZHBvaW50Lm1fcG9zLS07CisgICAgICAgIH0KKyAg
ICB9Cit9CisKK0lubGluZUl0ZXJhdG9yIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRW5kT2ZMaW5l
KCkKK3sKKyNpZiBFTkFCTEUoQ1NTX1NIQVBFUykKKyAgICBTaGFwZUluc2lkZUluZm8qIHNoYXBl
SW5mbyA9IG1fYmxvY2subGF5b3V0U2hhcGVJbnNpZGVJbmZvKCk7CisgICAgYm9vbCBzZWdtZW50
QWxsb3dzT3ZlcmZsb3cgPSAhc2hhcGVJbmZvIHx8ICFzaGFwZUluZm8tPmhhc1NlZ21lbnRzKCk7
CisjZWxzZQorICAgIGJvb2wgc2VnbWVudEFsbG93c092ZXJmbG93ID0gdHJ1ZTsKKyNlbmRpZgor
ICAgIGlmIChzZWdtZW50QWxsb3dzT3ZlcmZsb3cpIHsKKyAgICAgICAgaWYgKG1fbGluZUJyZWFr
ID09IG1fcmVzb2x2ZXIucG9zaXRpb24oKSkgeworICAgICAgICAgICAgaWYgKCFtX2xpbmVCcmVh
ay5tX29iaiB8fCAhbV9saW5lQnJlYWsubV9vYmotPmlzQlIoKSkgeworICAgICAgICAgICAgICAg
IC8vIHdlIGp1c3QgYWRkIGFzIG11Y2ggYXMgcG9zc2libGUKKyAgICAgICAgICAgICAgICBpZiAo
bV9ibG9ja1N0eWxlLndoaXRlU3BhY2UoKSA9PSBQUkUgJiYgIW1fY3VycmVudC5tX3Bvcykgewor
ICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8obV9sYXN0T2JqZWN0LCBtX2xh
c3RPYmplY3QtPmlzVGV4dCgpID8gbV9sYXN0T2JqZWN0LT5sZW5ndGgoKSA6IDApOworICAgICAg
ICAgICAgICAgIH0gZWxzZSBpZiAobV9saW5lQnJlYWsubV9vYmopIHsKKyAgICAgICAgICAgICAg
ICAgICAgLy8gRG9uJ3QgZXZlciBicmVhayBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBpZiB3ZSBj
YW4gaGVscCBpdC4KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyByb29tIGF0IGFs
bC4gV2UganVzdCBoYXZlIHRvIGJlIG9uIHRoaXMgbGluZSwKKyAgICAgICAgICAgICAgICAgICAg
Ly8gZXZlbiB0aG91Z2ggd2UnbGwgc3BpbGwgb3V0LgorICAgICAgICAgICAgICAgICAgICBtX2xp
bmVCcmVhay5tb3ZlVG8obV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MpOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBj
b25zdW1lIGF0IGxlYXN0IG9uZSBjaGFyL29iamVjdC4KKyAgICAgICAgICAgIGlmIChtX2xpbmVC
cmVhayA9PSBtX3Jlc29sdmVyLnBvc2l0aW9uKCkpCisgICAgICAgICAgICAgICAgbV9saW5lQnJl
YWsuaW5jcmVtZW50KCk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1fY3VycmVudC5tX3BvcyAmJiAh
bV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICYmIG1fd2lkdGgudW5jb21taXR0ZWRXaWR0aCgpICYm
ICFtX2hhZFVuY29tbWl0dGVkV2lkdGhCZWZvcmVDdXJyZW50KSB7CisgICAgICAgICAgICAvLyBE
byBub3QgcHVzaCB0aGUgY3VycmVudCBvYmplY3QgdG8gdGhlIG5leHQgbGluZSwgd2hlbiB0aGlz
IGxpbmUgaGFzIHNvbWUgY29udGVudCwgYnV0IGl0IGlzIHN0aWxsIGNvbnNpZGVyZWQgZW1wdHku
CisgICAgICAgICAgICAvLyBFbXB0eSBpbmxpbmUgZWxlbWVudHMgbGlrZSA8c3Bhbj48L3NwYW4+
IGNhbiBwcm9kdWNlIHN1Y2ggbGluZXMgYW5kIG5vdyB3ZSBqdXN0IGlnbm9yZSB0aGVzZSBicmVh
ayBvcHBvcnR1bml0aWVzCisgICAgICAgICAgICAvLyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLCBp
ZiBubyB3aWR0aCBoYXMgYmVlbiBjb21taXR0ZWQgeWV0LgorICAgICAgICAgICAgLy8gQmVoYXZl
IGFzIGlmIGl0IHdhcyBhY3R1YWxseSBlbXB0eSBhbmQgY29uc3VtZSBhdCBsZWFzdCBvbmUgb2Jq
ZWN0LgorICAgICAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICAvLyBTYW5pdHkgY2hlY2sgb3VyIG1pZHBvaW50cy4KKyAgICBjaGVja01pZHBv
aW50cyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2xpbmVCcmVhayk7CisKKyAgICBtX3RyYWlsaW5n
T2JqZWN0cy51cGRhdGVNaWRwb2ludHNGb3JUcmFpbGluZ0JveGVzKG1fbGluZU1pZHBvaW50U3Rh
dGUsIG1fbGluZUJyZWFrLCBUcmFpbGluZ09iamVjdHM6OkNvbGxhcHNlRmlyc3RTcGFjZSk7CisK
KyAgICAvLyBXZSBtaWdodCBoYXZlIG1hZGUgbGluZUJyZWFrIGFuIGl0ZXJhdG9yIHRoYXQgcG9p
bnRzIHBhc3QgdGhlIGVuZAorICAgIC8vIG9mIHRoZSBvYmplY3QuIERvIHRoaXMgYWRqdXN0bWVu
dCB0byBtYWtlIGl0IHBvaW50IHRvIHRoZSBzdGFydAorICAgIC8vIG9mIHRoZSBuZXh0IG9iamVj
dCBpbnN0ZWFkIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUgcmVzdCBvZiB0aGUKKyAgICAvLyBjb2Rl
LgorICAgIGlmIChtX2xpbmVCcmVhay5tX3BvcyA+IDApIHsKKyAgICAgICAgbV9saW5lQnJlYWsu
bV9wb3MtLTsKKyAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7CisgICAgfQorCisgICAg
cmV0dXJuIG1fbGluZUJyZWFrOworfQorCit9CisKKyNlbmRpZiAvLyBCcmVha2luZ0NvbnRleHRJ
bmxpbmVIZWFkZXJzX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5l
L0xpbmVCcmVha2VyLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVh
a2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjkzYmJjCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIu
Y3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGFycyBLbm9s
bCAoa25vbGxAa2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNiwgMjAw
NywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDEzIENoYW5nU2VvayBPaCA8c2hpdmFtaWRvd0BnbWFpbC5jb20+
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmMuIEFsbCByaWdodCByZXNl
cnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisg
KgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJMaW5lQnJlYWtlci5oIgor
CisjaW5jbHVkZSAiUmVuZGVyQ29tYmluZVRleHQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Cit2b2lkIExpbmVCcmVha2VyOjpyZXNldCgpCit7CisgICAgbV9wb3NpdGlvbmVkT2JqZWN0cy5j
bGVhcigpOworICAgIG1faHlwaGVuYXRlZCA9IGZhbHNlOworICAgIG1fY2xlYXIgPSBDTk9ORTsK
K30KKworLy8gRklYTUU6IFRoZSBlbnRpcmUgY29uY2VwdCBvZiB0aGUgc2tpcFRyYWlsaW5nV2hp
dGVzcGFjZSBmdW5jdGlvbiBpcyBmbGF3ZWQsIHNpbmNlIHdlIHJlYWxseSBuZWVkIHRvIGJlIGJ1
aWxkaW5nCisvLyBsaW5lIGJveGVzIGV2ZW4gZm9yIGNvbnRhaW5lcnMgdGhhdCBtYXkgdWx0aW1h
dGVseSBjb2xsYXBzZSBhd2F5LiBPdGhlcndpc2Ugd2UnbGwgbmV2ZXIgZ2V0IHBvc2l0aW9uZWQK
Ky8vIGVsZW1lbnRzIHF1aXRlIHJpZ2h0LiBJbiBvdGhlciB3b3Jkcywgd2UgbmVlZCB0byBidWls
ZCB0aGlzIGZ1bmN0aW9uJ3Mgd29yayBpbnRvIHRoZSBub3JtYWwgbGluZQorLy8gb2JqZWN0IGl0
ZXJhdGlvbiBwcm9jZXNzLgorLy8gTkIuIHRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYW55IGZs
b2F0aW5nIGVsZW1lbnRzIHRoYXQgd291bGQgb3RoZXJ3aXNlCisvLyBiZSBza2lwcGVkIGJ1dCBp
dCB3aWxsIG5vdCBwb3NpdGlvbiB0aGVtLgordm9pZCBMaW5lQnJlYWtlcjo6c2tpcFRyYWlsaW5n
V2hpdGVzcGFjZShJbmxpbmVJdGVyYXRvciYgaXRlcmF0b3IsIGNvbnN0IExpbmVJbmZvJiBsaW5l
SW5mbykKK3sKKyAgICB3aGlsZSAoIWl0ZXJhdG9yLmF0RW5kKCkgJiYgIXJlcXVpcmVzTGluZUJv
eChpdGVyYXRvciwgbGluZUluZm8sIFRyYWlsaW5nV2hpdGVzcGFjZSkpIHsKKyAgICAgICAgUmVu
ZGVyT2JqZWN0JiBvYmplY3QgPSAqaXRlcmF0b3IubV9vYmo7CisgICAgICAgIGlmIChvYmplY3Qu
aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCisgICAgICAgICAgICBzZXRTdGF0aWNQb3NpdGlvbnMo
bV9ibG9jaywgdG9SZW5kZXJCb3gob2JqZWN0KSk7CisgICAgICAgIGVsc2UgaWYgKG9iamVjdC5p
c0Zsb2F0aW5nKCkpCisgICAgICAgICAgICBtX2Jsb2NrLmluc2VydEZsb2F0aW5nT2JqZWN0KHRv
UmVuZGVyQm94KG9iamVjdCkpOworICAgICAgICBpdGVyYXRvci5pbmNyZW1lbnQoKTsKKyAgICB9
Cit9CisKK3ZvaWQgTGluZUJyZWFrZXI6OnNraXBMZWFkaW5nV2hpdGVzcGFjZShJbmxpbmVCaWRp
UmVzb2x2ZXImIHJlc29sdmVyLCBMaW5lSW5mbyYgbGluZUluZm8sIEZsb2F0aW5nT2JqZWN0KiBs
YXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lV2lkdGgmIHdpZHRoKQoreworICAgIHdoaWxl
ICghcmVzb2x2ZXIucG9zaXRpb24oKS5hdEVuZCgpICYmICFyZXF1aXJlc0xpbmVCb3gocmVzb2x2
ZXIucG9zaXRpb24oKSwgbGluZUluZm8sIExlYWRpbmdXaGl0ZXNwYWNlKSkgeworICAgICAgICBS
ZW5kZXJPYmplY3QmIG9iamVjdCA9ICpyZXNvbHZlci5wb3NpdGlvbigpLm1fb2JqOworICAgICAg
ICBpZiAob2JqZWN0LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7CisgICAgICAgICAgICBzZXRT
dGF0aWNQb3NpdGlvbnMobV9ibG9jaywgdG9SZW5kZXJCb3gob2JqZWN0KSk7CisgICAgICAgICAg
ICBpZiAob2JqZWN0LnN0eWxlKCkuaXNPcmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCkpIHsKKyAg
ICAgICAgICAgICAgICByZXNvbHZlci5ydW5zKCkuYWRkUnVuKG5ldyBCaWRpUnVuKDAsIDEsIG9i
amVjdCwgcmVzb2x2ZXIuY29udGV4dCgpLCByZXNvbHZlci5kaXIoKSkpOworICAgICAgICAgICAg
ICAgIGxpbmVJbmZvLmluY3JlbWVudFJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UoKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QuaXNGbG9hdGluZygpKSB7CisgICAg
ICAgICAgICAvLyBUaGUgdG9wIG1hcmdpbiBlZGdlIG9mIGEgc2VsZi1jb2xsYXBzaW5nIGJsb2Nr
IHRoYXQgY2xlYXJzIGEgZmxvYXQgaW50cnVkZXMgdXAgaW50byBpdCBieSB0aGUgaGVpZ2h0IG9m
IHRoZSBtYXJnaW4sCisgICAgICAgICAgICAvLyBzbyBpbiBvcmRlciB0byBwbGFjZSB0aGlzIGZp
cnN0IGNoaWxkIGZsb2F0IGF0IHRoZSB0b3AgY29udGVudCBlZGdlIG9mIHRoZSBzZWxmLWNvbGxh
cHNpbmcgYmxvY2sgYWRkIHRoZSBtYXJnaW4gYmFjayBpbiBiZWZvcmUgcGxhY2VtZW50LgorICAg
ICAgICAgICAgTGF5b3V0VW5pdCBtYXJnaW5PZmZzZXQgPSAoIW9iamVjdC5wcmV2aW91c1NpYmxp
bmcoKSAmJiBtX2Jsb2NrLmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpICYmIG1fYmxvY2suc3R5bGUo
KS5jbGVhcigpICYmIG1fYmxvY2suZ2V0Q2xlYXJEZWx0YShtX2Jsb2NrLCBMYXlvdXRVbml0KCkp
KSA/IG1fYmxvY2suY29sbGFwc2VkTWFyZ2luQmVmb3JlRm9yQ2hpbGQobV9ibG9jaykgOiBMYXlv
dXRVbml0KCk7CisgICAgICAgICAgICBMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQgPSBtX2Js
b2NrLmxvZ2ljYWxIZWlnaHQoKTsKKyAgICAgICAgICAgIG1fYmxvY2suc2V0TG9naWNhbEhlaWdo
dChvbGRMb2dpY2FsSGVpZ2h0ICsgbWFyZ2luT2Zmc2V0KTsKKyAgICAgICAgICAgIG1fYmxvY2su
cG9zaXRpb25OZXdGbG9hdE9uTGluZShtX2Jsb2NrLmluc2VydEZsb2F0aW5nT2JqZWN0KHRvUmVu
ZGVyQm94KG9iamVjdCkpLCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBsaW5lSW5mbywgd2lk
dGgpOworICAgICAgICAgICAgbV9ibG9jay5zZXRMb2dpY2FsSGVpZ2h0KG9sZExvZ2ljYWxIZWln
aHQpOworICAgICAgICB9IGVsc2UgaWYgKG9iamVjdC5pc1RleHQoKSAmJiBvYmplY3Quc3R5bGUo
KS5oYXNUZXh0Q29tYmluZSgpICYmIG9iamVjdC5pc0NvbWJpbmVUZXh0KCkgJiYgIXRvUmVuZGVy
Q29tYmluZVRleHQob2JqZWN0KS5pc0NvbWJpbmVkKCkpIHsKKyAgICAgICAgICAgIHRvUmVuZGVy
Q29tYmluZVRleHQob2JqZWN0KS5jb21iaW5lVGV4dCgpOworICAgICAgICAgICAgaWYgKHRvUmVu
ZGVyQ29tYmluZVRleHQob2JqZWN0KS5pc0NvbWJpbmVkKCkpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIH0KKyAgICAgICAgcmVzb2x2ZXIuaW5jcmVtZW50KCk7CisgICAgfQor
ICAgIHJlc29sdmVyLmNvbW1pdEV4cGxpY2l0RW1iZWRkaW5nKCk7Cit9CisKK30KZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmggYi9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjc1ZWNmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDAgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqIENvcHlyaWdo
dCAoQykgMjAwMywgMjAwNCwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBBcHBs
ZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEzIENoYW5nU2Vv
ayBPaCA8c2hpdmFtaWRvd0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQWRvYmUg
U3lzdGVtcyBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgTGluZUJyZWFrZXJf
aAorI2RlZmluZSBMaW5lQnJlYWtlcl9oCisKKyNpbmNsdWRlICJJbmxpbmVJdGVyYXRvci5oIgor
I2luY2x1ZGUgIkxpbmVJbmZvLmgiCisjaW5jbHVkZSAiTGluZUlubGluZUhlYWRlcnMuaCIKKyNp
bmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUmVu
ZGVyVGV4dDsKKworc3RydWN0IFJlbmRlclRleHRJbmZvIHsKKyAgICAvLyBEZXN0cnVjdGlvbiBv
ZiBtX2xheW91dCByZXF1aXJlcyBUZXh0TGF5b3V0IHRvIGJlIGEgY29tcGxldGUgdHlwZSwgc28g
dGhlIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIGFyZSBtYWRlIG5vbi1pbmxpbmUgdG8gYXZv
aWQgY29tcGlsYXRpb24gZXJyb3JzLgorICAgIFJlbmRlclRleHRJbmZvKCk7CisgICAgflJlbmRl
clRleHRJbmZvKCk7CisKKyAgICBSZW5kZXJUZXh0KiBtX3RleHQ7CisgICAgT3duUHRyPFRleHRM
YXlvdXQ+IG1fbGF5b3V0OworICAgIExhenlMaW5lQnJlYWtJdGVyYXRvciBtX2xpbmVCcmVha0l0
ZXJhdG9yOworICAgIGNvbnN0IEZvbnQqIG1fZm9udDsKK307CisKK2NsYXNzIExpbmVCcmVha2Vy
IHsKK3B1YmxpYzoKKyAgICBmcmllbmQgY2xhc3MgQnJlYWtpbmdDb250ZXh0OworICAgIExpbmVC
cmVha2VyKFJlbmRlckJsb2NrRmxvdyYgYmxvY2spCisgICAgICAgIDogbV9ibG9jayhibG9jaykK
KyAgICB7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgSW5saW5lSXRlcmF0b3IgbmV4
dExpbmVCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYsIFJlbmRlclRleHRJbmZv
JiwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHVuc2lnbmVkIGNv
bnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBXb3JkTWVhc3VyZW1lbnRzJik7CisKKyAgICBib29s
IGxpbmVXYXNIeXBoZW5hdGVkKCkgeyByZXR1cm4gbV9oeXBoZW5hdGVkOyB9CisgICAgY29uc3Qg
VmVjdG9yPFJlbmRlckJveCo+JiBwb3NpdGlvbmVkT2JqZWN0cygpIHsgcmV0dXJuIG1fcG9zaXRp
b25lZE9iamVjdHM7IH0KKyAgICBFQ2xlYXIgY2xlYXIoKSB7IHJldHVybiBtX2NsZWFyOyB9CisK
K3ByaXZhdGU6CisgICAgdm9pZCByZXNldCgpOworCisgICAgSW5saW5lSXRlcmF0b3IgbmV4dFNl
Z21lbnRCcmVhayhJbmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYsIFJlbmRlclRleHRJbmZv
JiwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHVuc2lnbmVkIGNv
bnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBXb3JkTWVhc3VyZW1lbnRzJik7CisgICAgdm9pZCBz
a2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiwgY29uc3QgTGluZUluZm8mKTsK
KyAgICB2b2lkIHNraXBMZWFkaW5nV2hpdGVzcGFjZShJbmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5l
SW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lV2lk
dGgmKTsKKworICAgIFJlbmRlckJsb2NrRmxvdyYgbV9ibG9jazsKKyAgICBib29sIG1faHlwaGVu
YXRlZDsKKyAgICBFQ2xlYXIgbV9jbGVhcjsKKyAgICBWZWN0b3I8UmVuZGVyQm94Kj4gbV9wb3Np
dGlvbmVkT2JqZWN0czsKK307CisKK30KKworI2VuZGlmIC8vIExpbmVCcmVha2VyX2gKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmZvLmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwLi5kYTcxOGFkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL2xpbmUvTGluZUluZm8uY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZQorICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcKKyAqICAgIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICBjb3B5cmlnaHQg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAg
ZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisg
KiAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwor
ICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQ09QWVJJR0hUIEhPTERFUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IKKyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJMaW5lSW5mby5oIgorCisjaW5jbHVkZSAiUmVu
ZGVyQmxvY2suaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIExpbmVJbmZvOjpzZXRF
bXB0eShib29sIGVtcHR5LCBSZW5kZXJCbG9jayogYmxvY2ssIExpbmVXaWR0aCogbGluZVdpZHRo
KQoreworICAgIGlmIChtX2lzRW1wdHkgPT0gZW1wdHkpCisgICAgICAgIHJldHVybjsKKyAgICBt
X2lzRW1wdHkgPSBlbXB0eTsKKyAgICBpZiAoIWVtcHR5ICYmIGJsb2NrICYmIGZsb2F0UGFnaW5h
dGlvblN0cnV0KCkpIHsKKyAgICAgICAgYmxvY2stPnNldExvZ2ljYWxIZWlnaHQoYmxvY2stPmxv
Z2ljYWxIZWlnaHQoKSArIGZsb2F0UGFnaW5hdGlvblN0cnV0KCkpOworICAgICAgICBzZXRGbG9h
dFBhZ2luYXRpb25TdHJ1dCgwKTsKKyAgICAgICAgbGluZVdpZHRoLT51cGRhdGVBdmFpbGFibGVX
aWR0aCgpOworICAgIH0KK30KKworfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL2xpbmUvTGluZUluZm8uaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJ
bmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzNjZjNwotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmZvLmgKQEAg
LTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIElu
Y29ycG9yYXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nCisgKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
CisgKiBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBMaW5lSW5mb19oCisjZGVmaW5lIExpbmVJbmZv
X2gKKworI2luY2x1ZGUgIkxpbmVXaWR0aC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Ns
YXNzIFJlbmRlckJsb2NrOworCitjbGFzcyBMaW5lSW5mbyB7CitwdWJsaWM6CisgICAgTGluZUlu
Zm8oKQorICAgICAgICA6IG1faXNGaXJzdExpbmUodHJ1ZSkKKyAgICAgICAgLCBtX2lzTGFzdExp
bmUoZmFsc2UpCisgICAgICAgICwgbV9pc0VtcHR5KHRydWUpCisgICAgICAgICwgbV9wcmV2aW91
c0xpbmVCcm9rZUNsZWFubHkodHJ1ZSkKKyAgICAgICAgLCBtX2Zsb2F0UGFnaW5hdGlvblN0cnV0
KDApCisgICAgICAgICwgbV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKDApCisgICAgeyB9CisK
KyAgICBib29sIGlzRmlyc3RMaW5lKCkgY29uc3QgeyByZXR1cm4gbV9pc0ZpcnN0TGluZTsgfQor
ICAgIGJvb2wgaXNMYXN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNMYXN0TGluZTsgfQorICAg
IGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1faXNFbXB0eTsgfQorICAgIGJvb2wgcHJl
dmlvdXNMaW5lQnJva2VDbGVhbmx5KCkgY29uc3QgeyByZXR1cm4gbV9wcmV2aW91c0xpbmVCcm9r
ZUNsZWFubHk7IH0KKyAgICBMYXlvdXRVbml0IGZsb2F0UGFnaW5hdGlvblN0cnV0KCkgY29uc3Qg
eyByZXR1cm4gbV9mbG9hdFBhZ2luYXRpb25TdHJ1dDsgfQorICAgIHVuc2lnbmVkIHJ1bnNGcm9t
TGVhZGluZ1doaXRlc3BhY2UoKSBjb25zdCB7IHJldHVybiBtX3J1bnNGcm9tTGVhZGluZ1doaXRl
c3BhY2U7IH0KKyAgICB2b2lkIHJlc2V0UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgpIHsgbV9y
dW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlID0gMDsgfQorICAgIHZvaWQgaW5jcmVtZW50UnVuc0Zy
b21MZWFkaW5nV2hpdGVzcGFjZSgpIHsgbV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKys7IH0K
KworICAgIHZvaWQgc2V0Rmlyc3RMaW5lKGJvb2wgZmlyc3RMaW5lKSB7IG1faXNGaXJzdExpbmUg
PSBmaXJzdExpbmU7IH0KKyAgICB2b2lkIHNldExhc3RMaW5lKGJvb2wgbGFzdExpbmUpIHsgbV9p
c0xhc3RMaW5lID0gbGFzdExpbmU7IH0KKyAgICB2b2lkIHNldEVtcHR5KGJvb2wgZW1wdHksIFJl
bmRlckJsb2NrKiBibG9jayA9IDAsIExpbmVXaWR0aCogbGluZVdpZHRoID0gMCk7CisgICAgdm9p
ZCBzZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHkpIHsgbV9wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkgPSBwcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHk7IH0KKyAgICB2b2lkIHNldEZsb2F0UGFnaW5hdGlvblN0cnV0KExheW91dFVuaXQgc3RydXQp
IHsgbV9mbG9hdFBhZ2luYXRpb25TdHJ1dCA9IHN0cnV0OyB9CisKK3ByaXZhdGU6CisgICAgYm9v
bCBtX2lzRmlyc3RMaW5lOworICAgIGJvb2wgbV9pc0xhc3RMaW5lOworICAgIGJvb2wgbV9pc0Vt
cHR5OworICAgIGJvb2wgbV9wcmV2aW91c0xpbmVCcm9rZUNsZWFubHk7CisgICAgTGF5b3V0VW5p
dCBtX2Zsb2F0UGFnaW5hdGlvblN0cnV0OworICAgIHVuc2lnbmVkIG1fcnVuc0Zyb21MZWFkaW5n
V2hpdGVzcGFjZTsKK307CisKK30KKworI2VuZGlmIC8vIExpbmVJbmZvX2gKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmxpbmVIZWFkZXJzLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lSW5saW5lSGVhZGVycy5oCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YTFiZWUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lSW5saW5lSGVhZGVycy5oCkBAIC0wLDAgKzEs
MTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIExhcnMgS25vbGwgKGtub2xsQGtkZS5v
cmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDks
IDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAxMyBDaGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21haWwuY29tPgorICogQ29weXJpZ2h0
IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZu
ZGVmIExpbmVJbmxpbmVIZWFkZXJzX2gKKyNkZWZpbmUgTGluZUlubGluZUhlYWRlcnNfaAorCisj
aW5jbHVkZSAiUmVuZGVyTGF5ZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitlbnVtIFdo
aXRlc3BhY2VQb3NpdGlvbiB7IExlYWRpbmdXaGl0ZXNwYWNlLCBUcmFpbGluZ1doaXRlc3BhY2Ug
fTsKKworaW5saW5lIGJvb2wgaGFzSW5saW5lRGlyZWN0aW9uQm9yZGVyc1BhZGRpbmdPck1hcmdp
bihjb25zdCBSZW5kZXJJbmxpbmUmIGZsb3cpCit7CisgICAgLy8gV2hlcmUgYW4gZW1wdHkgaW5s
aW5lIGlzIHNwbGl0IGFjcm9zcyBhbm9ueW1vdXMgYmxvY2tzIHdlIHNob3VsZCBvbmx5IGdpdmUg
bGluZWJveGVzIHRvIHRoZSAnc2lkZXMnIG9mIHRoZQorICAgIC8vIGlubGluZSB0aGF0IGhhdmUg
Ym9yZGVycywgcGFkZGluZyBvciBtYXJnaW4uCisgICAgYm9vbCBzaG91bGRBcHBseVN0YXJ0Qm9y
ZGVyUGFkZGluZ09yTWFyZ2luID0gIWZsb3cucGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSB8
fCAhZmxvdy5pc0lubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsKKyAgICBpZiAoc2hvdWxkQXBw
bHlTdGFydEJvcmRlclBhZGRpbmdPck1hcmdpbiAmJiAoZmxvdy5ib3JkZXJTdGFydCgpIHx8IGZs
b3cubWFyZ2luU3RhcnQoKSB8fCBmbG93LnBhZGRpbmdTdGFydCgpKSkKKyAgICAgICAgcmV0dXJu
IHRydWU7CisKKyAgICBib29sIHNob3VsZEFwcGx5RW5kQm9yZGVyUGFkZGluZ09yTWFyZ2luID0g
IWZsb3cucGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSB8fCBmbG93LmlzSW5saW5lRWxlbWVu
dENvbnRpbnVhdGlvbigpIHx8ICFmbG93LmlubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsKKyAg
ICByZXR1cm4gc2hvdWxkQXBwbHlFbmRCb3JkZXJQYWRkaW5nT3JNYXJnaW4gJiYgKGZsb3cuYm9y
ZGVyRW5kKCkgfHwgZmxvdy5tYXJnaW5FbmQoKSB8fCBmbG93LnBhZGRpbmdFbmQoKSk7Cit9CisK
K2lubGluZSBjb25zdCBSZW5kZXJTdHlsZSYgbGluZVN0eWxlKGNvbnN0IFJlbmRlckVsZW1lbnQm
IHJlbmRlcmVyLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCit7CisgICAgcmV0dXJuIGxpbmVJ
bmZvLmlzRmlyc3RMaW5lKCkgPyByZW5kZXJlci5maXJzdExpbmVTdHlsZSgpIDogcmVuZGVyZXIu
c3R5bGUoKTsKK30KKworaW5saW5lIGJvb2wgcmVxdWlyZXNMaW5lQm94Rm9yQ29udGVudChjb25z
dCBSZW5kZXJJbmxpbmUmIGZsb3csIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykKK3sKKyAgICBS
ZW5kZXJFbGVtZW50KiBwYXJlbnQgPSBmbG93LnBhcmVudCgpOworICAgIGlmIChmbG93LmRvY3Vt
ZW50KCkuaW5Ob1F1aXJrc01vZGUoKSkgeworICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYgZmxv
d1N0eWxlID0gbGluZVN0eWxlKGZsb3csIGxpbmVJbmZvKTsKKyAgICAgICAgY29uc3QgUmVuZGVy
U3R5bGUmIHBhcmVudFN0eWxlID0gbGluZVN0eWxlKCpwYXJlbnQsIGxpbmVJbmZvKTsKKyAgICAg
ICAgaWYgKGZsb3dTdHlsZS5saW5lSGVpZ2h0KCkgIT0gcGFyZW50U3R5bGUubGluZUhlaWdodCgp
CisgICAgICAgICAgICB8fCBmbG93U3R5bGUudmVydGljYWxBbGlnbigpICE9IHBhcmVudFN0eWxl
LnZlcnRpY2FsQWxpZ24oKQorICAgICAgICAgICAgfHwgIXBhcmVudFN0eWxlLmZvbnQoKS5mb250
TWV0cmljcygpLmhhc0lkZW50aWNhbEFzY2VudERlc2NlbnRBbmRMaW5lR2FwKGZsb3dTdHlsZS5m
b250KCkuZm9udE1ldHJpY3MoKSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIHNob3VsZENvbGxhcHNlV2hpdGVTcGFjZShj
b25zdCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgV2hpdGVz
cGFjZVBvc2l0aW9uIHdoaXRlc3BhY2VQb3NpdGlvbikKK3sKKyAgICAvLyBDU1MyIDE2LjYuMQor
ICAgIC8vIElmIGEgc3BhY2UgKFUrMDAyMCkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgaGFz
ICd3aGl0ZS1zcGFjZScgc2V0IHRvICdub3JtYWwnLCAnbm93cmFwJywgb3IgJ3ByZS1saW5lJywg
aXQgaXMgcmVtb3ZlZC4KKyAgICAvLyBJZiBhIHNwYWNlIChVKzAwMjApIGF0IHRoZSBlbmQgb2Yg
YSBsaW5lIGhhcyAnd2hpdGUtc3BhY2UnIHNldCB0byAnbm9ybWFsJywgJ25vd3JhcCcsIG9yICdw
cmUtbGluZScsIGl0IGlzIGFsc28gcmVtb3ZlZC4KKyAgICAvLyBJZiBzcGFjZXMgKFUrMDAyMCkg
b3IgdGFicyAoVSswMDA5KSBhdCB0aGUgZW5kIG9mIGEgbGluZSBoYXZlICd3aGl0ZS1zcGFjZScg
c2V0IHRvICdwcmUtd3JhcCcsIFVBcyBtYXkgdmlzdWFsbHkgY29sbGFwc2UgdGhlbS4KKyAgICBy
ZXR1cm4gc3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpCisgICAgICAgIHx8ICh3aGl0ZXNwYWNl
UG9zaXRpb24gPT0gVHJhaWxpbmdXaGl0ZXNwYWNlICYmIHN0eWxlLT53aGl0ZVNwYWNlKCkgPT0g
UFJFX1dSQVAgJiYgKCFsaW5lSW5mby5pc0VtcHR5KCkgfHwgIWxpbmVJbmZvLnByZXZpb3VzTGlu
ZUJyb2tlQ2xlYW5seSgpKSk7Cit9CisKK2lubGluZSBib29sIHNraXBOb25CcmVha2luZ1NwYWNl
KGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQorewor
ICAgIGlmIChpdC5tX29iai0+c3R5bGUoKS5uYnNwTW9kZSgpICE9IFNQQUNFIHx8IGl0LmN1cnJl
bnQoKSAhPSBub0JyZWFrU3BhY2UpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEZJ
WE1FOiBUaGlzIGlzIGJhZC4gSXQgbWFrZXMgbmJzcCBpbmNvbnNpc3RlbnQgd2l0aCBzcGFjZSBh
bmQgd29uJ3Qgd29yayBjb3JyZWN0bHkKKyAgICAvLyB3aXRoIG1fbWluV2lkdGgvbV9tYXhXaWR0
aC4KKyAgICAvLyBEbyBub3Qgc2tpcCBhIG5vbi1icmVha2luZyBzcGFjZSBpZiBpdCBpcyB0aGUg
Zmlyc3QgY2hhcmFjdGVyCisgICAgLy8gb24gYSBsaW5lIGFmdGVyIGEgY2xlYW4gbGluZSBicmVh
ayAob3Igb24gdGhlIGZpcnN0IGxpbmUsIHNpbmNlIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSBz
dGFydHMgb2ZmCisgICAgLy8gfHRydWV8KS4KKyAgICBpZiAobGluZUluZm8uaXNFbXB0eSgpICYm
IGxpbmVJbmZvLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIGJvb2wgYWx3YXlzUmVxdWlyZXNM
aW5lQm94KGNvbnN0IFJlbmRlcklubGluZSYgZmxvdykKK3sKKyAgICAvLyBGSVhNRTogUmlnaHQg
bm93LCB3ZSBvbmx5IGFsbG93IGxpbmUgYm94ZXMgZm9yIGlubGluZXMgdGhhdCBhcmUgdHJ1bHkg
ZW1wdHkuCisgICAgLy8gV2UgbmVlZCB0byBmaXggdGhpcywgdGhvdWdoLCBiZWNhdXNlIGF0IHRo
ZSB2ZXJ5IGxlYXN0LCBpbmxpbmVzIGNvbnRhaW5pbmcgb25seQorICAgIC8vIGlnbm9yYWJsZSB3
aGl0ZXNwYWNlIHNob3VsZCBzaG91bGQgYWxzbyBoYXZlIGxpbmUgYm94ZXMuCisgICAgcmV0dXJu
IGlzRW1wdHlJbmxpbmUoZmxvdykgJiYgaGFzSW5saW5lRGlyZWN0aW9uQm9yZGVyc1BhZGRpbmdP
ck1hcmdpbihmbG93KTsKK30KKworaW5saW5lIGJvb2wgcmVxdWlyZXNMaW5lQm94KGNvbnN0IElu
bGluZUl0ZXJhdG9yJiBpdCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvID0gTGluZUluZm8oKSwg
V2hpdGVzcGFjZVBvc2l0aW9uIHdoaXRlc3BhY2VQb3NpdGlvbiA9IExlYWRpbmdXaGl0ZXNwYWNl
KQoreworICAgIGlmIChpdC5tX29iai0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaXQubV9vYmotPmlzQlIoKSkKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBib29sIHJlbmRlcmVySXNFbXB0eUlubGluZSA9IGZh
bHNlOworICAgIGlmIChpdC5tX29iai0+aXNSZW5kZXJJbmxpbmUoKSkgeworICAgICAgICBjb25z
dCBSZW5kZXJJbmxpbmUmIGlubGluZVJlbmRlcmVyID0gdG9SZW5kZXJJbmxpbmUoKml0Lm1fb2Jq
KTsKKyAgICAgICAgaWYgKCFhbHdheXNSZXF1aXJlc0xpbmVCb3goaW5saW5lUmVuZGVyZXIpICYm
ICFyZXF1aXJlc0xpbmVCb3hGb3JDb250ZW50KGlubGluZVJlbmRlcmVyLCBsaW5lSW5mbykpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJlbmRlcmVySXNFbXB0eUlubGluZSA9
IGlzRW1wdHlJbmxpbmUoaW5saW5lUmVuZGVyZXIpOworICAgIH0KKworICAgIGlmICghc2hvdWxk
Q29sbGFwc2VXaGl0ZVNwYWNlKCZpdC5tX29iai0+c3R5bGUoKSwgbGluZUluZm8sIHdoaXRlc3Bh
Y2VQb3NpdGlvbikpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgVUNoYXIgY3VycmVudCA9
IGl0LmN1cnJlbnQoKTsKKyAgICBib29sIG5vdEp1c3RXaGl0ZXNwYWNlID0gY3VycmVudCAhPSAn
ICcgJiYgY3VycmVudCAhPSAnXHQnICYmIGN1cnJlbnQgIT0gc29mdEh5cGhlbiAmJiAoY3VycmVu
dCAhPSAnXG4nIHx8IGl0Lm1fb2JqLT5wcmVzZXJ2ZXNOZXdsaW5lKCkpICYmICFza2lwTm9uQnJl
YWtpbmdTcGFjZShpdCwgbGluZUluZm8pOworICAgIHJldHVybiBub3RKdXN0V2hpdGVzcGFjZSB8
fCByZW5kZXJlcklzRW1wdHlJbmxpbmU7Cit9CisKK2lubGluZSB2b2lkIHNldFN0YXRpY1Bvc2l0
aW9ucyhSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBSZW5kZXJCb3gmIGNoaWxkKQoreworICAgIC8v
IEZJWE1FOiBUaGUgbWF0aCBoZXJlIGlzIGFjdHVhbGx5IG5vdCByZWFsbHkgcmlnaHQuIEl0J3Mg
YSBiZXN0LWd1ZXNzIGFwcHJveGltYXRpb24gdGhhdAorICAgIC8vIHdpbGwgd29yayBmb3IgdGhl
IGNvbW1vbiBjYXNlcworICAgIFJlbmRlckVsZW1lbnQqIGNvbnRhaW5lckJsb2NrID0gY2hpbGQu
Y29udGFpbmVyKCk7CisgICAgTGF5b3V0VW5pdCBibG9ja0hlaWdodCA9IGJsb2NrLmxvZ2ljYWxI
ZWlnaHQoKTsKKyAgICBpZiAoY29udGFpbmVyQmxvY2stPmlzUmVuZGVySW5saW5lKCkpIHsKKyAg
ICAgICAgLy8gQSByZWxhdGl2ZSBwb3NpdGlvbmVkIGlubGluZSBlbmNsb3NlcyB1cy4gSW4gdGhp
cyBjYXNlLCB3ZSBhbHNvIGhhdmUgdG8gZGV0ZXJtaW5lIG91cgorICAgICAgICAvLyBwb3NpdGlv
biBhcyB0aG91Z2ggd2Ugd2VyZSBhbiBpbmxpbmUuIFNldCB8c3RhdGljSW5saW5lUG9zaXRpb258
IGFuZCB8c3RhdGljQmxvY2tQb3NpdGlvbnwgb24gdGhlIHJlbGF0aXZlIHBvc2l0aW9uZWQKKyAg
ICAgICAgLy8gaW5saW5lIHNvIHRoYXQgd2UgY2FuIG9idGFpbiB0aGUgdmFsdWUgbGF0ZXIuCisg
ICAgICAgIHRvUmVuZGVySW5saW5lKGNvbnRhaW5lckJsb2NrKS0+bGF5ZXIoKS0+c2V0U3RhdGlj
SW5saW5lUG9zaXRpb24oYmxvY2suc3RhcnRBbGlnbmVkT2Zmc2V0Rm9yTGluZShibG9ja0hlaWdo
dCwgZmFsc2UpKTsKKyAgICAgICAgdG9SZW5kZXJJbmxpbmUoY29udGFpbmVyQmxvY2spLT5sYXll
cigpLT5zZXRTdGF0aWNCbG9ja1Bvc2l0aW9uKGJsb2NrSGVpZ2h0KTsKKyAgICB9CisgICAgYmxv
Y2sudXBkYXRlU3RhdGljSW5saW5lUG9zaXRpb25Gb3JDaGlsZChjaGlsZCwgYmxvY2tIZWlnaHQp
OworICAgIGNoaWxkLmxheWVyKCktPnNldFN0YXRpY0Jsb2NrUG9zaXRpb24oYmxvY2tIZWlnaHQp
OworfQorCit9CisKKyNlbmRpZgo=
</data>
<flag name="commit-queue"
          id="239963"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>216959</attachid>
            <date>2013-11-14 10:42:54 -0800</date>
            <delta_ts>2013-11-14 14:15:07 -0800</delta_ts>
            <desc>EWS bullet3 - style won&apos;t make it (expected)</desc>
            <filename>refactorLB.patch</filename>
            <type>text/plain</type>
            <size>174881</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNv
cmUvQ01ha2VMaXN0cy50eHQKaW5kZXggNzRlMzhmNC4uZTE1ZDhlZiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0
cy50eHQKQEAgLTc2LDYgKzc2LDcgQEAgc2V0KFdlYkNvcmVfSU5DTFVERV9ESVJFQ1RPUklFUwog
ICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS90ZXh0IgogICAgICIke1dFQkNPUkVfRElSfS9w
bHVnaW5zIgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmciCisgICAgIiR7V0VCQ09SRV9E
SVJ9L3JlbmRlcmluZy9saW5lIgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmcvbWF0aG1s
IgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmcvc2hhcGVzIgogICAgICIke1dFQkNPUkVf
RElSfS9yZW5kZXJpbmcvc3R5bGUiCkBAIC0yMjA5LDYgKzIyMTAsOSBAQCBzZXQoV2ViQ29yZV9T
T1VSQ0VTCiAgICAgcmVuZGVyaW5nL1RleHRQYWludGVyLmNwcAogICAgIHJlbmRlcmluZy9icmVh
a19saW5lcy5jcHAKIAorICAgIHJlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcAorICAgIHJl
bmRlcmluZy9saW5lL0xpbmVJbmZvLmNwcAorCiAgICAgcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJN
YXRoTUxCbG9jay5jcHAKICAgICByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTEZlbmNlZC5j
cHAKICAgICByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTEZyYWN0aW9uLmNwcApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9n
CmluZGV4IDYyNDc3MDguLjgwY2ViMmIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMDkgQEAKKzIw
MTMtMTEtMTQgIFpvbHRhbiBIb3J2YXRoICA8em9sdGFuQHdlYmtpdC5vcmc+CisKKyAgICAgICAg
TW92ZSBCcmVha2luZ0NvbnRleHQgYW5kIExpbmVCcmVha2VyIGludG8gdGhlaXIgb3duIGZpbGVz
CisgICAgICAgIDxodHRwczovL3dlYmtpdC5vcmcvYi8xMjQzMzY+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW4gdGhpcyBjaGFuZ2UgSSBpbnRyb2R1
Y2VkICdsaW5lJyBzdWJkaXJlY3RvcnkgaW5zaWRlICdyZW5kZXJpbmcnLCB0aGlzIGRpcmVjdG9y
eSB3aWxsIGNvbnRhaW4gYWxsIHRoZSBjbGFzc2VzCisgICAgICAgIHdoaWNoIGhhdmUgYmVlbiBy
ZWZhY3RvcmVkIGZyb20gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4gVGhpcyBjaGFuZ2UgY29u
dGFpbnMgdGhlIHNlcGFyYXRpb24gb2YgQnJlYWtpbmdDb250ZXh0LAorICAgICAgICBhbmQgdGhl
IHNlcGFyYXRpb24gb2YgTGluZUJyZWFrZXIgY2xhc3Nlcy4gU2luY2UgSSB3YW50ZWQgdG8ga2Vl
cCB0aGUgaGVscGVyIGZ1bmN0aW9ucyBvcmdhbml6ZWQsIEkgYWxzbyBhZGRlZCBhCisgICAgICAg
IG5ldyBmaWxlIGNhbGxlZCBMaW5lSW5saW5lSGVhZGVycy5oLCB3aGljaCBjb250YWlucyB0aGUg
ZnVuY3Rpb25zIHdoaWNoIHVzZWQgaW4gTGluZUJyZWFrZXIuaCBhbmQgQnJlYWtpbmdDb250ZXh0
LmguCisgICAgICAgIEkgbW92ZWQgTGluZUluZm8gY2xhc3MgaW50byBsaW5lIGRpcmVjdG9yeS4g
SXQgd2FzIG5lY2Vzc2FyeSB0aGlzIHRpbWUsIHNpbmNlIEkgYWRkZWQgYSBjcHAgZm9yIGl0LiBJ
J2xsIG1vdmUgdGhlCisgICAgICAgIHJlc3Qgb2YgdGhlIGxpbmUgbGF5b3V0IHJlbGF0ZWQgaGVs
cGVyIGNsYXNzZXMgbGF0ZXIuIChJIHdhbnRlZCB0byBtaW5pbWl6ZSBtZXJnZSBjb25mbGljdHMu
KQorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgbm8gYmVoYXZpb3IgY2hhbmdlLgorCisgICAgICAg
ICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogR05VbWFrZWZpbGUuYW06CisgICAgICAgICog
R05VbWFrZWZpbGUubGlzdC5hbToKKyAgICAgICAgKiBXZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52
Y3hwcm9qOgorICAgICAgICAqIFdlYkNvcmUudmN4cHJvai9jb3B5Rm9yd2FyZGluZ0hlYWRlcnMu
Y21kOgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAg
ICAgKiByZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDoKKyAgICAgICAgKFdlYkNv
cmU6OmNyZWF0ZVJ1bik6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0
SW5saW5lSGVhZGVycy5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OldvcmRNZWFzdXJlbWVu
dDo6V29yZE1lYXN1cmVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6
VHJhaWxpbmdPYmplY3RzKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6c2V0
VHJhaWxpbmdXaGl0ZXNwYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6
Y2xlYXIpOgorICAgICAgICAoV2ViQ29yZTo6VHJhaWxpbmdPYmplY3RzOjphcHBlbmRCb3hJZk5l
ZWRlZCk6CisgICAgICAgIChXZWJDb3JlOjpkZXByZWNhdGVkQWRkTWlkcG9pbnQpOgorICAgICAg
ICAoV2ViQ29yZTo6c3RhcnRJZ25vcmluZ1NwYWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpzdG9w
SWdub3JpbmdTcGFjZXMpOgorICAgICAgICAoV2ViQ29yZTo6ZW5zdXJlTGluZUJveEluc2lkZUln
bm9yZWRTcGFjZXMpOgorICAgICAgICAoV2ViQ29yZTo6VHJhaWxpbmdPYmplY3RzOjp1cGRhdGVN
aWRwb2ludHNGb3JUcmFpbGluZ0JveGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29u
dGV4dDo6QnJlYWtpbmdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4
dDo6Y3VycmVudE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6Omxp
bmVCcmVhayk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVCcmVha1Jl
Zik6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVXaWR0aCk6CisgICAg
ICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmF0RW5kKToKKyAgICAgICAgKFdlYkNvcmU6
OkJyZWFraW5nQ29udGV4dDo6Y2xlYXJMaW5lQnJlYWtJZkZpdHNPbkxpbmUpOgorICAgICAgICAo
V2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0Ojpjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aCk6
CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmluaXRpYWxpemVGb3JDdXJyZW50
T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KToK
KyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aGFuZGxlQlIpOgorICAgICAgICAo
V2ViQ29yZTo6Ym9yZGVyUGFkZGluZ01hcmdpblN0YXJ0KToKKyAgICAgICAgKFdlYkNvcmU6OmJv
cmRlclBhZGRpbmdNYXJnaW5FbmQpOgorICAgICAgICAoV2ViQ29yZTo6c2hvdWxkQWRkQm9yZGVy
UGFkZGluZ01hcmdpbik6CisgICAgICAgIChXZWJDb3JlOjpwcmV2aW91c0luRmxvd1NpYmxpbmcp
OgorICAgICAgICAoV2ViQ29yZTo6aW5saW5lTG9naWNhbFdpZHRoKToKKyAgICAgICAgKFdlYkNv
cmU6OkJyZWFraW5nQ29udGV4dDo6aGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZCk6CisgICAgICAg
IChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUZsb2F0KToKKyAgICAgICAgKFdlYkNv
cmU6OnNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdCk6CisgICAgICAgIChXZWJD
b3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUVtcHR5SW5saW5lKToKKyAgICAgICAgKFdlYkNv
cmU6OkJyZWFraW5nQ29udGV4dDo6aGFuZGxlUmVwbGFjZWQpOgorICAgICAgICAoV2ViQ29yZTo6
Zmlyc3RQb3NpdGl2ZVdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OnVwZGF0ZVNlZ21lbnRzRm9y
U2hhcGVzKToKKyAgICAgICAgKFdlYkNvcmU6Oml0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNv
bWJpbmVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6Om5leHRDaGFyYWN0ZXIpOgorICAgICAgICAo
V2ViQ29yZTo6dXBkYXRlQ291bnRlcklmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6Om1lYXN1
cmVIeXBoZW5XaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0V2lkdGgpOgorICAgICAgICAo
V2ViQ29yZTo6ZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gpOgorICAgICAgICAoV2ViQ29yZTo6
dHJ5SHlwaGVuYXRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpoYW5k
bGVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRp
b24pOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpjYW5CcmVha0F0VGhpc1Bv
c2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6Y29tbWl0QW5kVXBk
YXRlTGluZUJyZWFrSWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tNaWRwb2ludHMp
OgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbmRPZkxpbmUpOgor
ICAgICAgICAqIHJlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6cmVzZXQpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJy
ZWFrZXI6OnNraXBUcmFpbGluZ1doaXRlc3BhY2UpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJy
ZWFrZXI6OnNraXBMZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUv
TGluZUJyZWFrZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6TGlu
ZUJyZWFrZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJyZWFrZXI6OmxpbmVXYXNIeXBoZW5h
dGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVCcmVha2VyOjpwb3NpdGlvbmVkT2JqZWN0cyk6
CisgICAgICAgIChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6Y2xlYXIpOgorICAgICAgICAqIHJlbmRl
cmluZy9saW5lL0xpbmVJbmZvLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5m
bzo6c2V0RW1wdHkpOgorICAgICAgICAqIHJlbmRlcmluZy9saW5lL0xpbmVJbmZvLmg6IFJlbmFt
ZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvTGluZUluZm8uaC4KKyAgICAgICAgKFdl
YkNvcmU6OkxpbmVJbmZvOjpMaW5lSW5mbyk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6
aXNGaXJzdExpbmUpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OmlzTGFzdExpbmUpOgor
ICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OmlzRW1wdHkpOgorICAgICAgICAoV2ViQ29yZTo6
TGluZUluZm86OnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk6CisgICAgICAgIChXZWJDb3JlOjpM
aW5lSW5mbzo6ZmxvYXRQYWdpbmF0aW9uU3RydXQpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUlu
Zm86OnJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUlu
Zm86OnJlc2V0UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpM
aW5lSW5mbzo6aW5jcmVtZW50UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAgIChX
ZWJDb3JlOjpMaW5lSW5mbzo6c2V0Rmlyc3RMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVJ
bmZvOjpzZXRMYXN0TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6c2V0UHJldmlv
dXNMaW5lQnJva2VDbGVhbmx5KToKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVJbmZvOjpzZXRGbG9h
dFBhZ2luYXRpb25TdHJ1dCk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvTGluZUlubGluZUhl
YWRlcnMuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpoYXNJbmxpbmVEaXJlY3Rpb25Cb3Jk
ZXJzUGFkZGluZ09yTWFyZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OmxpbmVTdHlsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpyZXF1aXJlc0xpbmVCb3hGb3JDb250ZW50KToKKyAgICAgICAgKFdlYkNv
cmU6OnNob3VsZENvbGxhcHNlV2hpdGVTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpza2lwTm9u
QnJlYWtpbmdTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjphbHdheXNSZXF1aXJlc0xpbmVCb3gp
OgorICAgICAgICAoV2ViQ29yZTo6cmVxdWlyZXNMaW5lQm94KToKKyAgICAgICAgKFdlYkNvcmU6
OnNldFN0YXRpY1Bvc2l0aW9ucyk6CisKIDIwMTMtMTEtMTQgIEpvc2VwaCBQZWNvcmFybyAgPHBl
Y29yYXJvQGFwcGxlLmNvbT4KIAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBDbGVhbmVyIEJhY2tl
bmQgTWV0aG9kIENhbGxpbmcgQ29kZSBHZW5lcmF0aW9uCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9HTlVtYWtlZmlsZS5hbSBiL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCmluZGV4
IGQ0N2Q2YjcuLmJlMmFiMGEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxl
LmFtCisrKyBiL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCkBAIC05MCw2ICs5MCw3IEBA
IHdlYmNvcmVfY3BwZmxhZ3MgKz0gXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsdWdp
bnMgXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsdWdpbnMvd2luIFwKIAktSSQoc3Jj
ZGlyKS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcgXAorCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9saW5lIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvbWF0aG1sIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc2hhcGVz
IFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3R5bGUgXApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbSBiL1NvdXJjZS9XZWJDb3Jl
L0dOVW1ha2VmaWxlLmxpc3QuYW0KaW5kZXggOTFiOTNkMi4uYjk2MTUwNyAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQorKysgYi9Tb3VyY2UvV2ViQ29yZS9H
TlVtYWtlZmlsZS5saXN0LmFtCkBAIC00Mjk4LDcgKzQyOTgsNiBAQCB3ZWJjb3JlX3NvdXJjZXMg
Kz0gXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9Mb2dpY2FsU2VsZWN0aW9uT2Zmc2V0Q2Fj
aGVzLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MYXlvdXRSZXBhaW50ZXIuaCBcCiAJ
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xheW91dFJlcGFpbnRlci5jcHAgXAotCVNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9MaW5lSW5mby5oIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
TGluZUxheW91dFN0YXRlLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lV2lkdGgu
aCBcCiAJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xpbmVXaWR0aC5jcHAgXApAQCAtNDUwMyw2
ICs0NTAyLDEyIEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL1RleHRQYWludGVyLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0UGFpbnRT
dHlsZS5oIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVmVydGljYWxQb3NpdGlvbkNhY2hl
LmggXAorCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0JyZWFraW5nQ29udGV4dElubGlu
ZUhlYWRlcnMuaCBcCisJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUluZm8uaCBc
CisJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUluZm8uY3BwIFwKKwlTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5oIFwKKwlTb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5jcHAgXAorCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9saW5lL0xpbmVJbmxpbmVIZWFkZXJzLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9t
YXRobWwvUmVuZGVyTWF0aE1MQmxvY2suY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
bWF0aG1sL1JlbmRlck1hdGhNTEJsb2NrLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9t
YXRobWwvUmVuZGVyTWF0aE1MRmVuY2VkLmNwcCBcCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvagppbmRleCAxNzU0N2M5Li4zOGUyNDgyIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qCisrKyBi
L1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2oKQEAgLTExMDUw
LDYgKzExMDUwLDggQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xTaW1w
bGVMaW5lTGF5b3V0LmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmlu
Z1xTaW1wbGVMaW5lTGF5b3V0RnVuY3Rpb25zLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1
ZGU9Ii4uXHJlbmRlcmluZ1xUZXh0UGFpbnRTdHlsZS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJ
bmNsdWRlPSIuLlxyZW5kZXJpbmdcbGluZVxMaW5lQnJlYWtlci5jcHAiIC8+CisgICAgPENsQ29t
cGlsZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcbGluZVxMaW5lSW5mby5jcHAiIC8+CiAgICAgPENs
Q29tcGlsZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcc2hhcGVzXFBvbHlnb25TaGFwZS5jcHAiIC8+
CiAgICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcc2hhcGVzXFJhc3RlclNoYXBl
LmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xzaGFwZXNcUmVj
dGFuZ2xlU2hhcGUuY3BwIiAvPgpAQCAtMTk3NjUsNyArMTk3NjcsNiBAQAogICAgIDxDbEluY2x1
ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXElubGluZVRleHRCb3guaCIgLz4KICAgICA8Q2xJbmNs
dWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xMYXlvdXRSZXBhaW50ZXIuaCIgLz4KICAgICA8Q2xJ
bmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xMYXlvdXRTdGF0ZS5oIiAvPgotICAgIDxDbElu
Y2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXExpbmVJbmZvLmgiIC8+CiAgICAgPENsSW5jbHVk
ZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcTGluZUxheW91dFN0YXRlLmgiIC8+CiAgICAgPENsSW5j
bHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcTGluZVdpZHRoLmgiIC8+CiAgICAgPENsSW5jbHVk
ZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcT3JkZXJJdGVyYXRvci5oIiAvPgpAQCAtMTk4NDAsNiAr
MTk4NDEsMTAgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xSZW5kZXJT
ZWxlY3Rpb25JbmZvLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdc
UmVuZGVyU2xpZGVyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdc
UmVuZGVyU25hcHNob3R0ZWRQbHVnSW4uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4u
XHJlbmRlcmluZ1xsaW5lXEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCIgLz4KKyAgICA8
Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xsaW5lXExpbmVCcmVha2VyLmgiIC8+Cisg
ICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcbGluZVxMaW5lSW5mby5oIiAvPgor
ICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXGxpbmVcTGluZUlubGluZUhlYWRl
cnMuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xzaGFwZXNcUG9s
eWdvblNoYXBlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcc2hh
cGVzXFJhc3RlclNoYXBlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJp
bmdcc2hhcGVzXFJlY3RhbmdsZVNoYXBlLmgiIC8+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9XZWJDb3JlLnZjeHByb2ovY29weUZvcndhcmRpbmdIZWFkZXJzLmNtZCBiL1NvdXJjZS9XZWJD
b3JlL1dlYkNvcmUudmN4cHJvai9jb3B5Rm9yd2FyZGluZ0hlYWRlcnMuY21kCmluZGV4IDU5MjA5
ZmEuLmI5ZjY2NTkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9j
b3B5Rm9yd2FyZGluZ0hlYWRlcnMuY21kCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4
cHJvai9jb3B5Rm9yd2FyZGluZ0hlYWRlcnMuY21kCkBAIC03Myw2ICs3Myw3IEBAIHhjb3B5IC95
IC9kICIlUHJvamVjdERpciUuLlxicmlkZ2VcanNjXCouaCIgIiVDT05GSUdVUkFUSU9OQlVJTERE
SVIlXGluY2x1ZGVcV2ViCiB4Y29weSAveSAvZCAiJVByb2plY3REaXIlLi5ccGx1Z2luc1wqLmgi
ICIlQ09ORklHVVJBVElPTkJVSUxERElSJVxpbmNsdWRlXFdlYkNvcmUiCiB4Y29weSAveSAvZCAi
JVByb2plY3REaXIlLi5ccGx1Z2luc1x3aW5cKi5oIiAiJUNPTkZJR1VSQVRJT05CVUlMRERJUiVc
aW5jbHVkZVxXZWJDb3JlIgogeGNvcHkgL3kgL2QgIiVQcm9qZWN0RGlyJS4uXHJlbmRlcmluZ1wq
LmgiICIlQ09ORklHVVJBVElPTkJVSUxERElSJVxpbmNsdWRlXFdlYkNvcmUiCit4Y29weSAveSAv
ZCAiJVByb2plY3REaXIlLi5ccmVuZGVyaW5nXGxpbmVcKi5oIiAiJUNPTkZJR1VSQVRJT05CVUlM
RERJUiVcaW5jbHVkZVxXZWJDb3JlIgogeGNvcHkgL3kgL2QgIiVQcm9qZWN0RGlyJS4uXHJlbmRl
cmluZ1xzdHlsZVwqLmgiICIlQ09ORklHVVJBVElPTkJVSUxERElSJVxpbmNsdWRlXFdlYkNvcmUi
CiB4Y29weSAveSAvZCAiJVByb2plY3REaXIlLi5ccmVuZGVyaW5nXHNoYXBlc1wqLmgiICIlQ09O
RklHVVJBVElPTkJVSUxERElSJVxpbmNsdWRlXFdlYkNvcmUiCiB4Y29weSAveSAvZCAiJVByb2pl
Y3REaXIlLi5ccmVuZGVyaW5nXHN2Z1wqLmgiICIlQ09ORklHVVJBVElPTkJVSUxERElSJVxpbmNs
dWRlXFdlYkNvcmUiCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2ogYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oKaW5kZXggMTMzMGJkOC4uMzE5OTM0YiAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCisrKyBiL1NvdXJjZS9XZWJD
b3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMzQzNiw3ICszNDM2LDYg
QEAKIAkJOUZBMzdFRkQxMTcyRkRBNjAwQzRDRDU1IC8qIEpTU2NyaXB0UHJvZmlsZU5vZGUuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDlGQTM3RUY5MTE3
MkZEOTMwMEM0Q0Q1NSAvKiBKU1NjcmlwdFByb2ZpbGVOb2RlLmggKi87IH07CiAJCUEwMjQ1NzUx
MTZDRUFBMjcwMDBFNTY3MSAvKiBFWFREcmF3QnVmZmVycy5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBMDI0NTc0RTE2Q0VBQTI3MDAwRTU2NzEgLyog
RVhURHJhd0J1ZmZlcnMuY3BwICovOyB9OwogCQlBMDI0NTc1MjE2Q0VBQTI3MDAwRTU2NzEgLyog
RVhURHJhd0J1ZmZlcnMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEEwMjQ1NzRGMTZDRUFBMjcwMDBFNTY3MSAvKiBFWFREcmF3QnVmZmVycy5oICovOyB9
OwotCQlBMDZCRkUyRTE3REZCNDNGMDA4MzAyQkIgLyogTGluZUluZm8uaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEEwNkJGRTJDMTdERkI0MzMwMDgzMDJC
QiAvKiBMaW5lSW5mby5oICovOyB9OwogCQlBMDdEMzM1NTE1MkI2MzBFMDAxQjYzOTMgLyogSlNX
ZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBBMDdEMzM1MzE1MkI2MzBFMDAxQjYzOTMgLyogSlNXZWJHTFNo
YWRlclByZWNpc2lvbkZvcm1hdC5jcHAgKi87IH07CiAJCUEwN0QzMzU2MTUyQjYzMEUwMDFCNjM5
MyAvKiBKU1dlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0LmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBMDdEMzM1NDE1MkI2MzBFMDAxQjYzOTMgLyogSlNX
ZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5oICovOyB9OwogCQlBMDdEMzM1ODE1MkI2MzJEMDAx
QjYzOTMgLyogV2ViR0xTaGFkZXJQcmVjaXNpb25Gb3JtYXQuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEEwN0QzMzU3MTUyQjYzMkQwMDFCNjM5MyAvKiBX
ZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5oICovOyB9OwpAQCAtNjMwMSw2ICs2MzAwLDggQEAK
IAkJRkVFMTgxMTQxNkMzMTlFODAwMDg0ODQ5IC8qIFNRTFRyYW5zYWN0aW9uQmFja2VuZC5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkVFMTgxMTIxNkMz
MTlFODAwMDg0ODQ5IC8qIFNRTFRyYW5zYWN0aW9uQmFja2VuZC5oICovOyB9OwogCQlGRjk0NUVD
QjE2MUY3RjM2MDA5NzFCQzggLyogUHNldWRvRWxlbWVudC5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRjk0NUVDOTE2MUY3RjM2MDA5NzFCQzggLyog
UHNldWRvRWxlbWVudC5jcHAgKi87IH07CiAJCUZGOTQ1RUNDMTYxRjdGMzYwMDk3MUJDOCAvKiBQ
c2V1ZG9FbGVtZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBGRjk0NUVDQTE2MUY3RjM2MDA5NzFCQzggLyogUHNldWRvRWxlbWVudC5oICovOyB9Owor
CQlGRkI2OThDQzE4MzNFRTBEMDAxNThBMzEgLyogTGluZUJyZWFrZXIuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkZCNjk4Q0ExODMzRUMzODAwMTU4
QTMxIC8qIExpbmVCcmVha2VyLmNwcCAqLzsgfTsKKwkJRkZCNjk4Q0YxODM0MDJCQjAwMTU4QTMx
IC8qIExpbmVJbmZvLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEZGQjY5OENEMTgzM0YxNzYwMDE1OEEzMSAvKiBMaW5lSW5mby5jcHAgKi87IH07CiAJ
CUZGRDVCOTdBMTM1Q0M5NzgwMEQ1RTkyQSAvKiBQYWdlVmlzaWJpbGl0eVN0YXRlLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZGRDVCOTc3MTM1Q0M5
NzgwMEQ1RTkyQSAvKiBQYWdlVmlzaWJpbGl0eVN0YXRlLmNwcCAqLzsgfTsKIAkJRkZENUI5N0Ix
MzVDQzk3ODAwRDVFOTJBIC8qIFBhZ2VWaXNpYmlsaXR5U3RhdGUuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZGRDVCOTc4MTM1Q0M5NzgwMEQ1RTkyQSAv
KiBQYWdlVmlzaWJpbGl0eVN0YXRlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJp
dmF0ZSwgKTsgfTsgfTsKIC8qIEVuZCBQQlhCdWlsZEZpbGUgc2VjdGlvbiAqLwpAQCAtMTAyMDcs
NyArMTAyMDgsNiBAQAogCQlBMDI0NTc0RTE2Q0VBQTI3MDAwRTU2NzEgLyogRVhURHJhd0J1ZmZl
cnMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gRVhURHJhd0J1ZmZl
cnMuY3BwOyBwYXRoID0gY2FudmFzL0VYVERyYXdCdWZmZXJzLmNwcDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJQTAyNDU3NEYxNkNFQUEyNzAwMEU1NjcxIC8qIEVYVERyYXdCdWZmZXJz
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEVYVERyYXdCdWZmZXJzLmg7IHBh
dGggPSBjYW52YXMvRVhURHJhd0J1ZmZlcnMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJQTAyNDU3NTAxNkNFQUEyNzAwMEU1NjcxIC8qIEVYVERyYXdCdWZmZXJzLmlkbCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHRleHQ7IG5hbWUgPSBFWFREcmF3QnVmZmVycy5pZGw7IHBhdGggPSBjYW52YXMvRVhURHJh
d0J1ZmZlcnMuaWRsOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQlBMDZCRkUyQzE3REZC
NDMzMDA4MzAyQkIgLyogTGluZUluZm8uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gTGluZUluZm8uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQTA3MThCRTgxN0Uy
NkYxNjAwRjZCRjQ0IC8qIExpbmVMYXlvdXRTdGF0ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBMaW5lTGF5b3V0U3RhdGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
IAkJQTA3RDMzNTMxNTJCNjMwRTAwMUI2MzkzIC8qIEpTV2ViR0xTaGFkZXJQcmVjaXNpb25Gb3Jt
YXQuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSlNXZWJHTFNoYWRl
clByZWNpc2lvbkZvcm1hdC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUEwN0Qz
MzU0MTUyQjYzMEUwMDFCNjM5MyAvKiBKU1dlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0LmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTV2ViR0xTaGFkZXJQcmVjaXNpb25Gb3Jt
YXQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTEzNDc2LDYgKzEzNDc2LDExIEBA
CiAJCUZFRTE4MTEyMTZDMzE5RTgwMDA4NDg0OSAvKiBTUUxUcmFuc2FjdGlvbkJhY2tlbmQuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU1FMVHJhbnNhY3Rpb25CYWNrZW5kLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZGOTQ1RUM5MTYxRjdGMzYwMDk3MUJDOCAv
KiBQc2V1ZG9FbGVtZW50LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9
IFBzZXVkb0VsZW1lbnQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGRjk0NUVD
QTE2MUY3RjM2MDA5NzFCQzggLyogUHNldWRvRWxlbWVudC5oICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jLmg7IHBhdGggPSBQc2V1ZG9FbGVtZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCUZGQjY5OEM5MTgzMkYxMEIwMDE1OEEzMSAvKiBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFk
ZXJzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJyZWFraW5nQ29udGV4dElu
bGluZUhlYWRlcnMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkZCNjk4Q0ExODMz
RUMzODAwMTU4QTMxIC8qIExpbmVCcmVha2VyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
LmNwcDsgcGF0aCA9IExpbmVCcmVha2VyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJRkZCNjk4Q0IxODMzRUMzODAwMTU4QTMxIC8qIExpbmVCcmVha2VyLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IExpbmVCcmVha2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CisJCUZGQjY5OENEMTgzM0YxNzYwMDE1OEEzMSAvKiBMaW5lSW5mby5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBMaW5lSW5mby5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CisJCUZGQjY5OENFMTgzM0YxNzYwMDE1OEEzMSAvKiBMaW5lSW5mby5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBMaW5lSW5mby5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQlGRkQ1Qjk3NzEzNUNDOTc4MDBENUU5MkEgLyogUGFnZVZpc2li
aWxpdHlTdGF0ZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBQYWdl
VmlzaWJpbGl0eVN0YXRlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkZENUI5
NzgxMzVDQzk3ODAwRDVFOTJBIC8qIFBhZ2VWaXNpYmlsaXR5U3RhdGUuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gUGFnZVZpc2liaWxpdHlTdGF0ZS5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogLyogRW5kIFBCWEZpbGVSZWZlcmVuY2Ugc2VjdGlvbiAqLwpAQCAtMjA5
MDcsNiArMjA5MTIsNyBAQAogCQlGNTIzRDJGMzAyREU0NDNCMDE4NjM1Q0EgLyogcmVuZGVyaW5n
ICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKKwkJCQlGRkI2OThD
ODE4MzJGMTBCMDAxNThBMzEgLyogbGluZSAqLywKIAkJCQlDREU3RkM0MjE4MTkwNEIxMDAyQkJC
NzcgLyogT3JkZXJJdGVyYXRvci5jcHAgKi8sCiAJCQkJQ0RFN0ZDNDMxODE5MDRCMTAwMkJCQjc3
IC8qIE9yZGVySXRlcmF0b3IuaCAqLywKIAkJCQk0MzkwNDZDMjEyREEyNUNFMDBBRjgwQTIgLyog
bWF0aG1sICovLApAQCAtMjA5NTUsNyArMjA5NjEsNiBAQAogCQkJCUExMjBBQ0EwMTNGOTk4Mzcw
MEZFNEFDNyAvKiBMYXlvdXRSZXBhaW50ZXIuaCAqLywKIAkJCQkyRDkwNjYwNDBCRTE0MUQ0MDA5
NTY5OTggLyogTGF5b3V0U3RhdGUuY3BwICovLAogCQkJCTJEOTA2NjA1MEJFMTQxRDQwMDk1Njk5
OCAvKiBMYXlvdXRTdGF0ZS5oICovLAotCQkJCUEwNkJGRTJDMTdERkI0MzMwMDgzMDJCQiAvKiBM
aW5lSW5mby5oICovLAogCQkJCUEwNzE4QkU4MTdFMjZGMTYwMEY2QkY0NCAvKiBMaW5lTGF5b3V0
U3RhdGUuaCAqLywKIAkJCQlBMENCMDAyMzE3REY4MUFDMDAxNzg5NkIgLyogTGluZVdpZHRoLmNw
cCAqLywKIAkJCQlBMENCMDAyMTE3REU5Q0QwMDAxNzg5NkIgLyogTGluZVdpZHRoLmggKi8sCkBA
IC0yMTg5NSw2ICsyMTkwMCwxOCBAQAogCQkJbmFtZSA9IFdlYkF1ZGlvOwogCQkJc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsKIAkJfTsKKwkJRkZCNjk4QzgxODMyRjEwQjAwMTU4QTMxIC8qIGxpbmUg
Ki8gPSB7CisJCQlpc2EgPSBQQlhHcm91cDsKKwkJCWNoaWxkcmVuID0gKAorCQkJCUZGQjY5OENE
MTgzM0YxNzYwMDE1OEEzMSAvKiBMaW5lSW5mby5jcHAgKi8sCisJCQkJRkZCNjk4Q0UxODMzRjE3
NjAwMTU4QTMxIC8qIExpbmVJbmZvLmggKi8sCisJCQkJRkZCNjk4Q0ExODMzRUMzODAwMTU4QTMx
IC8qIExpbmVCcmVha2VyLmNwcCAqLywKKwkJCQlGRkI2OThDQjE4MzNFQzM4MDAxNThBMzEgLyog
TGluZUJyZWFrZXIuaCAqLywKKwkJCQlGRkI2OThDOTE4MzJGMTBCMDAxNThBMzEgLyogQnJlYWtp
bmdDb250ZXh0SW5saW5lSGVhZGVycy5oICovLAorCQkJKTsKKwkJCXBhdGggPSBsaW5lOworCQkJ
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKIC8qIEVuZCBQQlhHcm91cCBzZWN0aW9uICov
CiAKIC8qIEJlZ2luIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KQEAgLTI1MTg3LDcg
KzI1MjA0LDYgQEAKIAkJCQlCRTE2QzU5NTE3Q0ZFMTcyMDA4NTJDMDQgLyogSW5iYW5kV2ViVlRU
VGV4dFRyYWNrLmggaW4gSGVhZGVycyAqLywKIAkJCQlCQzEwRDc2ODE3RDhFRTcxMDA1RTI2MjYg
LyogUmVuZGVyQmxvY2tGbG93LmggaW4gSGVhZGVycyAqLywKIAkJCQlBMENCMDAyNTE3REY4MjZD
MDAxNzg5NkIgLyogTGluZVdpZHRoLmggaW4gSGVhZGVycyAqLywKLQkJCQlBMDZCRkUyRTE3REZC
NDNGMDA4MzAyQkIgLyogTGluZUluZm8uaCBpbiBIZWFkZXJzICovLAogCQkJCUNEM0UyNTFDMTgw
NDZCMDYwMEUyN0Y1NiAvKiBHcmlkQ29vcmRpbmF0ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQ0Qz
RTI1MjQxODA0NkJDRDAwRTI3RjU2IC8qIENTU0dyaWRUZW1wbGF0ZVZhbHVlLmggaW4gSGVhZGVy
cyAqLywKIAkJCQlDREVGNEZENzE3RTg1QzhGMDBBRUUyNEIgLyogR3JpZExlbmd0aC5oIGluIEhl
YWRlcnMgKi8sCkBAIC0yNTc3Myw2ICsyNTc4OSw3IEBACiAJCQkJOTc3QjM4NjIxMjI4ODNFOTAw
QjgxRkY4IC8qIENTU1ByZWxvYWRTY2FubmVyLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4MEU2
RDA1MEExOTg5Q0EwMDdGQjhDNSAvKiBDU1NQcmltaXRpdmVWYWx1ZS5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQlBODBFNkNGNzBBMTk4OUNBMDA3RkI4QzUgLyogQ1NTUHJvcGVydHkuY3BwIGluIFNv
dXJjZXMgKi8sCisJCQkJRkZCNjk4Q0MxODMzRUUwRDAwMTU4QTMxIC8qIExpbmVCcmVha2VyLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCTc4RDAyQkM1MTU0QTE4REYwMEI2MkQwNSAvKiBDU1NQcm9w
ZXJ0eUFuaW1hdGlvbi5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxQUJBNzZDQTExRDIwRTUwMDA0
QzIwMUMgLyogQ1NTUHJvcGVydHlOYW1lcy5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkwN0M1OUI1
NjE3RjRBQzE1MDAwRkJDQkIgLyogVmlkZW9TdHJlYW1UcmFjay5jcHAgaW4gU291cmNlcyAqLywK
QEAgLTI2NTc5LDYgKzI2NTk2LDcgQEAKIAkJCQkwNzAzNjNFNTE4MUExQ0RDMDBDMDc0QTUgLyog
QVZNZWRpYUNhcHR1cmVTb3VyY2UubW0gaW4gU291cmNlcyAqLywKIAkJCQk5MzkyMjYyRjEwMzIx
MDg0MDA2RTdENUQgLyogSlNDU1NSdWxlTGlzdEN1c3RvbS5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQkxNDIwMTFCNjBBMDAzMTMzMDA4MzAzRjkgLyogSlNDU1NTdHlsZURlY2xhcmF0aW9uLmNwcCBp
biBTb3VyY2VzICovLAorCQkJCUZGQjY5OENGMTgzNDAyQkIwMDE1OEEzMSAvKiBMaW5lSW5mby5j
cHAgaW4gU291cmNlcyAqLywKIAkJCQlCQzU4MjVGMzBDMEI4OTM4MDA1M0YxQjUgLyogSlNDU1NT
dHlsZURlY2xhcmF0aW9uQ3VzdG9tLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDNDZDMjA2MEMw
RERDQTEwMDIwQ0ZDMyAvKiBKU0NTU1N0eWxlUnVsZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlC
Q0M1QkUwMDBDMEU5MzExMDAxMUMyREIgLyogSlNDU1NTdHlsZVNoZWV0LmNwcCBpbiBTb3VyY2Vz
ICovLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xpbmVJbmZvLmggYi9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvTGluZUluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggODUzYWU2Ni4uMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
TGluZUluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQot
ICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcKLSAqICAgIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiAgICBjb3B5cmlnaHQgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICAgZGlzY2xh
aW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiAgICBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQotICogQ09QWVJJR0hUIEhPTERFUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotICogSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IKLSAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RAotICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYg
TGluZUluZm9faAotI2RlZmluZSBMaW5lSW5mb19oCi0KLSNpbmNsdWRlICJMaW5lV2lkdGguaCIK
LQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1jbGFzcyBMaW5lSW5mbyB7Ci1wdWJsaWM6Ci0gICAg
TGluZUluZm8oKQotICAgICAgICA6IG1faXNGaXJzdExpbmUodHJ1ZSkKLSAgICAgICAgLCBtX2lz
TGFzdExpbmUoZmFsc2UpCi0gICAgICAgICwgbV9pc0VtcHR5KHRydWUpCi0gICAgICAgICwgbV9w
cmV2aW91c0xpbmVCcm9rZUNsZWFubHkodHJ1ZSkKLSAgICAgICAgLCBtX2Zsb2F0UGFnaW5hdGlv
blN0cnV0KDApCi0gICAgICAgICwgbV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKDApCi0gICAg
eyB9Ci0KLSAgICBib29sIGlzRmlyc3RMaW5lKCkgY29uc3QgeyByZXR1cm4gbV9pc0ZpcnN0TGlu
ZTsgfQotICAgIGJvb2wgaXNMYXN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNMYXN0TGluZTsg
fQotICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1faXNFbXB0eTsgfQotICAgIGJv
b2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkgY29uc3QgeyByZXR1cm4gbV9wcmV2aW91c0xp
bmVCcm9rZUNsZWFubHk7IH0KLSAgICBMYXlvdXRVbml0IGZsb2F0UGFnaW5hdGlvblN0cnV0KCkg
Y29uc3QgeyByZXR1cm4gbV9mbG9hdFBhZ2luYXRpb25TdHJ1dDsgfQotICAgIHVuc2lnbmVkIHJ1
bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UoKSBjb25zdCB7IHJldHVybiBtX3J1bnNGcm9tTGVhZGlu
Z1doaXRlc3BhY2U7IH0KLSAgICB2b2lkIHJlc2V0UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgp
IHsgbV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlID0gMDsgfQotICAgIHZvaWQgaW5jcmVtZW50
UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgpIHsgbV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNl
Kys7IH0KLQotICAgIHZvaWQgc2V0Rmlyc3RMaW5lKGJvb2wgZmlyc3RMaW5lKSB7IG1faXNGaXJz
dExpbmUgPSBmaXJzdExpbmU7IH0KLSAgICB2b2lkIHNldExhc3RMaW5lKGJvb2wgbGFzdExpbmUp
IHsgbV9pc0xhc3RMaW5lID0gbGFzdExpbmU7IH0KLSAgICB2b2lkIHNldEVtcHR5KGJvb2wgZW1w
dHksIFJlbmRlckJsb2NrKiBibG9jayA9IDAsIExpbmVXaWR0aCogbGluZVdpZHRoID0gMCkKLSAg
ICB7Ci0gICAgICAgIGlmIChtX2lzRW1wdHkgPT0gZW1wdHkpCi0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIG1faXNFbXB0eSA9IGVtcHR5OwotICAgICAgICBpZiAoIWVtcHR5ICYmIGJsb2Nr
ICYmIGZsb2F0UGFnaW5hdGlvblN0cnV0KCkpIHsKLSAgICAgICAgICAgIGJsb2NrLT5zZXRMb2dp
Y2FsSGVpZ2h0KGJsb2NrLT5sb2dpY2FsSGVpZ2h0KCkgKyBmbG9hdFBhZ2luYXRpb25TdHJ1dCgp
KTsKLSAgICAgICAgICAgIHNldEZsb2F0UGFnaW5hdGlvblN0cnV0KDApOwotICAgICAgICAgICAg
bGluZVdpZHRoLT51cGRhdGVBdmFpbGFibGVXaWR0aCgpOwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgdm9pZCBzZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoYm9vbCBwcmV2aW91c0xpbmVCcm9r
ZUNsZWFubHkpIHsgbV9wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkgPSBwcmV2aW91c0xpbmVCcm9r
ZUNsZWFubHk7IH0KLSAgICB2b2lkIHNldEZsb2F0UGFnaW5hdGlvblN0cnV0KExheW91dFVuaXQg
c3RydXQpIHsgbV9mbG9hdFBhZ2luYXRpb25TdHJ1dCA9IHN0cnV0OyB9Ci0KLXByaXZhdGU6Ci0g
ICAgYm9vbCBtX2lzRmlyc3RMaW5lOwotICAgIGJvb2wgbV9pc0xhc3RMaW5lOwotICAgIGJvb2wg
bV9pc0VtcHR5OwotICAgIGJvb2wgbV9wcmV2aW91c0xpbmVCcm9rZUNsZWFubHk7Ci0gICAgTGF5
b3V0VW5pdCBtX2Zsb2F0UGFnaW5hdGlvblN0cnV0OwotICAgIHVuc2lnbmVkIG1fcnVuc0Zyb21M
ZWFkaW5nV2hpdGVzcGFjZTsKLX07Ci0KLX0KLQotI2VuZGlmIC8vIExpbmVJbmZvX2gKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKaW5k
ZXggZTU3YmM4NS4uMjE1NjY1MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKQEAgLTMsNiArMyw3IEBACiAgKiBDb3B5cmlnaHQg
KEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgQXBwbGUg
SW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sg
T2ggPHNoaXZhbWlkb3dAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5
c3RlbXMgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKQEAgLTI1
LDEzOCArMjYsMzEgQEAKIAogI2luY2x1ZGUgIkFYT2JqZWN0Q2FjaGUuaCIKICNpbmNsdWRlICJC
aWRpUmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmgi
CiAjaW5jbHVkZSAiRmxvYXRpbmdPYmplY3RzLmgiCi0jaW5jbHVkZSAiSHlwaGVuYXRpb24uaCIK
ICNpbmNsdWRlICJJbmxpbmVFbGVtZW50Qm94LmgiCiAjaW5jbHVkZSAiSW5saW5lSXRlcmF0b3Iu
aCIKICNpbmNsdWRlICJJbmxpbmVUZXh0Qm94LmgiCi0jaW5jbHVkZSAiTGluZUluZm8uaCIKICNp
bmNsdWRlICJMaW5lTGF5b3V0U3RhdGUuaCIKICNpbmNsdWRlICJMb2dnaW5nLmgiCiAjaW5jbHVk
ZSAiUmVuZGVyQmxvY2tGbG93LmgiCi0jaW5jbHVkZSAiUmVuZGVyQ29tYmluZVRleHQuaCIKLSNp
bmNsdWRlICJSZW5kZXJDb3VudGVyLmgiCiAjaW5jbHVkZSAiUmVuZGVyRmxvd1RocmVhZC5oIgot
I2luY2x1ZGUgIlJlbmRlcklubGluZS5oIgotI2luY2x1ZGUgIlJlbmRlckxheWVyLmgiCiAjaW5j
bHVkZSAiUmVuZGVyTGluZUJyZWFrLmgiCi0jaW5jbHVkZSAiUmVuZGVyTGlzdE1hcmtlci5oIgog
I2luY2x1ZGUgIlJlbmRlclJlZ2lvbi5oIgotI2luY2x1ZGUgIlJlbmRlclJ1YnlSdW4uaCIKICNp
bmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSAiU2V0dGluZ3MuaCIKICNpbmNsdWRlICJT
aW1wbGVMaW5lTGF5b3V0RnVuY3Rpb25zLmgiCiAjaW5jbHVkZSAiVHJhaWxpbmdGbG9hdHNSb290
SW5saW5lQm94LmgiCiAjaW5jbHVkZSAiVmVydGljYWxQb3NpdGlvbkNhY2hlLmgiCi0jaW5jbHVk
ZSAiYnJlYWtfbGluZXMuaCIKICNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZExlYWtDb3VudGVyLmg+
CiAjaW5jbHVkZSA8d3RmL1N0ZExpYkV4dHJhcy5oPgotI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4K
LSNpbmNsdWRlIDx3dGYvdW5pY29kZS9DaGFyYWN0ZXJOYW1lcy5oPgotCi0jaWYgRU5BQkxFKENT
U19TSEFQRVMpCi0jaW5jbHVkZSAiU2hhcGVJbnNpZGVJbmZvLmgiCi0jZW5kaWYKIAogI2lmIEVO
QUJMRShTVkcpCi0jaW5jbHVkZSAiUmVuZGVyU1ZHSW5saW5lVGV4dC5oIgogI2luY2x1ZGUgIlNW
R1Jvb3RJbmxpbmVCb3guaCIKICNlbmRpZgogCi11c2luZyBuYW1lc3BhY2UgV1RGOwotdXNpbmcg
bmFtZXNwYWNlIFVuaWNvZGU7Ci0KIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotLy8gV2UgZG9uJ3Qg
bGV0IG91ciBsaW5lIGJveCB0cmVlIGZvciBhIHNpbmdsZSBsaW5lIGdldCBhbnkgZGVlcGVyIHRo
YW4gdGhpcy4KLWNvbnN0IHVuc2lnbmVkIGNNYXhMaW5lRGVwdGggPSAyMDA7Ci0KLXN0cnVjdCBS
ZW5kZXJUZXh0SW5mbyB7Ci0gICAgLy8gRGVzdHJ1Y3Rpb24gb2YgbV9sYXlvdXQgcmVxdWlyZXMg
VGV4dExheW91dCB0byBiZSBhIGNvbXBsZXRlIHR5cGUsIHNvIHRoZSBjb25zdHJ1Y3RvciBhbmQg
ZGVzdHJ1Y3RvciBhcmUgbWFkZSBub24taW5saW5lIHRvIGF2b2lkIGNvbXBpbGF0aW9uIGVycm9y
cy4KLSAgICBSZW5kZXJUZXh0SW5mbygpOwotICAgIH5SZW5kZXJUZXh0SW5mbygpOwotCi0gICAg
UmVuZGVyVGV4dCogbV90ZXh0OwotICAgIE93blB0cjxUZXh0TGF5b3V0PiBtX2xheW91dDsKLSAg
ICBMYXp5TGluZUJyZWFrSXRlcmF0b3IgbV9saW5lQnJlYWtJdGVyYXRvcjsKLSAgICBjb25zdCBG
b250KiBtX2ZvbnQ7Ci19OwotCi1jbGFzcyBMaW5lQnJlYWtlciB7Ci1wdWJsaWM6Ci0gICAgZnJp
ZW5kIGNsYXNzIEJyZWFraW5nQ29udGV4dDsKLSAgICBMaW5lQnJlYWtlcihSZW5kZXJCbG9ja0Zs
b3cmIGJsb2NrKQotICAgICAgICA6IG1fYmxvY2soYmxvY2spCi0gICAgewotICAgICAgICByZXNl
dCgpOwotICAgIH0KLQotICAgIElubGluZUl0ZXJhdG9yIG5leHRMaW5lQnJlYWsoSW5saW5lQmlk
aVJlc29sdmVyJiwgTGluZUluZm8mLCBSZW5kZXJUZXh0SW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBs
YXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRM
aW5lcywgV29yZE1lYXN1cmVtZW50cyYpOwotCi0gICAgYm9vbCBsaW5lV2FzSHlwaGVuYXRlZCgp
IHsgcmV0dXJuIG1faHlwaGVuYXRlZDsgfQotICAgIGNvbnN0IFZlY3RvcjxSZW5kZXJCb3gqPiYg
cG9zaXRpb25lZE9iamVjdHMoKSB7IHJldHVybiBtX3Bvc2l0aW9uZWRPYmplY3RzOyB9Ci0gICAg
RUNsZWFyIGNsZWFyKCkgeyByZXR1cm4gbV9jbGVhcjsgfQotCi1wcml2YXRlOgotICAgIHZvaWQg
cmVzZXQoKTsKLQotICAgIElubGluZUl0ZXJhdG9yIG5leHRTZWdtZW50QnJlYWsoSW5saW5lQmlk
aVJlc29sdmVyJiwgTGluZUluZm8mLCBSZW5kZXJUZXh0SW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBs
YXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRM
aW5lcywgV29yZE1lYXN1cmVtZW50cyYpOwotICAgIHZvaWQgc2tpcFRyYWlsaW5nV2hpdGVzcGFj
ZShJbmxpbmVJdGVyYXRvciYsIGNvbnN0IExpbmVJbmZvJik7Ci0gICAgdm9pZCBza2lwTGVhZGlu
Z1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVyJiwgTGluZUluZm8mLCBGbG9hdGluZ09iamVj
dCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgTGluZVdpZHRoJik7Ci0KLSAgICBSZW5kZXJC
bG9ja0Zsb3cmIG1fYmxvY2s7Ci0gICAgYm9vbCBtX2h5cGhlbmF0ZWQ7Ci0gICAgRUNsZWFyIG1f
Y2xlYXI7Ci0gICAgVmVjdG9yPFJlbmRlckJveCo+IG1fcG9zaXRpb25lZE9iamVjdHM7Ci19Owot
Ci1zdGF0aWMgaW5saW5lIExheW91dFVuaXQgYm9yZGVyUGFkZGluZ01hcmdpblN0YXJ0KGNvbnN0
IFJlbmRlcklubGluZSYgY2hpbGQpCi17Ci0gICAgcmV0dXJuIGNoaWxkLm1hcmdpblN0YXJ0KCkg
KyBjaGlsZC5wYWRkaW5nU3RhcnQoKSArIGNoaWxkLmJvcmRlclN0YXJ0KCk7Ci19Ci0KLXN0YXRp
YyBpbmxpbmUgTGF5b3V0VW5pdCBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKGNvbnN0IFJlbmRlcklu
bGluZSYgY2hpbGQpCi17Ci0gICAgcmV0dXJuIGNoaWxkLm1hcmdpbkVuZCgpICsgY2hpbGQucGFk
ZGluZ0VuZCgpICsgY2hpbGQuYm9yZGVyRW5kKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBz
aG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2luKFJlbmRlck9iamVjdCogY2hpbGQpCi17Ci0gICAg
Ly8gV2hlbiBkZWNpZGluZyB3aGV0aGVyIHdlJ3JlIGF0IHRoZSBlZGdlIG9mIGFuIGlubGluZSwg
YWRqYWNlbnQgY29sbGFwc2VkIHdoaXRlc3BhY2UgaXMgdGhlIHNhbWUgYXMgbm8gc2libGluZyBh
dCBhbGwuCi0gICAgcmV0dXJuICFjaGlsZCB8fCAoY2hpbGQtPmlzVGV4dCgpICYmICF0b1JlbmRl
clRleHQoY2hpbGQpLT50ZXh0TGVuZ3RoKCkpOwotfQotCi1zdGF0aWMgUmVuZGVyT2JqZWN0KiBw
cmV2aW91c0luRmxvd1NpYmxpbmcoUmVuZGVyT2JqZWN0KiBjaGlsZCkKLXsKLSAgICBjaGlsZCA9
IGNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICB3aGlsZSAoY2hpbGQgJiYgY2hpbGQtPmlz
T3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAgICAgICBjaGlsZCA9IGNoaWxkLT5wcmV2aW91c1Np
YmxpbmcoKTsKLSAgICByZXR1cm4gY2hpbGQ7Ci19Ci0KLXN0YXRpYyBMYXlvdXRVbml0IGlubGlu
ZUxvZ2ljYWxXaWR0aChSZW5kZXJPYmplY3QqIGNoaWxkLCBib29sIGNoZWNrU3RhcnRFZGdlID0g
dHJ1ZSwgYm9vbCBjaGVja0VuZEVkZ2UgPSB0cnVlKQotewotICAgIHVuc2lnbmVkIGxpbmVEZXB0
aCA9IDE7Ci0gICAgTGF5b3V0VW5pdCBleHRyYVdpZHRoID0gMDsKLSAgICBSZW5kZXJFbGVtZW50
KiBwYXJlbnQgPSBjaGlsZC0+cGFyZW50KCk7Ci0gICAgd2hpbGUgKHBhcmVudC0+aXNSZW5kZXJJ
bmxpbmUoKSAmJiBsaW5lRGVwdGgrKyA8IGNNYXhMaW5lRGVwdGgpIHsKLSAgICAgICAgY29uc3Qg
UmVuZGVySW5saW5lJiBwYXJlbnRBc1JlbmRlcklubGluZSA9IHRvUmVuZGVySW5saW5lKCpwYXJl
bnQpOwotICAgICAgICBpZiAoIWlzRW1wdHlJbmxpbmUocGFyZW50QXNSZW5kZXJJbmxpbmUpKSB7
Ci0gICAgICAgICAgICBjaGVja1N0YXJ0RWRnZSA9IGNoZWNrU3RhcnRFZGdlICYmIHNob3VsZEFk
ZEJvcmRlclBhZGRpbmdNYXJnaW4ocHJldmlvdXNJbkZsb3dTaWJsaW5nKGNoaWxkKSk7Ci0gICAg
ICAgICAgICBpZiAoY2hlY2tTdGFydEVkZ2UpCi0gICAgICAgICAgICAgICAgZXh0cmFXaWR0aCAr
PSBib3JkZXJQYWRkaW5nTWFyZ2luU3RhcnQocGFyZW50QXNSZW5kZXJJbmxpbmUpOwotICAgICAg
ICAgICAgY2hlY2tFbmRFZGdlID0gY2hlY2tFbmRFZGdlICYmIHNob3VsZEFkZEJvcmRlclBhZGRp
bmdNYXJnaW4oY2hpbGQtPm5leHRTaWJsaW5nKCkpOwotICAgICAgICAgICAgaWYgKGNoZWNrRW5k
RWRnZSkKLSAgICAgICAgICAgICAgICBleHRyYVdpZHRoICs9IGJvcmRlclBhZGRpbmdNYXJnaW5F
bmQocGFyZW50QXNSZW5kZXJJbmxpbmUpOwotICAgICAgICAgICAgaWYgKCFjaGVja1N0YXJ0RWRn
ZSAmJiAhY2hlY2tFbmRFZGdlKQotICAgICAgICAgICAgICAgIHJldHVybiBleHRyYVdpZHRoOwot
ICAgICAgICB9Ci0gICAgICAgIGNoaWxkID0gcGFyZW50OwotICAgICAgICBwYXJlbnQgPSBjaGls
ZC0+cGFyZW50KCk7Ci0gICAgfQotICAgIHJldHVybiBleHRyYVdpZHRoOwotfQotCiBzdGF0aWMg
dm9pZCBkZXRlcm1pbmVEaXJlY3Rpb25hbGl0eShUZXh0RGlyZWN0aW9uJiBkaXIsIElubGluZUl0
ZXJhdG9yIGl0ZXIpCiB7CiAgICAgd2hpbGUgKCFpdGVyLmF0RW5kKCkpIHsKQEAgLTE3Nyw2NyAr
NzEsNyBAQCBzdGF0aWMgdm9pZCBkZXRlcm1pbmVEaXJlY3Rpb25hbGl0eShUZXh0RGlyZWN0aW9u
JiBkaXIsIElubGluZUl0ZXJhdG9yIGl0ZXIpCiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjaGVj
a01pZHBvaW50cyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0
ZXJhdG9yJiBsQnJlYWspCi17Ci0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIG91ciBsYXN0IG1pZHBv
aW50IGlzIGEgc3RhcnQgcG9pbnQgYmV5b25kIHRoZSBsaW5lIGJyZWFrLiAgSWYgc28sCi0gICAg
Ly8gc2hhdmUgaXQgb2ZmIHRoZSBsaXN0LCBhbmQgc2hhdmUgb2ZmIGEgdHJhaWxpbmcgc3BhY2Ug
aWYgdGhlIHByZXZpb3VzIGVuZCBwb2ludCBkb2Vzbid0Ci0gICAgLy8gcHJlc2VydmUgd2hpdGVz
cGFjZS4KLSAgICBpZiAobEJyZWFrLm1fb2JqICYmIGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBv
aW50cyAmJiAhKGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAlIDIpKSB7Ci0gICAgICAg
IElubGluZUl0ZXJhdG9yKiBtaWRwb2ludHMgPSBsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHMu
ZGF0YSgpOwotICAgICAgICBJbmxpbmVJdGVyYXRvciYgZW5kcG9pbnQgPSBtaWRwb2ludHNbbGlu
ZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzIC0gMl07Ci0gICAgICAgIGNvbnN0IElubGluZUl0
ZXJhdG9yJiBzdGFydHBvaW50ID0gbWlkcG9pbnRzW2xpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBv
aW50cyAtIDFdOwotICAgICAgICBJbmxpbmVJdGVyYXRvciBjdXJycG9pbnQgPSBlbmRwb2ludDsK
LSAgICAgICAgd2hpbGUgKCFjdXJycG9pbnQuYXRFbmQoKSAmJiBjdXJycG9pbnQgIT0gc3RhcnRw
b2ludCAmJiBjdXJycG9pbnQgIT0gbEJyZWFrKQotICAgICAgICAgICAgY3VycnBvaW50LmluY3Jl
bWVudCgpOwotICAgICAgICBpZiAoY3VycnBvaW50ID09IGxCcmVhaykgewotICAgICAgICAgICAg
Ly8gV2UgaGl0IHRoZSBsaW5lIGJyZWFrIGJlZm9yZSB0aGUgc3RhcnQgcG9pbnQuICBTaGF2ZSBv
ZmYgdGhlIHN0YXJ0IHBvaW50LgotICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUubnVtTWlk
cG9pbnRzLS07Ci0gICAgICAgICAgICBpZiAoZW5kcG9pbnQubV9vYmotPnN0eWxlKCkuY29sbGFw
c2VXaGl0ZVNwYWNlKCkgJiYgZW5kcG9pbnQubV9vYmotPmlzVGV4dCgpKQotICAgICAgICAgICAg
ICAgIGVuZHBvaW50Lm1fcG9zLS07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIERvbid0IGNh
bGwgdGhpcyBkaXJlY3RseS4gVXNlIG9uZSBvZiB0aGUgZGVzY3JpcHRpdmUgaGVscGVyIGZ1bmN0
aW9ucyBiZWxvdy4KLXN0YXRpYyB2b2lkIGRlcHJlY2F0ZWRBZGRNaWRwb2ludChMaW5lTWlkcG9p
bnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBtaWRwb2lu
dCkKLXsKLSAgICBpZiAobGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLnNpemUoKSA8PSBsaW5l
TWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMpCi0gICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLm1p
ZHBvaW50cy5ncm93KGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyArIDEwKTsKLQotICAg
IElubGluZUl0ZXJhdG9yKiBtaWRwb2ludHMgPSBsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHMu
ZGF0YSgpOwotICAgIG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMrK10g
PSBtaWRwb2ludDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0SWdub3JpbmdTcGFjZXMo
TGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBjb25zdCBJbmxpbmVJdGVyYXRv
ciYgbWlkcG9pbnQpCi17Ci0gICAgQVNTRVJUKCEobGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9p
bnRzICUgMikpOwotICAgIGRlcHJlY2F0ZWRBZGRNaWRwb2ludChsaW5lTWlkcG9pbnRTdGF0ZSwg
bWlkcG9pbnQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RvcElnbm9yaW5nU3BhY2VzKExp
bmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3Im
IG1pZHBvaW50KQotewotICAgIEFTU0VSVChsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMg
JSAyKTsKLSAgICBkZXByZWNhdGVkQWRkTWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIG1pZHBv
aW50KTsKLX0KLQotLy8gV2hlbiBpZ25vcmluZyBzcGFjZXMsIHRoaXMgbmVlZHMgdG8gYmUgY2Fs
bGVkIGZvciBvYmplY3RzIHRoYXQgbmVlZCBsaW5lIGJveGVzIHN1Y2ggYXMgUmVuZGVySW5saW5l
cyBvcgotLy8gaGFyZCBsaW5lIGJyZWFrcyB0byBlbnN1cmUgdGhhdCB0aGV5J3JlIG5vdCBpZ25v
cmVkLgotc3RhdGljIGlubGluZSB2b2lkIGVuc3VyZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2Vz
KExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgUmVuZGVyT2JqZWN0KiByZW5k
ZXJlcikKLXsKLSAgICBJbmxpbmVJdGVyYXRvciBtaWRwb2ludCgwLCByZW5kZXJlciwgMCk7Ci0g
ICAgc3RvcElnbm9yaW5nU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBtaWRwb2ludCk7Ci0gICAg
c3RhcnRJZ25vcmluZ1NwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwgbWlkcG9pbnQpOwotfQotCi0v
LyBBZGRpbmcgYSBwYWlyIG9mIG1pZHBvaW50cyBiZWZvcmUgYSBjaGFyYWN0ZXIgd2lsbCBzcGxp
dCBpdCBvdXQgaW50byBhIG5ldyBsaW5lIGJveC4KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbnN1cmVD
aGFyYWN0ZXJHZXRzTGluZUJveChMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUs
IElubGluZUl0ZXJhdG9yJiB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yKQotewotICAgIElubGluZUl0
ZXJhdG9yIG1pZHBvaW50KDAsIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IubV9vYmosIHRleHRQYXJh
Z3JhcGhTZXBhcmF0b3IubV9wb3MpOwotICAgIHN0YXJ0SWdub3JpbmdTcGFjZXMobGluZU1pZHBv
aW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IubV9vYmos
IHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IubV9wb3MgLSAxKSk7Ci0gICAgc3RvcElnbm9yaW5nU3Bh
Y2VzKGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCB0ZXh0UGFyYWdyYXBoU2Vw
YXJhdG9yLm1fb2JqLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fcG9zKSk7Ci19Ci0KLXN0YXRp
YyBpbmxpbmUgQmlkaVJ1biogY3JlYXRlUnVuKGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2Jq
ZWN0KiBvYmosIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIpCitpbmxpbmUgQmlkaVJ1biog
Y3JlYXRlUnVuKGludCBzdGFydCwgaW50IGVuZCwgUmVuZGVyT2JqZWN0KiBvYmosIElubGluZUJp
ZGlSZXNvbHZlciYgcmVzb2x2ZXIpCiB7CiAgICAgQVNTRVJUKG9iaik7CiAgICAgcmV0dXJuIG5l
dyBCaWRpUnVuKHN0YXJ0LCBlbmQsICpvYmosIHJlc29sdmVyLmNvbnRleHQoKSwgcmVzb2x2ZXIu
ZGlyKCkpOwpAQCAtMzAzLDcgKzEzNyw2IEBAIFJvb3RJbmxpbmVCb3gqIFJlbmRlckJsb2NrRmxv
dzo6Y3JlYXRlQW5kQXBwZW5kUm9vdElubGluZUJveCgpCiAgICAgcmV0dXJuIHJvb3RCb3g7CiB9
CiAKLQogc3RhdGljIGlubGluZSBJbmxpbmVCb3gqIGNyZWF0ZUlubGluZUJveEZvclJlbmRlcmVy
KFJlbmRlck9iamVjdCogb2JqLCBib29sIGlzUm9vdExpbmVCb3gsIGJvb2wgaXNPbmx5UnVuID0g
ZmFsc2UpCiB7CiAgICAgaWYgKGlzUm9vdExpbmVCb3gpCkBAIC0zMjksMTUgKzE2Miw2IEBAIHN0
YXRpYyBpbmxpbmUgSW5saW5lQm94KiBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihSZW5kZXJP
YmplY3QqIG9iaiwgYm9vbCBpc1JvCiAgICAgcmV0dXJuIHRvUmVuZGVySW5saW5lKG9iaiktPmNy
ZWF0ZUFuZEFwcGVuZElubGluZUZsb3dCb3goKTsKIH0KIAotLy8gRklYTUU6IERvbid0IGxldCBj
b3VudGVycyBtYXJrIHRoZW1zZWx2ZXMgYXMgbmVlZGluZyBwcmVmIHdpZHRoIHJlY2FsY3MgZHVy
aW5nIGxheW91dAotLy8gc28gd2UgZG9uJ3QgbmVlZCB0aGlzIGhhY2suCi1zdGF0aWMgaW5saW5l
IHZvaWQgdXBkYXRlQ291bnRlcklmTmVlZGVkKFJlbmRlclRleHQmIHJlbmRlclRleHQpCi17Ci0g
ICAgaWYgKCFyZW5kZXJUZXh0LnByZWZlcnJlZExvZ2ljYWxXaWR0aHNEaXJ0eSgpIHx8ICFyZW5k
ZXJUZXh0LmlzQ291bnRlcigpKQotICAgICAgICByZXR1cm47Ci0gICAgdG9SZW5kZXJDb3VudGVy
KHJlbmRlclRleHQpLnVwZGF0ZUNvdW50ZXIoKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGRp
cnR5TGluZUJveGVzRm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0JiByZW5kZXJlciwgYm9vbCBmdWxs
TGF5b3V0KQogewogICAgIGlmIChyZW5kZXJlci5pc1RleHQoKSkgewpAQCAtNjA1LDM0ICs0Mjks
NiBAQCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6c2V0TWFyZ2luc0ZvclJ1YnlSdW4oQmlkaVJ1biog
cnVuLCBSZW5kZXJSdWJ5UnVuJiByZW5kZXJlcgogICAgIHNldE1hcmdpbkVuZEZvckNoaWxkKHJl
bmRlcmVyLCAtZW5kT3ZlcmhhbmcpOwogfQogCi1zdGF0aWMgaW5saW5lIGZsb2F0IG1lYXN1cmVI
eXBoZW5XaWR0aChSZW5kZXJUZXh0KiByZW5kZXJlciwgY29uc3QgRm9udCYgZm9udCwgSGFzaFNl
dDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxsYmFja0ZvbnRzID0gMCkKLXsKLSAgICBjb25z
dCBSZW5kZXJTdHlsZSYgc3R5bGUgPSByZW5kZXJlci0+c3R5bGUoKTsKLSAgICByZXR1cm4gZm9u
dC53aWR0aChSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bihyZW5kZXJlciwgZm9udCwgc3R5
bGUuaHlwaGVuU3RyaW5nKCkuc3RyaW5nKCksIHN0eWxlKSwgZmFsbGJhY2tGb250cyk7Ci19Ci0K
LWNsYXNzIFdvcmRNZWFzdXJlbWVudCB7Ci1wdWJsaWM6Ci0gICAgV29yZE1lYXN1cmVtZW50KCkK
LSAgICAgICAgOiByZW5kZXJlcigwKQotICAgICAgICAsIHdpZHRoKDApCi0gICAgICAgICwgc3Rh
cnRPZmZzZXQoMCkKLSAgICAgICAgLCBlbmRPZmZzZXQoMCkKLSAgICB7Ci0gICAgfQotICAgIAot
ICAgIFJlbmRlclRleHQqIHJlbmRlcmVyOwotICAgIGZsb2F0IHdpZHRoOwotICAgIGludCBzdGFy
dE9mZnNldDsKLSAgICBpbnQgZW5kT2Zmc2V0OwotICAgIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9u
dERhdGEqPiBmYWxsYmFja0ZvbnRzOwotfTsKLQotc3RhdGljIGlubGluZSBjb25zdCBSZW5kZXJT
dHlsZSYgbGluZVN0eWxlKGNvbnN0IFJlbmRlckVsZW1lbnQmIHJlbmRlcmVyLCBjb25zdCBMaW5l
SW5mbyYgbGluZUluZm8pCi17Ci0gICAgcmV0dXJuIGxpbmVJbmZvLmlzRmlyc3RMaW5lKCkgPyBy
ZW5kZXJlci5maXJzdExpbmVTdHlsZSgpIDogcmVuZGVyZXIuc3R5bGUoKTsKLX0KLQogc3RhdGlj
IGlubGluZSB2b2lkIHNldExvZ2ljYWxXaWR0aEZvclRleHRSdW4oUm9vdElubGluZUJveCogbGlu
ZUJveCwgQmlkaVJ1biogcnVuLCBSZW5kZXJUZXh0KiByZW5kZXJlciwgZmxvYXQgeFBvcywgY29u
c3QgTGluZUluZm8mIGxpbmVJbmZvLAogICAgIEdseXBoT3ZlcmZsb3dBbmRGYWxsYmFja0ZvbnRz
TWFwJiB0ZXh0Qm94RGF0YU1hcCwgVmVydGljYWxQb3NpdGlvbkNhY2hlJiB2ZXJ0aWNhbFBvc2l0
aW9uQ2FjaGUsIFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMpCiB7CkBAIC05OTcs
MjQgKzc5Myw2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0NvbGxhcHNpYmxlU3BhY2UoVUNoYXIg
Y2hhcmFjdGVyLCBjb25zdCBSZW5kZXJUZXh0JiByZW5kZXJlCiAgICAgcmV0dXJuIGZhbHNlOwog
fQogCi0KLXN0YXRpYyB2b2lkIHNldFN0YXRpY1Bvc2l0aW9ucyhSZW5kZXJCbG9ja0Zsb3cmIGJs
b2NrLCBSZW5kZXJCb3gmIGNoaWxkKQotewotICAgIC8vIEZJWE1FOiBUaGUgbWF0aCBoZXJlIGlz
IGFjdHVhbGx5IG5vdCByZWFsbHkgcmlnaHQuIEl0J3MgYSBiZXN0LWd1ZXNzIGFwcHJveGltYXRp
b24gdGhhdAotICAgIC8vIHdpbGwgd29yayBmb3IgdGhlIGNvbW1vbiBjYXNlcwotICAgIFJlbmRl
ckVsZW1lbnQqIGNvbnRhaW5lckJsb2NrID0gY2hpbGQuY29udGFpbmVyKCk7Ci0gICAgTGF5b3V0
VW5pdCBibG9ja0hlaWdodCA9IGJsb2NrLmxvZ2ljYWxIZWlnaHQoKTsKLSAgICBpZiAoY29udGFp
bmVyQmxvY2stPmlzUmVuZGVySW5saW5lKCkpIHsKLSAgICAgICAgLy8gQSByZWxhdGl2ZSBwb3Np
dGlvbmVkIGlubGluZSBlbmNsb3NlcyB1cy4gSW4gdGhpcyBjYXNlLCB3ZSBhbHNvIGhhdmUgdG8g
ZGV0ZXJtaW5lIG91cgotICAgICAgICAvLyBwb3NpdGlvbiBhcyB0aG91Z2ggd2Ugd2VyZSBhbiBp
bmxpbmUuIFNldCB8c3RhdGljSW5saW5lUG9zaXRpb258IGFuZCB8c3RhdGljQmxvY2tQb3NpdGlv
bnwgb24gdGhlIHJlbGF0aXZlIHBvc2l0aW9uZWQKLSAgICAgICAgLy8gaW5saW5lIHNvIHRoYXQg
d2UgY2FuIG9idGFpbiB0aGUgdmFsdWUgbGF0ZXIuCi0gICAgICAgIHRvUmVuZGVySW5saW5lKGNv
bnRhaW5lckJsb2NrKS0+bGF5ZXIoKS0+c2V0U3RhdGljSW5saW5lUG9zaXRpb24oYmxvY2suc3Rh
cnRBbGlnbmVkT2Zmc2V0Rm9yTGluZShibG9ja0hlaWdodCwgZmFsc2UpKTsKLSAgICAgICAgdG9S
ZW5kZXJJbmxpbmUoY29udGFpbmVyQmxvY2spLT5sYXllcigpLT5zZXRTdGF0aWNCbG9ja1Bvc2l0
aW9uKGJsb2NrSGVpZ2h0KTsKLSAgICB9Ci0gICAgYmxvY2sudXBkYXRlU3RhdGljSW5saW5lUG9z
aXRpb25Gb3JDaGlsZChjaGlsZCwgYmxvY2tIZWlnaHQpOwotICAgIGNoaWxkLmxheWVyKCktPnNl
dFN0YXRpY0Jsb2NrUG9zaXRpb24oYmxvY2tIZWlnaHQpOwotfQotCiB0ZW1wbGF0ZSA8dHlwZW5h
bWUgQ2hhcmFjdGVyVHlwZT4KIHN0YXRpYyBpbmxpbmUgaW50IGZpbmRGaXJzdFRyYWlsaW5nU3Bh
Y2UoY29uc3QgUmVuZGVyVGV4dCYgbGFzdFRleHQsIGNvbnN0IENoYXJhY3RlclR5cGUqIGNoYXJh
Y3RlcnMsIGludCBzdGFydCwgaW50IHN0b3ApCiB7CkBAIC0xNDY2LDE1ICsxMjQ0LDYgQEAgdm9p
ZCBSZW5kZXJCbG9ja0Zsb3c6OnVwZGF0ZVNoYXBlQW5kU2VnbWVudHNGb3JDdXJyZW50TGluZUlu
Rmxvd1RocmVhZChTaGFwZUluc2kKICAgICAgICAgcHVzaFNoYXBlQ29udGVudE92ZXJmbG93QmVs
b3dUaGVDb250ZW50Qm94KHRoaXMsIHNoYXBlSW5zaWRlSW5mbywgbGluZVRvcCwgbGluZUhlaWdo
dCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgZmxvYXQgZmlyc3RQb3NpdGl2ZVdpZHRoKGNvbnN0IFdv
cmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMpCi17Ci0gICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCB3b3JkTWVhc3VyZW1lbnRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmICh3b3Jk
TWVhc3VyZW1lbnRzW2ldLndpZHRoID4gMCkKLSAgICAgICAgICAgIHJldHVybiB3b3JkTWVhc3Vy
ZW1lbnRzW2ldLndpZHRoOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQogc3RhdGljIGlubGlu
ZSBMYXlvdXRVbml0IGFkanVzdExvZ2ljYWxMaW5lVG9wKFNoYXBlSW5zaWRlSW5mbyogc2hhcGVJ
bnNpZGVJbmZvLCBJbmxpbmVJdGVyYXRvciBzdGFydCwgSW5saW5lSXRlcmF0b3IgZW5kLCBjb25z
dCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewogICAgIGlmICghc2hhcGVJ
bnNpZGVJbmZvIHx8IGVuZCAhPSBzdGFydCkKQEAgLTIyMjUsOTEgKzE5OTQsNiBAQCBib29sIFJl
bmRlckJsb2NrRmxvdzo6bWF0Y2hlZEVuZExpbmUoTGluZUxheW91dFN0YXRlJiBsYXlvdXRTdGF0
ZSwgY29uc3QgSW5saW5lQgogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGlubGluZSBi
b29sIHNraXBOb25CcmVha2luZ1NwYWNlKGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdCwgY29uc3Qg
TGluZUluZm8mIGxpbmVJbmZvKQotewotICAgIGlmIChpdC5tX29iai0+c3R5bGUoKS5uYnNwTW9k
ZSgpICE9IFNQQUNFIHx8IGl0LmN1cnJlbnQoKSAhPSBub0JyZWFrU3BhY2UpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIC8vIEZJWE1FOiBUaGlzIGlzIGJhZC4gIEl0IG1ha2VzIG5ic3Ag
aW5jb25zaXN0ZW50IHdpdGggc3BhY2UgYW5kIHdvbid0IHdvcmsgY29ycmVjdGx5Ci0gICAgLy8g
d2l0aCBtX21pbldpZHRoL21fbWF4V2lkdGguCi0gICAgLy8gRG8gbm90IHNraXAgYSBub24tYnJl
YWtpbmcgc3BhY2UgaWYgaXQgaXMgdGhlIGZpcnN0IGNoYXJhY3RlcgotICAgIC8vIG9uIGEgbGlu
ZSBhZnRlciBhIGNsZWFuIGxpbmUgYnJlYWsgKG9yIG9uIHRoZSBmaXJzdCBsaW5lLCBzaW5jZSBw
cmV2aW91c0xpbmVCcm9rZUNsZWFubHkgc3RhcnRzIG9mZgotICAgIC8vIHx0cnVlfCkuCi0gICAg
aWYgKGxpbmVJbmZvLmlzRW1wdHkoKSAmJiBsaW5lSW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWVu
dW0gV2hpdGVzcGFjZVBvc2l0aW9uIHsgTGVhZGluZ1doaXRlc3BhY2UsIFRyYWlsaW5nV2hpdGVz
cGFjZSB9Owotc3RhdGljIGlubGluZSBib29sIHNob3VsZENvbGxhcHNlV2hpdGVTcGFjZShjb25z
dCBSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgV2hpdGVzcGFj
ZVBvc2l0aW9uIHdoaXRlc3BhY2VQb3NpdGlvbikKLXsKLSAgICAvLyBDU1MyIDE2LjYuMQotICAg
IC8vIElmIGEgc3BhY2UgKFUrMDAyMCkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgaGFzICd3
aGl0ZS1zcGFjZScgc2V0IHRvICdub3JtYWwnLCAnbm93cmFwJywgb3IgJ3ByZS1saW5lJywgaXQg
aXMgcmVtb3ZlZC4KLSAgICAvLyBJZiBhIHNwYWNlIChVKzAwMjApIGF0IHRoZSBlbmQgb2YgYSBs
aW5lIGhhcyAnd2hpdGUtc3BhY2UnIHNldCB0byAnbm9ybWFsJywgJ25vd3JhcCcsIG9yICdwcmUt
bGluZScsIGl0IGlzIGFsc28gcmVtb3ZlZC4KLSAgICAvLyBJZiBzcGFjZXMgKFUrMDAyMCkgb3Ig
dGFicyAoVSswMDA5KSBhdCB0aGUgZW5kIG9mIGEgbGluZSBoYXZlICd3aGl0ZS1zcGFjZScgc2V0
IHRvICdwcmUtd3JhcCcsIFVBcyBtYXkgdmlzdWFsbHkgY29sbGFwc2UgdGhlbS4KLSAgICByZXR1
cm4gc3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpCi0gICAgICAgIHx8ICh3aGl0ZXNwYWNlUG9z
aXRpb24gPT0gVHJhaWxpbmdXaGl0ZXNwYWNlICYmIHN0eWxlLT53aGl0ZVNwYWNlKCkgPT0gUFJF
X1dSQVAgJiYgKCFsaW5lSW5mby5pc0VtcHR5KCkgfHwgIWxpbmVJbmZvLnByZXZpb3VzTGluZUJy
b2tlQ2xlYW5seSgpKSk7Ci19Ci0KLXN0YXRpYyBib29sIHJlcXVpcmVzTGluZUJveEZvckNvbnRl
bnQoY29uc3QgUmVuZGVySW5saW5lJiBmbG93LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCi17
Ci0gICAgUmVuZGVyRWxlbWVudCogcGFyZW50ID0gZmxvdy5wYXJlbnQoKTsKLSAgICBpZiAoZmxv
dy5kb2N1bWVudCgpLmluTm9RdWlya3NNb2RlKCkpIHsKLSAgICAgICAgY29uc3QgUmVuZGVyU3R5
bGUmIGZsb3dTdHlsZSA9IGxpbmVTdHlsZShmbG93LCBsaW5lSW5mbyk7Ci0gICAgICAgIGNvbnN0
IFJlbmRlclN0eWxlJiBwYXJlbnRTdHlsZSA9IGxpbmVTdHlsZSgqcGFyZW50LCBsaW5lSW5mbyk7
Ci0gICAgICAgIGlmIChmbG93U3R5bGUubGluZUhlaWdodCgpICE9IHBhcmVudFN0eWxlLmxpbmVI
ZWlnaHQoKQotICAgICAgICAgICAgfHwgZmxvd1N0eWxlLnZlcnRpY2FsQWxpZ24oKSAhPSBwYXJl
bnRTdHlsZS52ZXJ0aWNhbEFsaWduKCkKLSAgICAgICAgICAgIHx8ICFwYXJlbnRTdHlsZS5mb250
KCkuZm9udE1ldHJpY3MoKS5oYXNJZGVudGljYWxBc2NlbnREZXNjZW50QW5kTGluZUdhcChmbG93
U3R5bGUuZm9udCgpLmZvbnRNZXRyaWNzKCkpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBoYXNJbmxpbmVEaXJlY3Rpb25C
b3JkZXJzUGFkZGluZ09yTWFyZ2luKGNvbnN0IFJlbmRlcklubGluZSYgZmxvdykKLXsKLSAgICAv
LyBXaGVyZSBhbiBlbXB0eSBpbmxpbmUgaXMgc3BsaXQgYWNyb3NzIGFub255bW91cyBibG9ja3Mg
d2Ugc2hvdWxkIG9ubHkgZ2l2ZSBsaW5lYm94ZXMgdG8gdGhlICdzaWRlcycgb2YgdGhlCi0gICAg
Ly8gaW5saW5lIHRoYXQgaGF2ZSBib3JkZXJzLCBwYWRkaW5nIG9yIG1hcmdpbi4KLSAgICBib29s
IHNob3VsZEFwcGx5U3RhcnRCb3JkZXJQYWRkaW5nT3JNYXJnaW4gPSAhZmxvdy5wYXJlbnQoKS0+
aXNBbm9ueW1vdXNCbG9jaygpIHx8ICFmbG93LmlzSW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigp
OwotICAgIGlmIChzaG91bGRBcHBseVN0YXJ0Qm9yZGVyUGFkZGluZ09yTWFyZ2luICYmIChmbG93
LmJvcmRlclN0YXJ0KCkgfHwgZmxvdy5tYXJnaW5TdGFydCgpIHx8IGZsb3cucGFkZGluZ1N0YXJ0
KCkpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGJvb2wgc2hvdWxkQXBwbHlFbmRCb3Jk
ZXJQYWRkaW5nT3JNYXJnaW4gPSAhZmxvdy5wYXJlbnQoKS0+aXNBbm9ueW1vdXNCbG9jaygpIHx8
IGZsb3cuaXNJbmxpbmVFbGVtZW50Q29udGludWF0aW9uKCkgfHwgIWZsb3cuaW5saW5lRWxlbWVu
dENvbnRpbnVhdGlvbigpOwotICAgIHJldHVybiBzaG91bGRBcHBseUVuZEJvcmRlclBhZGRpbmdP
ck1hcmdpbiAmJiAoZmxvdy5ib3JkZXJFbmQoKSB8fCBmbG93Lm1hcmdpbkVuZCgpIHx8IGZsb3cu
cGFkZGluZ0VuZCgpKTsKLX0KLQotc3RhdGljIGJvb2wgYWx3YXlzUmVxdWlyZXNMaW5lQm94KGNv
bnN0IFJlbmRlcklubGluZSYgZmxvdykKLXsKLSAgICAvLyBGSVhNRTogUmlnaHQgbm93LCB3ZSBv
bmx5IGFsbG93IGxpbmUgYm94ZXMgZm9yIGlubGluZXMgdGhhdCBhcmUgdHJ1bHkgZW1wdHkuCi0g
ICAgLy8gV2UgbmVlZCB0byBmaXggdGhpcywgdGhvdWdoLCBiZWNhdXNlIGF0IHRoZSB2ZXJ5IGxl
YXN0LCBpbmxpbmVzIGNvbnRhaW5pbmcgb25seQotICAgIC8vIGlnbm9yYWJsZSB3aGl0ZXNwYWNl
IHNob3VsZCBzaG91bGQgYWxzbyBoYXZlIGxpbmUgYm94ZXMuCi0gICAgcmV0dXJuIGlzRW1wdHlJ
bmxpbmUoZmxvdykgJiYgaGFzSW5saW5lRGlyZWN0aW9uQm9yZGVyc1BhZGRpbmdPck1hcmdpbihm
bG93KTsKLX0KLQotc3RhdGljIGJvb2wgcmVxdWlyZXNMaW5lQm94KGNvbnN0IElubGluZUl0ZXJh
dG9yJiBpdCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvID0gTGluZUluZm8oKSwgV2hpdGVzcGFj
ZVBvc2l0aW9uIHdoaXRlc3BhY2VQb3NpdGlvbiA9IExlYWRpbmdXaGl0ZXNwYWNlKQotewotICAg
IGlmIChpdC5tX29iai0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoaXQubV9vYmotPmlzQlIoKSkKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0KLSAgICBib29sIHJlbmRlcmVySXNFbXB0eUlubGluZSA9IGZhbHNlOwotICAg
IGlmIChpdC5tX29iai0+aXNSZW5kZXJJbmxpbmUoKSkgewotICAgICAgICBjb25zdCBSZW5kZXJJ
bmxpbmUmIGlubGluZVJlbmRlcmVyID0gdG9SZW5kZXJJbmxpbmUoKml0Lm1fb2JqKTsKLSAgICAg
ICAgaWYgKCFhbHdheXNSZXF1aXJlc0xpbmVCb3goaW5saW5lUmVuZGVyZXIpICYmICFyZXF1aXJl
c0xpbmVCb3hGb3JDb250ZW50KGlubGluZVJlbmRlcmVyLCBsaW5lSW5mbykpCi0gICAgICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJlbmRlcmVySXNFbXB0eUlubGluZSA9IGlzRW1wdHlJ
bmxpbmUoaW5saW5lUmVuZGVyZXIpOwotICAgIH0KLQotICAgIGlmICghc2hvdWxkQ29sbGFwc2VX
aGl0ZVNwYWNlKCZpdC5tX29iai0+c3R5bGUoKSwgbGluZUluZm8sIHdoaXRlc3BhY2VQb3NpdGlv
bikpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgVUNoYXIgY3VycmVudCA9IGl0LmN1cnJl
bnQoKTsKLSAgICBib29sIG5vdEp1c3RXaGl0ZXNwYWNlID0gY3VycmVudCAhPSAnICcgJiYgY3Vy
cmVudCAhPSAnXHQnICYmIGN1cnJlbnQgIT0gc29mdEh5cGhlbiAmJiAoY3VycmVudCAhPSAnXG4n
IHx8IGl0Lm1fb2JqLT5wcmVzZXJ2ZXNOZXdsaW5lKCkpICYmICFza2lwTm9uQnJlYWtpbmdTcGFj
ZShpdCwgbGluZUluZm8pOwotICAgIHJldHVybiBub3RKdXN0V2hpdGVzcGFjZSB8fCByZW5kZXJl
cklzRW1wdHlJbmxpbmU7Ci19Ci0KIGJvb2wgUmVuZGVyQmxvY2s6OmdlbmVyYXRlc0xpbmVCb3hl
c0ZvcklubGluZUNoaWxkKFJlbmRlck9iamVjdCogaW5saW5lT2JqKQogewogICAgIEFTU0VSVChp
bmxpbmVPYmotPnBhcmVudCgpID09IHRoaXMpOwpAQCAtMjMyMiwyNDkgKzIwMDYsNiBAQCBib29s
IFJlbmRlckJsb2NrOjpnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZChSZW5kZXJPYmpl
Y3QqIGlubGluZU9iaikKICAgICByZXR1cm4gIWl0LmF0RW5kKCk7CiB9CiAKLS8vIEZJWE1FOiBU
aGUgZW50aXJlIGNvbmNlcHQgb2YgdGhlIHNraXBUcmFpbGluZ1doaXRlc3BhY2UgZnVuY3Rpb24g
aXMgZmxhd2VkLCBzaW5jZSB3ZSByZWFsbHkgbmVlZCB0byBiZSBidWlsZGluZwotLy8gbGluZSBi
b3hlcyBldmVuIGZvciBjb250YWluZXJzIHRoYXQgbWF5IHVsdGltYXRlbHkgY29sbGFwc2UgYXdh
eS4gT3RoZXJ3aXNlIHdlJ2xsIG5ldmVyIGdldCBwb3NpdGlvbmVkCi0vLyBlbGVtZW50cyBxdWl0
ZSByaWdodC4gSW4gb3RoZXIgd29yZHMsIHdlIG5lZWQgdG8gYnVpbGQgdGhpcyBmdW5jdGlvbidz
IHdvcmsgaW50byB0aGUgbm9ybWFsIGxpbmUKLS8vIG9iamVjdCBpdGVyYXRpb24gcHJvY2Vzcy4K
LS8vIE5CLiB0aGlzIGZ1bmN0aW9uIHdpbGwgaW5zZXJ0IGFueSBmbG9hdGluZyBlbGVtZW50cyB0
aGF0IHdvdWxkIG90aGVyd2lzZQotLy8gYmUgc2tpcHBlZCBidXQgaXQgd2lsbCBub3QgcG9zaXRp
b24gdGhlbS4KLXZvaWQgTGluZUJyZWFrZXI6OnNraXBUcmFpbGluZ1doaXRlc3BhY2UoSW5saW5l
SXRlcmF0b3ImIGl0ZXJhdG9yLCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCi17Ci0gICAgd2hp
bGUgKCFpdGVyYXRvci5hdEVuZCgpICYmICFyZXF1aXJlc0xpbmVCb3goaXRlcmF0b3IsIGxpbmVJ
bmZvLCBUcmFpbGluZ1doaXRlc3BhY2UpKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCYgb2JqZWN0
ID0gKml0ZXJhdG9yLm1fb2JqOwotICAgICAgICBpZiAob2JqZWN0LmlzT3V0T2ZGbG93UG9zaXRp
b25lZCgpKQotICAgICAgICAgICAgc2V0U3RhdGljUG9zaXRpb25zKG1fYmxvY2ssIHRvUmVuZGVy
Qm94KG9iamVjdCkpOwotICAgICAgICBlbHNlIGlmIChvYmplY3QuaXNGbG9hdGluZygpKQotICAg
ICAgICAgICAgbV9ibG9jay5pbnNlcnRGbG9hdGluZ09iamVjdCh0b1JlbmRlckJveChvYmplY3Qp
KTsKLSAgICAgICAgaXRlcmF0b3IuaW5jcmVtZW50KCk7Ci0gICAgfQotfQotCi12b2lkIExpbmVC
cmVha2VyOjpza2lwTGVhZGluZ1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZl
ciwgTGluZUluZm8mIGxpbmVJbmZvLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZp
b3VzTGluZSwgTGluZVdpZHRoJiB3aWR0aCkKLXsKLSAgICB3aGlsZSAoIXJlc29sdmVyLnBvc2l0
aW9uKCkuYXRFbmQoKSAmJiAhcmVxdWlyZXNMaW5lQm94KHJlc29sdmVyLnBvc2l0aW9uKCksIGxp
bmVJbmZvLCBMZWFkaW5nV2hpdGVzcGFjZSkpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0JiBvYmpl
Y3QgPSAqcmVzb2x2ZXIucG9zaXRpb24oKS5tX29iajsKLSAgICAgICAgaWYgKG9iamVjdC5pc091
dE9mRmxvd1Bvc2l0aW9uZWQoKSkgewotICAgICAgICAgICAgc2V0U3RhdGljUG9zaXRpb25zKG1f
YmxvY2ssIHRvUmVuZGVyQm94KG9iamVjdCkpOwotICAgICAgICAgICAgaWYgKG9iamVjdC5zdHls
ZSgpLmlzT3JpZ2luYWxEaXNwbGF5SW5saW5lVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmVz
b2x2ZXIucnVucygpLmFkZFJ1bihjcmVhdGVSdW4oMCwgMSwgJm9iamVjdCwgcmVzb2x2ZXIpKTsK
LSAgICAgICAgICAgICAgICBsaW5lSW5mby5pbmNyZW1lbnRSdW5zRnJvbUxlYWRpbmdXaGl0ZXNw
YWNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0LmlzRmxvYXRp
bmcoKSkgewotICAgICAgICAgICAgLy8gVGhlIHRvcCBtYXJnaW4gZWRnZSBvZiBhIHNlbGYtY29s
bGFwc2luZyBibG9jayB0aGF0IGNsZWFycyBhIGZsb2F0IGludHJ1ZGVzIHVwIGludG8gaXQgYnkg
dGhlIGhlaWdodCBvZiB0aGUgbWFyZ2luLAotICAgICAgICAgICAgLy8gc28gaW4gb3JkZXIgdG8g
cGxhY2UgdGhpcyBmaXJzdCBjaGlsZCBmbG9hdCBhdCB0aGUgdG9wIGNvbnRlbnQgZWRnZSBvZiB0
aGUgc2VsZi1jb2xsYXBzaW5nIGJsb2NrIGFkZCB0aGUgbWFyZ2luIGJhY2sgaW4gYmVmb3JlIHBs
YWNlbWVudC4KLSAgICAgICAgICAgIExheW91dFVuaXQgbWFyZ2luT2Zmc2V0ID0gKCFvYmplY3Qu
cHJldmlvdXNTaWJsaW5nKCkgJiYgbV9ibG9jay5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSAmJiBt
X2Jsb2NrLnN0eWxlKCkuY2xlYXIoKSAmJiBtX2Jsb2NrLmdldENsZWFyRGVsdGEobV9ibG9jaywg
TGF5b3V0VW5pdCgpKSkgPyBtX2Jsb2NrLmNvbGxhcHNlZE1hcmdpbkJlZm9yZUZvckNoaWxkKG1f
YmxvY2spIDogTGF5b3V0VW5pdCgpOwotICAgICAgICAgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2Fs
SGVpZ2h0ID0gbV9ibG9jay5sb2dpY2FsSGVpZ2h0KCk7Ci0gICAgICAgICAgICBtX2Jsb2NrLnNl
dExvZ2ljYWxIZWlnaHQob2xkTG9naWNhbEhlaWdodCArIG1hcmdpbk9mZnNldCk7Ci0gICAgICAg
ICAgICBtX2Jsb2NrLnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUobV9ibG9jay5pbnNlcnRGbG9hdGlu
Z09iamVjdCh0b1JlbmRlckJveChvYmplY3QpKSwgbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwg
bGluZUluZm8sIHdpZHRoKTsKLSAgICAgICAgICAgIG1fYmxvY2suc2V0TG9naWNhbEhlaWdodChv
bGRMb2dpY2FsSGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIGlmIChvYmplY3QuaXNUZXh0KCkgJiYg
b2JqZWN0LnN0eWxlKCkuaGFzVGV4dENvbWJpbmUoKSAmJiBvYmplY3QuaXNDb21iaW5lVGV4dCgp
ICYmICF0b1JlbmRlckNvbWJpbmVUZXh0KG9iamVjdCkuaXNDb21iaW5lZCgpKSB7Ci0gICAgICAg
ICAgICB0b1JlbmRlckNvbWJpbmVUZXh0KG9iamVjdCkuY29tYmluZVRleHQoKTsKLSAgICAgICAg
ICAgIGlmICh0b1JlbmRlckNvbWJpbmVUZXh0KG9iamVjdCkuaXNDb21iaW5lZCgpKQotICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHJlc29sdmVyLmluY3JlbWVu
dCgpOwotICAgIH0KLSAgICByZXNvbHZlci5jb21taXRFeHBsaWNpdEVtYmVkZGluZygpOwotfQot
Ci0vLyBUaGlzIGlzIGN1cnJlbnRseSBqdXN0IHVzZWQgZm9yIGxpc3QgbWFya2VycyBhbmQgaW5s
aW5lIGZsb3dzIHRoYXQgaGF2ZSBsaW5lIGJveGVzLiBOZWl0aGVyIHNob3VsZAotLy8gaGF2ZSBh
biBlZmZlY3Qgb24gd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCi1zdGF0aWMg
Ym9vbCBzaG91bGRTa2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QoUmVuZGVyQmxvY2tGbG93
JiBibG9jaywgUmVuZGVyT2JqZWN0KiBvLCBMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50
U3RhdGUpCi17Ci0gICAgUmVuZGVyT2JqZWN0KiBuZXh0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5
SW5saW5lcyhibG9jaywgbyk7Ci0gICAgd2hpbGUgKG5leHQgJiYgbmV4dC0+aXNGbG9hdGluZ09y
T3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAgICAgICBuZXh0ID0gYmlkaU5leHRTa2lwcGluZ0Vt
cHR5SW5saW5lcyhibG9jaywgbmV4dCk7Ci0KLSAgICBpZiAobmV4dCAmJiBuZXh0LT5pc1RleHQo
KSAmJiB0b1JlbmRlclRleHQobmV4dCktPnRleHRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgUmVu
ZGVyVGV4dCogbmV4dFRleHQgPSB0b1JlbmRlclRleHQobmV4dCk7Ci0gICAgICAgIFVDaGFyIG5l
eHRDaGFyID0gbmV4dFRleHQtPmNoYXJhY3RlckF0KDApOwotICAgICAgICBpZiAobmV4dFRleHQt
PnN0eWxlKCkuaXNDb2xsYXBzaWJsZVdoaXRlU3BhY2UobmV4dENoYXIpKSB7Ci0gICAgICAgICAg
ICBzdGFydElnbm9yaW5nU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigw
LCBvLCAwKSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQot
ICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIEFMV0FZU19JTkxJTkUgZmxvYXQgdGV4dFdp
ZHRoKFJlbmRlclRleHQqIHRleHQsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbiwgY29uc3Qg
Rm9udCYgZm9udCwgZmxvYXQgeFBvcywgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VX
aGl0ZVNwYWNlLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4mIGZhbGxiYWNrRm9udHMs
IFRleHRMYXlvdXQqIGxheW91dCA9IDApCi17Ci0gICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxl
ID0gdGV4dC0+c3R5bGUoKTsKLQotICAgIEdseXBoT3ZlcmZsb3cgZ2x5cGhPdmVyZmxvdzsKLSAg
ICBpZiAoaXNGaXhlZFBpdGNoIHx8ICghZnJvbSAmJiBsZW4gPT0gdGV4dC0+dGV4dExlbmd0aCgp
KSB8fCBzdHlsZS5oYXNUZXh0Q29tYmluZSgpKQotICAgICAgICByZXR1cm4gdGV4dC0+d2lkdGgo
ZnJvbSwgbGVuLCBmb250LCB4UG9zLCAmZmFsbGJhY2tGb250cywgJmdseXBoT3ZlcmZsb3cpOwot
Ci0gICAgaWYgKGxheW91dCkKLSAgICAgICAgcmV0dXJuIEZvbnQ6OndpZHRoKCpsYXlvdXQsIGZy
b20sIGxlbiwgJmZhbGxiYWNrRm9udHMpOwotCi0gICAgVGV4dFJ1biBydW4gPSBSZW5kZXJCbG9j
azo6Y29uc3RydWN0VGV4dFJ1bih0ZXh0LCBmb250LCB0ZXh0LCBmcm9tLCBsZW4sIHN0eWxlKTsK
LSAgICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LT50ZXh0TGVuZ3RoKCkgLSBmcm9tKTsK
LSAgICBBU1NFUlQocnVuLmNoYXJhY3RlcnNMZW5ndGgoKSA+PSBydW4ubGVuZ3RoKCkpOwotCi0g
ICAgcnVuLnNldENoYXJhY3RlclNjYW5Gb3JDb2RlUGF0aCghdGV4dC0+Y2FuVXNlU2ltcGxlRm9u
dENvZGVQYXRoKCkpOwotICAgIHJ1bi5zZXRUYWJTaXplKCFjb2xsYXBzZVdoaXRlU3BhY2UsIHN0
eWxlLnRhYlNpemUoKSk7Ci0gICAgcnVuLnNldFhQb3MoeFBvcyk7Ci0gICAgcmV0dXJuIGZvbnQu
d2lkdGgocnVuLCAmZmFsbGJhY2tGb250cywgJmdseXBoT3ZlcmZsb3cpOwotfQotCi1zdGF0aWMg
dm9pZCB0cnlIeXBoZW5hdGluZyhSZW5kZXJUZXh0KiB0ZXh0LCBjb25zdCBGb250JiBmb250LCBj
b25zdCBBdG9taWNTdHJpbmcmIGxvY2FsZUlkZW50aWZpZXIsIHVuc2lnbmVkIGNvbnNlY3V0aXZl
SHlwaGVuYXRlZExpbmVzLCBpbnQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXNMaW1pdCwgaW50
IG1pbmltdW1QcmVmaXhMaW1pdCwgaW50IG1pbmltdW1TdWZmaXhMaW1pdCwgdW5zaWduZWQgbGFz
dFNwYWNlLCB1bnNpZ25lZCBwb3MsIGZsb2F0IHhQb3MsIGludCBhdmFpbGFibGVXaWR0aCwgYm9v
bCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNlLCBpbnQgbGFzdFNwYWNlV29y
ZFNwYWNpbmcsIElubGluZUl0ZXJhdG9yJiBsaW5lQnJlYWssIGludCBuZXh0QnJlYWthYmxlLCBi
b29sJiBoeXBoZW5hdGVkKQotewotICAgIC8vIE1hcCAnaHlwaGVuYXRlLWxpbWl0LXtiZWZvcmUs
YWZ0ZXJ9OiBhdXRvOycgdG8gMi4KLSAgICB1bnNpZ25lZCBtaW5pbXVtUHJlZml4TGVuZ3RoOwot
ICAgIHVuc2lnbmVkIG1pbmltdW1TdWZmaXhMZW5ndGg7Ci0KLSAgICBpZiAobWluaW11bVByZWZp
eExpbWl0IDwgMCkKLSAgICAgICAgbWluaW11bVByZWZpeExlbmd0aCA9IDI7Ci0gICAgZWxzZQot
ICAgICAgICBtaW5pbXVtUHJlZml4TGVuZ3RoID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG1pbmlt
dW1QcmVmaXhMaW1pdCk7Ci0KLSAgICBpZiAobWluaW11bVN1ZmZpeExpbWl0IDwgMCkKLSAgICAg
ICAgbWluaW11bVN1ZmZpeExlbmd0aCA9IDI7Ci0gICAgZWxzZQotICAgICAgICBtaW5pbXVtU3Vm
Zml4TGVuZ3RoID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG1pbmltdW1TdWZmaXhMaW1pdCk7Ci0K
LSAgICBpZiAocG9zIC0gbGFzdFNwYWNlIDw9IG1pbmltdW1TdWZmaXhMZW5ndGgpCi0gICAgICAg
IHJldHVybjsKLQotICAgIGlmIChjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0ID49IDAg
JiYgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMgPj0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGNv
bnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzTGltaXQpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBp
bnQgaHlwaGVuV2lkdGggPSBtZWFzdXJlSHlwaGVuV2lkdGgodGV4dCwgZm9udCk7Ci0KLSAgICBm
bG9hdCBtYXhQcmVmaXhXaWR0aCA9IGF2YWlsYWJsZVdpZHRoIC0geFBvcyAtIGh5cGhlbldpZHRo
IC0gbGFzdFNwYWNlV29yZFNwYWNpbmc7Ci0gICAgLy8gSWYgdGhlIG1heGltdW0gd2lkdGggYXZh
aWxhYmxlIGZvciB0aGUgcHJlZml4IGJlZm9yZSB0aGUgaHlwaGVuIGlzIHNtYWxsLCB0aGVuIGl0
IGlzIHZlcnkgdW5saWtlbHkKLSAgICAvLyB0aGF0IGFuIGh5cGhlbmF0aW9uIG9wcG9ydHVuaXR5
IGV4aXN0cywgc28gZG8gbm90IGJvdGhlciB0byBsb29rIGZvciBpdC4KLSAgICBpZiAobWF4UHJl
Zml4V2lkdGggPD0gZm9udC5waXhlbFNpemUoKSAqIDUgLyA0KQotICAgICAgICByZXR1cm47Ci0K
LSAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSB0ZXh0LT5zdHlsZSgpOwotICAgIFRleHRS
dW4gcnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4odGV4dCwgZm9udCwgdGV4dCwg
bGFzdFNwYWNlLCBwb3MgLSBsYXN0U3BhY2UsIHN0eWxlKTsKLSAgICBydW4uc2V0Q2hhcmFjdGVy
c0xlbmd0aCh0ZXh0LT50ZXh0TGVuZ3RoKCkgLSBsYXN0U3BhY2UpOwotICAgIEFTU0VSVChydW4u
Y2hhcmFjdGVyc0xlbmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7Ci0KLSAgICBydW4uc2V0VGFiU2l6
ZSghY29sbGFwc2VXaGl0ZVNwYWNlLCBzdHlsZS50YWJTaXplKCkpOwotICAgIHJ1bi5zZXRYUG9z
KHhQb3MgKyBsYXN0U3BhY2VXb3JkU3BhY2luZyk7Ci0KLSAgICB1bnNpZ25lZCBwcmVmaXhMZW5n
dGggPSBmb250Lm9mZnNldEZvclBvc2l0aW9uKHJ1biwgbWF4UHJlZml4V2lkdGgsIGZhbHNlKTsK
LSAgICBpZiAocHJlZml4TGVuZ3RoIDwgbWluaW11bVByZWZpeExlbmd0aCkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgcHJlZml4TGVuZ3RoID0gbGFzdEh5cGhlbkxvY2F0aW9uKHRleHQtPmNoYXJh
Y3RlcnMoKSArIGxhc3RTcGFjZSwgcG9zIC0gbGFzdFNwYWNlLCBzdGQ6Om1pbihwcmVmaXhMZW5n
dGgsIHBvcyAtIGxhc3RTcGFjZSAtIG1pbmltdW1TdWZmaXhMZW5ndGgpICsgMSwgbG9jYWxlSWRl
bnRpZmllcik7Ci0gICAgaWYgKCFwcmVmaXhMZW5ndGggfHwgcHJlZml4TGVuZ3RoIDwgbWluaW11
bVByZWZpeExlbmd0aCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gV2hlbiBsYXN0U2FwY2Ug
aXMgYSBzcGFjZSwgd2hpY2ggaXQgYWx3YXlzIGlzIGV4Y2VwdCBzb21ldGltZXMgYXQgdGhlIGJl
Z2lubmluZyBvZiBhIGxpbmUgb3IgYWZ0ZXIgY29sbGFwc2VkCi0gICAgLy8gc3BhY2UsIGl0IHNo
b3VsZCBub3QgY291bnQgdG93YXJkcyBoeXBoZW5hdGUtbGltaXQtYmVmb3JlLgotICAgIGlmIChw
cmVmaXhMZW5ndGggPT0gbWluaW11bVByZWZpeExlbmd0aCkgewotICAgICAgICBVQ2hhciBjaGFy
YWN0ZXJBdExhc3RTcGFjZSA9IHRleHQtPmNoYXJhY3RlckF0KGxhc3RTcGFjZSk7Ci0gICAgICAg
IGlmIChjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSAnICcgfHwgY2hhcmFjdGVyQXRMYXN0U3BhY2Ug
PT0gJ1xuJyB8fCBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSAnXHQnIHx8IGNoYXJhY3RlckF0TGFz
dFNwYWNlID09IG5vQnJlYWtTcGFjZSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAg
ICBBU1NFUlQocG9zIC0gbGFzdFNwYWNlIC0gcHJlZml4TGVuZ3RoID49IG1pbmltdW1TdWZmaXhM
ZW5ndGgpOwotCi0jaWYgIUFTU0VSVF9ESVNBQkxFRAotICAgIEhhc2hTZXQ8Y29uc3QgU2ltcGxl
Rm9udERhdGEqPiBmYWxsYmFja0ZvbnRzOwotICAgIGZsb2F0IHByZWZpeFdpZHRoID0gaHlwaGVu
V2lkdGggKyB0ZXh0V2lkdGgodGV4dCwgbGFzdFNwYWNlLCBwcmVmaXhMZW5ndGgsIGZvbnQsIHhQ
b3MsIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCBmYWxsYmFja0ZvbnRzKSArIGxh
c3RTcGFjZVdvcmRTcGFjaW5nOwotICAgIEFTU0VSVCh4UG9zICsgcHJlZml4V2lkdGggPD0gYXZh
aWxhYmxlV2lkdGgpOwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0oaXNGaXhlZFBpdGNoKTsKLSNl
bmRpZgotCi0gICAgbGluZUJyZWFrLm1vdmVUbyh0ZXh0LCBsYXN0U3BhY2UgKyBwcmVmaXhMZW5n
dGgsIG5leHRCcmVha2FibGUpOwotICAgIGh5cGhlbmF0ZWQgPSB0cnVlOwotfQotCi1jbGFzcyBU
cmFpbGluZ09iamVjdHMgewotcHVibGljOgotICAgIFRyYWlsaW5nT2JqZWN0cygpOwotICAgIHZv
aWQgc2V0VHJhaWxpbmdXaGl0ZXNwYWNlKFJlbmRlclRleHQqKTsKLSAgICB2b2lkIGNsZWFyKCk7
Ci0gICAgdm9pZCBhcHBlbmRCb3hJZk5lZWRlZChSZW5kZXJCb3hNb2RlbE9iamVjdCopOwotCi0g
ICAgZW51bSBDb2xsYXBzZUZpcnN0U3BhY2VPck5vdCB7IERvTm90Q29sbGFwc2VGaXJzdFNwYWNl
LCBDb2xsYXBzZUZpcnN0U3BhY2UgfTsKLQotICAgIHZvaWQgdXBkYXRlTWlkcG9pbnRzRm9yVHJh
aWxpbmdCb3hlcyhMaW5lTWlkcG9pbnRTdGF0ZSYsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBsQnJl
YWssIENvbGxhcHNlRmlyc3RTcGFjZU9yTm90KTsKLQotcHJpdmF0ZToKLSAgICBSZW5kZXJUZXh0
KiBtX3doaXRlc3BhY2U7Ci0gICAgVmVjdG9yPFJlbmRlckJveE1vZGVsT2JqZWN0KiwgND4gbV9i
b3hlczsKLX07Ci0KLVRyYWlsaW5nT2JqZWN0czo6VHJhaWxpbmdPYmplY3RzKCkKLSAgICA6IG1f
d2hpdGVzcGFjZSgwKQotewotfQotCi1pbmxpbmUgdm9pZCBUcmFpbGluZ09iamVjdHM6OnNldFRy
YWlsaW5nV2hpdGVzcGFjZShSZW5kZXJUZXh0KiB3aGl0ZXNwYWNlKQotewotICAgIEFTU0VSVCh3
aGl0ZXNwYWNlKTsKLSAgICBtX3doaXRlc3BhY2UgPSB3aGl0ZXNwYWNlOwotfQotCi1pbmxpbmUg
dm9pZCBUcmFpbGluZ09iamVjdHM6OmNsZWFyKCkKLXsKLSAgICBtX3doaXRlc3BhY2UgPSAwOwot
ICAgIG1fYm94ZXMuc2hyaW5rKDApOyAvLyBVc2Ugc2hyaW5rKDApIGluc3RlYWQgb2YgY2xlYXIo
KSB0byByZXRhaW4gb3VyIGNhcGFjaXR5LgotfQotCi1pbmxpbmUgdm9pZCBUcmFpbGluZ09iamVj
dHM6OmFwcGVuZEJveElmTmVlZGVkKFJlbmRlckJveE1vZGVsT2JqZWN0KiBib3gpCi17Ci0gICAg
aWYgKG1fd2hpdGVzcGFjZSkKLSAgICAgICAgbV9ib3hlcy5hcHBlbmQoYm94KTsKLX0KLQotdm9p
ZCBUcmFpbGluZ09iamVjdHM6OnVwZGF0ZU1pZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMoTGluZU1p
ZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbEJy
ZWFrLCBDb2xsYXBzZUZpcnN0U3BhY2VPck5vdCBjb2xsYXBzZUZpcnN0U3BhY2UpCi17Ci0gICAg
aWYgKCFtX3doaXRlc3BhY2UpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIFRoaXMgb2JqZWN0
IGlzIGVpdGhlciBnb2luZyB0byBiZSBwYXJ0IG9mIHRoZSBsYXN0IG1pZHBvaW50LCBvciBpdCBp
cyBnb2luZyB0byBiZSB0aGUgYWN0dWFsIGVuZHBvaW50LgotICAgIC8vIEluIGJvdGggY2FzZXMg
d2UganVzdCBkZWNyZWFzZSBvdXIgcG9zIGJ5IDEgbGV2ZWwgdG8gZXhjbHVkZSB0aGUgc3BhY2Us
IGFsbG93aW5nIGl0IHRvIC0gaW4gZWZmZWN0IC0gY29sbGFwc2UgaW50byB0aGUgbmV3bGluZS4K
LSAgICBpZiAobGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzICUgMikgewotICAgICAgICAv
LyBGaW5kIHRoZSB0cmFpbGluZyBzcGFjZSBvYmplY3QncyBtaWRwb2ludC4KLSAgICAgICAgaW50
IHRyYWlsaW5nU3BhY2VNaWRwb2ludCA9IGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAt
IDE7Ci0gICAgICAgIGZvciAoIDsgdHJhaWxpbmdTcGFjZU1pZHBvaW50ID4gMCAmJiBsaW5lTWlk
cG9pbnRTdGF0ZS5taWRwb2ludHNbdHJhaWxpbmdTcGFjZU1pZHBvaW50XS5tX29iaiAhPSBtX3do
aXRlc3BhY2U7IC0tdHJhaWxpbmdTcGFjZU1pZHBvaW50KSB7IH0KLSAgICAgICAgQVNTRVJUKHRy
YWlsaW5nU3BhY2VNaWRwb2ludCA+PSAwKTsKLSAgICAgICAgaWYgKGNvbGxhcHNlRmlyc3RTcGFj
ZSA9PSBDb2xsYXBzZUZpcnN0U3BhY2UpCi0gICAgICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5t
aWRwb2ludHNbdHJhaWxpbmdTcGFjZU1pZHBvaW50XS5tX3Bvcy0tOwotCi0gICAgICAgIC8vIE5v
dyBtYWtlIHN1cmUgZXZlcnkgc2luZ2xlIHRyYWlsaW5nUG9zaXRpb25lZEJveCBmb2xsb3dpbmcg
dGhlIHRyYWlsaW5nU3BhY2VNaWRwb2ludCBwcm9wZXJseSBzdG9wcyBhbmQgc3RhcnRzCi0gICAg
ICAgIC8vIGlnbm9yaW5nIHNwYWNlcy4KLSAgICAgICAgc2l6ZV90IGN1cnJlbnRNaWRwb2ludCA9
IHRyYWlsaW5nU3BhY2VNaWRwb2ludCArIDE7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbV9ib3hlcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRNaWRwb2lu
dCA+PSBsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMpIHsKLSAgICAgICAgICAgICAgICAv
LyBXZSBkb24ndCBoYXZlIGEgbWlkcG9pbnQgZm9yIHRoaXMgYm94IHlldC4KLSAgICAgICAgICAg
ICAgICBlbnN1cmVMaW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwg
bV9ib3hlc1tpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFTU0VS
VChsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHNbY3VycmVudE1pZHBvaW50XS5tX29iaiA9PSBt
X2JveGVzW2ldKTsKLSAgICAgICAgICAgICAgICBBU1NFUlQobGluZU1pZHBvaW50U3RhdGUubWlk
cG9pbnRzW2N1cnJlbnRNaWRwb2ludCArIDFdLm1fb2JqID09IG1fYm94ZXNbaV0pOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgY3VycmVudE1pZHBvaW50ICs9IDI7Ci0gICAgICAgIH0KLSAg
ICB9IGVsc2UgaWYgKCFsQnJlYWsubV9vYmopIHsKLSAgICAgICAgQVNTRVJUKG1fd2hpdGVzcGFj
ZS0+aXNUZXh0KCkpOwotICAgICAgICBBU1NFUlQoY29sbGFwc2VGaXJzdFNwYWNlID09IENvbGxh
cHNlRmlyc3RTcGFjZSk7Ci0gICAgICAgIC8vIEFkZCBhIG5ldyBlbmQgbWlkcG9pbnQgdGhhdCBz
dG9wcyByaWdodCBhdCB0aGUgdmVyeSBlbmQuCi0gICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IG1f
d2hpdGVzcGFjZS0+dGV4dExlbmd0aCgpOwotICAgICAgICB1bnNpZ25lZCBwb3MgPSBsZW5ndGgg
Pj0gMiA/IGxlbmd0aCAtIDIgOiBVSU5UX01BWDsKLSAgICAgICAgSW5saW5lSXRlcmF0b3IgZW5k
TWlkKDAsIG1fd2hpdGVzcGFjZSwgcG9zKTsKLSAgICAgICAgc3RhcnRJZ25vcmluZ1NwYWNlcyhs
aW5lTWlkcG9pbnRTdGF0ZSwgZW5kTWlkKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBtX2JveGVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBlbnN1cmVMaW5lQm94SW5zaWRl
SWdub3JlZFNwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwgbV9ib3hlc1tpXSk7Ci0gICAgICAgIH0K
LSAgICB9Ci19Ci0KLXZvaWQgTGluZUJyZWFrZXI6OnJlc2V0KCkKLXsKLSAgICBtX3Bvc2l0aW9u
ZWRPYmplY3RzLmNsZWFyKCk7Ci0gICAgbV9oeXBoZW5hdGVkID0gZmFsc2U7Ci0gICAgbV9jbGVh
ciA9IENOT05FOwotfQotCiBJbmxpbmVJdGVyYXRvciBMaW5lQnJlYWtlcjo6bmV4dExpbmVCcmVh
ayhJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBMaW5lSW5mbyYgbGluZUluZm8sIFJlbmRl
clRleHRJbmZvJiByZW5kZXJUZXh0SW5mbywgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21Q
cmV2aW91c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBXb3JkTWVh
c3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewogI2lmICFFTkFCTEUoQ1NTX1NIQVBFUykK
QEAgLTI2MTksODYzICsyMDYwLDYgQEAgSW5saW5lSXRlcmF0b3IgTGluZUJyZWFrZXI6Om5leHRM
aW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgTGluZUluZm8KICNlbmRpZgog
fQogCi1zdGF0aWMgaW5saW5lIGJvb2wgaXRlcmF0b3JJc0JleW9uZEVuZE9mUmVuZGVyQ29tYmlu
ZVRleHQoY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0ZXIsIFJlbmRlckNvbWJpbmVUZXh0JiByZW5k
ZXJlcikKLXsKLSAgICByZXR1cm4gaXRlci5tX29iaiA9PSAmcmVuZGVyZXIgJiYgaXRlci5tX3Bv
cyA+PSByZW5kZXJlci50ZXh0TGVuZ3RoKCk7Ci19Ci0KLSNpZiBFTkFCTEUoQ1NTX1NIQVBFUykK
LXN0YXRpYyB2b2lkIHVwZGF0ZVNlZ21lbnRzRm9yU2hhcGVzKFJlbmRlckJsb2NrRmxvdyYgYmxv
Y2ssIGNvbnN0IEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBjb25z
dCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzLCBMaW5lV2lkdGgmIHdpZHRoLCBi
b29sIGlzRmlyc3RMaW5lKQotewotICAgIEFTU0VSVChsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5l
KTsKLQotICAgIFNoYXBlSW5zaWRlSW5mbyogc2hhcGVJbnNpZGVJbmZvID0gYmxvY2subGF5b3V0
U2hhcGVJbnNpZGVJbmZvKCk7Ci0gICAgaWYgKCFsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLT5p
c1BsYWNlZCgpIHx8ICFzaGFwZUluc2lkZUluZm8pCi0gICAgICAgIHJldHVybjsKLQotICAgIGJv
b2wgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUgPSBibG9jay5pc0hvcml6b250YWxXcml0aW5nTW9k
ZSgpOwotICAgIExheW91dFVuaXQgbG9naWNhbE9mZnNldEZyb21TaGFwZUNvbnRhaW5lciA9IGJs
b2NrLmxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVBbmNlc3RvckNvbnRhaW5lcihzaGFwZUluc2lkZUlu
Zm8tPm93bmVyKCkpLmhlaWdodCgpOwotCi0gICAgTGF5b3V0VW5pdCBsaW5lTG9naWNhbFRvcCA9
IGJsb2NrLmxvZ2ljYWxIZWlnaHQoKSArIGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWluZXI7
Ci0gICAgTGF5b3V0VW5pdCBsaW5lTG9naWNhbEhlaWdodCA9IGJsb2NrLmxpbmVIZWlnaHQoaXNG
aXJzdExpbmUsIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlID8gSG9yaXpvbnRhbExpbmUgOiBWZXJ0
aWNhbExpbmUsIFBvc2l0aW9uT2ZJbnRlcmlvckxpbmVCb3hlcyk7Ci0gICAgTGF5b3V0VW5pdCBs
aW5lTG9naWNhbEJvdHRvbSA9IGxpbmVMb2dpY2FsVG9wICsgbGluZUxvZ2ljYWxIZWlnaHQ7Ci0K
LSAgICBMYXlvdXRVbml0IGZsb2F0TG9naWNhbFRvcCA9IGJsb2NrLmxvZ2ljYWxUb3BGb3JGbG9h
dChsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKTsKLSAgICBMYXlvdXRVbml0IGZsb2F0TG9naWNh
bEJvdHRvbSA9IGJsb2NrLmxvZ2ljYWxCb3R0b21Gb3JGbG9hdChsYXN0RmxvYXRGcm9tUHJldmlv
dXNMaW5lKTsKLQotICAgIGJvb2wgbGluZU92ZXJsYXBzV2l0aEZsb2F0ID0gKGZsb2F0TG9naWNh
bFRvcCA8IGxpbmVMb2dpY2FsQm90dG9tKSAmJiAobGluZUxvZ2ljYWxUb3AgPCBmbG9hdExvZ2lj
YWxCb3R0b20pOwotICAgIGlmICghbGluZU92ZXJsYXBzV2l0aEZsb2F0KQotICAgICAgICByZXR1
cm47Ci0KLSAgICBmbG9hdCBtaW5TZWdtZW50V2lkdGggPSBmaXJzdFBvc2l0aXZlV2lkdGgod29y
ZE1lYXN1cmVtZW50cyk7Ci0KLSAgICBMYXlvdXRVbml0IGZsb2F0TG9naWNhbFdpZHRoID0gYmxv
Y2subG9naWNhbFdpZHRoRm9yRmxvYXQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7Ci0gICAg
TGF5b3V0VW5pdCBhdmFpbGFibGVMb2dpY2FsV2lkdGggPSBibG9jay5sb2dpY2FsV2lkdGgoKSAt
IGJsb2NrLmxvZ2ljYWxSaWdodEZvckZsb2F0KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpOwot
ICAgIGlmIChhdmFpbGFibGVMb2dpY2FsV2lkdGggPCBtaW5TZWdtZW50V2lkdGgpCi0gICAgICAg
IGJsb2NrLnNldExvZ2ljYWxIZWlnaHQoZmxvYXRMb2dpY2FsQm90dG9tKTsKLQotICAgIGlmIChi
bG9jay5sb2dpY2FsSGVpZ2h0KCkgPCBmbG9hdExvZ2ljYWxUb3ApIHsKLSAgICAgICAgc2hhcGVJ
bnNpZGVJbmZvLT5hZGp1c3RMb2dpY2FsTGluZVRvcChtaW5TZWdtZW50V2lkdGggKyBmbG9hdExv
Z2ljYWxXaWR0aCk7Ci0gICAgICAgIGJsb2NrLnNldExvZ2ljYWxIZWlnaHQoc2hhcGVJbnNpZGVJ
bmZvLT5sb2dpY2FsTGluZVRvcCgpIC0gbG9naWNhbE9mZnNldEZyb21TaGFwZUNvbnRhaW5lcik7
Ci0gICAgfQotCi0gICAgbGluZUxvZ2ljYWxUb3AgPSBibG9jay5sb2dpY2FsSGVpZ2h0KCkgKyBs
b2dpY2FsT2Zmc2V0RnJvbVNoYXBlQ29udGFpbmVyOwotCi0gICAgc2hhcGVJbnNpZGVJbmZvLT51
cGRhdGVTZWdtZW50c0ZvckxpbmUobGluZUxvZ2ljYWxUb3AsIGxpbmVMb2dpY2FsSGVpZ2h0KTsK
LSAgICB3aWR0aC51cGRhdGVDdXJyZW50U2hhcGVTZWdtZW50KCk7Ci0gICAgd2lkdGgudXBkYXRl
QXZhaWxhYmxlV2lkdGgoKTsKLX0KLSNlbmRpZgotCi1jbGFzcyBCcmVha2luZ0NvbnRleHQgewot
cHVibGljOgotICAgIEJyZWFraW5nQ29udGV4dChMaW5lQnJlYWtlciYgbGluZUJyZWFrZXIsIElu
bGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJbmZvJiBpbkxpbmVJbmZvLCBMaW5lV2lk
dGgmIGxpbmVXaWR0aCwgUmVuZGVyVGV4dEluZm8mIGluUmVuZGVyVGV4dEluZm8sIEZsb2F0aW5n
T2JqZWN0KiBpbkxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGJvb2wgYXBwbGllZFN0YXJ0V2lk
dGgsIFJlbmRlckJsb2NrRmxvdyYgYmxvY2spCi0gICAgICAgIDogbV9saW5lQnJlYWtlcihsaW5l
QnJlYWtlcikKLSAgICAgICAgLCBtX3Jlc29sdmVyKHJlc29sdmVyKQotICAgICAgICAsIG1fY3Vy
cmVudChyZXNvbHZlci5wb3NpdGlvbigpKQotICAgICAgICAsIG1fbGluZUJyZWFrKHJlc29sdmVy
LnBvc2l0aW9uKCkpCi0gICAgICAgICwgbV9ibG9jayhibG9jaykKLSAgICAgICAgLCBtX2xhc3RP
YmplY3QobV9jdXJyZW50Lm1fb2JqKQotICAgICAgICAsIG1fbmV4dE9iamVjdCgwKQotICAgICAg
ICAsIG1fY3VycmVudFN0eWxlKDApCi0gICAgICAgICwgbV9ibG9ja1N0eWxlKGJsb2NrLnN0eWxl
KCkpCi0gICAgICAgICwgbV9saW5lSW5mbyhpbkxpbmVJbmZvKQotICAgICAgICAsIG1fcmVuZGVy
VGV4dEluZm8oaW5SZW5kZXJUZXh0SW5mbykKLSAgICAgICAgLCBtX2xhc3RGbG9hdEZyb21QcmV2
aW91c0xpbmUoaW5MYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKQotICAgICAgICAsIG1fd2lkdGgo
bGluZVdpZHRoKQotICAgICAgICAsIG1fY3VycldTKE5PUk1BTCkKLSAgICAgICAgLCBtX2xhc3RX
UyhOT1JNQUwpCi0gICAgICAgICwgbV9wcmVzZXJ2ZXNOZXdsaW5lKGZhbHNlKQotICAgICAgICAs
IG1fYXRTdGFydCh0cnVlKQotICAgICAgICAsIG1faWdub3JpbmdTcGFjZXMoZmFsc2UpCi0gICAg
ICAgICwgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZShmYWxzZSkKLSAgICAgICAgLCBtX2N1cnJl
bnRDaGFyYWN0ZXJJc1dTKGZhbHNlKQotICAgICAgICAsIG1fYXBwbGllZFN0YXJ0V2lkdGgoYXBw
bGllZFN0YXJ0V2lkdGgpCi0gICAgICAgICwgbV9pbmNsdWRlRW5kV2lkdGgodHJ1ZSkKLSAgICAg
ICAgLCBtX2F1dG9XcmFwKGZhbHNlKQotICAgICAgICAsIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9u
TGluZShmYWxzZSkKLSAgICAgICAgLCBtX2Zsb2F0c0ZpdE9uTGluZSh0cnVlKQotICAgICAgICAs
IG1fY29sbGFwc2VXaGl0ZVNwYWNlKGZhbHNlKQotICAgICAgICAsIG1fc3RhcnRpbmdOZXdQYXJh
Z3JhcGgobV9saW5lSW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSkKLSAgICAgICAgLCBt
X2FsbG93SW1hZ2VzVG9CcmVhayghYmxvY2suZG9jdW1lbnQoKS5pblF1aXJrc01vZGUoKSB8fCAh
YmxvY2suaXNUYWJsZUNlbGwoKSB8fCAhbV9ibG9ja1N0eWxlLmxvZ2ljYWxXaWR0aCgpLmlzSW50
cmluc2ljT3JBdXRvKCkpCi0gICAgICAgICwgbV9hdEVuZChmYWxzZSkKLSAgICAgICAgLCBtX2hh
ZFVuY29tbWl0dGVkV2lkdGhCZWZvcmVDdXJyZW50KGZhbHNlKQotICAgICAgICAsIG1fbGluZU1p
ZHBvaW50U3RhdGUocmVzb2x2ZXIubWlkcG9pbnRTdGF0ZSgpKQotICAgIHsKLSAgICAgICAgbV9s
aW5lSW5mby5zZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoZmFsc2UpOwotICAgIH0KLQotICAg
IFJlbmRlck9iamVjdCogY3VycmVudE9iamVjdCgpIHsgcmV0dXJuIG1fY3VycmVudC5tX29iajsg
fQotICAgIElubGluZUl0ZXJhdG9yIGxpbmVCcmVhaygpIHsgcmV0dXJuIG1fbGluZUJyZWFrOyB9
Ci0gICAgSW5saW5lSXRlcmF0b3ImIGxpbmVCcmVha1JlZigpIHtyZXR1cm4gbV9saW5lQnJlYWs7
IH0KLSAgICBMaW5lV2lkdGgmIGxpbmVXaWR0aCgpIHsgcmV0dXJuIG1fd2lkdGg7IH0KLSAgICBi
b29sIGF0RW5kKCkgeyByZXR1cm4gbV9hdEVuZDsgfQotCi0gICAgdm9pZCBpbml0aWFsaXplRm9y
Q3VycmVudE9iamVjdCgpOwotCi0gICAgdm9pZCBpbmNyZW1lbnQoKTsKLQotICAgIHZvaWQgaGFu
ZGxlQlIoRUNsZWFyJik7Ci0gICAgdm9pZCBoYW5kbGVPdXRPZkZsb3dQb3NpdGlvbmVkKFZlY3Rv
cjxSZW5kZXJCb3gqPiYgcG9zaXRpb25lZE9iamVjdHMpOwotICAgIHZvaWQgaGFuZGxlRmxvYXQo
KTsKLSAgICB2b2lkIGhhbmRsZUVtcHR5SW5saW5lKCk7Ci0gICAgdm9pZCBoYW5kbGVSZXBsYWNl
ZCgpOwotICAgIGJvb2wgaGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiwgYm9vbCYgaHlwaGVu
YXRlZCwgdW5zaWduZWQmIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKTsKLSAgICBib29sIGNh
bkJyZWFrQXRUaGlzUG9zaXRpb24oKTsKLSAgICB2b2lkIGNvbW1pdEFuZFVwZGF0ZUxpbmVCcmVh
a0lmTmVlZGVkKCk7Ci0gICAgSW5saW5lSXRlcmF0b3IgaGFuZGxlRW5kT2ZMaW5lKCk7Ci0KLSAg
ICB2b2lkIGNsZWFyTGluZUJyZWFrSWZGaXRzT25MaW5lKGJvb2wgaWdub3JpbmdUcmFpbGluZ1Nw
YWNlID0gZmFsc2UpCi0gICAgewotICAgICAgICBpZiAobV93aWR0aC5maXRzT25MaW5lKGlnbm9y
aW5nVHJhaWxpbmdTcGFjZSkgfHwgbV9sYXN0V1MgPT0gTk9XUkFQKQotICAgICAgICAgICAgbV9s
aW5lQnJlYWsuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbW1pdExpbmVCcmVha0F0Q3Vy
cmVudFdpZHRoKFJlbmRlck9iamVjdCogb2JqZWN0LCB1bnNpZ25lZCBvZmZzZXQgPSAwLCBpbnQg
bmV4dEJyZWFrID0gLTEpCi0gICAgewotICAgICAgICBtX3dpZHRoLmNvbW1pdCgpOwotICAgICAg
ICBtX2xpbmVCcmVhay5tb3ZlVG8ob2JqZWN0LCBvZmZzZXQsIG5leHRCcmVhayk7Ci0gICAgfQot
Ci1wcml2YXRlOgotICAgIExpbmVCcmVha2VyJiBtX2xpbmVCcmVha2VyOwotICAgIElubGluZUJp
ZGlSZXNvbHZlciYgbV9yZXNvbHZlcjsKLQotICAgIElubGluZUl0ZXJhdG9yIG1fY3VycmVudDsK
LSAgICBJbmxpbmVJdGVyYXRvciBtX2xpbmVCcmVhazsKLSAgICBJbmxpbmVJdGVyYXRvciBtX3N0
YXJ0T2ZJZ25vcmVkU3BhY2VzOwotCi0gICAgUmVuZGVyQmxvY2tGbG93JiBtX2Jsb2NrOwotICAg
IFJlbmRlck9iamVjdCogbV9sYXN0T2JqZWN0OwotICAgIFJlbmRlck9iamVjdCogbV9uZXh0T2Jq
ZWN0OwotCi0gICAgUmVuZGVyU3R5bGUqIG1fY3VycmVudFN0eWxlOwotCi0gICAgLy8gRmlyZWZv
eCBhbmQgT3BlcmEgd2lsbCBhbGxvdyBhIHRhYmxlIGNlbGwgdG8gZ3JvdyB0byBmaXQgYW4gaW1h
Z2UgaW5zaWRlIGl0IHVuZGVyCi0gICAgLy8gdmVyeSBzcGVjaWZpYyBjaXJjdW1zdGFuY2VzIChp
biBvcmRlciB0byBtYXRjaCBjb21tb24gV2luSUUgcmVuZGVyaW5ncykuCi0gICAgLy8gTm90IHN1
cHBvcnRpbmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQgdXMgdG8gbWlzLXJlbmRlciBzb21lIHJlYWwg
c2l0ZXMuIChTZWUgQnVnemlsbGEgMTA1MTcuKQotICAgIFJlbmRlclN0eWxlJiBtX2Jsb2NrU3R5
bGU7Ci0KLSAgICBMaW5lSW5mbyYgbV9saW5lSW5mbzsKLQotICAgIFJlbmRlclRleHRJbmZvJiBt
X3JlbmRlclRleHRJbmZvOwotCi0gICAgRmxvYXRpbmdPYmplY3QqIG1fbGFzdEZsb2F0RnJvbVBy
ZXZpb3VzTGluZTsKLQotICAgIExpbmVXaWR0aCBtX3dpZHRoOwotCi0gICAgRVdoaXRlU3BhY2Ug
bV9jdXJyV1M7Ci0gICAgRVdoaXRlU3BhY2UgbV9sYXN0V1M7Ci0KLSAgICBib29sIG1fcHJlc2Vy
dmVzTmV3bGluZTsKLSAgICBib29sIG1fYXRTdGFydDsKLQotICAgIC8vIFRoaXMgdmFyaWFibGUg
aXMgdXNlZCBvbmx5IGlmIHdoaXRlc3BhY2UgaXNuJ3Qgc2V0IHRvIFBSRSwgYW5kIGl0IHRlbGxz
IHVzIHdoZXRoZXIKLSAgICAvLyBvciBub3Qgd2UgYXJlIGN1cnJlbnRseSBpZ25vcmluZyB3aGl0
ZXNwYWNlLgotICAgIGJvb2wgbV9pZ25vcmluZ1NwYWNlczsKLQotICAgIC8vIFRoaXMgdmFyaWFi
bGUgdHJhY2tzIHdoZXRoZXIgdGhlIHZlcnkgbGFzdCBjaGFyYWN0ZXIgd2Ugc2F3IHdhcyBhIHNw
YWNlLiAgV2UgdXNlCi0gICAgLy8gdGhpcyB0byBkZXRlY3Qgd2hlbiB3ZSBlbmNvdW50ZXIgYSBz
ZWNvbmQgc3BhY2Ugc28gd2Uga25vdyB3ZSBoYXZlIHRvIHRlcm1pbmF0ZQotICAgIC8vIGEgcnVu
LgotICAgIGJvb2wgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKLSAgICBib29sIG1fY3VycmVu
dENoYXJhY3RlcklzV1M7Ci0gICAgYm9vbCBtX2FwcGxpZWRTdGFydFdpZHRoOwotICAgIGJvb2wg
bV9pbmNsdWRlRW5kV2lkdGg7Ci0gICAgYm9vbCBtX2F1dG9XcmFwOwotICAgIGJvb2wgbV9hdXRv
V3JhcFdhc0V2ZXJUcnVlT25MaW5lOwotICAgIGJvb2wgbV9mbG9hdHNGaXRPbkxpbmU7Ci0gICAg
Ym9vbCBtX2NvbGxhcHNlV2hpdGVTcGFjZTsKLSAgICBib29sIG1fc3RhcnRpbmdOZXdQYXJhZ3Jh
cGg7Ci0gICAgYm9vbCBtX2FsbG93SW1hZ2VzVG9CcmVhazsKLSAgICBib29sIG1fYXRFbmQ7Ci0g
ICAgYm9vbCBtX2hhZFVuY29tbWl0dGVkV2lkdGhCZWZvcmVDdXJyZW50OwotCi0gICAgTGluZU1p
ZHBvaW50U3RhdGUmIG1fbGluZU1pZHBvaW50U3RhdGU7Ci0KLSAgICBUcmFpbGluZ09iamVjdHMg
bV90cmFpbGluZ09iamVjdHM7Ci19OwotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6Omlu
aXRpYWxpemVGb3JDdXJyZW50T2JqZWN0KCkKLXsKLSAgICBtX2hhZFVuY29tbWl0dGVkV2lkdGhC
ZWZvcmVDdXJyZW50ID0gISFtX3dpZHRoLnVuY29tbWl0dGVkV2lkdGgoKTsKLQotICAgIG1fY3Vy
cmVudFN0eWxlID0gJm1fY3VycmVudC5tX29iai0+c3R5bGUoKTsKLQotICAgIEFTU0VSVChtX2N1
cnJlbnRTdHlsZSk7Ci0KLSAgICBtX25leHRPYmplY3QgPSBiaWRpTmV4dFNraXBwaW5nRW1wdHlJ
bmxpbmVzKG1fYmxvY2ssIG1fY3VycmVudC5tX29iaik7Ci0gICAgaWYgKG1fbmV4dE9iamVjdCAm
JiBtX25leHRPYmplY3QtPnBhcmVudCgpICYmICFtX25leHRPYmplY3QtPnBhcmVudCgpLT5pc0Rl
c2NlbmRhbnRPZihtX2N1cnJlbnQubV9vYmotPnBhcmVudCgpKSkKLSAgICAgICAgbV9pbmNsdWRl
RW5kV2lkdGggPSB0cnVlOwotCi0gICAgbV9jdXJyV1MgPSBtX2N1cnJlbnQubV9vYmotPmlzUmVw
bGFjZWQoKSA/IG1fY3VycmVudC5tX29iai0+cGFyZW50KCktPnN0eWxlKCkud2hpdGVTcGFjZSgp
IDogbV9jdXJyZW50U3R5bGUtPndoaXRlU3BhY2UoKTsKLSAgICBtX2xhc3RXUyA9IG1fbGFzdE9i
amVjdC0+aXNSZXBsYWNlZCgpID8gbV9sYXN0T2JqZWN0LT5wYXJlbnQoKS0+c3R5bGUoKS53aGl0
ZVNwYWNlKCkgOiBtX2xhc3RPYmplY3QtPnN0eWxlKCkud2hpdGVTcGFjZSgpOwotCi0gICAgbV9h
dXRvV3JhcCA9IFJlbmRlclN0eWxlOjphdXRvV3JhcChtX2N1cnJXUyk7Ci0gICAgbV9hdXRvV3Jh
cFdhc0V2ZXJUcnVlT25MaW5lID0gbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lIHx8IG1fYXV0
b1dyYXA7Ci0KLSNpZiBFTkFCTEUoU1ZHKQotICAgIG1fcHJlc2VydmVzTmV3bGluZSA9IG1fY3Vy
cmVudC5tX29iai0+aXNTVkdJbmxpbmVUZXh0KCkgPyBmYWxzZSA6IFJlbmRlclN0eWxlOjpwcmVz
ZXJ2ZU5ld2xpbmUobV9jdXJyV1MpOwotI2Vsc2UKLSAgICBtX3ByZXNlcnZlc05ld2xpbmUgPSBS
ZW5kZXJTdHlsZTo6cHJlc2VydmVOZXdsaW5lKG1fY3VycldTKTsKLSNlbmRpZgotCi0gICAgbV9j
b2xsYXBzZVdoaXRlU3BhY2UgPSBSZW5kZXJTdHlsZTo6Y29sbGFwc2VXaGl0ZVNwYWNlKG1fY3Vy
cldTKTsKLX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjppbmNyZW1lbnQoKQotewot
ICAgIC8vIENsZWFyIG91dCBvdXIgY2hhcmFjdGVyIHNwYWNlIGJvb2wsIHNpbmNlIGlubGluZSA8
cHJlPnMgZG9uJ3QgY29sbGFwc2Ugd2hpdGVzcGFjZQotICAgIC8vIHdpdGggYWRqYWNlbnQgaW5s
aW5lIG5vcm1hbC9ub3dyYXAgc3BhbnMuCi0gICAgaWYgKCFtX2NvbGxhcHNlV2hpdGVTcGFjZSkK
LSAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOwotCi0gICAgbV9jdXJy
ZW50Lm1vdmVUb1N0YXJ0T2YobV9uZXh0T2JqZWN0KTsKLSAgICBtX2F0U3RhcnQgPSBmYWxzZTsK
LX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVCUihFQ2xlYXImIGNsZWFy
KQotewotICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoKSkgewotICAgICAgICBSZW5kZXJPYmpl
Y3QqIGJyID0gbV9jdXJyZW50Lm1fb2JqOwotICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG9TdGFy
dE9mKGJyKTsKLSAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7Ci0KLSAgICAgICAgLy8g
QSA8YnI+IGFsd2F5cyBicmVha3MgYSBsaW5lLCBzbyBkb24ndCBsZXQgdGhlIGxpbmUgYmUgY29s
bGFwc2VkCi0gICAgICAgIC8vIGF3YXkuIEFsc28sIHRoZSBzcGFjZSBhdCB0aGUgZW5kIG9mIGEg
bGluZSB3aXRoIGEgPGJyPiBkb2VzIG5vdAotICAgICAgICAvLyBnZXQgY29sbGFwc2VkIGF3YXku
IEl0IG9ubHkgZG9lcyB0aGlzIGlmIHRoZSBwcmV2aW91cyBsaW5lIGJyb2tlCi0gICAgICAgIC8v
IGNsZWFubHkuIE90aGVyd2lzZSB0aGUgPGJyPiBoYXMgbm8gZWZmZWN0IG9uIHdoZXRoZXIgdGhl
IGxpbmUgaXMKLSAgICAgICAgLy8gZW1wdHkgb3Igbm90LgotICAgICAgICBpZiAobV9zdGFydGlu
Z05ld1BhcmFncmFwaCkKLSAgICAgICAgICAgIG1fbGluZUluZm8uc2V0RW1wdHkoZmFsc2UsICZt
X2Jsb2NrLCAmbV93aWR0aCk7Ci0gICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7Ci0g
ICAgICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwotCi0g
ICAgICAgIC8vIEEgPGJyPiB3aXRoIGNsZWFyYW5jZSBhbHdheXMgbmVlZHMgYSBsaW5lYm94IGlu
IGNhc2UgdGhlIGxpbmVzIGJlbG93IGl0IGdldCBkaXJ0aWVkIGxhdGVyIGFuZAotICAgICAgICAv
LyBuZWVkIHRvIGNoZWNrIGZvciBmbG9hdHMgdG8gY2xlYXIgLSBzbyBpZiB3ZSdyZSBpZ25vcmlu
ZyBzcGFjZXMsIHN0b3AgaWdub3JpbmcgdGhlbSBhbmQgYWRkIGEKLSAgICAgICAgLy8gcnVuIGZv
ciB0aGlzIG9iamVjdC4KLSAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50
U3R5bGUtPmNsZWFyKCkgIT0gQ05PTkUpCi0gICAgICAgICAgICBlbnN1cmVMaW5lQm94SW5zaWRl
SWdub3JlZFNwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBicik7Ci0gICAgICAgIC8vIElmIHdl
IHdlcmUgcHJlY2VkZWQgYnkgY29sbGFwc2luZyBzcGFjZSBhbmQgYXJlIGluIGEgcmlnaHQtYWxp
Z25lZCBjb250YWluZXIgd2UgbmVlZCB0byBlbnN1cmUgdGhlIHNwYWNlIGdldHMKLSAgICAgICAg
Ly8gY29sbGFwc2VkIGF3YXkgc28gdGhhdCBpdCBkb2Vzbid0IHB1c2ggdGhlIHRleHQgb3V0IGZy
b20gdGhlIGNvbnRhaW5lcidzIHJpZ2h0LWhhbmQgZWRnZS4KLSAgICAgICAgLy8gRklYTUU6IERv
IHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgY29udGFpbmVyJ3MgYWxpZ25tZW50IC0gd2lsbCByZXF1
aXJlIHJlYmFzZWxpbmluZyBhIGxvdCBvZiB0ZXN0IHJlc3VsdHMuCi0gICAgICAgIGVsc2UgaWYg
KG1faWdub3JpbmdTcGFjZXMgJiYgKG1fYmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBSSUdIVCB8
fCBtX2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gV0VCS0lUX1JJR0hUKSkKLSAgICAgICAgICAg
IHN0b3BJZ25vcmluZ1NwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigw
LCBtX2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3BvcykpOwotCi0gICAgICAgIGlmICghbV9s
aW5lSW5mby5pc0VtcHR5KCkpCi0gICAgICAgICAgICBjbGVhciA9IG1fY3VycmVudFN0eWxlLT5j
bGVhcigpOwotICAgIH0KLSAgICBtX2F0RW5kID0gdHJ1ZTsKLX0KLQotaW5saW5lIHZvaWQgQnJl
YWtpbmdDb250ZXh0OjpoYW5kbGVPdXRPZkZsb3dQb3NpdGlvbmVkKFZlY3RvcjxSZW5kZXJCb3gq
PiYgcG9zaXRpb25lZE9iamVjdHMpCi17Ci0gICAgLy8gSWYgb3VyIG9yaWdpbmFsIGRpc3BsYXkg
d2Fzbid0IGFuIGlubGluZSB0eXBlLCB0aGVuIHdlIGNhbgotICAgIC8vIGdvIGFoZWFkIGFuZCBk
ZXRlcm1pbmUgb3VyIHN0YXRpYyBpbmxpbmUgcG9zaXRpb24gbm93LgotICAgIFJlbmRlckJveCog
Ym94ID0gdG9SZW5kZXJCb3gobV9jdXJyZW50Lm1fb2JqKTsKLSAgICBib29sIGlzSW5saW5lVHlw
ZSA9IGJveC0+c3R5bGUoKS5pc09yaWdpbmFsRGlzcGxheUlubGluZVR5cGUoKTsKLSAgICBpZiAo
IWlzSW5saW5lVHlwZSkKLSAgICAgICAgbV9ibG9jay5zZXRTdGF0aWNJbmxpbmVQb3NpdGlvbkZv
ckNoaWxkKCpib3gsIG1fYmxvY2subG9naWNhbEhlaWdodCgpLCBtX2Jsb2NrLnN0YXJ0T2Zmc2V0
Rm9yQ29udGVudChtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQoKSkpOwotICAgIGVsc2UgewotICAgICAg
ICAvLyBJZiBvdXIgb3JpZ2luYWwgZGlzcGxheSB3YXMgYW4gSU5MSU5FIHR5cGUsIHRoZW4gd2Ug
Y2FuIGdvIGFoZWFkCi0gICAgICAgIC8vIGFuZCBkZXRlcm1pbmUgb3VyIHN0YXRpYyB5IHBvc2l0
aW9uIG5vdy4KLSAgICAgICAgYm94LT5sYXllcigpLT5zZXRTdGF0aWNCbG9ja1Bvc2l0aW9uKG1f
YmxvY2subG9naWNhbEhlaWdodCgpKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSdyZSBpZ25vcmlu
ZyBzcGFjZXMsIHdlIGhhdmUgdG8gc3RvcCBhbmQgaW5jbHVkZSB0aGlzIG9iamVjdCBhbmQKLSAg
ICAvLyB0aGVuIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcyBhZ2Fpbi4KLSAgICBpZiAoaXNJbmxpbmVU
eXBlIHx8IGJveC0+Y29udGFpbmVyKCktPmlzUmVuZGVySW5saW5lKCkpIHsKLSAgICAgICAgaWYg
KG1faWdub3JpbmdTcGFjZXMpCi0gICAgICAgICAgICBlbnN1cmVMaW5lQm94SW5zaWRlSWdub3Jl
ZFNwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBib3gpOwotICAgICAgICBtX3RyYWlsaW5nT2Jq
ZWN0cy5hcHBlbmRCb3hJZk5lZWRlZChib3gpOwotICAgIH0gZWxzZQotICAgICAgICBwb3NpdGlv
bmVkT2JqZWN0cy5hcHBlbmQoYm94KTsKLQotICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0
aChpbmxpbmVMb2dpY2FsV2lkdGgoYm94KSk7Ci0gICAgLy8gUmVzZXQgcHJpb3IgbGluZSBicmVh
ayBjb250ZXh0IGNoYXJhY3RlcnMuCi0gICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0
ZXJhdG9yLnJlc2V0UHJpb3JDb250ZXh0KCk7Ci19Ci0KLWlubGluZSB2b2lkIEJyZWFraW5nQ29u
dGV4dDo6aGFuZGxlRmxvYXQoKQotewotICAgIFJlbmRlckJveCYgZmxvYXRCb3ggPSB0b1JlbmRl
ckJveCgqbV9jdXJyZW50Lm1fb2JqKTsKLSAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmpl
Y3QgPSBtX2Jsb2NrLmluc2VydEZsb2F0aW5nT2JqZWN0KGZsb2F0Qm94KTsKLSAgICAvLyBjaGVj
ayBpZiBpdCBmaXRzIGluIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgLy8gSWYgaXQgZG9lcywgcG9z
aXRpb24gaXQgbm93LCBvdGhlcndpc2UsIHBvc2l0aW9uCi0gICAgLy8gaXQgYWZ0ZXIgbW92aW5n
IHRvIG5leHQgbGluZSAoaW4gbmV3TGluZSgpIGZ1bmMpCi0gICAgLy8gRklYTUU6IEJ1ZyAxMTAz
NzI6IFByb3Blcmx5IHBvc2l0aW9uIG11bHRpcGxlIHN0YWNrZWQgZmxvYXRzIHdpdGggbm9uLXJl
Y3Rhbmd1bGFyIHNoYXBlIG91dHNpZGUuCi0gICAgaWYgKG1fZmxvYXRzRml0T25MaW5lICYmIG1f
d2lkdGguZml0c09uTGluZUV4Y2x1ZGluZ1RyYWlsaW5nV2hpdGVzcGFjZShtX2Jsb2NrLmxvZ2lj
YWxXaWR0aEZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KSkpIHsKLSAgICAgICAgbV9ibG9jay5wb3Np
dGlvbk5ld0Zsb2F0T25MaW5lKGZsb2F0aW5nT2JqZWN0LCBtX2xhc3RGbG9hdEZyb21QcmV2aW91
c0xpbmUsIG1fbGluZUluZm8sIG1fd2lkdGgpOwotICAgICAgICBpZiAobV9saW5lQnJlYWsubV9v
YmogPT0gbV9jdXJyZW50Lm1fb2JqKSB7Ci0gICAgICAgICAgICBBU1NFUlQoIW1fbGluZUJyZWFr
Lm1fcG9zKTsKLSAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOwotICAgICAgICB9
Ci0gICAgfSBlbHNlCi0gICAgICAgIG1fZmxvYXRzRml0T25MaW5lID0gZmFsc2U7Ci0gICAgLy8g
VXBkYXRlIHByaW9yIGxpbmUgYnJlYWsgY29udGV4dCBjaGFyYWN0ZXJzLCB1c2luZyBVK0ZGRkQg
KE9CSkVDVCBSRVBMQUNFTUVOVCBDSEFSQUNURVIpIGZvciBmbG9hdGluZyBlbGVtZW50LgotICAg
IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci51cGRhdGVQcmlvckNvbnRleHQo
cmVwbGFjZW1lbnRDaGFyYWN0ZXIpOwotfQotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6
OmhhbmRsZUVtcHR5SW5saW5lKCkKLXsKLSAgICBSZW5kZXJJbmxpbmUmIGZsb3dCb3ggPSB0b1Jl
bmRlcklubGluZSgqbV9jdXJyZW50Lm1fb2JqKTsKLQotICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkg
ZW5kIHVwIGJlaW5nIGNhbGxlZCBvbiBlbXB0eSBpbmxpbmVzCi0gICAgQVNTRVJUKGlzRW1wdHlJ
bmxpbmUoZmxvd0JveCkpOwotCi0gICAgLy8gTm93IHRoYXQgc29tZSBpbmxpbmUgZmxvd3MgaGF2
ZSBsaW5lIGJveGVzLCBpZiB3ZSBhcmUgYWxyZWFkeSBpZ25vcmluZyBzcGFjZXMsIHdlIG5lZWQK
LSAgICAvLyB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzdG9wIHRvIGluY2x1ZGUgdGhpcyBvYmplY3Qg
YW5kIHRoZW4gc3RhcnQgaWdub3Jpbmcgc3BhY2VzIGFnYWluLgotICAgIC8vIElmIHRoaXMgb2Jq
ZWN0IGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSwgd2UgbmVlZCB0byBiZWhhdmUgbGlrZSBs
aXN0IG1hcmtlcnMgYW5kCi0gICAgLy8gc3RhcnQgaWdub3Jpbmcgc3BhY2VzLgotICAgIGJvb2wg
cmVxdWlyZXNMaW5lQm94ID0gYWx3YXlzUmVxdWlyZXNMaW5lQm94KGZsb3dCb3gpOwotICAgIGlm
IChyZXF1aXJlc0xpbmVCb3ggfHwgcmVxdWlyZXNMaW5lQm94Rm9yQ29udGVudChmbG93Qm94LCBt
X2xpbmVJbmZvKSkgewotICAgICAgICAvLyBBbiBlbXB0eSBpbmxpbmUgdGhhdCBvbmx5IGhhcyBs
aW5lLWhlaWdodCwgdmVydGljYWwtYWxpZ24gb3IgZm9udC1tZXRyaWNzIHdpbGwgb25seSBnZXQg
YQotICAgICAgICAvLyBsaW5lIGJveCB0byBhZmZlY3QgdGhlIGhlaWdodCBvZiB0aGUgbGluZSBp
ZiB0aGUgcmVzdCBvZiB0aGUgbGluZSBpcyBub3QgZW1wdHkuCi0gICAgICAgIGlmIChyZXF1aXJl
c0xpbmVCb3gpCi0gICAgICAgICAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAmbV9ibG9j
aywgJm1fd2lkdGgpOwotICAgICAgICBpZiAobV9pZ25vcmluZ1NwYWNlcykgewotICAgICAgICAg
ICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKLSAgICAgICAgICAgIGVuc3VyZUxpbmVCb3hJ
bnNpZGVJZ25vcmVkU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudC5tX29iaik7
Ci0gICAgICAgIH0gZWxzZSBpZiAobV9ibG9ja1N0eWxlLmNvbGxhcHNlV2hpdGVTcGFjZSgpICYm
IG1fcmVzb2x2ZXIucG9zaXRpb24oKS5tX29iaiA9PSBtX2N1cnJlbnQubV9vYmoKLSAgICAgICAg
ICAgICYmIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdChtX2Jsb2NrLCBtX2N1
cnJlbnQubV9vYmosIG1fbGluZU1pZHBvaW50U3RhdGUpKSB7Ci0gICAgICAgICAgICAvLyBMaWtl
IHdpdGggbGlzdCBtYXJrZXJzLCB3ZSBzdGFydCBpZ25vcmluZyBzcGFjZXMgdG8gbWFrZSBzdXJl
IHRoYXQgYW55Ci0gICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHNwYWNlcyB3ZSBzZWUgd2lsbCBi
ZSBkaXNjYXJkZWQuCi0gICAgICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlID0gdHJ1
ZTsKLSAgICAgICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSB0cnVlOwotICAgICAgICAg
ICAgbV9pZ25vcmluZ1NwYWNlcyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAg
bV90cmFpbGluZ09iamVjdHMuYXBwZW5kQm94SWZOZWVkZWQoJmZsb3dCb3gpOwotICAgIH0KLQot
ICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJy
ZW50Lm1fb2JqKSArIGJvcmRlclBhZGRpbmdNYXJnaW5TdGFydChmbG93Qm94KSArIGJvcmRlclBh
ZGRpbmdNYXJnaW5FbmQoZmxvd0JveCkpOwotfQotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRl
eHQ6OmhhbmRsZVJlcGxhY2VkKCkKLXsKLSAgICBSZW5kZXJCb3gmIHJlcGxhY2VkQm94ID0gdG9S
ZW5kZXJCb3goKm1fY3VycmVudC5tX29iaik7Ci0KLSAgICBpZiAobV9hdFN0YXJ0KQotICAgICAg
ICBtX3dpZHRoLnVwZGF0ZUF2YWlsYWJsZVdpZHRoKHJlcGxhY2VkQm94LmxvZ2ljYWxIZWlnaHQo
KSk7Ci0KLSAgICAvLyBCcmVhayBvbiByZXBsYWNlZCBlbGVtZW50cyBpZiBlaXRoZXIgaGFzIG5v
cm1hbCB3aGl0ZS1zcGFjZS4KLSAgICBpZiAoKG1fYXV0b1dyYXAgfHwgUmVuZGVyU3R5bGU6OmF1
dG9XcmFwKG1fbGFzdFdTKSkgJiYgKCFtX2N1cnJlbnQubV9vYmotPmlzSW1hZ2UoKSB8fCBtX2Fs
bG93SW1hZ2VzVG9CcmVhaykpIHsKLSAgICAgICAgbV93aWR0aC5jb21taXQoKTsKLSAgICAgICAg
bV9saW5lQnJlYWsubW92ZVRvU3RhcnRPZihtX2N1cnJlbnQubV9vYmopOwotICAgIH0KLQotICAg
IGlmIChtX2lnbm9yaW5nU3BhY2VzKQotICAgICAgICBzdG9wSWdub3JpbmdTcGFjZXMobV9saW5l
TWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50Lm1fb2JqLCAwKSk7Ci0K
LSAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAmbV9ibG9jaywgJm1fd2lkdGgpOwotICAg
IG1faWdub3JpbmdTcGFjZXMgPSBmYWxzZTsKLSAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNl
ID0gZmFsc2U7Ci0gICAgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyA9IGZhbHNlOwotICAgIG1fdHJh
aWxpbmdPYmplY3RzLmNsZWFyKCk7Ci0KLSAgICAvLyBPcHRpbWl6ZSBmb3IgYSBjb21tb24gY2Fz
ZS4gSWYgd2UgY2FuJ3QgZmluZCB3aGl0ZXNwYWNlIGFmdGVyIHRoZSBsaXN0Ci0gICAgLy8gaXRl
bSwgdGhlbiB0aGlzIGlzIGFsbCBtb290LgotICAgIExheW91dFVuaXQgcmVwbGFjZWRMb2dpY2Fs
V2lkdGggPSBtX2Jsb2NrLmxvZ2ljYWxXaWR0aEZvckNoaWxkKHJlcGxhY2VkQm94KSArIG1fYmxv
Y2subWFyZ2luU3RhcnRGb3JDaGlsZChyZXBsYWNlZEJveCkgKyBtX2Jsb2NrLm1hcmdpbkVuZEZv
ckNoaWxkKHJlcGxhY2VkQm94KSArIGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQubV9vYmop
OwotICAgIGlmIChtX2N1cnJlbnQubV9vYmotPmlzTGlzdE1hcmtlcigpKSB7Ci0gICAgICAgIGlm
IChtX2Jsb2NrU3R5bGUuY29sbGFwc2VXaGl0ZVNwYWNlKCkgJiYgc2hvdWxkU2tpcFdoaXRlc3Bh
Y2VBZnRlclN0YXJ0T2JqZWN0KG1fYmxvY2ssIG1fY3VycmVudC5tX29iaiwgbV9saW5lTWlkcG9p
bnRTdGF0ZSkpIHsKLSAgICAgICAgICAgIC8vIExpa2Ugd2l0aCBpbmxpbmUgZmxvd3MsIHdlIHN0
YXJ0IGlnbm9yaW5nIHNwYWNlcyB0byBtYWtlIHN1cmUgdGhhdCBhbnkKLSAgICAgICAgICAgIC8v
IGFkZGl0aW9uYWwgc3BhY2VzIHdlIHNlZSB3aWxsIGJlIGRpc2NhcmRlZC4KLSAgICAgICAgICAg
IG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgPSB0cnVlOwotICAgICAgICAgICAgbV9jdXJyZW50
Q2hhcmFjdGVySXNXUyA9IGZhbHNlOwotICAgICAgICAgICAgbV9pZ25vcmluZ1NwYWNlcyA9IHRy
dWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRvUmVuZGVyTGlzdE1hcmtlcigqbV9jdXJyZW50
Lm1fb2JqKS5pc0luc2lkZSgpKQotICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdp
ZHRoKHJlcGxhY2VkTG9naWNhbFdpZHRoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgbV93aWR0aC5h
ZGRVbmNvbW1pdHRlZFdpZHRoKHJlcGxhY2VkTG9naWNhbFdpZHRoKTsKLSAgICBpZiAobV9jdXJy
ZW50Lm1fb2JqLT5pc1J1YnlSdW4oKSkKLSAgICAgICAgbV93aWR0aC5hcHBseU92ZXJoYW5nKHRv
UmVuZGVyUnVieVJ1bihtX2N1cnJlbnQubV9vYmopLCBtX2xhc3RPYmplY3QsIG1fbmV4dE9iamVj
dCk7Ci0gICAgLy8gVXBkYXRlIHByaW9yIGxpbmUgYnJlYWsgY29udGV4dCBjaGFyYWN0ZXJzLCB1
c2luZyBVK0ZGRkQgKE9CSkVDVCBSRVBMQUNFTUVOVCBDSEFSQUNURVIpIGZvciByZXBsYWNlZCBl
bGVtZW50LgotICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci51cGRhdGVQ
cmlvckNvbnRleHQocmVwbGFjZW1lbnRDaGFyYWN0ZXIpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUg
dm9pZCBuZXh0Q2hhcmFjdGVyKFVDaGFyJiBjdXJyZW50Q2hhcmFjdGVyLCBVQ2hhciYgbGFzdENo
YXJhY3RlciwgVUNoYXImIHNlY29uZFRvTGFzdENoYXJhY3RlcikKLXsKLSAgICBzZWNvbmRUb0xh
c3RDaGFyYWN0ZXIgPSBsYXN0Q2hhcmFjdGVyOwotICAgIGxhc3RDaGFyYWN0ZXIgPSBjdXJyZW50
Q2hhcmFjdGVyOwotfQotCi1pbmxpbmUgYm9vbCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZVRleHQo
V29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cywgYm9vbCYgaHlwaGVuYXRlZCwgIHVu
c2lnbmVkJiBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcykKLXsKLSAgICBpZiAoIW1fY3VycmVu
dC5tX3BvcykKLSAgICAgICAgbV9hcHBsaWVkU3RhcnRXaWR0aCA9IGZhbHNlOwotCi0gICAgUmVu
ZGVyVGV4dCogcmVuZGVyVGV4dCA9IHRvUmVuZGVyVGV4dChtX2N1cnJlbnQubV9vYmopOwotCi0j
aWYgRU5BQkxFKFNWRykKLSAgICBib29sIGlzU1ZHVGV4dCA9IHJlbmRlclRleHQtPmlzU1ZHSW5s
aW5lVGV4dCgpOwotI2VuZGlmCi0KLSAgICAvLyBJZiB3ZSBoYXZlIGxlZnQgYSBuby13cmFwIGlu
bGluZSBhbmQgZW50ZXJlZCBhbiBhdXRvd3JhcCBpbmxpbmUgd2hpbGUgaWdub3Jpbmcgc3BhY2Vz
Ci0gICAgLy8gdGhlbiB3ZSBuZWVkIHRvIG1hcmsgdGhlIHN0YXJ0IG9mIHRoZSBhdXRvd3JhcCBp
bmxpbmUgYXMgYSBwb3RlbnRpYWwgbGluZWJyZWFrIG5vdy4KLSAgICBpZiAobV9hdXRvV3JhcCAm
JiAhUmVuZGVyU3R5bGU6OmF1dG9XcmFwKG1fbGFzdFdTKSAmJiBtX2lnbm9yaW5nU3BhY2VzKQot
ICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aChtX2N1cnJlbnQubV9vYmopOwot
Ci0gICAgaWYgKHJlbmRlclRleHQtPnN0eWxlKCkuaGFzVGV4dENvbWJpbmUoKSAmJiBtX2N1cnJl
bnQubV9vYmotPmlzQ29tYmluZVRleHQoKSAmJiAhdG9SZW5kZXJDb21iaW5lVGV4dCgqbV9jdXJy
ZW50Lm1fb2JqKS5pc0NvbWJpbmVkKCkpIHsKLSAgICAgICAgUmVuZGVyQ29tYmluZVRleHQmIGNv
bWJpbmVSZW5kZXJlciA9IHRvUmVuZGVyQ29tYmluZVRleHQoKm1fY3VycmVudC5tX29iaik7Ci0g
ICAgICAgIGNvbWJpbmVSZW5kZXJlci5jb21iaW5lVGV4dCgpOwotICAgICAgICAvLyBUaGUgbGVu
Z3RoIG9mIHRoZSByZW5kZXJlcidzIHRleHQgbWF5IGhhdmUgY2hhbmdlZC4gSW5jcmVtZW50IHN0
YWxlIGl0ZXJhdG9yIHBvc2l0aW9ucwotICAgICAgICBpZiAoaXRlcmF0b3JJc0JleW9uZEVuZE9m
UmVuZGVyQ29tYmluZVRleHQobV9saW5lQnJlYWssIGNvbWJpbmVSZW5kZXJlcikpIHsKLSAgICAg
ICAgICAgIEFTU0VSVChpdGVyYXRvcklzQmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChtX3Jl
c29sdmVyLnBvc2l0aW9uKCksIGNvbWJpbmVSZW5kZXJlcikpOwotICAgICAgICAgICAgbV9saW5l
QnJlYWsuaW5jcmVtZW50KCk7Ci0gICAgICAgICAgICBtX3Jlc29sdmVyLmluY3JlbWVudCgpOwot
ICAgICAgICB9Ci0gICAgfQotCi0gICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gbGluZVN0
eWxlKCpyZW5kZXJUZXh0LT5wYXJlbnQoKSwgbV9saW5lSW5mbyk7Ci0gICAgY29uc3QgRm9udCYg
Zm9udCA9IHN0eWxlLmZvbnQoKTsKLSAgICBib29sIGlzRml4ZWRQaXRjaCA9IGZvbnQuaXNGaXhl
ZFBpdGNoKCk7Ci0gICAgYm9vbCBjYW5IeXBoZW5hdGUgPSBzdHlsZS5oeXBoZW5zKCkgPT0gSHlw
aGVuc0F1dG8gJiYgV2ViQ29yZTo6Y2FuSHlwaGVuYXRlKHN0eWxlLmxvY2FsZSgpKTsKLQotICAg
IHVuc2lnbmVkIGxhc3RTcGFjZSA9IG1fY3VycmVudC5tX3BvczsKLSAgICBmbG9hdCB3b3JkU3Bh
Y2luZyA9IG1fY3VycmVudFN0eWxlLT53b3JkU3BhY2luZygpOwotICAgIGZsb2F0IGxhc3RTcGFj
ZVdvcmRTcGFjaW5nID0gMDsKLSAgICBmbG9hdCB3b3JkU3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVu
dCA9IDA7Ci0KLSAgICBmbG9hdCB3cmFwVyA9IG1fd2lkdGgudW5jb21taXR0ZWRXaWR0aCgpICsg
aW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaiwgIW1fYXBwbGllZFN0YXJ0V2lkdGgs
IHRydWUpOwotICAgIGZsb2F0IGNoYXJXaWR0aCA9IDA7Ci0gICAgYm9vbCBicmVha05CU1AgPSBt
X2F1dG9XcmFwICYmIG1fY3VycmVudFN0eWxlLT5uYnNwTW9kZSgpID09IFNQQUNFOwotICAgIC8v
IEF1dG8td3JhcHBpbmcgdGV4dCBzaG91bGQgd3JhcCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBv
bmx5IGlmIGl0IGNvdWxkIG5vdCB3cmFwIGJlZm9yZSB0aGUgd29yZCwKLSAgICAvLyB3aGljaCBp
cyBvbmx5IHBvc3NpYmxlIGlmIHRoZSB3b3JkIGlzIHRoZSBmaXJzdCB0aGluZyBvbiB0aGUgbGlu
ZSwgdGhhdCBpcywgaWYgfHd8IGlzIHplcm8uCi0gICAgYm9vbCBicmVha1dvcmRzID0gbV9jdXJy
ZW50U3R5bGUtPmJyZWFrV29yZHMoKSAmJiAoKG1fYXV0b1dyYXAgJiYgIW1fd2lkdGguY29tbWl0
dGVkV2lkdGgoKSkgfHwgbV9jdXJyV1MgPT0gUFJFKTsKLSAgICBib29sIG1pZFdvcmRCcmVhayA9
IGZhbHNlOwotICAgIGJvb2wgYnJlYWtBbGwgPSBtX2N1cnJlbnRTdHlsZS0+d29yZEJyZWFrKCkg
PT0gQnJlYWtBbGxXb3JkQnJlYWsgJiYgbV9hdXRvV3JhcDsKLSAgICBmbG9hdCBoeXBoZW5XaWR0
aCA9IDA7Ci0jaWYgRU5BQkxFKFNWRykKLSAgICBpZiAoaXNTVkdUZXh0KSB7Ci0gICAgICAgIGJy
ZWFrV29yZHMgPSBmYWxzZTsKLSAgICAgICAgYnJlYWtBbGwgPSBmYWxzZTsKLSAgICB9Ci0jZW5k
aWYKLQotICAgIGlmIChtX3JlbmRlclRleHRJbmZvLm1fdGV4dCAhPSByZW5kZXJUZXh0KSB7Ci0g
ICAgICAgIHVwZGF0ZUNvdW50ZXJJZk5lZWRlZCgqcmVuZGVyVGV4dCk7Ci0gICAgICAgIG1fcmVu
ZGVyVGV4dEluZm8ubV90ZXh0ID0gcmVuZGVyVGV4dDsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5m
by5tX2ZvbnQgPSAmZm9udDsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xheW91dCA9IGZv
bnQuY3JlYXRlTGF5b3V0KHJlbmRlclRleHQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIG1fY29s
bGFwc2VXaGl0ZVNwYWNlKTsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0
ZXJhdG9yLnJlc2V0U3RyaW5nQW5kUmVsZWFzZUl0ZXJhdG9yKHJlbmRlclRleHQtPnRleHQoKSwg
c3R5bGUubG9jYWxlKCkpOwotICAgIH0gZWxzZSBpZiAobV9yZW5kZXJUZXh0SW5mby5tX2xheW91
dCAmJiBtX3JlbmRlclRleHRJbmZvLm1fZm9udCAhPSAmZm9udCkgewotICAgICAgICBtX3JlbmRl
clRleHRJbmZvLm1fZm9udCA9ICZmb250OwotICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fbGF5
b3V0ID0gZm9udC5jcmVhdGVMYXlvdXQocmVuZGVyVGV4dCwgbV93aWR0aC5jdXJyZW50V2lkdGgo
KSwgbV9jb2xsYXBzZVdoaXRlU3BhY2UpOwotICAgIH0KLQotICAgIFRleHRMYXlvdXQqIHRleHRM
YXlvdXQgPSBtX3JlbmRlclRleHRJbmZvLm1fbGF5b3V0LmdldCgpOwotCi0gICAgLy8gTm9uLXpl
cm8gb25seSB3aGVuIGtlcm5pbmcgaXMgZW5hYmxlZCBhbmQgVGV4dExheW91dCBpc24ndCB1c2Vk
LCBpbiB3aGljaCBjYXNlIHdlIG1lYXN1cmUKLSAgICAvLyB3b3JkcyB3aXRoIHRoZWlyIHRyYWls
aW5nIHNwYWNlLCB0aGVuIHN1YnRyYWN0IGl0cyB3aWR0aC4KLSAgICBIYXNoU2V0PGNvbnN0IFNp
bXBsZUZvbnREYXRhKj4gZmFsbGJhY2tGb250czsKLSAgICBmbG9hdCB3b3JkVHJhaWxpbmdTcGFj
ZVdpZHRoID0gKGZvbnQudHlwZXNldHRpbmdGZWF0dXJlcygpICYgS2VybmluZykgJiYgIXRleHRM
YXlvdXQgPyBmb250LndpZHRoKFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHJlbmRlclRl
eHQsIGZvbnQsICZzcGFjZSwgMSwgc3R5bGUpLCAmZmFsbGJhY2tGb250cykgKyB3b3JkU3BhY2lu
ZyA6IDA7Ci0KLSAgICBVQ2hhciBsYXN0Q2hhcmFjdGVyID0gbV9yZW5kZXJUZXh0SW5mby5tX2xp
bmVCcmVha0l0ZXJhdG9yLmxhc3RDaGFyYWN0ZXIoKTsKLSAgICBVQ2hhciBzZWNvbmRUb0xhc3RD
aGFyYWN0ZXIgPSBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3Iuc2Vjb25kVG9M
YXN0Q2hhcmFjdGVyKCk7Ci0gICAgZm9yICg7IG1fY3VycmVudC5tX3BvcyA8IHJlbmRlclRleHQt
PnRleHRMZW5ndGgoKTsgbV9jdXJyZW50LmZhc3RJbmNyZW1lbnRJblRleHROb2RlKCkpIHsKLSAg
ICAgICAgYm9vbCBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlOwotICAgICAgICBib29sIHByZXZpb3VzQ2hhcmFjdGVySXNXUyA9IG1fY3VycmVudENo
YXJhY3RlcklzV1M7Ci0gICAgICAgIFVDaGFyIGMgPSBtX2N1cnJlbnQuY3VycmVudCgpOwotICAg
ICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlID0gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8
ICghbV9wcmVzZXJ2ZXNOZXdsaW5lICYmIChjID09ICdcbicpKTsKLQotICAgICAgICBpZiAoIW1f
Y29sbGFwc2VXaGl0ZVNwYWNlIHx8ICFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQotICAgICAg
ICAgICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKLQot
ICAgICAgICBpZiAoYyA9PSBzb2Z0SHlwaGVuICYmIG1fYXV0b1dyYXAgJiYgIWh5cGhlbldpZHRo
ICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkgewotICAgICAgICAgICAgaHlwaGVu
V2lkdGggPSBtZWFzdXJlSHlwaGVuV2lkdGgocmVuZGVyVGV4dCwgZm9udCwgJmZhbGxiYWNrRm9u
dHMpOwotICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGh5cGhlbldpZHRo
KTsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgYXBwbHlXb3JkU3BhY2luZyA9IGZhbHNlOwot
Ci0gICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1Nw
YWNlIHx8IChicmVha05CU1AgJiYgYyA9PSBub0JyZWFrU3BhY2UpOwotCi0gICAgICAgIGlmICgo
YnJlYWtBbGwgfHwgYnJlYWtXb3JkcykgJiYgIW1pZFdvcmRCcmVhayAmJiAoIW1fY3VycmVudENo
YXJhY3RlcklzU3BhY2UgfHwgc3R5bGUud2hpdGVTcGFjZSgpICE9IFBSRV9XUkFQKSkgewotICAg
ICAgICAgICAgd3JhcFcgKz0gY2hhcldpZHRoOwotICAgICAgICAgICAgYm9vbCBtaWRXb3JkQnJl
YWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPSBVMTZfSVNfTEVBRChjKSAmJiBtX2N1cnJlbnQubV9w
b3MgKyAxIDwgcmVuZGVyVGV4dC0+dGV4dExlbmd0aCgpICYmIFUxNl9JU19UUkFJTCgoKnJlbmRl
clRleHQpW21fY3VycmVudC5tX3BvcyArIDFdKTsKLSAgICAgICAgICAgIGNoYXJXaWR0aCA9IHRl
eHRXaWR0aChyZW5kZXJUZXh0LCBtX2N1cnJlbnQubV9wb3MsIG1pZFdvcmRCcmVha0lzQmVmb3Jl
U3Vycm9nYXRlUGFpciA/IDIgOiAxLCBmb250LCBtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgKyB3
cmFwVywgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgZmFsbGJhY2tGb250cywg
dGV4dExheW91dCk7Ci0gICAgICAgICAgICBtaWRXb3JkQnJlYWsgPSBtX3dpZHRoLmNvbW1pdHRl
ZFdpZHRoKCkgKyB3cmFwVyArIGNoYXJXaWR0aCA+IG1fd2lkdGguYXZhaWxhYmxlV2lkdGgoKTsK
LSAgICAgICAgfQotCi0gICAgICAgIGJvb2wgYmV0d2VlbldvcmRzID0gYyA9PSAnXG4nIHx8ICht
X2N1cnJXUyAhPSBQUkUgJiYgIW1fYXRTdGFydCAmJiBpc0JyZWFrYWJsZShtX3JlbmRlclRleHRJ
bmZvLm1fbGluZUJyZWFrSXRlcmF0b3IsIG1fY3VycmVudC5tX3BvcywgbV9jdXJyZW50Lm1fbmV4
dEJyZWFrYWJsZVBvc2l0aW9uLCBicmVha05CU1ApCi0gICAgICAgICAgICAmJiAoc3R5bGUuaHlw
aGVucygpICE9IEh5cGhlbnNOb25lIHx8IChtX2N1cnJlbnQucHJldmlvdXNJblNhbWVOb2RlKCkg
IT0gc29mdEh5cGhlbikpKTsKLQotICAgICAgICBpZiAoYmV0d2VlbldvcmRzIHx8IG1pZFdvcmRC
cmVhaykgewotICAgICAgICAgICAgYm9vbCBzdG9wcGVkSWdub3JpbmdTcGFjZXMgPSBmYWxzZTsK
LSAgICAgICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzKSB7Ci0gICAgICAgICAgICAgICAgbGFz
dFNwYWNlV29yZFNwYWNpbmcgPSAwOwotICAgICAgICAgICAgICAgIGlmICghbV9jdXJyZW50Q2hh
cmFjdGVySXNTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGlnbm9yaW5nIHNw
YWNlcyBhbmQgYmVnaW4gYXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAvLyBuZXcgcG9pbnQu
Ci0gICAgICAgICAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSBmYWxzZTsKLSAgICAgICAg
ICAgICAgICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAwOwotICAgICAgICAg
ICAgICAgICAgICBsYXN0U3BhY2UgPSBtX2N1cnJlbnQubV9wb3M7IC8vIGUuZy4sICJGb28gICAg
Z29vIiwgZG9uJ3QgYWRkIGluIGFueSBvZiB0aGUgaWdub3JlZCBzcGFjZXMuCi0gICAgICAgICAg
ICAgICAgICAgIHN0b3BJZ25vcmluZ1NwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJ
dGVyYXRvcigwLCBtX2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3BvcykpOwotICAgICAgICAg
ICAgICAgICAgICBzdG9wcGVkSWdub3JpbmdTcGFjZXMgPSB0cnVlOwotICAgICAgICAgICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEp1c3Qga2VlcCBpZ25vcmluZyB0aGVz
ZSBzcGFjZXMuCi0gICAgICAgICAgICAgICAgICAgIG5leHRDaGFyYWN0ZXIoYywgbGFzdENoYXJh
Y3Rlciwgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3b3Jk
TWVhc3VyZW1lbnRzLmdyb3cod29yZE1lYXN1cmVtZW50cy5zaXplKCkgKyAxKTsKLSAgICAgICAg
ICAgIFdvcmRNZWFzdXJlbWVudCYgd29yZE1lYXN1cmVtZW50ID0gd29yZE1lYXN1cmVtZW50cy5s
YXN0KCk7Ci0KLSAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9IHJlbmRlclRl
eHQ7Ci0gICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9jdXJyZW50Lm1f
cG9zOwotICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0ID0gbGFzdFNwYWNl
OwotCi0gICAgICAgICAgICBmbG9hdCBhZGRpdGlvbmFsVGVtcFdpZHRoOwotICAgICAgICAgICAg
aWYgKHdvcmRUcmFpbGluZ1NwYWNlV2lkdGggJiYgYyA9PSAnICcpCi0gICAgICAgICAgICAgICAg
YWRkaXRpb25hbFRlbXBXaWR0aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1f
Y3VycmVudC5tX3BvcyArIDEgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVudFdpZHRo
KCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVudC5m
YWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSAtIHdvcmRUcmFpbGluZ1NwYWNlV2lkdGg7Ci0gICAg
ICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWRkaXRpb25hbFRlbXBXaWR0aCA9IHRleHRX
aWR0aChyZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVudC5tX3BvcyAtIGxhc3RTcGFjZSwg
Zm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hp
dGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOwotCi0g
ICAgICAgICAgICBpZiAod29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuaXNFbXB0eSgpICYm
ICFmYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1l
bnQuZmFsbGJhY2tGb250cy5zd2FwKGZhbGxiYWNrRm9udHMpOwotICAgICAgICAgICAgZmFsbGJh
Y2tGb250cy5jbGVhcigpOwotCi0gICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQud2lkdGggPSBh
ZGRpdGlvbmFsVGVtcFdpZHRoICsgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQ7Ci0gICAg
ICAgICAgICBhZGRpdGlvbmFsVGVtcFdpZHRoICs9IGxhc3RTcGFjZVdvcmRTcGFjaW5nOwotICAg
ICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxUZW1wV2lkdGgp
OwotCi0gICAgICAgICAgICBpZiAobV9jb2xsYXBzZVdoaXRlU3BhY2UgJiYgcHJldmlvdXNDaGFy
YWN0ZXJJc1NwYWNlICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgYWRkaXRpb25hbFRl
bXBXaWR0aCkKLSAgICAgICAgICAgICAgICBtX3dpZHRoLnNldFRyYWlsaW5nV2hpdGVzcGFjZVdp
ZHRoKGFkZGl0aW9uYWxUZW1wV2lkdGgpOwotCi0gICAgICAgICAgICBpZiAoIW1fYXBwbGllZFN0
YXJ0V2lkdGgpIHsKLSAgICAgICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgo
aW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaiwgdHJ1ZSwgZmFsc2UpKTsKLSAgICAg
ICAgICAgICAgICBtX2FwcGxpZWRTdGFydFdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQot
I2lmIEVOQUJMRShDU1NfU0hBUEVTKQotICAgICAgICAgICAgaWYgKG1fbGFzdEZsb2F0RnJvbVBy
ZXZpb3VzTGluZSkKLSAgICAgICAgICAgICAgICB1cGRhdGVTZWdtZW50c0ZvclNoYXBlcyhtX2Js
b2NrLCBtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHdvcmRNZWFzdXJlbWVudHMsIG1fd2lk
dGgsIG1fbGluZUluZm8uaXNGaXJzdExpbmUoKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGFwcGx5
V29yZFNwYWNpbmcgPSB3b3JkU3BhY2luZyAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlOwot
Ci0gICAgICAgICAgICBpZiAoIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiBtX2F1dG9XcmFw
ICYmICFtX3dpZHRoLmZpdHNPbkxpbmUoKSkKLSAgICAgICAgICAgICAgICBtX3dpZHRoLmZpdEJl
bG93RmxvYXRzKCk7Ci0KLSAgICAgICAgICAgIGlmIChtX2F1dG9XcmFwIHx8IGJyZWFrV29yZHMp
IHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBicmVhayBvbmx5IGFmdGVyIHdoaXRlLXNwYWNl
LCBjb25zaWRlciB0aGUgY3VycmVudCBjaGFyYWN0ZXIKLSAgICAgICAgICAgICAgICAvLyBhcyBj
YW5kaWRhdGUgd2lkdGggZm9yIHRoaXMgbGluZS4KLSAgICAgICAgICAgICAgICBib29sIGxpbmVX
YXNUb29XaWRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKG1fd2lkdGguZml0c09uTGlu
ZSgpICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgbV9jdXJyZW50U3R5bGUtPmJyZWFr
T25seUFmdGVyV2hpdGVTcGFjZSgpICYmICFtaWRXb3JkQnJlYWspIHsKLSAgICAgICAgICAgICAg
ICAgICAgZmxvYXQgY2hhcldpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIG1fY3VycmVudC5t
X3BvcywgMSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2Nv
bGxhcHNlV2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlv
dXQpICsgKGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDApOwotICAgICAgICAgICAg
ICAgICAgICAvLyBDaGVjayBpZiBsaW5lIGlzIHRvbyBiaWcgZXZlbiB3aXRob3V0IHRoZSBleHRy
YSBzcGFjZQotICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiBJ
ZiBpdCBpcyBub3QsIGRvIG5vdGhpbmcuCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBs
aW5lIG5lZWRzIHRoZSBleHRyYSB3aGl0ZXNwYWNlIHRvIGJlIHRvbyBsb25nLAotICAgICAgICAg
ICAgICAgICAgICAvLyB0aGVuIG1vdmUgdGhlIGxpbmUgYnJlYWsgdG8gdGhlIHNwYWNlIGFuZCBz
a2lwIGFsbAotICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHdoaXRlc3BhY2UuCi0g
ICAgICAgICAgICAgICAgICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lSW5jbHVkaW5nRXh0cmFX
aWR0aChjaGFyV2lkdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2FzVG9vV2lk
ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8obV9j
dXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2FibGVQ
b3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVha2VyLnNraXBUcmFp
bGluZ1doaXRlc3BhY2UobV9saW5lQnJlYWssIG1fbGluZUluZm8pOwotICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChsaW5lV2FzVG9v
V2lkZSB8fCAhbV93aWR0aC5maXRzT25MaW5lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYg
KGNhbkh5cGhlbmF0ZSAmJiAhbV93aWR0aC5maXRzT25MaW5lKCkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIHRyeUh5cGhlbmF0aW5nKHJlbmRlclRleHQsIGZvbnQsIHN0eWxlLmxvY2FsZSgp
LCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgbV9ibG9ja1N0eWxlLmh5cGhlbmF0aW9uTGlt
aXRMaW5lcygpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCksIHN0eWxlLmh5cGhlbmF0
aW9uTGltaXRBZnRlcigpLCBsYXN0U3BhY2UsIG1fY3VycmVudC5tX3BvcywgbV93aWR0aC5jdXJy
ZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lkdGgsIG1fd2lkdGguYXZhaWxhYmxlV2lkdGgo
KSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgbGFzdFNwYWNlV29yZFNwYWNp
bmcsIG1fbGluZUJyZWFrLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24sIG1fbGlu
ZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2xp
bmVCcmVha2VyLm1faHlwaGVuYXRlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1f
YXRFbmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWsuYXRUZXh0UGFyYWdyYXBoU2VwYXJhdG9yKCkp
IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcHBlZElnbm9yaW5nU3BhY2VzICYm
IG1fY3VycmVudC5tX3BvcyA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJl
Q2hhcmFjdGVyR2V0c0xpbmVCb3gobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9jdXJyZW50KTsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFubHkodHJ1
ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0g
bV9saW5lQnJlYWsubV9wb3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAgICAgaWYgKG1fbGluZUJyZWFrLm1fb2JqICYmIG1fbGluZUJyZWFrLm1fcG9zICYmIG1fbGlu
ZUJyZWFrLm1fb2JqLT5pc1RleHQoKSAmJiB0b1JlbmRlclRleHQobV9saW5lQnJlYWsubV9vYmop
LT50ZXh0TGVuZ3RoKCkgJiYgdG9SZW5kZXJUZXh0KG1fbGluZUJyZWFrLm1fb2JqKS0+Y2hhcmFj
dGVyQXQobV9saW5lQnJlYWsubV9wb3MgLSAxKSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhl
bnMoKSAhPSBIeXBoZW5zTm9uZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGh5cGhlbmF0ZWQg
PSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWsubV9wb3MgJiYgbV9s
aW5lQnJlYWsubV9wb3MgIT0gKHVuc2lnbmVkKXdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgJiYg
IXdvcmRNZWFzdXJlbWVudC53aWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNo
YXJXaWR0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5l
bmRPZmZzZXQgPSBtX2xpbmVCcmVhay5tX3BvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB3b3JkTWVhc3VyZW1lbnQud2lkdGggPSBjaGFyV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gRGlk
bid0IGZpdC4gSnVtcCB0byB0aGUgZW5kIHVubGVzcyB0aGVyZSdzIHN0aWxsIGFuIG9wcG9ydHVu
aXR5IHRvIGNvbGxhcHNlIHdoaXRlc3BhY2UuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX2ln
bm9yaW5nU3BhY2VzIHx8ICFtX2NvbGxhcHNlV2hpdGVTcGFjZSB8fCAhbV9jdXJyZW50Q2hhcmFj
dGVySXNTcGFjZSB8fCAhcHJldmlvdXNDaGFyYWN0ZXJJc1NwYWNlKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICAgICAgICAgIGlmICghYmV0d2VlbldvcmRzIHx8IChtaWRXb3JkQnJlYWsg
JiYgIW1fYXV0b1dyYXApKQotICAgICAgICAgICAgICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNv
bW1pdHRlZFdpZHRoKC1hZGRpdGlvbmFsVGVtcFdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAg
aWYgKGh5cGhlbldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJ0cmFjdCB0
aGUgd2lkdGggb2YgdGhlIHNvZnQgaHlwaGVuIG91dCBzaW5jZSB3ZSBmaXQgb24gYSBsaW5lLgot
ICAgICAgICAgICAgICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKC1oeXBo
ZW5XaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoeXBoZW5XaWR0aCA9IDA7Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIGlmIChjID09ICdcbicgJiYgbV9wcmVzZXJ2ZXNOZXdsaW5lKSB7Ci0gICAgICAg
ICAgICAgICAgaWYgKCFzdG9wcGVkSWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50Lm1fcG9zID4g
MCkKLSAgICAgICAgICAgICAgICAgICAgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gobV9saW5l
TWlkcG9pbnRTdGF0ZSwgbV9jdXJyZW50KTsKLSAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5t
b3ZlVG8obV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRC
cmVha2FibGVQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50
KCk7Ci0gICAgICAgICAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHkodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0K
LSAgICAgICAgICAgIGlmIChtX2F1dG9XcmFwICYmIGJldHdlZW5Xb3JkcykgewotICAgICAgICAg
ICAgICAgIG1fd2lkdGguY29tbWl0KCk7Ci0gICAgICAgICAgICAgICAgd3JhcFcgPSAwOwotICAg
ICAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQubV9vYmosIG1fY3VycmVu
dC5tX3BvcywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uKTsKLSAgICAgICAgICAg
ICAgICAvLyBBdXRvLXdyYXBwaW5nIHRleHQgc2hvdWxkIG5vdCB3cmFwIGluIHRoZSBtaWRkbGUg
b2YgYSB3b3JkIG9uY2UgaXQgaGFzIGhhZCBhbgotICAgICAgICAgICAgICAgIC8vIG9wcG9ydHVu
aXR5IHRvIGJyZWFrIGFmdGVyIGEgd29yZC4KLSAgICAgICAgICAgICAgICBicmVha1dvcmRzID0g
ZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtaWRXb3JkQnJlYWsgJiYg
IVUxNl9JU19UUkFJTChjKSAmJiAhKFVfR0VUX0dDX01BU0soYykgJiBVX0dDX01fTUFTSykpIHsK
LSAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIGFzIGEgYnJlYWthYmxlIHBvc2l0aW9u
IGluIGNhc2UKLSAgICAgICAgICAgICAgICAvLyBhZGRpbmcgdGhlIGVuZCB3aWR0aCBmb3JjZXMg
YSBicmVhay4KLSAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8obV9jdXJyZW50Lm1f
b2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2FibGVQb3NpdGlvbik7
Ci0gICAgICAgICAgICAgICAgbWlkV29yZEJyZWFrICY9IChicmVha1dvcmRzIHx8IGJyZWFrQWxs
KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGJldHdlZW5Xb3JkcykgewotICAg
ICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gYXBwbHlXb3JkU3BhY2luZyA/IHdv
cmRTcGFjaW5nIDogMDsKLSAgICAgICAgICAgICAgICB3b3JkU3BhY2luZ0ZvcldvcmRNZWFzdXJl
bWVudCA9IChhcHBseVdvcmRTcGFjaW5nICYmIHdvcmRNZWFzdXJlbWVudC53aWR0aCkgPyB3b3Jk
U3BhY2luZyA6IDA7Ci0gICAgICAgICAgICAgICAgbGFzdFNwYWNlID0gbV9jdXJyZW50Lm1fcG9z
OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW1faWdub3JpbmdTcGFjZXMgJiYg
bV9jdXJyZW50U3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpKSB7Ci0gICAgICAgICAgICAgICAg
Ly8gSWYgd2UgZW5jb3VudGVyIGEgbmV3bGluZSwgb3IgaWYgd2UgZW5jb3VudGVyIGEKLSAgICAg
ICAgICAgICAgICAvLyBzZWNvbmQgc3BhY2UsIHdlIG5lZWQgdG8gZ28gYWhlYWQgYW5kIGJyZWFr
IHVwIHRoaXMKLSAgICAgICAgICAgICAgICAvLyBydW4gYW5kIGVudGVyIGEgbW9kZSB3aGVyZSB3
ZSBzdGFydCBjb2xsYXBzaW5nIHNwYWNlcy4KLSAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50
Q2hhcmFjdGVySXNTcGFjZSAmJiBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UpIHsKLSAgICAgICAg
ICAgICAgICAgICAgbV9pZ25vcmluZ1NwYWNlcyA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAg
ICAgLy8gV2UganVzdCBlbnRlcmVkIGEgbW9kZSB3aGVyZSB3ZSBhcmUgaWdub3JpbmcKLSAgICAg
ICAgICAgICAgICAgICAgLy8gc3BhY2VzLiBDcmVhdGUgYSBtaWRwb2ludCB0byB0ZXJtaW5hdGUg
dGhlIHJ1bgotICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBzcGFjZS4K
LSAgICAgICAgICAgICAgICAgICAgc3RhcnRJZ25vcmluZ1NwYWNlcyhtX2xpbmVNaWRwb2ludFN0
YXRlLCBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzKTsKLSAgICAgICAgICAgICAgICAgICAgbV90cmFp
bGluZ09iamVjdHMudXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxpbmdCb3hlcyhtX2xpbmVNaWRwb2lu
dFN0YXRlLCBJbmxpbmVJdGVyYXRvcigpLCBUcmFpbGluZ09iamVjdHM6OkRvTm90Q29sbGFwc2VG
aXJzdFNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0g
ZWxzZSBpZiAobV9pZ25vcmluZ1NwYWNlcykgewotICAgICAgICAgICAgLy8gU3RvcCBpZ25vcmlu
ZyBzcGFjZXMgYW5kIGJlZ2luIGF0IHRoaXMKLSAgICAgICAgICAgIC8vIG5ldyBwb2ludC4KLSAg
ICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGxhc3RTcGFj
ZVdvcmRTcGFjaW5nID0gYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFjaW5nIDogMDsKLSAgICAg
ICAgICAgIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50ID0gKGFwcGx5V29yZFNwYWNpbmcg
JiYgd29yZE1lYXN1cmVtZW50cy5sYXN0KCkud2lkdGgpID8gd29yZFNwYWNpbmcgOiAwOwotICAg
ICAgICAgICAgbGFzdFNwYWNlID0gbV9jdXJyZW50Lm1fcG9zOyAvLyBlLmcuLCAiRm9vICAgIGdv
byIsIGRvbid0IGFkZCBpbiBhbnkgb2YgdGhlIGlnbm9yZWQgc3BhY2VzLgotICAgICAgICAgICAg
c3RvcElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAs
IG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1fcG9zKSk7Ci0gICAgICAgIH0KLSNpZiBFTkFC
TEUoU1ZHKQotICAgICAgICBpZiAoaXNTVkdUZXh0ICYmIG1fY3VycmVudC5tX3BvcyA+IDApIHsK
LSAgICAgICAgICAgIC8vIEZvcmNlIGNyZWF0aW9uIG9mIG5ldyBJbmxpbmVCb3hlcyBmb3IgZWFj
aCBhYnNvbHV0ZSBwb3NpdGlvbmVkIGNoYXJhY3RlciAodGhvc2UgdGhhdCBzdGFydCBuZXcgdGV4
dCBjaHVua3MpLgotICAgICAgICAgICAgaWYgKHRvUmVuZGVyU1ZHSW5saW5lVGV4dChyZW5kZXJU
ZXh0KS0+Y2hhcmFjdGVyU3RhcnRzTmV3VGV4dENodW5rKG1fY3VycmVudC5tX3BvcykpCi0gICAg
ICAgICAgICAgICAgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gobV9saW5lTWlkcG9pbnRTdGF0
ZSwgbV9jdXJyZW50KTsKLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgaWYgKG1fY3VycmVu
dENoYXJhY3RlcklzU3BhY2UgJiYgIXByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSkgewotICAgICAg
ICAgICAgbV9zdGFydE9mSWdub3JlZFNwYWNlcy5tX29iaiA9IG1fY3VycmVudC5tX29iajsKLSAg
ICAgICAgICAgIG1fc3RhcnRPZklnbm9yZWRTcGFjZXMubV9wb3MgPSBtX2N1cnJlbnQubV9wb3M7
Ci0gICAgICAgICAgICAvLyBTcGFjZXMgYWZ0ZXIgcmlnaHQtYWxpZ25lZCB0ZXh0IGFuZCBiZWZv
cmUgYSBsaW5lLWJyZWFrIGdldCBjb2xsYXBzZWQgYXdheSBjb21wbGV0ZWx5IHNvIHRoYXQgdGhl
IHRyYWlsaW5nCi0gICAgICAgICAgICAvLyBzcGFjZSBkb2Vzbid0IHNlZW0gdG8gcHVzaCB0aGUg
dGV4dCBvdXQgZnJvbSB0aGUgcmlnaHQtaGFuZCBlZGdlLgotICAgICAgICAgICAgLy8gRklYTUU6
IERvIHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgY29udGFpbmVyJ3MgYWxpZ25tZW50IC0gd2lsbCBy
ZXF1aXJlIHJlYmFzZWxpbmluZyBhIGxvdCBvZiB0ZXN0IHJlc3VsdHMuCi0gICAgICAgICAgICBp
ZiAobV9uZXh0T2JqZWN0ICYmIG1fbmV4dE9iamVjdC0+aXNCUigpICYmIChtX2Jsb2NrU3R5bGUu
dGV4dEFsaWduKCkgPT0gUklHSFQgfHwgbV9ibG9ja1N0eWxlLnRleHRBbGlnbigpID09IFdFQktJ
VF9SSUdIVCkpIHsKLSAgICAgICAgICAgICAgICBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLm1fcG9z
LS07Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBqdXN0IGEgc2luZ2xlIHRyYWlsaW5n
IHNwYWNlIHN0YXJ0IGlnbm9yaW5nIGl0IG5vdyBzbyBpdCBjb2xsYXBzZXMgYXdheS4KLSAgICAg
ICAgICAgICAgICBpZiAobV9jdXJyZW50Lm1fcG9zID09IHJlbmRlclRleHQtPnRleHRMZW5ndGgo
KSAtIDEpCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0SWdub3JpbmdTcGFjZXMobV9saW5lTWlk
cG9pbnRTdGF0ZSwgbV9zdGFydE9mSWdub3JlZFNwYWNlcyk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLQotICAgICAgICBpZiAoIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgcHJldmlv
dXNDaGFyYWN0ZXJJc1dTKSB7Ci0gICAgICAgICAgICBpZiAobV9hdXRvV3JhcCAmJiBtX2N1cnJl
bnRTdHlsZS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkpCi0gICAgICAgICAgICAgICAgbV9s
aW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1fcG9zLCBtX2N1cnJl
bnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1f
Y29sbGFwc2VXaGl0ZVNwYWNlICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgIW1faWdu
b3JpbmdTcGFjZXMpCi0gICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5zZXRUcmFpbGluZ1do
aXRlc3BhY2UodG9SZW5kZXJUZXh0KG1fY3VycmVudC5tX29iaikpOwotICAgICAgICBlbHNlIGlm
ICghbV9jdXJyZW50U3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpIHx8ICFtX2N1cnJlbnRDaGFy
YWN0ZXJJc1NwYWNlKQotICAgICAgICAgICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKLQot
ICAgICAgICBtX2F0U3RhcnQgPSBmYWxzZTsKLSAgICAgICAgbmV4dENoYXJhY3RlcihjLCBsYXN0
Q2hhcmFjdGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpOwotICAgIH0KLQotICAgIG1fcmVuZGVy
VGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5zZXRQcmlvckNvbnRleHQobGFzdENoYXJhY3Rl
ciwgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyKTsKLQotICAgIHdvcmRNZWFzdXJlbWVudHMuZ3Jvdyh3
b3JkTWVhc3VyZW1lbnRzLnNpemUoKSArIDEpOwotICAgIFdvcmRNZWFzdXJlbWVudCYgd29yZE1l
YXN1cmVtZW50ID0gd29yZE1lYXN1cmVtZW50cy5sYXN0KCk7Ci0gICAgd29yZE1lYXN1cmVtZW50
LnJlbmRlcmVyID0gcmVuZGVyVGV4dDsKLQotICAgIC8vIElNUE9SVEFOVDogY3VycmVudC5tX3Bv
cyBpcyA+IGxlbmd0aCBoZXJlIQotICAgIGZsb2F0IGFkZGl0aW9uYWxUZW1wV2lkdGggPSBtX2ln
bm9yaW5nU3BhY2VzID8gMCA6IHRleHRXaWR0aChyZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3Vy
cmVudC5tX3BvcyAtIGxhc3RTcGFjZSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNG
aXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNr
Rm9udHMsIHRleHRMYXlvdXQpOwotICAgIHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCA9IGxh
c3RTcGFjZTsKLSAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9jdXJyZW50Lm1fcG9z
OwotICAgIHdvcmRNZWFzdXJlbWVudC53aWR0aCA9IG1faWdub3JpbmdTcGFjZXMgPyAwIDogYWRk
aXRpb25hbFRlbXBXaWR0aCArIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50OwotICAgIGFk
ZGl0aW9uYWxUZW1wV2lkdGggKz0gbGFzdFNwYWNlV29yZFNwYWNpbmc7Ci0KLSAgICBmbG9hdCBp
bmxpbmVMb2dpY2FsVGVtcFdpZHRoID0gaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29i
aiwgIW1fYXBwbGllZFN0YXJ0V2lkdGgsIG1faW5jbHVkZUVuZFdpZHRoKTsKLSAgICBtX3dpZHRo
LmFkZFVuY29tbWl0dGVkV2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0aCArIGlubGluZUxvZ2ljYWxU
ZW1wV2lkdGgpOwotCi0gICAgaWYgKHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLmlzRW1w
dHkoKSAmJiAhZmFsbGJhY2tGb250cy5pc0VtcHR5KCkpCi0gICAgICAgIHdvcmRNZWFzdXJlbWVu
dC5mYWxsYmFja0ZvbnRzLnN3YXAoZmFsbGJhY2tGb250cyk7Ci0gICAgZmFsbGJhY2tGb250cy5j
bGVhcigpOwotCi0gICAgaWYgKG1fY29sbGFwc2VXaGl0ZVNwYWNlICYmIG1fY3VycmVudENoYXJh
Y3RlcklzU3BhY2UgJiYgYWRkaXRpb25hbFRlbXBXaWR0aCkKLSAgICAgICAgbV93aWR0aC5zZXRU
cmFpbGluZ1doaXRlc3BhY2VXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoLCBpbmxpbmVMb2dpY2Fs
VGVtcFdpZHRoKTsKLQotICAgIG1faW5jbHVkZUVuZFdpZHRoID0gZmFsc2U7Ci0KLSAgICBpZiAo
IW1fd2lkdGguZml0c09uTGluZSgpKSB7Ci0gICAgICAgIGlmIChjYW5IeXBoZW5hdGUpCi0gICAg
ICAgICAgICB0cnlIeXBoZW5hdGluZyhyZW5kZXJUZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwg
Y29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0
TGluZXMoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlv
bkxpbWl0QWZ0ZXIoKSwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MsIG1fd2lkdGguY3VycmVu
dFdpZHRoKCkgLSBhZGRpdGlvbmFsVGVtcFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCks
IGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFjaW5n
LCBtX2xpbmVCcmVhaywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBtX2xpbmVC
cmVha2VyLm1faHlwaGVuYXRlZCk7Ci0KLSAgICAgICAgaWYgKCFoeXBoZW5hdGVkICYmIG1fbGlu
ZUJyZWFrLnByZXZpb3VzSW5TYW1lTm9kZSgpID09IHNvZnRIeXBoZW4gJiYgc3R5bGUuaHlwaGVu
cygpICE9IEh5cGhlbnNOb25lKSB7Ci0gICAgICAgICAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKLSAg
ICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotc3RhdGljIGJvb2wgdGV4dEJlZ2luc1dpdGhCcmVha2FibGVQb3NpdGlvbihS
ZW5kZXJPYmplY3QqIG5leHQpCi17Ci0gICAgQVNTRVJUKG5leHQtPmlzVGV4dCgpKTsKLSAgICBS
ZW5kZXJUZXh0KiBuZXh0VGV4dCA9IHRvUmVuZGVyVGV4dChuZXh0KTsKLSAgICBpZiAoIW5leHRU
ZXh0LT50ZXh0TGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBVQ2hhciBjID0g
bmV4dFRleHQtPmNoYXJhY3RlckF0KDApOwotICAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdc
dCcgfHwgKGMgPT0gJ1xuJyAmJiAhbmV4dFRleHQtPnByZXNlcnZlc05ld2xpbmUoKSk7Ci19Ci0K
LWlubGluZSBib29sIEJyZWFraW5nQ29udGV4dDo6Y2FuQnJlYWtBdFRoaXNQb3NpdGlvbigpCi17
Ci0gICAgLy8gSWYgd2UgYXJlIG5vLXdyYXAgYW5kIGhhdmUgZm91bmQgYSBsaW5lLWJyZWFraW5n
IG9wcG9ydHVuaXR5IGFscmVhZHkgdGhlbiB3ZSBzaG91bGQgdGFrZSBpdC4KLSAgICBpZiAobV93
aWR0aC5jb21taXR0ZWRXaWR0aCgpICYmICFtX3dpZHRoLmZpdHNPbkxpbmUobV9jdXJyZW50Q2hh
cmFjdGVySXNTcGFjZSkgJiYgbV9jdXJyV1MgPT0gTk9XUkFQKQotICAgICAgICByZXR1cm4gdHJ1
ZTsKLQotICAgIC8vIEF2b2lkIGJyZWFraW5nIGJlZm9yZSBlbXB0eSBpbmxpbmVzLgotICAgIGlm
IChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5pc1JlbmRlcklubGluZSgpICYmIGlzRW1w
dHlJbmxpbmUodG9SZW5kZXJJbmxpbmUoKm1fbmV4dE9iamVjdCkpKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICAvLyBSZXR1cm4gZWFybHkgaWYgd2UgYXV0b3dyYXAgYW5kIHRoZSBjdXJy
ZW50IGNoYXJhY3RlciBpcyBhIHNwYWNlIGFzIHdlIHdpbGwgYWx3YXlzIHdhbnQgdG8gYnJlYWsg
YXQgc3VjaCBhIHBvc2l0aW9uLgotICAgIGlmIChtX2F1dG9XcmFwICYmIG1fY3VycmVudENoYXJh
Y3RlcklzU3BhY2UpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKG1fbmV4dE9iamVj
dCAmJiBtX25leHRPYmplY3QtPmlzTGluZUJyZWFrT3Bwb3J0dW5pdHkoKSkKLSAgICAgICAgcmV0
dXJuIG1fYXV0b1dyYXA7Ci0KLSAgICBib29sIG5leHRJc0F1dG9XcmFwcGluZ1RleHQgPSAobV9u
ZXh0T2JqZWN0ICYmIG1fbmV4dE9iamVjdC0+aXNUZXh0KCkgJiYgKG1fYXV0b1dyYXAgfHwgbV9u
ZXh0T2JqZWN0LT5zdHlsZSgpLmF1dG9XcmFwKCkpKTsKLSAgICBpZiAoIW5leHRJc0F1dG9XcmFw
cGluZ1RleHQpCi0gICAgICAgIHJldHVybiBtX2F1dG9XcmFwOwotICAgIGJvb2wgY3VycmVudElz
VGV4dE9yRW1wdHlJbmxpbmUgPSBtX2N1cnJlbnQubV9vYmotPmlzVGV4dCgpIHx8IChtX2N1cnJl
bnQubV9vYmotPmlzUmVuZGVySW5saW5lKCkgJiYgaXNFbXB0eUlubGluZSh0b1JlbmRlcklubGlu
ZSgqbV9jdXJyZW50Lm1fb2JqKSkpOwotICAgIGlmICghY3VycmVudElzVGV4dE9yRW1wdHlJbmxp
bmUpCi0gICAgICAgIHJldHVybiBtX2F1dG9XcmFwOwotCi0gICAgYm9vbCBjYW5CcmVha0hlcmUg
PSAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiB0ZXh0QmVnaW5zV2l0aEJyZWFrYWJsZVBv
c2l0aW9uKG1fbmV4dE9iamVjdCk7Ci0KLSAgICAvLyBTZWUgaWYgYXR0ZW1wdGluZyB0byBmaXQg
YmVsb3cgZmxvYXRzIGNyZWF0ZXMgbW9yZSBhdmFpbGFibGUgd2lkdGggb24gdGhlIGxpbmUuCi0g
ICAgaWYgKCFtX3dpZHRoLmZpdHNPbkxpbmUoKSAmJiAhbV93aWR0aC5jb21taXR0ZWRXaWR0aCgp
KQotICAgICAgICBtX3dpZHRoLmZpdEJlbG93RmxvYXRzKCk7Ci0KLSAgICBib29sIGNhblBsYWNl
T25MaW5lID0gbV93aWR0aC5maXRzT25MaW5lKCkgfHwgIW1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9u
TGluZTsKLQotICAgIGlmIChjYW5QbGFjZU9uTGluZSAmJiBjYW5CcmVha0hlcmUpCi0gICAgICAg
IGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRoKG1fbmV4dE9iamVjdCk7Ci0KLSAgICByZXR1
cm4gY2FuQnJlYWtIZXJlOwotfQotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmNvbW1p
dEFuZFVwZGF0ZUxpbmVCcmVha0lmTmVlZGVkKCkKLXsKLSAgICBib29sIGNoZWNrRm9yQnJlYWsg
PSBjYW5CcmVha0F0VGhpc1Bvc2l0aW9uKCk7Ci0KLSAgICBpZiAoY2hlY2tGb3JCcmVhayAmJiAh
bV93aWR0aC5maXRzT25MaW5lKG1faWdub3JpbmdTcGFjZXMpKSB7Ci0gICAgICAgIC8vIGlmIHdl
IGhhdmUgZmxvYXRzLCB0cnkgdG8gZ2V0IGJlbG93IHRoZW0uCi0gICAgICAgIGlmIChtX2N1cnJl
bnRDaGFyYWN0ZXJJc1NwYWNlICYmICFtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxl
LT5jb2xsYXBzZVdoaXRlU3BhY2UoKSkKLSAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmNs
ZWFyKCk7Ci0KLSAgICAgICAgaWYgKG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSkgewotICAgICAg
ICAgICAgbV9hdEVuZCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQot
ICAgICAgICBtX3dpZHRoLmZpdEJlbG93RmxvYXRzKCk7Ci0KLSAgICAgICAgLy8gfHdpZHRofCBt
YXkgaGF2ZSBiZWVuIGFkanVzdGVkIGJlY2F1c2Ugd2UgZ290IHNob3ZlZCBkb3duIHBhc3QgYSBm
bG9hdCAodGh1cwotICAgICAgICAvLyBnaXZpbmcgdXMgbW9yZSByb29tKSwgc28gd2UgbmVlZCB0
byByZXRlc3QsIGFuZCBvbmx5IGp1bXAgdG8KLSAgICAgICAgLy8gdGhlIGVuZCBsYWJlbCBpZiB3
ZSBzdGlsbCBkb24ndCBmaXQgb24gdGhlIGxpbmUuIC1kd2gKLSAgICAgICAgaWYgKCFtX3dpZHRo
LmZpdHNPbkxpbmUobV9pZ25vcmluZ1NwYWNlcykpIHsKLSAgICAgICAgICAgIG1fYXRFbmQgPSB0
cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtX2Js
b2NrU3R5bGUuYXV0b1dyYXAoKSAmJiAhbV93aWR0aC5maXRzT25MaW5lKCkgJiYgIW1fd2lkdGgu
Y29tbWl0dGVkV2lkdGgoKSkgewotICAgICAgICAvLyBJZiB0aGUgY29udGFpbmVyIGF1dG93cmFw
cyBidXQgdGhlIGN1cnJlbnQgY2hpbGQgZG9lcyBub3QgdGhlbiB3ZSBzdGlsbCBuZWVkIHRvIGVu
c3VyZSB0aGF0IGl0Ci0gICAgICAgIC8vIHdyYXBzIGFuZCBtb3ZlcyBiZWxvdyBhbnkgZmxvYXRz
LgotICAgICAgICBtX3dpZHRoLmZpdEJlbG93RmxvYXRzKCk7Ci0gICAgfQotCi0gICAgaWYgKCFt
X2N1cnJlbnQubV9vYmotPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkgewotICAg
ICAgICBtX2xhc3RPYmplY3QgPSBtX2N1cnJlbnQubV9vYmo7Ci0gICAgICAgIGlmIChtX2xhc3RP
YmplY3QtPmlzUmVwbGFjZWQoKSAmJiBtX2F1dG9XcmFwICYmICghbV9sYXN0T2JqZWN0LT5pc0lt
YWdlKCkgfHwgbV9hbGxvd0ltYWdlc1RvQnJlYWspICYmICghbV9sYXN0T2JqZWN0LT5pc0xpc3RN
YXJrZXIoKSB8fCB0b1JlbmRlckxpc3RNYXJrZXIoKm1fbGFzdE9iamVjdCkuaXNJbnNpZGUoKSkp
IHsKLSAgICAgICAgICAgIG1fd2lkdGguY29tbWl0KCk7Ci0gICAgICAgICAgICBtX2xpbmVCcmVh
ay5tb3ZlVG9TdGFydE9mKG1fbmV4dE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLUlu
bGluZUl0ZXJhdG9yIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRW5kT2ZMaW5lKCkKLXsKLSNpZiBF
TkFCTEUoQ1NTX1NIQVBFUykKLSAgICBTaGFwZUluc2lkZUluZm8qIHNoYXBlSW5mbyA9IG1fYmxv
Y2subGF5b3V0U2hhcGVJbnNpZGVJbmZvKCk7Ci0gICAgYm9vbCBzZWdtZW50QWxsb3dzT3ZlcmZs
b3cgPSAhc2hhcGVJbmZvIHx8ICFzaGFwZUluZm8tPmhhc1NlZ21lbnRzKCk7Ci0jZWxzZQotICAg
IGJvb2wgc2VnbWVudEFsbG93c092ZXJmbG93ID0gdHJ1ZTsKLSNlbmRpZgotICAgIGlmIChzZWdt
ZW50QWxsb3dzT3ZlcmZsb3cpIHsKLSAgICAgICAgaWYgKG1fbGluZUJyZWFrID09IG1fcmVzb2x2
ZXIucG9zaXRpb24oKSkgewotICAgICAgICAgICAgaWYgKCFtX2xpbmVCcmVhay5tX29iaiB8fCAh
bV9saW5lQnJlYWsubV9vYmotPmlzQlIoKSkgewotICAgICAgICAgICAgICAgIC8vIHdlIGp1c3Qg
YWRkIGFzIG11Y2ggYXMgcG9zc2libGUKLSAgICAgICAgICAgICAgICBpZiAobV9ibG9ja1N0eWxl
LndoaXRlU3BhY2UoKSA9PSBQUkUgJiYgIW1fY3VycmVudC5tX3BvcykgewotICAgICAgICAgICAg
ICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8obV9sYXN0T2JqZWN0LCBtX2xhc3RPYmplY3QtPmlz
VGV4dCgpID8gbV9sYXN0T2JqZWN0LT5sZW5ndGgoKSA6IDApOwotICAgICAgICAgICAgICAgIH0g
ZWxzZSBpZiAobV9saW5lQnJlYWsubV9vYmopIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG9u
J3QgZXZlciBicmVhayBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBpZiB3ZSBjYW4gaGVscCBpdC4K
LSAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyByb29tIGF0IGFsbC4gV2UganVzdCBo
YXZlIHRvIGJlIG9uIHRoaXMgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiB0aG91
Z2ggd2UnbGwgc3BpbGwgb3V0LgotICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3Zl
VG8obV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MpOwotICAgICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBjb25zdW1lIGF0IGxl
YXN0IG9uZSBjaGFyL29iamVjdC4KLSAgICAgICAgICAgIGlmIChtX2xpbmVCcmVhayA9PSBtX3Jl
c29sdmVyLnBvc2l0aW9uKCkpCi0gICAgICAgICAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50
KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW1fY3VycmVudC5tX3BvcyAmJiAhbV93aWR0aC5jb21t
aXR0ZWRXaWR0aCgpICYmIG1fd2lkdGgudW5jb21taXR0ZWRXaWR0aCgpICYmICFtX2hhZFVuY29t
bWl0dGVkV2lkdGhCZWZvcmVDdXJyZW50KSB7Ci0gICAgICAgICAgICAvLyBEbyBub3QgcHVzaCB0
aGUgY3VycmVudCBvYmplY3QgdG8gdGhlIG5leHQgbGluZSwgd2hlbiB0aGlzIGxpbmUgaGFzIHNv
bWUgY29udGVudCwgYnV0IGl0IGlzIHN0aWxsIGNvbnNpZGVyZWQgZW1wdHkuCi0gICAgICAgICAg
ICAvLyBFbXB0eSBpbmxpbmUgZWxlbWVudHMgbGlrZSA8c3Bhbj48L3NwYW4+IGNhbiBwcm9kdWNl
IHN1Y2ggbGluZXMgYW5kIG5vdyB3ZSBqdXN0IGlnbm9yZSB0aGVzZSBicmVhayBvcHBvcnR1bml0
aWVzCi0gICAgICAgICAgICAvLyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLCBpZiBubyB3aWR0aCBo
YXMgYmVlbiBjb21taXR0ZWQgeWV0LgotICAgICAgICAgICAgLy8gQmVoYXZlIGFzIGlmIGl0IHdh
cyBhY3R1YWxseSBlbXB0eSBhbmQgY29uc3VtZSBhdCBsZWFzdCBvbmUgb2JqZWN0LgotICAgICAg
ICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAv
LyBTYW5pdHkgY2hlY2sgb3VyIG1pZHBvaW50cy4KLSAgICBjaGVja01pZHBvaW50cyhtX2xpbmVN
aWRwb2ludFN0YXRlLCBtX2xpbmVCcmVhayk7Ci0KLSAgICBtX3RyYWlsaW5nT2JqZWN0cy51cGRh
dGVNaWRwb2ludHNGb3JUcmFpbGluZ0JveGVzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fbGluZUJy
ZWFrLCBUcmFpbGluZ09iamVjdHM6OkNvbGxhcHNlRmlyc3RTcGFjZSk7Ci0KLSAgICAvLyBXZSBt
aWdodCBoYXZlIG1hZGUgbGluZUJyZWFrIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHBhc3QgdGhl
IGVuZAotICAgIC8vIG9mIHRoZSBvYmplY3QuIERvIHRoaXMgYWRqdXN0bWVudCB0byBtYWtlIGl0
IHBvaW50IHRvIHRoZSBzdGFydAotICAgIC8vIG9mIHRoZSBuZXh0IG9iamVjdCBpbnN0ZWFkIHRv
IGF2b2lkIGNvbmZ1c2luZyB0aGUgcmVzdCBvZiB0aGUKLSAgICAvLyBjb2RlLgotICAgIGlmICht
X2xpbmVCcmVhay5tX3BvcyA+IDApIHsKLSAgICAgICAgbV9saW5lQnJlYWsubV9wb3MtLTsKLSAg
ICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1fbGlu
ZUJyZWFrOwotfQotCiBJbmxpbmVJdGVyYXRvciBMaW5lQnJlYWtlcjo6bmV4dFNlZ21lbnRCcmVh
ayhJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBMaW5lSW5mbyYgbGluZUluZm8sIFJlbmRl
clRleHRJbmZvJiByZW5kZXJUZXh0SW5mbywgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21Q
cmV2aW91c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBXb3JkTWVh
c3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewogICAgIHJlc2V0KCk7CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHRJbmxpbmVIZWFk
ZXJzLmggYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHRJbmxp
bmVIZWFkZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjNTNhYgot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0JyZWFraW5n
Q29udGV4dElubGluZUhlYWRlcnMuaApAQCAtMCwwICsxLDEyNDggQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMDAgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykg
MjAwMywgMjAwNCwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMu
IEFsbCByaWdodCByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEzIENoYW5nU2VvayBPaCA8
c2hpdmFtaWRvd0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQWRvYmUgU3lzdGVt
cyBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgQnJlYWtpbmdDb250ZXh0SW5s
aW5lSGVhZGVyc19oCisjZGVmaW5lIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnNfaAorCisj
aW5jbHVkZSAiSHlwaGVuYXRpb24uaCIKKyNpbmNsdWRlICJMaW5lQnJlYWtlci5oIgorI2luY2x1
ZGUgIkxpbmVJbmZvLmgiCisjaW5jbHVkZSAiTGluZVdpZHRoLmgiCisjaW5jbHVkZSAiUmVuZGVy
Q29tYmluZVRleHQuaCIKKyNpbmNsdWRlICJSZW5kZXJDb3VudGVyLmgiCisjaW5jbHVkZSAiUmVu
ZGVySW5saW5lLmgiCisjaW5jbHVkZSAiUmVuZGVyTGlzdE1hcmtlci5oIgorI2luY2x1ZGUgIlJl
bmRlclJ1YnlSdW4uaCIKKyNpbmNsdWRlICJicmVha19saW5lcy5oIgorI2luY2x1ZGUgPHd0Zi91
bmljb2RlL0NoYXJhY3Rlck5hbWVzLmg+CisKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1ZGUgIlJl
bmRlclNWR0lubGluZVRleHQuaCIKKyNlbmRpZgorCisjaWYgRU5BQkxFKENTU19TSEFQRVMpCisj
aW5jbHVkZSAiU2hhcGVJbnNpZGVJbmZvLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCisvLyBXZSBkb24ndCBsZXQgb3VyIGxpbmUgYm94IHRyZWUgZm9yIGEgc2luZ2xlIGxpbmUg
Z2V0IGFueSBkZWVwZXIgdGhhbiB0aGlzLgorY29uc3QgdW5zaWduZWQgY01heExpbmVEZXB0aCA9
IDIwMDsKKworY2xhc3MgV29yZE1lYXN1cmVtZW50IHsKK3B1YmxpYzoKKyAgICBXb3JkTWVhc3Vy
ZW1lbnQoKQorICAgICAgICA6IHJlbmRlcmVyKDApCisgICAgICAgICwgd2lkdGgoMCkKKyAgICAg
ICAgLCBzdGFydE9mZnNldCgwKQorICAgICAgICAsIGVuZE9mZnNldCgwKQorICAgIHsKKyAgICB9
CisKKyAgICBSZW5kZXJUZXh0KiByZW5kZXJlcjsKKyAgICBmbG9hdCB3aWR0aDsKKyAgICBpbnQg
c3RhcnRPZmZzZXQ7CisgICAgaW50IGVuZE9mZnNldDsKKyAgICBIYXNoU2V0PGNvbnN0IFNpbXBs
ZUZvbnREYXRhKj4gZmFsbGJhY2tGb250czsKK307CisKK2NsYXNzIFRyYWlsaW5nT2JqZWN0cyB7
CitwdWJsaWM6CisgICAgVHJhaWxpbmdPYmplY3RzKCk7CisgICAgdm9pZCBzZXRUcmFpbGluZ1do
aXRlc3BhY2UoUmVuZGVyVGV4dCopOworICAgIHZvaWQgY2xlYXIoKTsKKyAgICB2b2lkIGFwcGVu
ZEJveElmTmVlZGVkKFJlbmRlckJveE1vZGVsT2JqZWN0Kik7CisKKyAgICBlbnVtIENvbGxhcHNl
Rmlyc3RTcGFjZU9yTm90IHsgRG9Ob3RDb2xsYXBzZUZpcnN0U3BhY2UsIENvbGxhcHNlRmlyc3RT
cGFjZSB9OworCisgICAgdm9pZCB1cGRhdGVNaWRwb2ludHNGb3JUcmFpbGluZ0JveGVzKExpbmVN
aWRwb2ludFN0YXRlJiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGxCcmVhaywgQ29sbGFwc2VGaXJz
dFNwYWNlT3JOb3QpOworCitwcml2YXRlOgorICAgIFJlbmRlclRleHQqIG1fd2hpdGVzcGFjZTsK
KyAgICBWZWN0b3I8UmVuZGVyQm94TW9kZWxPYmplY3QqLCA0PiBtX2JveGVzOworfTsKKworVHJh
aWxpbmdPYmplY3RzOjpUcmFpbGluZ09iamVjdHMoKQorICAgIDogbV93aGl0ZXNwYWNlKDApCit7
Cit9CisKK2lubGluZSB2b2lkIFRyYWlsaW5nT2JqZWN0czo6c2V0VHJhaWxpbmdXaGl0ZXNwYWNl
KFJlbmRlclRleHQqIHdoaXRlc3BhY2UpCit7CisgICAgQVNTRVJUKHdoaXRlc3BhY2UpOworICAg
IG1fd2hpdGVzcGFjZSA9IHdoaXRlc3BhY2U7Cit9CisKK2lubGluZSB2b2lkIFRyYWlsaW5nT2Jq
ZWN0czo6Y2xlYXIoKQoreworICAgIG1fd2hpdGVzcGFjZSA9IDA7CisgICAgbV9ib3hlcy5zaHJp
bmsoMCk7IC8vIFVzZSBzaHJpbmsoMCkgaW5zdGVhZCBvZiBjbGVhcigpIHRvIHJldGFpbiBvdXIg
Y2FwYWNpdHkuCit9CisKK2lubGluZSB2b2lkIFRyYWlsaW5nT2JqZWN0czo6YXBwZW5kQm94SWZO
ZWVkZWQoUmVuZGVyQm94TW9kZWxPYmplY3QqIGJveCkKK3sKKyAgICBpZiAobV93aGl0ZXNwYWNl
KQorICAgICAgICBtX2JveGVzLmFwcGVuZChib3gpOworfQorCisvLyBEb24ndCBjYWxsIHRoaXMg
ZGlyZWN0bHkuIFVzZSBvbmUgb2YgdGhlIGRlc2NyaXB0aXZlIGhlbHBlciBmdW5jdGlvbnMgYmVs
b3cuCitpbmxpbmUgdm9pZCBkZXByZWNhdGVkQWRkTWlkcG9pbnQoTGluZU1pZHBvaW50U3RhdGUm
IGxpbmVNaWRwb2ludFN0YXRlLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbWlkcG9pbnQpCit7Cisg
ICAgaWYgKGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50cy5zaXplKCkgPD0gbGluZU1pZHBvaW50
U3RhdGUubnVtTWlkcG9pbnRzKQorICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHMu
Z3JvdyhsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgKyAxMCk7CisKKyAgICBJbmxpbmVJ
dGVyYXRvciogbWlkcG9pbnRzID0gbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmRhdGEoKTsK
KyAgICBtaWRwb2ludHNbbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKytdID0gbWlkcG9p
bnQ7Cit9CisKK2lubGluZSB2b2lkIHN0YXJ0SWdub3JpbmdTcGFjZXMoTGluZU1pZHBvaW50U3Rh
dGUmIGxpbmVNaWRwb2ludFN0YXRlLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbWlkcG9pbnQpCit7
CisgICAgQVNTRVJUKCEobGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzICUgMikpOworICAg
IGRlcHJlY2F0ZWRBZGRNaWRwb2ludChsaW5lTWlkcG9pbnRTdGF0ZSwgbWlkcG9pbnQpOworfQor
CitpbmxpbmUgdm9pZCBzdG9wSWdub3JpbmdTcGFjZXMoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVN
aWRwb2ludFN0YXRlLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbWlkcG9pbnQpCit7CisgICAgQVNT
RVJUKGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAlIDIpOworICAgIGRlcHJlY2F0ZWRB
ZGRNaWRwb2ludChsaW5lTWlkcG9pbnRTdGF0ZSwgbWlkcG9pbnQpOworfQorCisvLyBXaGVuIGln
bm9yaW5nIHNwYWNlcywgdGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgZm9yIG9iamVjdHMgdGhhdCBu
ZWVkIGxpbmUgYm94ZXMgc3VjaCBhcyBSZW5kZXJJbmxpbmVzIG9yCisvLyBoYXJkIGxpbmUgYnJl
YWtzIHRvIGVuc3VyZSB0aGF0IHRoZXkncmUgbm90IGlnbm9yZWQuCitpbmxpbmUgdm9pZCBlbnN1
cmVMaW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBv
aW50U3RhdGUsIFJlbmRlck9iamVjdCogcmVuZGVyZXIpCit7CisgICAgSW5saW5lSXRlcmF0b3Ig
bWlkcG9pbnQoMCwgcmVuZGVyZXIsIDApOworICAgIHN0b3BJZ25vcmluZ1NwYWNlcyhsaW5lTWlk
cG9pbnRTdGF0ZSwgbWlkcG9pbnQpOworICAgIHN0YXJ0SWdub3JpbmdTcGFjZXMobGluZU1pZHBv
aW50U3RhdGUsIG1pZHBvaW50KTsKK30KKwordm9pZCBUcmFpbGluZ09iamVjdHM6OnVwZGF0ZU1p
ZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0
YXRlLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbEJyZWFrLCBDb2xsYXBzZUZpcnN0U3BhY2VPck5v
dCBjb2xsYXBzZUZpcnN0U3BhY2UpCit7CisgICAgaWYgKCFtX3doaXRlc3BhY2UpCisgICAgICAg
IHJldHVybjsKKworICAgIC8vIFRoaXMgb2JqZWN0IGlzIGVpdGhlciBnb2luZyB0byBiZSBwYXJ0
IG9mIHRoZSBsYXN0IG1pZHBvaW50LCBvciBpdCBpcyBnb2luZyB0byBiZSB0aGUgYWN0dWFsIGVu
ZHBvaW50LgorICAgIC8vIEluIGJvdGggY2FzZXMgd2UganVzdCBkZWNyZWFzZSBvdXIgcG9zIGJ5
IDEgbGV2ZWwgdG8gZXhjbHVkZSB0aGUgc3BhY2UsIGFsbG93aW5nIGl0IHRvIC0gaW4gZWZmZWN0
IC0gY29sbGFwc2UgaW50byB0aGUgbmV3bGluZS4KKyAgICBpZiAobGluZU1pZHBvaW50U3RhdGUu
bnVtTWlkcG9pbnRzICUgMikgeworICAgICAgICAvLyBGaW5kIHRoZSB0cmFpbGluZyBzcGFjZSBv
YmplY3QncyBtaWRwb2ludC4KKyAgICAgICAgaW50IHRyYWlsaW5nU3BhY2VNaWRwb2ludCA9IGxp
bmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAtIDE7CisgICAgICAgIGZvciAoIDsgdHJhaWxp
bmdTcGFjZU1pZHBvaW50ID4gMCAmJiBsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHNbdHJhaWxp
bmdTcGFjZU1pZHBvaW50XS5tX29iaiAhPSBtX3doaXRlc3BhY2U7IC0tdHJhaWxpbmdTcGFjZU1p
ZHBvaW50KSB7IH0KKyAgICAgICAgQVNTRVJUKHRyYWlsaW5nU3BhY2VNaWRwb2ludCA+PSAwKTsK
KyAgICAgICAgaWYgKGNvbGxhcHNlRmlyc3RTcGFjZSA9PSBDb2xsYXBzZUZpcnN0U3BhY2UpCisg
ICAgICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHNbdHJhaWxpbmdTcGFjZU1pZHBv
aW50XS5tX3Bvcy0tOworCisgICAgICAgIC8vIE5vdyBtYWtlIHN1cmUgZXZlcnkgc2luZ2xlIHRy
YWlsaW5nUG9zaXRpb25lZEJveCBmb2xsb3dpbmcgdGhlIHRyYWlsaW5nU3BhY2VNaWRwb2ludCBw
cm9wZXJseSBzdG9wcyBhbmQgc3RhcnRzCisgICAgICAgIC8vIGlnbm9yaW5nIHNwYWNlcy4KKyAg
ICAgICAgc2l6ZV90IGN1cnJlbnRNaWRwb2ludCA9IHRyYWlsaW5nU3BhY2VNaWRwb2ludCArIDE7
CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9ib3hlcy5zaXplKCk7ICsraSkgewor
ICAgICAgICAgICAgaWYgKGN1cnJlbnRNaWRwb2ludCA+PSBsaW5lTWlkcG9pbnRTdGF0ZS5udW1N
aWRwb2ludHMpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCBoYXZlIGEgbWlkcG9pbnQg
Zm9yIHRoaXMgYm94IHlldC4KKyAgICAgICAgICAgICAgICBlbnN1cmVMaW5lQm94SW5zaWRlSWdu
b3JlZFNwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwgbV9ib3hlc1tpXSk7CisgICAgICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgICAgIEFTU0VSVChsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2lu
dHNbY3VycmVudE1pZHBvaW50XS5tX29iaiA9PSBtX2JveGVzW2ldKTsKKyAgICAgICAgICAgICAg
ICBBU1NFUlQobGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzW2N1cnJlbnRNaWRwb2ludCArIDFd
Lm1fb2JqID09IG1fYm94ZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVu
dE1pZHBvaW50ICs9IDI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFsQnJlYWsubV9vYmop
IHsKKyAgICAgICAgQVNTRVJUKG1fd2hpdGVzcGFjZS0+aXNUZXh0KCkpOworICAgICAgICBBU1NF
UlQoY29sbGFwc2VGaXJzdFNwYWNlID09IENvbGxhcHNlRmlyc3RTcGFjZSk7CisgICAgICAgIC8v
IEFkZCBhIG5ldyBlbmQgbWlkcG9pbnQgdGhhdCBzdG9wcyByaWdodCBhdCB0aGUgdmVyeSBlbmQu
CisgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IG1fd2hpdGVzcGFjZS0+dGV4dExlbmd0aCgpOwor
ICAgICAgICB1bnNpZ25lZCBwb3MgPSBsZW5ndGggPj0gMiA/IGxlbmd0aCAtIDIgOiBVSU5UX01B
WDsKKyAgICAgICAgSW5saW5lSXRlcmF0b3IgZW5kTWlkKDAsIG1fd2hpdGVzcGFjZSwgcG9zKTsK
KyAgICAgICAgc3RhcnRJZ25vcmluZ1NwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwgZW5kTWlkKTsK
KyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2JveGVzLnNpemUoKTsgKytpKQorICAg
ICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobGluZU1pZHBvaW50U3Rh
dGUsIG1fYm94ZXNbaV0pOworICAgIH0KK30KKworY2xhc3MgQnJlYWtpbmdDb250ZXh0IHsKK3B1
YmxpYzoKKyAgICBCcmVha2luZ0NvbnRleHQoTGluZUJyZWFrZXImIGxpbmVCcmVha2VyLCBJbmxp
bmVCaWRpUmVzb2x2ZXImIHJlc29sdmVyLCBMaW5lSW5mbyYgaW5MaW5lSW5mbywgTGluZVdpZHRo
JiBsaW5lV2lkdGgsIFJlbmRlclRleHRJbmZvJiBpblJlbmRlclRleHRJbmZvLCBGbG9hdGluZ09i
amVjdCogaW5MYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBib29sIGFwcGxpZWRTdGFydFdpZHRo
LCBSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrKQorICAgICAgICA6IG1fbGluZUJyZWFrZXIobGluZUJy
ZWFrZXIpCisgICAgICAgICwgbV9yZXNvbHZlcihyZXNvbHZlcikKKyAgICAgICAgLCBtX2N1cnJl
bnQocmVzb2x2ZXIucG9zaXRpb24oKSkKKyAgICAgICAgLCBtX2xpbmVCcmVhayhyZXNvbHZlci5w
b3NpdGlvbigpKQorICAgICAgICAsIG1fYmxvY2soYmxvY2spCisgICAgICAgICwgbV9sYXN0T2Jq
ZWN0KG1fY3VycmVudC5tX29iaikKKyAgICAgICAgLCBtX25leHRPYmplY3QoMCkKKyAgICAgICAg
LCBtX2N1cnJlbnRTdHlsZSgwKQorICAgICAgICAsIG1fYmxvY2tTdHlsZShibG9jay5zdHlsZSgp
KQorICAgICAgICAsIG1fbGluZUluZm8oaW5MaW5lSW5mbykKKyAgICAgICAgLCBtX3JlbmRlclRl
eHRJbmZvKGluUmVuZGVyVGV4dEluZm8pCisgICAgICAgICwgbV9sYXN0RmxvYXRGcm9tUHJldmlv
dXNMaW5lKGluTGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSkKKyAgICAgICAgLCBtX3dpZHRoKGxp
bmVXaWR0aCkKKyAgICAgICAgLCBtX2N1cnJXUyhOT1JNQUwpCisgICAgICAgICwgbV9sYXN0V1Mo
Tk9STUFMKQorICAgICAgICAsIG1fcHJlc2VydmVzTmV3bGluZShmYWxzZSkKKyAgICAgICAgLCBt
X2F0U3RhcnQodHJ1ZSkKKyAgICAgICAgLCBtX2lnbm9yaW5nU3BhY2VzKGZhbHNlKQorICAgICAg
ICAsIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UoZmFsc2UpCisgICAgICAgICwgbV9jdXJyZW50
Q2hhcmFjdGVySXNXUyhmYWxzZSkKKyAgICAgICAgLCBtX2FwcGxpZWRTdGFydFdpZHRoKGFwcGxp
ZWRTdGFydFdpZHRoKQorICAgICAgICAsIG1faW5jbHVkZUVuZFdpZHRoKHRydWUpCisgICAgICAg
ICwgbV9hdXRvV3JhcChmYWxzZSkKKyAgICAgICAgLCBtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxp
bmUoZmFsc2UpCisgICAgICAgICwgbV9mbG9hdHNGaXRPbkxpbmUodHJ1ZSkKKyAgICAgICAgLCBt
X2NvbGxhcHNlV2hpdGVTcGFjZShmYWxzZSkKKyAgICAgICAgLCBtX3N0YXJ0aW5nTmV3UGFyYWdy
YXBoKG1fbGluZUluZm8ucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpCisgICAgICAgICwgbV9h
bGxvd0ltYWdlc1RvQnJlYWsoIWJsb2NrLmRvY3VtZW50KCkuaW5RdWlya3NNb2RlKCkgfHwgIWJs
b2NrLmlzVGFibGVDZWxsKCkgfHwgIW1fYmxvY2tTdHlsZS5sb2dpY2FsV2lkdGgoKS5pc0ludHJp
bnNpY09yQXV0bygpKQorICAgICAgICAsIG1fYXRFbmQoZmFsc2UpCisgICAgICAgICwgbV9oYWRV
bmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudChmYWxzZSkKKyAgICAgICAgLCBtX2xpbmVNaWRw
b2ludFN0YXRlKHJlc29sdmVyLm1pZHBvaW50U3RhdGUoKSkKKyAgICB7CisgICAgICAgIG1fbGlu
ZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KGZhbHNlKTsKKyAgICB9CisKKyAgICBS
ZW5kZXJPYmplY3QqIGN1cnJlbnRPYmplY3QoKSB7IHJldHVybiBtX2N1cnJlbnQubV9vYmo7IH0K
KyAgICBJbmxpbmVJdGVyYXRvciBsaW5lQnJlYWsoKSB7IHJldHVybiBtX2xpbmVCcmVhazsgfQor
ICAgIElubGluZUl0ZXJhdG9yJiBsaW5lQnJlYWtSZWYoKSB7cmV0dXJuIG1fbGluZUJyZWFrOyB9
CisgICAgTGluZVdpZHRoJiBsaW5lV2lkdGgoKSB7IHJldHVybiBtX3dpZHRoOyB9CisgICAgYm9v
bCBhdEVuZCgpIHsgcmV0dXJuIG1fYXRFbmQ7IH0KKworICAgIHZvaWQgaW5pdGlhbGl6ZUZvckN1
cnJlbnRPYmplY3QoKTsKKworICAgIHZvaWQgaW5jcmVtZW50KCk7CisKKyAgICB2b2lkIGhhbmRs
ZUJSKEVDbGVhciYpOworICAgIHZvaWQgaGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZChWZWN0b3I8
UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmplY3RzKTsKKyAgICB2b2lkIGhhbmRsZUZsb2F0KCk7
CisgICAgdm9pZCBoYW5kbGVFbXB0eUlubGluZSgpOworICAgIHZvaWQgaGFuZGxlUmVwbGFjZWQo
KTsKKyAgICBib29sIGhhbmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYsIGJvb2wmIGh5cGhlbmF0
ZWQsIHVuc2lnbmVkJiBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7CisgICAgYm9vbCBjYW5C
cmVha0F0VGhpc1Bvc2l0aW9uKCk7CisgICAgdm9pZCBjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJ
Zk5lZWRlZCgpOworICAgIElubGluZUl0ZXJhdG9yIGhhbmRsZUVuZE9mTGluZSgpOworCisgICAg
dm9pZCBjbGVhckxpbmVCcmVha0lmRml0c09uTGluZShib29sIGlnbm9yaW5nVHJhaWxpbmdTcGFj
ZSA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgaWYgKG1fd2lkdGguZml0c09uTGluZShpZ25vcmlu
Z1RyYWlsaW5nU3BhY2UpIHx8IG1fbGFzdFdTID09IE5PV1JBUCkKKyAgICAgICAgICAgIG1fbGlu
ZUJyZWFrLmNsZWFyKCk7CisgICAgfQorCisgICAgdm9pZCBjb21taXRMaW5lQnJlYWtBdEN1cnJl
bnRXaWR0aChSZW5kZXJPYmplY3QqIG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0ID0gMCwgaW50IG5l
eHRCcmVhayA9IC0xKQorICAgIHsKKyAgICAgICAgbV93aWR0aC5jb21taXQoKTsKKyAgICAgICAg
bV9saW5lQnJlYWsubW92ZVRvKG9iamVjdCwgb2Zmc2V0LCBuZXh0QnJlYWspOworICAgIH0KKwor
cHJpdmF0ZToKKyAgICBMaW5lQnJlYWtlciYgbV9saW5lQnJlYWtlcjsKKyAgICBJbmxpbmVCaWRp
UmVzb2x2ZXImIG1fcmVzb2x2ZXI7CisKKyAgICBJbmxpbmVJdGVyYXRvciBtX2N1cnJlbnQ7Cisg
ICAgSW5saW5lSXRlcmF0b3IgbV9saW5lQnJlYWs7CisgICAgSW5saW5lSXRlcmF0b3IgbV9zdGFy
dE9mSWdub3JlZFNwYWNlczsKKworICAgIFJlbmRlckJsb2NrRmxvdyYgbV9ibG9jazsKKyAgICBS
ZW5kZXJPYmplY3QqIG1fbGFzdE9iamVjdDsKKyAgICBSZW5kZXJPYmplY3QqIG1fbmV4dE9iamVj
dDsKKworICAgIFJlbmRlclN0eWxlKiBtX2N1cnJlbnRTdHlsZTsKKworICAgIC8vIEZpcmVmb3gg
YW5kIE9wZXJhIHdpbGwgYWxsb3cgYSB0YWJsZSBjZWxsIHRvIGdyb3cgdG8gZml0IGFuIGltYWdl
IGluc2lkZSBpdCB1bmRlcgorICAgIC8vIHZlcnkgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcyAoaW4g
b3JkZXIgdG8gbWF0Y2ggY29tbW9uIFdpbklFIHJlbmRlcmluZ3MpLgorICAgIC8vIE5vdCBzdXBw
b3J0aW5nIHRoZSBxdWlyayBoYXMgY2F1c2VkIHVzIHRvIG1pcy1yZW5kZXIgc29tZSByZWFsIHNp
dGVzLiAoU2VlIEJ1Z3ppbGxhIDEwNTE3LikKKyAgICBSZW5kZXJTdHlsZSYgbV9ibG9ja1N0eWxl
OworCisgICAgTGluZUluZm8mIG1fbGluZUluZm87CisKKyAgICBSZW5kZXJUZXh0SW5mbyYgbV9y
ZW5kZXJUZXh0SW5mbzsKKworICAgIEZsb2F0aW5nT2JqZWN0KiBtX2xhc3RGbG9hdEZyb21QcmV2
aW91c0xpbmU7CisKKyAgICBMaW5lV2lkdGggbV93aWR0aDsKKworICAgIEVXaGl0ZVNwYWNlIG1f
Y3VycldTOworICAgIEVXaGl0ZVNwYWNlIG1fbGFzdFdTOworCisgICAgYm9vbCBtX3ByZXNlcnZl
c05ld2xpbmU7CisgICAgYm9vbCBtX2F0U3RhcnQ7CisKKyAgICAvLyBUaGlzIHZhcmlhYmxlIGlz
IHVzZWQgb25seSBpZiB3aGl0ZXNwYWNlIGlzbid0IHNldCB0byBQUkUsIGFuZCBpdCB0ZWxscyB1
cyB3aGV0aGVyCisgICAgLy8gb3Igbm90IHdlIGFyZSBjdXJyZW50bHkgaWdub3Jpbmcgd2hpdGVz
cGFjZS4KKyAgICBib29sIG1faWdub3JpbmdTcGFjZXM7CisKKyAgICAvLyBUaGlzIHZhcmlhYmxl
IHRyYWNrcyB3aGV0aGVyIHRoZSB2ZXJ5IGxhc3QgY2hhcmFjdGVyIHdlIHNhdyB3YXMgYSBzcGFj
ZS4gV2UgdXNlCisgICAgLy8gdGhpcyB0byBkZXRlY3Qgd2hlbiB3ZSBlbmNvdW50ZXIgYSBzZWNv
bmQgc3BhY2Ugc28gd2Uga25vdyB3ZSBoYXZlIHRvIHRlcm1pbmF0ZQorICAgIC8vIGEgcnVuLgor
ICAgIGJvb2wgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKKyAgICBib29sIG1fY3VycmVudENo
YXJhY3RlcklzV1M7CisgICAgYm9vbCBtX2FwcGxpZWRTdGFydFdpZHRoOworICAgIGJvb2wgbV9p
bmNsdWRlRW5kV2lkdGg7CisgICAgYm9vbCBtX2F1dG9XcmFwOworICAgIGJvb2wgbV9hdXRvV3Jh
cFdhc0V2ZXJUcnVlT25MaW5lOworICAgIGJvb2wgbV9mbG9hdHNGaXRPbkxpbmU7CisgICAgYm9v
bCBtX2NvbGxhcHNlV2hpdGVTcGFjZTsKKyAgICBib29sIG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGg7
CisgICAgYm9vbCBtX2FsbG93SW1hZ2VzVG9CcmVhazsKKyAgICBib29sIG1fYXRFbmQ7CisgICAg
Ym9vbCBtX2hhZFVuY29tbWl0dGVkV2lkdGhCZWZvcmVDdXJyZW50OworCisgICAgTGluZU1pZHBv
aW50U3RhdGUmIG1fbGluZU1pZHBvaW50U3RhdGU7CisKKyAgICBUcmFpbGluZ09iamVjdHMgbV90
cmFpbGluZ09iamVjdHM7Cit9OworCitpbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmluaXRp
YWxpemVGb3JDdXJyZW50T2JqZWN0KCkKK3sKKyAgICBtX2hhZFVuY29tbWl0dGVkV2lkdGhCZWZv
cmVDdXJyZW50ID0gISFtX3dpZHRoLnVuY29tbWl0dGVkV2lkdGgoKTsKKworICAgIG1fY3VycmVu
dFN0eWxlID0gJm1fY3VycmVudC5tX29iai0+c3R5bGUoKTsKKworICAgIEFTU0VSVChtX2N1cnJl
bnRTdHlsZSk7CisKKyAgICBtX25leHRPYmplY3QgPSBiaWRpTmV4dFNraXBwaW5nRW1wdHlJbmxp
bmVzKG1fYmxvY2ssIG1fY3VycmVudC5tX29iaik7CisgICAgaWYgKG1fbmV4dE9iamVjdCAmJiBt
X25leHRPYmplY3QtPnBhcmVudCgpICYmICFtX25leHRPYmplY3QtPnBhcmVudCgpLT5pc0Rlc2Nl
bmRhbnRPZihtX2N1cnJlbnQubV9vYmotPnBhcmVudCgpKSkKKyAgICAgICAgbV9pbmNsdWRlRW5k
V2lkdGggPSB0cnVlOworCisgICAgbV9jdXJyV1MgPSBtX2N1cnJlbnQubV9vYmotPmlzUmVwbGFj
ZWQoKSA/IG1fY3VycmVudC5tX29iai0+cGFyZW50KCktPnN0eWxlKCkud2hpdGVTcGFjZSgpIDog
bV9jdXJyZW50U3R5bGUtPndoaXRlU3BhY2UoKTsKKyAgICBtX2xhc3RXUyA9IG1fbGFzdE9iamVj
dC0+aXNSZXBsYWNlZCgpID8gbV9sYXN0T2JqZWN0LT5wYXJlbnQoKS0+c3R5bGUoKS53aGl0ZVNw
YWNlKCkgOiBtX2xhc3RPYmplY3QtPnN0eWxlKCkud2hpdGVTcGFjZSgpOworCisgICAgbV9hdXRv
V3JhcCA9IFJlbmRlclN0eWxlOjphdXRvV3JhcChtX2N1cnJXUyk7CisgICAgbV9hdXRvV3JhcFdh
c0V2ZXJUcnVlT25MaW5lID0gbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lIHx8IG1fYXV0b1dy
YXA7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAgIG1fcHJlc2VydmVzTmV3bGluZSA9IG1fY3VycmVu
dC5tX29iai0+aXNTVkdJbmxpbmVUZXh0KCkgPyBmYWxzZSA6IFJlbmRlclN0eWxlOjpwcmVzZXJ2
ZU5ld2xpbmUobV9jdXJyV1MpOworI2Vsc2UKKyAgICBtX3ByZXNlcnZlc05ld2xpbmUgPSBSZW5k
ZXJTdHlsZTo6cHJlc2VydmVOZXdsaW5lKG1fY3VycldTKTsKKyNlbmRpZgorCisgICAgbV9jb2xs
YXBzZVdoaXRlU3BhY2UgPSBSZW5kZXJTdHlsZTo6Y29sbGFwc2VXaGl0ZVNwYWNlKG1fY3VycldT
KTsKK30KKworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjppbmNyZW1lbnQoKQoreworICAg
IC8vIENsZWFyIG91dCBvdXIgY2hhcmFjdGVyIHNwYWNlIGJvb2wsIHNpbmNlIGlubGluZSA8cHJl
PnMgZG9uJ3QgY29sbGFwc2Ugd2hpdGVzcGFjZQorICAgIC8vIHdpdGggYWRqYWNlbnQgaW5saW5l
IG5vcm1hbC9ub3dyYXAgc3BhbnMuCisgICAgaWYgKCFtX2NvbGxhcHNlV2hpdGVTcGFjZSkKKyAg
ICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOworCisgICAgbV9jdXJyZW50
Lm1vdmVUb1N0YXJ0T2YobV9uZXh0T2JqZWN0KTsKKyAgICBtX2F0U3RhcnQgPSBmYWxzZTsKK30K
KworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVCUihFQ2xlYXImIGNsZWFyKQor
eworICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoKSkgeworICAgICAgICBSZW5kZXJPYmplY3Qq
IGJyID0gbV9jdXJyZW50Lm1fb2JqOworICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG9TdGFydE9m
KGJyKTsKKyAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7CisKKyAgICAgICAgLy8gQSA8
YnI+IGFsd2F5cyBicmVha3MgYSBsaW5lLCBzbyBkb24ndCBsZXQgdGhlIGxpbmUgYmUgY29sbGFw
c2VkCisgICAgICAgIC8vIGF3YXkuIEFsc28sIHRoZSBzcGFjZSBhdCB0aGUgZW5kIG9mIGEgbGlu
ZSB3aXRoIGEgPGJyPiBkb2VzIG5vdAorICAgICAgICAvLyBnZXQgY29sbGFwc2VkIGF3YXkuIEl0
IG9ubHkgZG9lcyB0aGlzIGlmIHRoZSBwcmV2aW91cyBsaW5lIGJyb2tlCisgICAgICAgIC8vIGNs
ZWFubHkuIE90aGVyd2lzZSB0aGUgPGJyPiBoYXMgbm8gZWZmZWN0IG9uIHdoZXRoZXIgdGhlIGxp
bmUgaXMKKyAgICAgICAgLy8gZW1wdHkgb3Igbm90LgorICAgICAgICBpZiAobV9zdGFydGluZ05l
d1BhcmFncmFwaCkKKyAgICAgICAgICAgIG1fbGluZUluZm8uc2V0RW1wdHkoZmFsc2UsICZtX2Js
b2NrLCAmbV93aWR0aCk7CisgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7CisgICAg
ICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOworCisgICAg
ICAgIC8vIEEgPGJyPiB3aXRoIGNsZWFyYW5jZSBhbHdheXMgbmVlZHMgYSBsaW5lYm94IGluIGNh
c2UgdGhlIGxpbmVzIGJlbG93IGl0IGdldCBkaXJ0aWVkIGxhdGVyIGFuZAorICAgICAgICAvLyBu
ZWVkIHRvIGNoZWNrIGZvciBmbG9hdHMgdG8gY2xlYXIgLSBzbyBpZiB3ZSdyZSBpZ25vcmluZyBz
cGFjZXMsIHN0b3AgaWdub3JpbmcgdGhlbSBhbmQgYWRkIGEKKyAgICAgICAgLy8gcnVuIGZvciB0
aGlzIG9iamVjdC4KKyAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50U3R5
bGUtPmNsZWFyKCkgIT0gQ05PTkUpCisgICAgICAgICAgICBlbnN1cmVMaW5lQm94SW5zaWRlSWdu
b3JlZFNwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBicik7CisgICAgICAgIC8vIElmIHdlIHdl
cmUgcHJlY2VkZWQgYnkgY29sbGFwc2luZyBzcGFjZSBhbmQgYXJlIGluIGEgcmlnaHQtYWxpZ25l
ZCBjb250YWluZXIgd2UgbmVlZCB0byBlbnN1cmUgdGhlIHNwYWNlIGdldHMKKyAgICAgICAgLy8g
Y29sbGFwc2VkIGF3YXkgc28gdGhhdCBpdCBkb2Vzbid0IHB1c2ggdGhlIHRleHQgb3V0IGZyb20g
dGhlIGNvbnRhaW5lcidzIHJpZ2h0LWhhbmQgZWRnZS4KKyAgICAgICAgLy8gRklYTUU6IERvIHRo
aXMgcmVnYXJkbGVzcyBvZiB0aGUgY29udGFpbmVyJ3MgYWxpZ25tZW50IC0gd2lsbCByZXF1aXJl
IHJlYmFzZWxpbmluZyBhIGxvdCBvZiB0ZXN0IHJlc3VsdHMuCisgICAgICAgIGVsc2UgaWYgKG1f
aWdub3JpbmdTcGFjZXMgJiYgKG1fYmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBSSUdIVCB8fCBt
X2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gV0VCS0lUX1JJR0hUKSkKKyAgICAgICAgICAgIHN0
b3BJZ25vcmluZ1NwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBt
X2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3BvcykpOworCisgICAgICAgIGlmICghbV9saW5l
SW5mby5pc0VtcHR5KCkpCisgICAgICAgICAgICBjbGVhciA9IG1fY3VycmVudFN0eWxlLT5jbGVh
cigpOworICAgIH0KKyAgICBtX2F0RW5kID0gdHJ1ZTsKK30KKworaW5saW5lIExheW91dFVuaXQg
Ym9yZGVyUGFkZGluZ01hcmdpblN0YXJ0KGNvbnN0IFJlbmRlcklubGluZSYgY2hpbGQpCit7Cisg
ICAgcmV0dXJuIGNoaWxkLm1hcmdpblN0YXJ0KCkgKyBjaGlsZC5wYWRkaW5nU3RhcnQoKSArIGNo
aWxkLmJvcmRlclN0YXJ0KCk7Cit9CisKK2lubGluZSBMYXlvdXRVbml0IGJvcmRlclBhZGRpbmdN
YXJnaW5FbmQoY29uc3QgUmVuZGVySW5saW5lJiBjaGlsZCkKK3sKKyAgICByZXR1cm4gY2hpbGQu
bWFyZ2luRW5kKCkgKyBjaGlsZC5wYWRkaW5nRW5kKCkgKyBjaGlsZC5ib3JkZXJFbmQoKTsKK30K
KworaW5saW5lIGJvb2wgc2hvdWxkQWRkQm9yZGVyUGFkZGluZ01hcmdpbihSZW5kZXJPYmplY3Qq
IGNoaWxkKQoreworICAgIC8vIFdoZW4gZGVjaWRpbmcgd2hldGhlciB3ZSdyZSBhdCB0aGUgZWRn
ZSBvZiBhbiBpbmxpbmUsIGFkamFjZW50IGNvbGxhcHNlZCB3aGl0ZXNwYWNlIGlzIHRoZSBzYW1l
IGFzIG5vIHNpYmxpbmcgYXQgYWxsLgorICAgIHJldHVybiAhY2hpbGQgfHwgKGNoaWxkLT5pc1Rl
eHQoKSAmJiAhdG9SZW5kZXJUZXh0KGNoaWxkKS0+dGV4dExlbmd0aCgpKTsKK30KKworaW5saW5l
IFJlbmRlck9iamVjdCogcHJldmlvdXNJbkZsb3dTaWJsaW5nKFJlbmRlck9iamVjdCogY2hpbGQp
Cit7CisgICAgY2hpbGQgPSBjaGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7CisgICAgd2hpbGUgKGNo
aWxkICYmIGNoaWxkLT5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgY2hpbGQgPSBj
aGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7CisgICAgcmV0dXJuIGNoaWxkOworfQorCitpbmxpbmUg
TGF5b3V0VW5pdCBpbmxpbmVMb2dpY2FsV2lkdGgoUmVuZGVyT2JqZWN0KiBjaGlsZCwgYm9vbCBj
aGVja1N0YXJ0RWRnZSA9IHRydWUsIGJvb2wgY2hlY2tFbmRFZGdlID0gdHJ1ZSkKK3sKKyAgICB1
bnNpZ25lZCBsaW5lRGVwdGggPSAxOworICAgIExheW91dFVuaXQgZXh0cmFXaWR0aCA9IDA7Cisg
ICAgUmVuZGVyRWxlbWVudCogcGFyZW50ID0gY2hpbGQtPnBhcmVudCgpOworICAgIHdoaWxlIChw
YXJlbnQtPmlzUmVuZGVySW5saW5lKCkgJiYgbGluZURlcHRoKysgPCBjTWF4TGluZURlcHRoKSB7
CisgICAgICAgIGNvbnN0IFJlbmRlcklubGluZSYgcGFyZW50QXNSZW5kZXJJbmxpbmUgPSB0b1Jl
bmRlcklubGluZSgqcGFyZW50KTsKKyAgICAgICAgaWYgKCFpc0VtcHR5SW5saW5lKHBhcmVudEFz
UmVuZGVySW5saW5lKSkgeworICAgICAgICAgICAgY2hlY2tTdGFydEVkZ2UgPSBjaGVja1N0YXJ0
RWRnZSAmJiBzaG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2luKHByZXZpb3VzSW5GbG93U2libGlu
ZyhjaGlsZCkpOworICAgICAgICAgICAgaWYgKGNoZWNrU3RhcnRFZGdlKQorICAgICAgICAgICAg
ICAgIGV4dHJhV2lkdGggKz0gYm9yZGVyUGFkZGluZ01hcmdpblN0YXJ0KHBhcmVudEFzUmVuZGVy
SW5saW5lKTsKKyAgICAgICAgICAgIGNoZWNrRW5kRWRnZSA9IGNoZWNrRW5kRWRnZSAmJiBzaG91
bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2luKGNoaWxkLT5uZXh0U2libGluZygpKTsKKyAgICAgICAg
ICAgIGlmIChjaGVja0VuZEVkZ2UpCisgICAgICAgICAgICAgICAgZXh0cmFXaWR0aCArPSBib3Jk
ZXJQYWRkaW5nTWFyZ2luRW5kKHBhcmVudEFzUmVuZGVySW5saW5lKTsKKyAgICAgICAgICAgIGlm
ICghY2hlY2tTdGFydEVkZ2UgJiYgIWNoZWNrRW5kRWRnZSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZXh0cmFXaWR0aDsKKyAgICAgICAgfQorICAgICAgICBjaGlsZCA9IHBhcmVudDsKKyAgICAg
ICAgcGFyZW50ID0gY2hpbGQtPnBhcmVudCgpOworICAgIH0KKyAgICByZXR1cm4gZXh0cmFXaWR0
aDsKK30KKworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVPdXRPZkZsb3dQb3Np
dGlvbmVkKFZlY3RvcjxSZW5kZXJCb3gqPiYgcG9zaXRpb25lZE9iamVjdHMpCit7CisgICAgLy8g
SWYgb3VyIG9yaWdpbmFsIGRpc3BsYXkgd2Fzbid0IGFuIGlubGluZSB0eXBlLCB0aGVuIHdlIGNh
bgorICAgIC8vIGdvIGFoZWFkIGFuZCBkZXRlcm1pbmUgb3VyIHN0YXRpYyBpbmxpbmUgcG9zaXRp
b24gbm93LgorICAgIFJlbmRlckJveCogYm94ID0gdG9SZW5kZXJCb3gobV9jdXJyZW50Lm1fb2Jq
KTsKKyAgICBib29sIGlzSW5saW5lVHlwZSA9IGJveC0+c3R5bGUoKS5pc09yaWdpbmFsRGlzcGxh
eUlubGluZVR5cGUoKTsKKyAgICBpZiAoIWlzSW5saW5lVHlwZSkKKyAgICAgICAgbV9ibG9jay5z
ZXRTdGF0aWNJbmxpbmVQb3NpdGlvbkZvckNoaWxkKCpib3gsIG1fYmxvY2subG9naWNhbEhlaWdo
dCgpLCBtX2Jsb2NrLnN0YXJ0T2Zmc2V0Rm9yQ29udGVudChtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQo
KSkpOworICAgIGVsc2UgeworICAgICAgICAvLyBJZiBvdXIgb3JpZ2luYWwgZGlzcGxheSB3YXMg
YW4gSU5MSU5FIHR5cGUsIHRoZW4gd2UgY2FuIGdvIGFoZWFkCisgICAgICAgIC8vIGFuZCBkZXRl
cm1pbmUgb3VyIHN0YXRpYyB5IHBvc2l0aW9uIG5vdy4KKyAgICAgICAgYm94LT5sYXllcigpLT5z
ZXRTdGF0aWNCbG9ja1Bvc2l0aW9uKG1fYmxvY2subG9naWNhbEhlaWdodCgpKTsKKyAgICB9CisK
KyAgICAvLyBJZiB3ZSdyZSBpZ25vcmluZyBzcGFjZXMsIHdlIGhhdmUgdG8gc3RvcCBhbmQgaW5j
bHVkZSB0aGlzIG9iamVjdCBhbmQKKyAgICAvLyB0aGVuIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcyBh
Z2Fpbi4KKyAgICBpZiAoaXNJbmxpbmVUeXBlIHx8IGJveC0+Y29udGFpbmVyKCktPmlzUmVuZGVy
SW5saW5lKCkpIHsKKyAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMpCisgICAgICAgICAgICBl
bnN1cmVMaW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBib3gp
OworICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5hcHBlbmRCb3hJZk5lZWRlZChib3gpOworICAg
IH0gZWxzZQorICAgICAgICBwb3NpdGlvbmVkT2JqZWN0cy5hcHBlbmQoYm94KTsKKworICAgIG1f
d2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgoYm94KSk7CisgICAg
Ly8gUmVzZXQgcHJpb3IgbGluZSBicmVhayBjb250ZXh0IGNoYXJhY3RlcnMuCisgICAgbV9yZW5k
ZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLnJlc2V0UHJpb3JDb250ZXh0KCk7Cit9CisK
K2lubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRmxvYXQoKQoreworICAgIFJlbmRl
ckJveCYgZmxvYXRCb3ggPSB0b1JlbmRlckJveCgqbV9jdXJyZW50Lm1fb2JqKTsKKyAgICBGbG9h
dGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBtX2Jsb2NrLmluc2VydEZsb2F0aW5nT2JqZWN0
KGZsb2F0Qm94KTsKKyAgICAvLyBjaGVjayBpZiBpdCBmaXRzIGluIHRoZSBjdXJyZW50IGxpbmUu
CisgICAgLy8gSWYgaXQgZG9lcywgcG9zaXRpb24gaXQgbm93LCBvdGhlcndpc2UsIHBvc2l0aW9u
CisgICAgLy8gaXQgYWZ0ZXIgbW92aW5nIHRvIG5leHQgbGluZSAoaW4gbmV3TGluZSgpIGZ1bmMp
CisgICAgLy8gRklYTUU6IEJ1ZyAxMTAzNzI6IFByb3Blcmx5IHBvc2l0aW9uIG11bHRpcGxlIHN0
YWNrZWQgZmxvYXRzIHdpdGggbm9uLXJlY3Rhbmd1bGFyIHNoYXBlIG91dHNpZGUuCisgICAgaWYg
KG1fZmxvYXRzRml0T25MaW5lICYmIG1fd2lkdGguZml0c09uTGluZUV4Y2x1ZGluZ1RyYWlsaW5n
V2hpdGVzcGFjZShtX2Jsb2NrLmxvZ2ljYWxXaWR0aEZvckZsb2F0KGZsb2F0aW5nT2JqZWN0KSkp
IHsKKyAgICAgICAgbV9ibG9jay5wb3NpdGlvbk5ld0Zsb2F0T25MaW5lKGZsb2F0aW5nT2JqZWN0
LCBtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIG1fbGluZUluZm8sIG1fd2lkdGgpOworICAg
ICAgICBpZiAobV9saW5lQnJlYWsubV9vYmogPT0gbV9jdXJyZW50Lm1fb2JqKSB7CisgICAgICAg
ICAgICBBU1NFUlQoIW1fbGluZUJyZWFrLm1fcG9zKTsKKyAgICAgICAgICAgIG1fbGluZUJyZWFr
LmluY3JlbWVudCgpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIG1fZmxvYXRzRml0
T25MaW5lID0gZmFsc2U7CisgICAgLy8gVXBkYXRlIHByaW9yIGxpbmUgYnJlYWsgY29udGV4dCBj
aGFyYWN0ZXJzLCB1c2luZyBVK0ZGRkQgKE9CSkVDVCBSRVBMQUNFTUVOVCBDSEFSQUNURVIpIGZv
ciBmbG9hdGluZyBlbGVtZW50LgorICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVy
YXRvci51cGRhdGVQcmlvckNvbnRleHQocmVwbGFjZW1lbnRDaGFyYWN0ZXIpOworfQorCisvLyBU
aGlzIGlzIGN1cnJlbnRseSBqdXN0IHVzZWQgZm9yIGxpc3QgbWFya2VycyBhbmQgaW5saW5lIGZs
b3dzIHRoYXQgaGF2ZSBsaW5lIGJveGVzLiBOZWl0aGVyIHNob3VsZAorLy8gaGF2ZSBhbiBlZmZl
Y3Qgb24gd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCitpbmxpbmUgYm9vbCBz
aG91bGRTa2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QoUmVuZGVyQmxvY2tGbG93JiBibG9j
aywgUmVuZGVyT2JqZWN0KiBvLCBMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUp
Cit7CisgICAgUmVuZGVyT2JqZWN0KiBuZXh0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5l
cyhibG9jaywgbyk7CisgICAgd2hpbGUgKG5leHQgJiYgbmV4dC0+aXNGbG9hdGluZ09yT3V0T2ZG
bG93UG9zaXRpb25lZCgpKQorICAgICAgICBuZXh0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5s
aW5lcyhibG9jaywgbmV4dCk7CisKKyAgICBpZiAobmV4dCAmJiBuZXh0LT5pc1RleHQoKSAmJiB0
b1JlbmRlclRleHQobmV4dCktPnRleHRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgUmVuZGVyVGV4
dCogbmV4dFRleHQgPSB0b1JlbmRlclRleHQobmV4dCk7CisgICAgICAgIFVDaGFyIG5leHRDaGFy
ID0gbmV4dFRleHQtPmNoYXJhY3RlckF0KDApOworICAgICAgICBpZiAobmV4dFRleHQtPnN0eWxl
KCkuaXNDb2xsYXBzaWJsZVdoaXRlU3BhY2UobmV4dENoYXIpKSB7CisgICAgICAgICAgICBzdGFy
dElnbm9yaW5nU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBvLCAw
KSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJl
dHVybiBmYWxzZTsKK30KKworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbXB0
eUlubGluZSgpCit7CisgICAgUmVuZGVySW5saW5lJiBmbG93Qm94ID0gdG9SZW5kZXJJbmxpbmUo
Km1fY3VycmVudC5tX29iaik7CisKKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGVuZCB1cCBiZWlu
ZyBjYWxsZWQgb24gZW1wdHkgaW5saW5lcworICAgIEFTU0VSVChpc0VtcHR5SW5saW5lKGZsb3dC
b3gpKTsKKworICAgIC8vIE5vdyB0aGF0IHNvbWUgaW5saW5lIGZsb3dzIGhhdmUgbGluZSBib3hl
cywgaWYgd2UgYXJlIGFscmVhZHkgaWdub3Jpbmcgc3BhY2VzLCB3ZSBuZWVkCisgICAgLy8gdG8g
bWFrZSBzdXJlIHRoYXQgd2Ugc3RvcCB0byBpbmNsdWRlIHRoaXMgb2JqZWN0IGFuZCB0aGVuIHN0
YXJ0IGlnbm9yaW5nIHNwYWNlcyBhZ2Fpbi4KKyAgICAvLyBJZiB0aGlzIG9iamVjdCBpcyBhdCB0
aGUgc3RhcnQgb2YgdGhlIGxpbmUsIHdlIG5lZWQgdG8gYmVoYXZlIGxpa2UgbGlzdCBtYXJrZXJz
IGFuZAorICAgIC8vIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcy4KKyAgICBib29sIHJlcXVpcmVzTGlu
ZUJveCA9IGFsd2F5c1JlcXVpcmVzTGluZUJveChmbG93Qm94KTsKKyAgICBpZiAocmVxdWlyZXNM
aW5lQm94IHx8IHJlcXVpcmVzTGluZUJveEZvckNvbnRlbnQoZmxvd0JveCwgbV9saW5lSW5mbykp
IHsKKyAgICAgICAgLy8gQW4gZW1wdHkgaW5saW5lIHRoYXQgb25seSBoYXMgbGluZS1oZWlnaHQs
IHZlcnRpY2FsLWFsaWduIG9yIGZvbnQtbWV0cmljcyB3aWxsIG9ubHkgZ2V0IGEKKyAgICAgICAg
Ly8gbGluZSBib3ggdG8gYWZmZWN0IHRoZSBoZWlnaHQgb2YgdGhlIGxpbmUgaWYgdGhlIHJlc3Qg
b2YgdGhlIGxpbmUgaXMgbm90IGVtcHR5LgorICAgICAgICBpZiAocmVxdWlyZXNMaW5lQm94KQor
ICAgICAgICAgICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRo
KTsKKyAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMpIHsKKyAgICAgICAgICAgIG1fdHJhaWxp
bmdPYmplY3RzLmNsZWFyKCk7CisgICAgICAgICAgICBlbnN1cmVMaW5lQm94SW5zaWRlSWdub3Jl
ZFNwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQubV9vYmopOworICAgICAgICB9
IGVsc2UgaWYgKG1fYmxvY2tTdHlsZS5jb2xsYXBzZVdoaXRlU3BhY2UoKSAmJiBtX3Jlc29sdmVy
LnBvc2l0aW9uKCkubV9vYmogPT0gbV9jdXJyZW50Lm1fb2JqCisgICAgICAgICAgICAmJiBzaG91
bGRTa2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QobV9ibG9jaywgbV9jdXJyZW50Lm1fb2Jq
LCBtX2xpbmVNaWRwb2ludFN0YXRlKSkgeworICAgICAgICAgICAgLy8gTGlrZSB3aXRoIGxpc3Qg
bWFya2Vycywgd2Ugc3RhcnQgaWdub3Jpbmcgc3BhY2VzIHRvIG1ha2Ugc3VyZSB0aGF0IGFueQor
ICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBzcGFjZXMgd2Ugc2VlIHdpbGwgYmUgZGlzY2FyZGVk
LgorICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IHRydWU7CisgICAgICAg
ICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTID0gdHJ1ZTsKKyAgICAgICAgICAgIG1faWdub3Jp
bmdTcGFjZXMgPSB0cnVlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1fdHJhaWxpbmdP
YmplY3RzLmFwcGVuZEJveElmTmVlZGVkKCZmbG93Qm94KTsKKyAgICB9CisKKyAgICBtX3dpZHRo
LmFkZFVuY29tbWl0dGVkV2lkdGgoaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaikg
KyBib3JkZXJQYWRkaW5nTWFyZ2luU3RhcnQoZmxvd0JveCkgKyBib3JkZXJQYWRkaW5nTWFyZ2lu
RW5kKGZsb3dCb3gpKTsKK30KKworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVS
ZXBsYWNlZCgpCit7CisgICAgUmVuZGVyQm94JiByZXBsYWNlZEJveCA9IHRvUmVuZGVyQm94KCpt
X2N1cnJlbnQubV9vYmopOworCisgICAgaWYgKG1fYXRTdGFydCkKKyAgICAgICAgbV93aWR0aC51
cGRhdGVBdmFpbGFibGVXaWR0aChyZXBsYWNlZEJveC5sb2dpY2FsSGVpZ2h0KCkpOworCisgICAg
Ly8gQnJlYWsgb24gcmVwbGFjZWQgZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUt
c3BhY2UuCisgICAgaWYgKChtX2F1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChtX2xh
c3RXUykpICYmICghbV9jdXJyZW50Lm1fb2JqLT5pc0ltYWdlKCkgfHwgbV9hbGxvd0ltYWdlc1Rv
QnJlYWspKSB7CisgICAgICAgIG1fd2lkdGguY29tbWl0KCk7CisgICAgICAgIG1fbGluZUJyZWFr
Lm1vdmVUb1N0YXJ0T2YobV9jdXJyZW50Lm1fb2JqKTsKKyAgICB9CisKKyAgICBpZiAobV9pZ25v
cmluZ1NwYWNlcykKKyAgICAgICAgc3RvcElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3Rh
dGUsIElubGluZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5tX29iaiwgMCkpOworCisgICAgbV9saW5l
SW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKKyAgICBtX2lnbm9yaW5n
U3BhY2VzID0gZmFsc2U7CisgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOwor
ICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSBmYWxzZTsKKyAgICBtX3RyYWlsaW5nT2JqZWN0
cy5jbGVhcigpOworCisgICAgLy8gT3B0aW1pemUgZm9yIGEgY29tbW9uIGNhc2UuIElmIHdlIGNh
bid0IGZpbmQgd2hpdGVzcGFjZSBhZnRlciB0aGUgbGlzdAorICAgIC8vIGl0ZW0sIHRoZW4gdGhp
cyBpcyBhbGwgbW9vdC4KKyAgICBMYXlvdXRVbml0IHJlcGxhY2VkTG9naWNhbFdpZHRoID0gbV9i
bG9jay5sb2dpY2FsV2lkdGhGb3JDaGlsZChyZXBsYWNlZEJveCkgKyBtX2Jsb2NrLm1hcmdpblN0
YXJ0Rm9yQ2hpbGQocmVwbGFjZWRCb3gpICsgbV9ibG9jay5tYXJnaW5FbmRGb3JDaGlsZChyZXBs
YWNlZEJveCkgKyBpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50Lm1fb2JqKTsKKyAgICBpZiAo
bV9jdXJyZW50Lm1fb2JqLT5pc0xpc3RNYXJrZXIoKSkgeworICAgICAgICBpZiAobV9ibG9ja1N0
eWxlLmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFy
dE9iamVjdChtX2Jsb2NrLCBtX2N1cnJlbnQubV9vYmosIG1fbGluZU1pZHBvaW50U3RhdGUpKSB7
CisgICAgICAgICAgICAvLyBMaWtlIHdpdGggaW5saW5lIGZsb3dzLCB3ZSBzdGFydCBpZ25vcmlu
ZyBzcGFjZXMgdG8gbWFrZSBzdXJlIHRoYXQgYW55CisgICAgICAgICAgICAvLyBhZGRpdGlvbmFs
IHNwYWNlcyB3ZSBzZWUgd2lsbCBiZSBkaXNjYXJkZWQuCisgICAgICAgICAgICBtX2N1cnJlbnRD
aGFyYWN0ZXJJc1NwYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fY3VycmVudENoYXJhY3Rlcklz
V1MgPSBmYWxzZTsKKyAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSB0cnVlOworICAgICAg
ICB9CisgICAgICAgIGlmICh0b1JlbmRlckxpc3RNYXJrZXIoKm1fY3VycmVudC5tX29iaikuaXNJ
bnNpZGUoKSkKKyAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChyZXBsYWNl
ZExvZ2ljYWxXaWR0aCk7CisgICAgfSBlbHNlCisgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0
ZWRXaWR0aChyZXBsYWNlZExvZ2ljYWxXaWR0aCk7CisgICAgaWYgKG1fY3VycmVudC5tX29iai0+
aXNSdWJ5UnVuKCkpCisgICAgICAgIG1fd2lkdGguYXBwbHlPdmVyaGFuZyh0b1JlbmRlclJ1YnlS
dW4obV9jdXJyZW50Lm1fb2JqKSwgbV9sYXN0T2JqZWN0LCBtX25leHRPYmplY3QpOworICAgIC8v
IFVwZGF0ZSBwcmlvciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVycywgdXNpbmcgVStGRkZE
IChPQkpFQ1QgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSKSBmb3IgcmVwbGFjZWQgZWxlbWVudC4KKyAg
ICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IudXBkYXRlUHJpb3JDb250ZXh0
KHJlcGxhY2VtZW50Q2hhcmFjdGVyKTsKK30KKworaW5saW5lIGZsb2F0IGZpcnN0UG9zaXRpdmVX
aWR0aChjb25zdCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQoreworICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgd29yZE1lYXN1cmVtZW50cy5zaXplKCk7ICsraSkgeworICAg
ICAgICBpZiAod29yZE1lYXN1cmVtZW50c1tpXS53aWR0aCA+IDApCisgICAgICAgICAgICByZXR1
cm4gd29yZE1lYXN1cmVtZW50c1tpXS53aWR0aDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisK
KyNpZiBFTkFCTEUoQ1NTX1NIQVBFUykKK2lubGluZSB2b2lkIHVwZGF0ZVNlZ21lbnRzRm9yU2hh
cGVzKFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIGNvbnN0IEZsb2F0aW5nT2JqZWN0KiBsYXN0Rmxv
YXRGcm9tUHJldmlvdXNMaW5lLCBjb25zdCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1l
bnRzLCBMaW5lV2lkdGgmIHdpZHRoLCBib29sIGlzRmlyc3RMaW5lKQoreworICAgIEFTU0VSVChs
YXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKTsKKworICAgIFNoYXBlSW5zaWRlSW5mbyogc2hhcGVJ
bnNpZGVJbmZvID0gYmxvY2subGF5b3V0U2hhcGVJbnNpZGVJbmZvKCk7CisgICAgaWYgKCFsYXN0
RmxvYXRGcm9tUHJldmlvdXNMaW5lLT5pc1BsYWNlZCgpIHx8ICFzaGFwZUluc2lkZUluZm8pCisg
ICAgICAgIHJldHVybjsKKworICAgIGJvb2wgaXNIb3Jpem9udGFsV3JpdGluZ01vZGUgPSBibG9j
ay5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpOworICAgIExheW91dFVuaXQgbG9naWNhbE9mZnNl
dEZyb21TaGFwZUNvbnRhaW5lciA9IGJsb2NrLmxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVBbmNlc3Rv
ckNvbnRhaW5lcihzaGFwZUluc2lkZUluZm8tPm93bmVyKCkpLmhlaWdodCgpOworCisgICAgTGF5
b3V0VW5pdCBsaW5lTG9naWNhbFRvcCA9IGJsb2NrLmxvZ2ljYWxIZWlnaHQoKSArIGxvZ2ljYWxP
ZmZzZXRGcm9tU2hhcGVDb250YWluZXI7CisgICAgTGF5b3V0VW5pdCBsaW5lTG9naWNhbEhlaWdo
dCA9IGJsb2NrLmxpbmVIZWlnaHQoaXNGaXJzdExpbmUsIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2Rl
ID8gSG9yaXpvbnRhbExpbmUgOiBWZXJ0aWNhbExpbmUsIFBvc2l0aW9uT2ZJbnRlcmlvckxpbmVC
b3hlcyk7CisgICAgTGF5b3V0VW5pdCBsaW5lTG9naWNhbEJvdHRvbSA9IGxpbmVMb2dpY2FsVG9w
ICsgbGluZUxvZ2ljYWxIZWlnaHQ7CisKKyAgICBMYXlvdXRVbml0IGZsb2F0TG9naWNhbFRvcCA9
IGJsb2NrLmxvZ2ljYWxUb3BGb3JGbG9hdChsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKTsKKyAg
ICBMYXlvdXRVbml0IGZsb2F0TG9naWNhbEJvdHRvbSA9IGJsb2NrLmxvZ2ljYWxCb3R0b21Gb3JG
bG9hdChsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKTsKKworICAgIGJvb2wgbGluZU92ZXJsYXBz
V2l0aEZsb2F0ID0gKGZsb2F0TG9naWNhbFRvcCA8IGxpbmVMb2dpY2FsQm90dG9tKSAmJiAobGlu
ZUxvZ2ljYWxUb3AgPCBmbG9hdExvZ2ljYWxCb3R0b20pOworICAgIGlmICghbGluZU92ZXJsYXBz
V2l0aEZsb2F0KQorICAgICAgICByZXR1cm47CisKKyAgICBmbG9hdCBtaW5TZWdtZW50V2lkdGgg
PSBmaXJzdFBvc2l0aXZlV2lkdGgod29yZE1lYXN1cmVtZW50cyk7CisKKyAgICBMYXlvdXRVbml0
IGZsb2F0TG9naWNhbFdpZHRoID0gYmxvY2subG9naWNhbFdpZHRoRm9yRmxvYXQobGFzdEZsb2F0
RnJvbVByZXZpb3VzTGluZSk7CisgICAgTGF5b3V0VW5pdCBhdmFpbGFibGVMb2dpY2FsV2lkdGgg
PSBibG9jay5sb2dpY2FsV2lkdGgoKSAtIGJsb2NrLmxvZ2ljYWxSaWdodEZvckZsb2F0KGxhc3RG
bG9hdEZyb21QcmV2aW91c0xpbmUpOworICAgIGlmIChhdmFpbGFibGVMb2dpY2FsV2lkdGggPCBt
aW5TZWdtZW50V2lkdGgpCisgICAgICAgIGJsb2NrLnNldExvZ2ljYWxIZWlnaHQoZmxvYXRMb2dp
Y2FsQm90dG9tKTsKKworICAgIGlmIChibG9jay5sb2dpY2FsSGVpZ2h0KCkgPCBmbG9hdExvZ2lj
YWxUb3ApIHsKKyAgICAgICAgc2hhcGVJbnNpZGVJbmZvLT5hZGp1c3RMb2dpY2FsTGluZVRvcCht
aW5TZWdtZW50V2lkdGggKyBmbG9hdExvZ2ljYWxXaWR0aCk7CisgICAgICAgIGJsb2NrLnNldExv
Z2ljYWxIZWlnaHQoc2hhcGVJbnNpZGVJbmZvLT5sb2dpY2FsTGluZVRvcCgpIC0gbG9naWNhbE9m
ZnNldEZyb21TaGFwZUNvbnRhaW5lcik7CisgICAgfQorCisgICAgbGluZUxvZ2ljYWxUb3AgPSBi
bG9jay5sb2dpY2FsSGVpZ2h0KCkgKyBsb2dpY2FsT2Zmc2V0RnJvbVNoYXBlQ29udGFpbmVyOwor
CisgICAgc2hhcGVJbnNpZGVJbmZvLT51cGRhdGVTZWdtZW50c0ZvckxpbmUobGluZUxvZ2ljYWxU
b3AsIGxpbmVMb2dpY2FsSGVpZ2h0KTsKKyAgICB3aWR0aC51cGRhdGVDdXJyZW50U2hhcGVTZWdt
ZW50KCk7CisgICAgd2lkdGgudXBkYXRlQXZhaWxhYmxlV2lkdGgoKTsKK30KKyNlbmRpZgorCitp
bmxpbmUgYm9vbCBpdGVyYXRvcklzQmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChjb25zdCBJ
bmxpbmVJdGVyYXRvciYgaXRlciwgUmVuZGVyQ29tYmluZVRleHQmIHJlbmRlcmVyKQoreworICAg
IHJldHVybiBpdGVyLm1fb2JqID09ICZyZW5kZXJlciAmJiBpdGVyLm1fcG9zID49IHJlbmRlcmVy
LnRleHRMZW5ndGgoKTsKK30KKworaW5saW5lIHZvaWQgbmV4dENoYXJhY3RlcihVQ2hhciYgY3Vy
cmVudENoYXJhY3RlciwgVUNoYXImIGxhc3RDaGFyYWN0ZXIsIFVDaGFyJiBzZWNvbmRUb0xhc3RD
aGFyYWN0ZXIpCit7CisgICAgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gbGFzdENoYXJhY3RlcjsK
KyAgICBsYXN0Q2hhcmFjdGVyID0gY3VycmVudENoYXJhY3RlcjsKK30KKworLy8gRklYTUU6IERv
bid0IGxldCBjb3VudGVycyBtYXJrIHRoZW1zZWx2ZXMgYXMgbmVlZGluZyBwcmVmIHdpZHRoIHJl
Y2FsY3MgZHVyaW5nIGxheW91dAorLy8gc28gd2UgZG9uJ3QgbmVlZCB0aGlzIGhhY2suCitpbmxp
bmUgdm9pZCB1cGRhdGVDb3VudGVySWZOZWVkZWQoUmVuZGVyVGV4dCYgcmVuZGVyVGV4dCkKK3sK
KyAgICBpZiAoIXJlbmRlclRleHQucHJlZmVycmVkTG9naWNhbFdpZHRoc0RpcnR5KCkgfHwgIXJl
bmRlclRleHQuaXNDb3VudGVyKCkpCisgICAgICAgIHJldHVybjsKKyAgICB0b1JlbmRlckNvdW50
ZXIocmVuZGVyVGV4dCkudXBkYXRlQ291bnRlcigpOworfQorCitpbmxpbmUgZmxvYXQgbWVhc3Vy
ZUh5cGhlbldpZHRoKFJlbmRlclRleHQqIHJlbmRlcmVyLCBjb25zdCBGb250JiBmb250LCBIYXNo
U2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNrRm9udHMgPSAwKQoreworICAgIGNv
bnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IHJlbmRlcmVyLT5zdHlsZSgpOworICAgIHJldHVybiBm
b250LndpZHRoKFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHJlbmRlcmVyLCBmb250LCBz
dHlsZS5oeXBoZW5TdHJpbmcoKS5zdHJpbmcoKSwgc3R5bGUpLCBmYWxsYmFja0ZvbnRzKTsKK30K
KworQUxXQVlTX0lOTElORSBmbG9hdCB0ZXh0V2lkdGgoUmVuZGVyVGV4dCogdGV4dCwgdW5zaWdu
ZWQgZnJvbSwgdW5zaWduZWQgbGVuLCBjb25zdCBGb250JiBmb250LCBmbG9hdCB4UG9zLCBib29s
IGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UsIEhhc2hTZXQ8Y29uc3QgU2lt
cGxlRm9udERhdGEqPiYgZmFsbGJhY2tGb250cywgVGV4dExheW91dCogbGF5b3V0ID0gMCkKK3sK
KyAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSB0ZXh0LT5zdHlsZSgpOworCisgICAgR2x5
cGhPdmVyZmxvdyBnbHlwaE92ZXJmbG93OworICAgIGlmIChpc0ZpeGVkUGl0Y2ggfHwgKCFmcm9t
ICYmIGxlbiA9PSB0ZXh0LT50ZXh0TGVuZ3RoKCkpIHx8IHN0eWxlLmhhc1RleHRDb21iaW5lKCkp
CisgICAgICAgIHJldHVybiB0ZXh0LT53aWR0aChmcm9tLCBsZW4sIGZvbnQsIHhQb3MsICZmYWxs
YmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdyk7CisKKyAgICBpZiAobGF5b3V0KQorICAgICAgICBy
ZXR1cm4gRm9udDo6d2lkdGgoKmxheW91dCwgZnJvbSwgbGVuLCAmZmFsbGJhY2tGb250cyk7CisK
KyAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZv
bnQsIHRleHQsIGZyb20sIGxlbiwgc3R5bGUpOworICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3Ro
KHRleHQtPnRleHRMZW5ndGgoKSAtIGZyb20pOworICAgIEFTU0VSVChydW4uY2hhcmFjdGVyc0xl
bmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7CisKKyAgICBydW4uc2V0Q2hhcmFjdGVyU2NhbkZvckNv
ZGVQYXRoKCF0ZXh0LT5jYW5Vc2VTaW1wbGVGb250Q29kZVBhdGgoKSk7CisgICAgcnVuLnNldFRh
YlNpemUoIWNvbGxhcHNlV2hpdGVTcGFjZSwgc3R5bGUudGFiU2l6ZSgpKTsKKyAgICBydW4uc2V0
WFBvcyh4UG9zKTsKKyAgICByZXR1cm4gZm9udC53aWR0aChydW4sICZmYWxsYmFja0ZvbnRzLCAm
Z2x5cGhPdmVyZmxvdyk7Cit9CisKKy8vIEFkZGluZyBhIHBhaXIgb2YgbWlkcG9pbnRzIGJlZm9y
ZSBhIGNoYXJhY3RlciB3aWxsIHNwbGl0IGl0IG91dCBpbnRvIGEgbmV3IGxpbmUgYm94LgoraW5s
aW5lIHZvaWQgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3goTGluZU1pZHBvaW50U3RhdGUmIGxp
bmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvciYgdGV4dFBhcmFncmFwaFNlcGFyYXRvcikK
K3sKKyAgICBJbmxpbmVJdGVyYXRvciBtaWRwb2ludCgwLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9y
Lm1fb2JqLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fcG9zKTsKKyAgICBzdGFydElnbm9yaW5n
U3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCB0ZXh0UGFyYWdyYXBo
U2VwYXJhdG9yLm1fb2JqLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fcG9zIC0gMSkpOworICAg
IHN0b3BJZ25vcmluZ1NwYWNlcyhsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwg
dGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX29iaiwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX3Bv
cykpOworfQorCitpbmxpbmUgdm9pZCB0cnlIeXBoZW5hdGluZyhSZW5kZXJUZXh0KiB0ZXh0LCBj
b25zdCBGb250JiBmb250LCBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsZUlkZW50aWZpZXIsIHVu
c2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBpbnQgY29uc2VjdXRpdmVIeXBoZW5h
dGVkTGluZXNMaW1pdCwgaW50IG1pbmltdW1QcmVmaXhMaW1pdCwgaW50IG1pbmltdW1TdWZmaXhM
aW1pdCwgdW5zaWduZWQgbGFzdFNwYWNlLCB1bnNpZ25lZCBwb3MsIGZsb2F0IHhQb3MsIGludCBh
dmFpbGFibGVXaWR0aCwgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0ZVNwYWNl
LCBpbnQgbGFzdFNwYWNlV29yZFNwYWNpbmcsIElubGluZUl0ZXJhdG9yJiBsaW5lQnJlYWssIGlu
dCBuZXh0QnJlYWthYmxlLCBib29sJiBoeXBoZW5hdGVkKQoreworICAgIC8vIE1hcCAnaHlwaGVu
YXRlLWxpbWl0LXtiZWZvcmUsYWZ0ZXJ9OiBhdXRvOycgdG8gMi4KKyAgICB1bnNpZ25lZCBtaW5p
bXVtUHJlZml4TGVuZ3RoOworICAgIHVuc2lnbmVkIG1pbmltdW1TdWZmaXhMZW5ndGg7CisKKyAg
ICBpZiAobWluaW11bVByZWZpeExpbWl0IDwgMCkKKyAgICAgICAgbWluaW11bVByZWZpeExlbmd0
aCA9IDI7CisgICAgZWxzZQorICAgICAgICBtaW5pbXVtUHJlZml4TGVuZ3RoID0gc3RhdGljX2Nh
c3Q8dW5zaWduZWQ+KG1pbmltdW1QcmVmaXhMaW1pdCk7CisKKyAgICBpZiAobWluaW11bVN1ZmZp
eExpbWl0IDwgMCkKKyAgICAgICAgbWluaW11bVN1ZmZpeExlbmd0aCA9IDI7CisgICAgZWxzZQor
ICAgICAgICBtaW5pbXVtU3VmZml4TGVuZ3RoID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG1pbmlt
dW1TdWZmaXhMaW1pdCk7CisKKyAgICBpZiAocG9zIC0gbGFzdFNwYWNlIDw9IG1pbmltdW1TdWZm
aXhMZW5ndGgpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChjb25zZWN1dGl2ZUh5cGhlbmF0
ZWRMaW5lc0xpbWl0ID49IDAgJiYgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMgPj0gc3RhdGlj
X2Nhc3Q8dW5zaWduZWQ+KGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzTGltaXQpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBpbnQgaHlwaGVuV2lkdGggPSBtZWFzdXJlSHlwaGVuV2lkdGgodGV4
dCwgZm9udCk7CisKKyAgICBmbG9hdCBtYXhQcmVmaXhXaWR0aCA9IGF2YWlsYWJsZVdpZHRoIC0g
eFBvcyAtIGh5cGhlbldpZHRoIC0gbGFzdFNwYWNlV29yZFNwYWNpbmc7CisgICAgLy8gSWYgdGhl
IG1heGltdW0gd2lkdGggYXZhaWxhYmxlIGZvciB0aGUgcHJlZml4IGJlZm9yZSB0aGUgaHlwaGVu
IGlzIHNtYWxsLCB0aGVuIGl0IGlzIHZlcnkgdW5saWtlbHkKKyAgICAvLyB0aGF0IGFuIGh5cGhl
bmF0aW9uIG9wcG9ydHVuaXR5IGV4aXN0cywgc28gZG8gbm90IGJvdGhlciB0byBsb29rIGZvciBp
dC4KKyAgICBpZiAobWF4UHJlZml4V2lkdGggPD0gZm9udC5waXhlbFNpemUoKSAqIDUgLyA0KQor
ICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSB0ZXh0LT5z
dHlsZSgpOworICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4o
dGV4dCwgZm9udCwgdGV4dCwgbGFzdFNwYWNlLCBwb3MgLSBsYXN0U3BhY2UsIHN0eWxlKTsKKyAg
ICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LT50ZXh0TGVuZ3RoKCkgLSBsYXN0U3BhY2Up
OworICAgIEFTU0VSVChydW4uY2hhcmFjdGVyc0xlbmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7CisK
KyAgICBydW4uc2V0VGFiU2l6ZSghY29sbGFwc2VXaGl0ZVNwYWNlLCBzdHlsZS50YWJTaXplKCkp
OworICAgIHJ1bi5zZXRYUG9zKHhQb3MgKyBsYXN0U3BhY2VXb3JkU3BhY2luZyk7CisKKyAgICB1
bnNpZ25lZCBwcmVmaXhMZW5ndGggPSBmb250Lm9mZnNldEZvclBvc2l0aW9uKHJ1biwgbWF4UHJl
Zml4V2lkdGgsIGZhbHNlKTsKKyAgICBpZiAocHJlZml4TGVuZ3RoIDwgbWluaW11bVByZWZpeExl
bmd0aCkKKyAgICAgICAgcmV0dXJuOworCisgICAgcHJlZml4TGVuZ3RoID0gbGFzdEh5cGhlbkxv
Y2F0aW9uKHRleHQtPmNoYXJhY3RlcnMoKSArIGxhc3RTcGFjZSwgcG9zIC0gbGFzdFNwYWNlLCBz
dGQ6Om1pbihwcmVmaXhMZW5ndGgsIHBvcyAtIGxhc3RTcGFjZSAtIG1pbmltdW1TdWZmaXhMZW5n
dGgpICsgMSwgbG9jYWxlSWRlbnRpZmllcik7CisgICAgaWYgKCFwcmVmaXhMZW5ndGggfHwgcHJl
Zml4TGVuZ3RoIDwgbWluaW11bVByZWZpeExlbmd0aCkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Ly8gV2hlbiBsYXN0U2FwY2UgaXMgYSBzcGFjZSwgd2hpY2ggaXQgYWx3YXlzIGlzIGV4Y2VwdCBz
b21ldGltZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgb3IgYWZ0ZXIgY29sbGFwc2VkCisg
ICAgLy8gc3BhY2UsIGl0IHNob3VsZCBub3QgY291bnQgdG93YXJkcyBoeXBoZW5hdGUtbGltaXQt
YmVmb3JlLgorICAgIGlmIChwcmVmaXhMZW5ndGggPT0gbWluaW11bVByZWZpeExlbmd0aCkgewor
ICAgICAgICBVQ2hhciBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9IHRleHQtPmNoYXJhY3RlckF0KGxh
c3RTcGFjZSk7CisgICAgICAgIGlmIChjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSAnICcgfHwgY2hh
cmFjdGVyQXRMYXN0U3BhY2UgPT0gJ1xuJyB8fCBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSAnXHQn
IHx8IGNoYXJhY3RlckF0TGFzdFNwYWNlID09IG5vQnJlYWtTcGFjZSkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBBU1NFUlQocG9zIC0gbGFzdFNwYWNlIC0gcHJlZml4TGVuZ3Ro
ID49IG1pbmltdW1TdWZmaXhMZW5ndGgpOworCisjaWYgIUFTU0VSVF9ESVNBQkxFRAorICAgIEhh
c2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiBmYWxsYmFja0ZvbnRzOworICAgIGZsb2F0IHBy
ZWZpeFdpZHRoID0gaHlwaGVuV2lkdGggKyB0ZXh0V2lkdGgodGV4dCwgbGFzdFNwYWNlLCBwcmVm
aXhMZW5ndGgsIGZvbnQsIHhQb3MsIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0ZVNwYWNlLCBm
YWxsYmFja0ZvbnRzKSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAgIEFTU0VSVCh4UG9zICsg
cHJlZml4V2lkdGggPD0gYXZhaWxhYmxlV2lkdGgpOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0o
aXNGaXhlZFBpdGNoKTsKKyNlbmRpZgorCisgICAgbGluZUJyZWFrLm1vdmVUbyh0ZXh0LCBsYXN0
U3BhY2UgKyBwcmVmaXhMZW5ndGgsIG5leHRCcmVha2FibGUpOworICAgIGh5cGhlbmF0ZWQgPSB0
cnVlOworfQorCitpbmxpbmUgYm9vbCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZVRleHQoV29yZE1l
YXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cywgYm9vbCYgaHlwaGVuYXRlZCwgIHVuc2lnbmVk
JiBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcykKK3sKKyAgICBpZiAoIW1fY3VycmVudC5tX3Bv
cykKKyAgICAgICAgbV9hcHBsaWVkU3RhcnRXaWR0aCA9IGZhbHNlOworCisgICAgUmVuZGVyVGV4
dCogcmVuZGVyVGV4dCA9IHRvUmVuZGVyVGV4dChtX2N1cnJlbnQubV9vYmopOworCisjaWYgRU5B
QkxFKFNWRykKKyAgICBib29sIGlzU1ZHVGV4dCA9IHJlbmRlclRleHQtPmlzU1ZHSW5saW5lVGV4
dCgpOworI2VuZGlmCisKKyAgICAvLyBJZiB3ZSBoYXZlIGxlZnQgYSBuby13cmFwIGlubGluZSBh
bmQgZW50ZXJlZCBhbiBhdXRvd3JhcCBpbmxpbmUgd2hpbGUgaWdub3Jpbmcgc3BhY2VzCisgICAg
Ly8gdGhlbiB3ZSBuZWVkIHRvIG1hcmsgdGhlIHN0YXJ0IG9mIHRoZSBhdXRvd3JhcCBpbmxpbmUg
YXMgYSBwb3RlbnRpYWwgbGluZWJyZWFrIG5vdy4KKyAgICBpZiAobV9hdXRvV3JhcCAmJiAhUmVu
ZGVyU3R5bGU6OmF1dG9XcmFwKG1fbGFzdFdTKSAmJiBtX2lnbm9yaW5nU3BhY2VzKQorICAgICAg
ICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aChtX2N1cnJlbnQubV9vYmopOworCisgICAg
aWYgKHJlbmRlclRleHQtPnN0eWxlKCkuaGFzVGV4dENvbWJpbmUoKSAmJiBtX2N1cnJlbnQubV9v
YmotPmlzQ29tYmluZVRleHQoKSAmJiAhdG9SZW5kZXJDb21iaW5lVGV4dCgqbV9jdXJyZW50Lm1f
b2JqKS5pc0NvbWJpbmVkKCkpIHsKKyAgICAgICAgUmVuZGVyQ29tYmluZVRleHQmIGNvbWJpbmVS
ZW5kZXJlciA9IHRvUmVuZGVyQ29tYmluZVRleHQoKm1fY3VycmVudC5tX29iaik7CisgICAgICAg
IGNvbWJpbmVSZW5kZXJlci5jb21iaW5lVGV4dCgpOworICAgICAgICAvLyBUaGUgbGVuZ3RoIG9m
IHRoZSByZW5kZXJlcidzIHRleHQgbWF5IGhhdmUgY2hhbmdlZC4gSW5jcmVtZW50IHN0YWxlIGl0
ZXJhdG9yIHBvc2l0aW9ucworICAgICAgICBpZiAoaXRlcmF0b3JJc0JleW9uZEVuZE9mUmVuZGVy
Q29tYmluZVRleHQobV9saW5lQnJlYWssIGNvbWJpbmVSZW5kZXJlcikpIHsKKyAgICAgICAgICAg
IEFTU0VSVChpdGVyYXRvcklzQmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChtX3Jlc29sdmVy
LnBvc2l0aW9uKCksIGNvbWJpbmVSZW5kZXJlcikpOworICAgICAgICAgICAgbV9saW5lQnJlYWsu
aW5jcmVtZW50KCk7CisgICAgICAgICAgICBtX3Jlc29sdmVyLmluY3JlbWVudCgpOworICAgICAg
ICB9CisgICAgfQorCisgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gbGluZVN0eWxlKCpy
ZW5kZXJUZXh0LT5wYXJlbnQoKSwgbV9saW5lSW5mbyk7CisgICAgY29uc3QgRm9udCYgZm9udCA9
IHN0eWxlLmZvbnQoKTsKKyAgICBib29sIGlzRml4ZWRQaXRjaCA9IGZvbnQuaXNGaXhlZFBpdGNo
KCk7CisgICAgYm9vbCBjYW5IeXBoZW5hdGUgPSBzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVuc0F1
dG8gJiYgV2ViQ29yZTo6Y2FuSHlwaGVuYXRlKHN0eWxlLmxvY2FsZSgpKTsKKworICAgIHVuc2ln
bmVkIGxhc3RTcGFjZSA9IG1fY3VycmVudC5tX3BvczsKKyAgICBmbG9hdCB3b3JkU3BhY2luZyA9
IG1fY3VycmVudFN0eWxlLT53b3JkU3BhY2luZygpOworICAgIGZsb2F0IGxhc3RTcGFjZVdvcmRT
cGFjaW5nID0gMDsKKyAgICBmbG9hdCB3b3JkU3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudCA9IDA7
CisKKyAgICBmbG9hdCB3cmFwVyA9IG1fd2lkdGgudW5jb21taXR0ZWRXaWR0aCgpICsgaW5saW5l
TG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaiwgIW1fYXBwbGllZFN0YXJ0V2lkdGgsIHRydWUp
OworICAgIGZsb2F0IGNoYXJXaWR0aCA9IDA7CisgICAgYm9vbCBicmVha05CU1AgPSBtX2F1dG9X
cmFwICYmIG1fY3VycmVudFN0eWxlLT5uYnNwTW9kZSgpID09IFNQQUNFOworICAgIC8vIEF1dG8t
d3JhcHBpbmcgdGV4dCBzaG91bGQgd3JhcCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBvbmx5IGlm
IGl0IGNvdWxkIG5vdCB3cmFwIGJlZm9yZSB0aGUgd29yZCwKKyAgICAvLyB3aGljaCBpcyBvbmx5
IHBvc3NpYmxlIGlmIHRoZSB3b3JkIGlzIHRoZSBmaXJzdCB0aGluZyBvbiB0aGUgbGluZSwgdGhh
dCBpcywgaWYgfHd8IGlzIHplcm8uCisgICAgYm9vbCBicmVha1dvcmRzID0gbV9jdXJyZW50U3R5
bGUtPmJyZWFrV29yZHMoKSAmJiAoKG1fYXV0b1dyYXAgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lk
dGgoKSkgfHwgbV9jdXJyV1MgPT0gUFJFKTsKKyAgICBib29sIG1pZFdvcmRCcmVhayA9IGZhbHNl
OworICAgIGJvb2wgYnJlYWtBbGwgPSBtX2N1cnJlbnRTdHlsZS0+d29yZEJyZWFrKCkgPT0gQnJl
YWtBbGxXb3JkQnJlYWsgJiYgbV9hdXRvV3JhcDsKKyAgICBmbG9hdCBoeXBoZW5XaWR0aCA9IDA7
CisjaWYgRU5BQkxFKFNWRykKKyAgICBpZiAoaXNTVkdUZXh0KSB7CisgICAgICAgIGJyZWFrV29y
ZHMgPSBmYWxzZTsKKyAgICAgICAgYnJlYWtBbGwgPSBmYWxzZTsKKyAgICB9CisjZW5kaWYKKwor
ICAgIGlmIChtX3JlbmRlclRleHRJbmZvLm1fdGV4dCAhPSByZW5kZXJUZXh0KSB7CisgICAgICAg
IHVwZGF0ZUNvdW50ZXJJZk5lZWRlZCgqcmVuZGVyVGV4dCk7CisgICAgICAgIG1fcmVuZGVyVGV4
dEluZm8ubV90ZXh0ID0gcmVuZGVyVGV4dDsKKyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2Zv
bnQgPSAmZm9udDsKKyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xheW91dCA9IGZvbnQuY3Jl
YXRlTGF5b3V0KHJlbmRlclRleHQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIG1fY29sbGFwc2VX
aGl0ZVNwYWNlKTsKKyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9y
LnJlc2V0U3RyaW5nQW5kUmVsZWFzZUl0ZXJhdG9yKHJlbmRlclRleHQtPnRleHQoKSwgc3R5bGUu
bG9jYWxlKCkpOworICAgIH0gZWxzZSBpZiAobV9yZW5kZXJUZXh0SW5mby5tX2xheW91dCAmJiBt
X3JlbmRlclRleHRJbmZvLm1fZm9udCAhPSAmZm9udCkgeworICAgICAgICBtX3JlbmRlclRleHRJ
bmZvLm1fZm9udCA9ICZmb250OworICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fbGF5b3V0ID0g
Zm9udC5jcmVhdGVMYXlvdXQocmVuZGVyVGV4dCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgbV9j
b2xsYXBzZVdoaXRlU3BhY2UpOworICAgIH0KKworICAgIFRleHRMYXlvdXQqIHRleHRMYXlvdXQg
PSBtX3JlbmRlclRleHRJbmZvLm1fbGF5b3V0LmdldCgpOworCisgICAgLy8gTm9uLXplcm8gb25s
eSB3aGVuIGtlcm5pbmcgaXMgZW5hYmxlZCBhbmQgVGV4dExheW91dCBpc24ndCB1c2VkLCBpbiB3
aGljaCBjYXNlIHdlIG1lYXN1cmUKKyAgICAvLyB3b3JkcyB3aXRoIHRoZWlyIHRyYWlsaW5nIHNw
YWNlLCB0aGVuIHN1YnRyYWN0IGl0cyB3aWR0aC4KKyAgICBIYXNoU2V0PGNvbnN0IFNpbXBsZUZv
bnREYXRhKj4gZmFsbGJhY2tGb250czsKKyAgICBmbG9hdCB3b3JkVHJhaWxpbmdTcGFjZVdpZHRo
ID0gKGZvbnQudHlwZXNldHRpbmdGZWF0dXJlcygpICYgS2VybmluZykgJiYgIXRleHRMYXlvdXQg
PyBmb250LndpZHRoKFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHJlbmRlclRleHQsIGZv
bnQsICZzcGFjZSwgMSwgc3R5bGUpLCAmZmFsbGJhY2tGb250cykgKyB3b3JkU3BhY2luZyA6IDA7
CisKKyAgICBVQ2hhciBsYXN0Q2hhcmFjdGVyID0gbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVh
a0l0ZXJhdG9yLmxhc3RDaGFyYWN0ZXIoKTsKKyAgICBVQ2hhciBzZWNvbmRUb0xhc3RDaGFyYWN0
ZXIgPSBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3Iuc2Vjb25kVG9MYXN0Q2hh
cmFjdGVyKCk7CisgICAgZm9yICg7IG1fY3VycmVudC5tX3BvcyA8IHJlbmRlclRleHQtPnRleHRM
ZW5ndGgoKTsgbV9jdXJyZW50LmZhc3RJbmNyZW1lbnRJblRleHROb2RlKCkpIHsKKyAgICAgICAg
Ym9vbCBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNl
OworICAgICAgICBib29sIHByZXZpb3VzQ2hhcmFjdGVySXNXUyA9IG1fY3VycmVudENoYXJhY3Rl
cklzV1M7CisgICAgICAgIFVDaGFyIGMgPSBtX2N1cnJlbnQuY3VycmVudCgpOworICAgICAgICBt
X2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlID0gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8ICghbV9w
cmVzZXJ2ZXNOZXdsaW5lICYmIChjID09ICdcbicpKTsKKworICAgICAgICBpZiAoIW1fY29sbGFw
c2VXaGl0ZVNwYWNlIHx8ICFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQorICAgICAgICAgICAg
bV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKKworICAgICAg
ICBpZiAoYyA9PSBzb2Z0SHlwaGVuICYmIG1fYXV0b1dyYXAgJiYgIWh5cGhlbldpZHRoICYmIHN0
eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkgeworICAgICAgICAgICAgaHlwaGVuV2lkdGgg
PSBtZWFzdXJlSHlwaGVuV2lkdGgocmVuZGVyVGV4dCwgZm9udCwgJmZhbGxiYWNrRm9udHMpOwor
ICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGh5cGhlbldpZHRoKTsKKyAg
ICAgICAgfQorCisgICAgICAgIGJvb2wgYXBwbHlXb3JkU3BhY2luZyA9IGZhbHNlOworCisgICAg
ICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlIHx8
IChicmVha05CU1AgJiYgYyA9PSBub0JyZWFrU3BhY2UpOworCisgICAgICAgIGlmICgoYnJlYWtB
bGwgfHwgYnJlYWtXb3JkcykgJiYgIW1pZFdvcmRCcmVhayAmJiAoIW1fY3VycmVudENoYXJhY3Rl
cklzU3BhY2UgfHwgc3R5bGUud2hpdGVTcGFjZSgpICE9IFBSRV9XUkFQKSkgeworICAgICAgICAg
ICAgd3JhcFcgKz0gY2hhcldpZHRoOworICAgICAgICAgICAgYm9vbCBtaWRXb3JkQnJlYWtJc0Jl
Zm9yZVN1cnJvZ2F0ZVBhaXIgPSBVMTZfSVNfTEVBRChjKSAmJiBtX2N1cnJlbnQubV9wb3MgKyAx
IDwgcmVuZGVyVGV4dC0+dGV4dExlbmd0aCgpICYmIFUxNl9JU19UUkFJTCgoKnJlbmRlclRleHQp
W21fY3VycmVudC5tX3BvcyArIDFdKTsKKyAgICAgICAgICAgIGNoYXJXaWR0aCA9IHRleHRXaWR0
aChyZW5kZXJUZXh0LCBtX2N1cnJlbnQubV9wb3MsIG1pZFdvcmRCcmVha0lzQmVmb3JlU3Vycm9n
YXRlUGFpciA/IDIgOiAxLCBmb250LCBtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgKyB3cmFwVywg
aXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgZmFsbGJhY2tGb250cywgdGV4dExh
eW91dCk7CisgICAgICAgICAgICBtaWRXb3JkQnJlYWsgPSBtX3dpZHRoLmNvbW1pdHRlZFdpZHRo
KCkgKyB3cmFwVyArIGNoYXJXaWR0aCA+IG1fd2lkdGguYXZhaWxhYmxlV2lkdGgoKTsKKyAgICAg
ICAgfQorCisgICAgICAgIGJvb2wgYmV0d2VlbldvcmRzID0gYyA9PSAnXG4nIHx8IChtX2N1cnJX
UyAhPSBQUkUgJiYgIW1fYXRTdGFydCAmJiBpc0JyZWFrYWJsZShtX3JlbmRlclRleHRJbmZvLm1f
bGluZUJyZWFrSXRlcmF0b3IsIG1fY3VycmVudC5tX3BvcywgbV9jdXJyZW50Lm1fbmV4dEJyZWFr
YWJsZVBvc2l0aW9uLCBicmVha05CU1ApCisgICAgICAgICAgICAmJiAoc3R5bGUuaHlwaGVucygp
ICE9IEh5cGhlbnNOb25lIHx8IChtX2N1cnJlbnQucHJldmlvdXNJblNhbWVOb2RlKCkgIT0gc29m
dEh5cGhlbikpKTsKKworICAgICAgICBpZiAoYmV0d2VlbldvcmRzIHx8IG1pZFdvcmRCcmVhaykg
eworICAgICAgICAgICAgYm9vbCBzdG9wcGVkSWdub3JpbmdTcGFjZXMgPSBmYWxzZTsKKyAgICAg
ICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzKSB7CisgICAgICAgICAgICAgICAgbGFzdFNwYWNl
V29yZFNwYWNpbmcgPSAwOworICAgICAgICAgICAgICAgIGlmICghbV9jdXJyZW50Q2hhcmFjdGVy
SXNTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGlnbm9yaW5nIHNwYWNlcyBh
bmQgYmVnaW4gYXQgdGhpcworICAgICAgICAgICAgICAgICAgICAvLyBuZXcgcG9pbnQuCisgICAg
ICAgICAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAg
ICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAwOworICAgICAgICAgICAgICAg
ICAgICBsYXN0U3BhY2UgPSBtX2N1cnJlbnQubV9wb3M7IC8vIGUuZy4sICJGb28gICAgZ29vIiwg
ZG9uJ3QgYWRkIGluIGFueSBvZiB0aGUgaWdub3JlZCBzcGFjZXMuCisgICAgICAgICAgICAgICAg
ICAgIHN0b3BJZ25vcmluZ1NwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRv
cigwLCBtX2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3BvcykpOworICAgICAgICAgICAgICAg
ICAgICBzdG9wcGVkSWdub3JpbmdTcGFjZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEp1c3Qga2VlcCBpZ25vcmluZyB0aGVzZSBzcGFj
ZXMuCisgICAgICAgICAgICAgICAgICAgIG5leHRDaGFyYWN0ZXIoYywgbGFzdENoYXJhY3Rlciwg
c2Vjb25kVG9MYXN0Q2hhcmFjdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3b3JkTWVhc3Vy
ZW1lbnRzLmdyb3cod29yZE1lYXN1cmVtZW50cy5zaXplKCkgKyAxKTsKKyAgICAgICAgICAgIFdv
cmRNZWFzdXJlbWVudCYgd29yZE1lYXN1cmVtZW50ID0gd29yZE1lYXN1cmVtZW50cy5sYXN0KCk7
CisKKyAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9IHJlbmRlclRleHQ7Cisg
ICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9jdXJyZW50Lm1fcG9zOwor
ICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0ID0gbGFzdFNwYWNlOworCisg
ICAgICAgICAgICBmbG9hdCBhZGRpdGlvbmFsVGVtcFdpZHRoOworICAgICAgICAgICAgaWYgKHdv
cmRUcmFpbGluZ1NwYWNlV2lkdGggJiYgYyA9PSAnICcpCisgICAgICAgICAgICAgICAgYWRkaXRp
b25hbFRlbXBXaWR0aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVu
dC5tX3BvcyArIDEgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlz
Rml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFj
a0ZvbnRzLCB0ZXh0TGF5b3V0KSAtIHdvcmRUcmFpbGluZ1NwYWNlV2lkdGg7CisgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgYWRkaXRpb25hbFRlbXBXaWR0aCA9IHRleHRXaWR0aChy
ZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVudC5tX3BvcyAtIGxhc3RTcGFjZSwgZm9udCwg
bV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFj
ZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOworCisgICAgICAg
ICAgICBpZiAod29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuaXNFbXB0eSgpICYmICFmYWxs
YmFja0ZvbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZmFs
bGJhY2tGb250cy5zd2FwKGZhbGxiYWNrRm9udHMpOworICAgICAgICAgICAgZmFsbGJhY2tGb250
cy5jbGVhcigpOworCisgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQud2lkdGggPSBhZGRpdGlv
bmFsVGVtcFdpZHRoICsgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQ7CisgICAgICAgICAg
ICBhZGRpdGlvbmFsVGVtcFdpZHRoICs9IGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAgICAgICAg
ICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxUZW1wV2lkdGgpOworCisg
ICAgICAgICAgICBpZiAobV9jb2xsYXBzZVdoaXRlU3BhY2UgJiYgcHJldmlvdXNDaGFyYWN0ZXJJ
c1NwYWNlICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgYWRkaXRpb25hbFRlbXBXaWR0
aCkKKyAgICAgICAgICAgICAgICBtX3dpZHRoLnNldFRyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKGFk
ZGl0aW9uYWxUZW1wV2lkdGgpOworCisgICAgICAgICAgICBpZiAoIW1fYXBwbGllZFN0YXJ0V2lk
dGgpIHsKKyAgICAgICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoaW5saW5l
TG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaiwgdHJ1ZSwgZmFsc2UpKTsKKyAgICAgICAgICAg
ICAgICBtX2FwcGxpZWRTdGFydFdpZHRoID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworI2lmIEVO
QUJMRShDU1NfU0hBUEVTKQorICAgICAgICAgICAgaWYgKG1fbGFzdEZsb2F0RnJvbVByZXZpb3Vz
TGluZSkKKyAgICAgICAgICAgICAgICB1cGRhdGVTZWdtZW50c0ZvclNoYXBlcyhtX2Jsb2NrLCBt
X2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHdvcmRNZWFzdXJlbWVudHMsIG1fd2lkdGgsIG1f
bGluZUluZm8uaXNGaXJzdExpbmUoKSk7CisjZW5kaWYKKyAgICAgICAgICAgIGFwcGx5V29yZFNw
YWNpbmcgPSB3b3JkU3BhY2luZyAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlOworCisgICAg
ICAgICAgICBpZiAoIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiBtX2F1dG9XcmFwICYmICFt
X3dpZHRoLmZpdHNPbkxpbmUoKSkKKyAgICAgICAgICAgICAgICBtX3dpZHRoLmZpdEJlbG93Rmxv
YXRzKCk7CisKKyAgICAgICAgICAgIGlmIChtX2F1dG9XcmFwIHx8IGJyZWFrV29yZHMpIHsKKyAg
ICAgICAgICAgICAgICAvLyBJZiB3ZSBicmVhayBvbmx5IGFmdGVyIHdoaXRlLXNwYWNlLCBjb25z
aWRlciB0aGUgY3VycmVudCBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAvLyBhcyBjYW5kaWRh
dGUgd2lkdGggZm9yIHRoaXMgbGluZS4KKyAgICAgICAgICAgICAgICBib29sIGxpbmVXYXNUb29X
aWRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1fd2lkdGguZml0c09uTGluZSgpICYm
IG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgbV9jdXJyZW50U3R5bGUtPmJyZWFrT25seUFm
dGVyV2hpdGVTcGFjZSgpICYmICFtaWRXb3JkQnJlYWspIHsKKyAgICAgICAgICAgICAgICAgICAg
ZmxvYXQgY2hhcldpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIG1fY3VycmVudC5tX3Bvcywg
MSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNl
V2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpICsg
KGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDApOworICAgICAgICAgICAgICAgICAg
ICAvLyBDaGVjayBpZiBsaW5lIGlzIHRvbyBiaWcgZXZlbiB3aXRob3V0IHRoZSBleHRyYSBzcGFj
ZQorICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiBJZiBpdCBp
cyBub3QsIGRvIG5vdGhpbmcuCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaW5lIG5l
ZWRzIHRoZSBleHRyYSB3aGl0ZXNwYWNlIHRvIGJlIHRvbyBsb25nLAorICAgICAgICAgICAgICAg
ICAgICAvLyB0aGVuIG1vdmUgdGhlIGxpbmUgYnJlYWsgdG8gdGhlIHNwYWNlIGFuZCBza2lwIGFs
bAorICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHdoaXRlc3BhY2UuCisgICAgICAg
ICAgICAgICAgICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lSW5jbHVkaW5nRXh0cmFXaWR0aChj
aGFyV2lkdGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2FzVG9vV2lkZSA9IHRy
dWU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8obV9jdXJyZW50
Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2FibGVQb3NpdGlv
bik7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVha2VyLnNraXBUcmFpbGluZ1do
aXRlc3BhY2UobV9saW5lQnJlYWssIG1fbGluZUluZm8pOworICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaW5lV2FzVG9vV2lkZSB8
fCAhbV93aWR0aC5maXRzT25MaW5lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkh5
cGhlbmF0ZSAmJiAhbV93aWR0aC5maXRzT25MaW5lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIHRyeUh5cGhlbmF0aW5nKHJlbmRlclRleHQsIGZvbnQsIHN0eWxlLmxvY2FsZSgpLCBjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgbV9ibG9ja1N0eWxlLmh5cGhlbmF0aW9uTGltaXRMaW5l
cygpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCksIHN0eWxlLmh5cGhlbmF0aW9uTGlt
aXRBZnRlcigpLCBsYXN0U3BhY2UsIG1fY3VycmVudC5tX3BvcywgbV93aWR0aC5jdXJyZW50V2lk
dGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lkdGgsIG1fd2lkdGguYXZhaWxhYmxlV2lkdGgoKSwgaXNG
aXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgbGFzdFNwYWNlV29yZFNwYWNpbmcsIG1f
bGluZUJyZWFrLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24sIG1fbGluZUJyZWFr
ZXIubV9oeXBoZW5hdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVh
a2VyLm1faHlwaGVuYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXRFbmQg
PSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgICAgICBpZiAobV9saW5lQnJlYWsuYXRUZXh0UGFyYWdyYXBoU2VwYXJhdG9yKCkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RvcHBlZElnbm9yaW5nU3BhY2VzICYmIG1fY3Vy
cmVudC5tX3BvcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlQ2hhcmFj
dGVyR2V0c0xpbmVCb3gobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9jdXJyZW50KTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOworICAgICAgICAgICAgICAg
ICAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFubHkodHJ1ZSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9saW5l
QnJlYWsubV9wb3M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAg
aWYgKG1fbGluZUJyZWFrLm1fb2JqICYmIG1fbGluZUJyZWFrLm1fcG9zICYmIG1fbGluZUJyZWFr
Lm1fb2JqLT5pc1RleHQoKSAmJiB0b1JlbmRlclRleHQobV9saW5lQnJlYWsubV9vYmopLT50ZXh0
TGVuZ3RoKCkgJiYgdG9SZW5kZXJUZXh0KG1fbGluZUJyZWFrLm1fb2JqKS0+Y2hhcmFjdGVyQXQo
bV9saW5lQnJlYWsubV9wb3MgLSAxKSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhlbnMoKSAh
PSBIeXBoZW5zTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGh5cGhlbmF0ZWQgPSB0cnVl
OworICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWsubV9wb3MgJiYgbV9saW5lQnJl
YWsubV9wb3MgIT0gKHVuc2lnbmVkKXdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgJiYgIXdvcmRN
ZWFzdXJlbWVudC53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJXaWR0
aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5lbmRPZmZz
ZXQgPSBtX2xpbmVCcmVhay5tX3BvczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jk
TWVhc3VyZW1lbnQud2lkdGggPSBjaGFyV2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gRGlkbid0IGZp
dC4gSnVtcCB0byB0aGUgZW5kIHVubGVzcyB0aGVyZSdzIHN0aWxsIGFuIG9wcG9ydHVuaXR5IHRv
IGNvbGxhcHNlIHdoaXRlc3BhY2UuCisgICAgICAgICAgICAgICAgICAgIGlmIChtX2lnbm9yaW5n
U3BhY2VzIHx8ICFtX2NvbGxhcHNlV2hpdGVTcGFjZSB8fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNT
cGFjZSB8fCAhcHJldmlvdXNDaGFyYWN0ZXJJc1NwYWNlKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBtX2F0RW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAgICAgICAgIGlmICghYmV0d2VlbldvcmRzIHx8IChtaWRXb3JkQnJlYWsgJiYgIW1f
YXV0b1dyYXApKQorICAgICAgICAgICAgICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRl
ZFdpZHRoKC1hZGRpdGlvbmFsVGVtcFdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGh5
cGhlbldpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJ0cmFjdCB0aGUgd2lk
dGggb2YgdGhlIHNvZnQgaHlwaGVuIG91dCBzaW5jZSB3ZSBmaXQgb24gYSBsaW5lLgorICAgICAg
ICAgICAgICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKC1oeXBoZW5XaWR0
aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoeXBoZW5XaWR0aCA9IDA7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGlmIChjID09ICdcbicgJiYgbV9wcmVzZXJ2ZXNOZXdsaW5lKSB7CisgICAgICAgICAgICAg
ICAgaWYgKCFzdG9wcGVkSWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50Lm1fcG9zID4gMCkKKyAg
ICAgICAgICAgICAgICAgICAgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gobV9saW5lTWlkcG9p
bnRTdGF0ZSwgbV9jdXJyZW50KTsKKyAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8o
bV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2Fi
bGVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7Cisg
ICAgICAgICAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFubHkodHJ1
ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGlmIChtX2F1dG9XcmFwICYmIGJldHdlZW5Xb3JkcykgeworICAgICAgICAgICAgICAg
IG1fd2lkdGguY29tbWl0KCk7CisgICAgICAgICAgICAgICAgd3JhcFcgPSAwOworICAgICAgICAg
ICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3Bv
cywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAv
LyBBdXRvLXdyYXBwaW5nIHRleHQgc2hvdWxkIG5vdCB3cmFwIGluIHRoZSBtaWRkbGUgb2YgYSB3
b3JkIG9uY2UgaXQgaGFzIGhhZCBhbgorICAgICAgICAgICAgICAgIC8vIG9wcG9ydHVuaXR5IHRv
IGJyZWFrIGFmdGVyIGEgd29yZC4KKyAgICAgICAgICAgICAgICBicmVha1dvcmRzID0gZmFsc2U7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtaWRXb3JkQnJlYWsgJiYgIVUxNl9J
U19UUkFJTChjKSAmJiAhKFVfR0VUX0dDX01BU0soYykgJiBVX0dDX01fTUFTSykpIHsKKyAgICAg
ICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIGFzIGEgYnJlYWthYmxlIHBvc2l0aW9uIGluIGNh
c2UKKyAgICAgICAgICAgICAgICAvLyBhZGRpbmcgdGhlIGVuZCB3aWR0aCBmb3JjZXMgYSBicmVh
ay4KKyAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8obV9jdXJyZW50Lm1fb2JqLCBt
X2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2FibGVQb3NpdGlvbik7CisgICAg
ICAgICAgICAgICAgbWlkV29yZEJyZWFrICY9IChicmVha1dvcmRzIHx8IGJyZWFrQWxsKTsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJldHdlZW5Xb3JkcykgeworICAgICAgICAg
ICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFj
aW5nIDogMDsKKyAgICAgICAgICAgICAgICB3b3JkU3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudCA9
IChhcHBseVdvcmRTcGFjaW5nICYmIHdvcmRNZWFzdXJlbWVudC53aWR0aCkgPyB3b3JkU3BhY2lu
ZyA6IDA7CisgICAgICAgICAgICAgICAgbGFzdFNwYWNlID0gbV9jdXJyZW50Lm1fcG9zOworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1faWdub3JpbmdTcGFjZXMgJiYgbV9jdXJy
ZW50U3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYg
d2UgZW5jb3VudGVyIGEgbmV3bGluZSwgb3IgaWYgd2UgZW5jb3VudGVyIGEKKyAgICAgICAgICAg
ICAgICAvLyBzZWNvbmQgc3BhY2UsIHdlIG5lZWQgdG8gZ28gYWhlYWQgYW5kIGJyZWFrIHVwIHRo
aXMKKyAgICAgICAgICAgICAgICAvLyBydW4gYW5kIGVudGVyIGEgbW9kZSB3aGVyZSB3ZSBzdGFy
dCBjb2xsYXBzaW5nIHNwYWNlcy4KKyAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50Q2hhcmFj
dGVySXNTcGFjZSAmJiBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UpIHsKKyAgICAgICAgICAgICAg
ICAgICAgbV9pZ25vcmluZ1NwYWNlcyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgLy8g
V2UganVzdCBlbnRlcmVkIGEgbW9kZSB3aGVyZSB3ZSBhcmUgaWdub3JpbmcKKyAgICAgICAgICAg
ICAgICAgICAgLy8gc3BhY2VzLiBDcmVhdGUgYSBtaWRwb2ludCB0byB0ZXJtaW5hdGUgdGhlIHJ1
bgorICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHNlY29uZCBzcGFjZS4KKyAgICAg
ICAgICAgICAgICAgICAgc3RhcnRJZ25vcmluZ1NwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBt
X3N0YXJ0T2ZJZ25vcmVkU3BhY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgbV90cmFpbGluZ09i
amVjdHMudXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxpbmdCb3hlcyhtX2xpbmVNaWRwb2ludFN0YXRl
LCBJbmxpbmVJdGVyYXRvcigpLCBUcmFpbGluZ09iamVjdHM6OkRvTm90Q29sbGFwc2VGaXJzdFNw
YWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBp
ZiAobV9pZ25vcmluZ1NwYWNlcykgeworICAgICAgICAgICAgLy8gU3RvcCBpZ25vcmluZyBzcGFj
ZXMgYW5kIGJlZ2luIGF0IHRoaXMKKyAgICAgICAgICAgIC8vIG5ldyBwb2ludC4KKyAgICAgICAg
ICAgIG1faWdub3JpbmdTcGFjZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRT
cGFjaW5nID0gYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFjaW5nIDogMDsKKyAgICAgICAgICAg
IHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50ID0gKGFwcGx5V29yZFNwYWNpbmcgJiYgd29y
ZE1lYXN1cmVtZW50cy5sYXN0KCkud2lkdGgpID8gd29yZFNwYWNpbmcgOiAwOworICAgICAgICAg
ICAgbGFzdFNwYWNlID0gbV9jdXJyZW50Lm1fcG9zOyAvLyBlLmcuLCAiRm9vICAgIGdvbyIsIGRv
bid0IGFkZCBpbiBhbnkgb2YgdGhlIGlnbm9yZWQgc3BhY2VzLgorICAgICAgICAgICAgc3RvcEln
bm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIG1fY3Vy
cmVudC5tX29iaiwgbV9jdXJyZW50Lm1fcG9zKSk7CisgICAgICAgIH0KKyNpZiBFTkFCTEUoU1ZH
KQorICAgICAgICBpZiAoaXNTVkdUZXh0ICYmIG1fY3VycmVudC5tX3BvcyA+IDApIHsKKyAgICAg
ICAgICAgIC8vIEZvcmNlIGNyZWF0aW9uIG9mIG5ldyBJbmxpbmVCb3hlcyBmb3IgZWFjaCBhYnNv
bHV0ZSBwb3NpdGlvbmVkIGNoYXJhY3RlciAodGhvc2UgdGhhdCBzdGFydCBuZXcgdGV4dCBjaHVu
a3MpLgorICAgICAgICAgICAgaWYgKHRvUmVuZGVyU1ZHSW5saW5lVGV4dChyZW5kZXJUZXh0KS0+
Y2hhcmFjdGVyU3RhcnRzTmV3VGV4dENodW5rKG1fY3VycmVudC5tX3BvcykpCisgICAgICAgICAg
ICAgICAgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9j
dXJyZW50KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKG1fY3VycmVudENoYXJh
Y3RlcklzU3BhY2UgJiYgIXByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSkgeworICAgICAgICAgICAg
bV9zdGFydE9mSWdub3JlZFNwYWNlcy5tX29iaiA9IG1fY3VycmVudC5tX29iajsKKyAgICAgICAg
ICAgIG1fc3RhcnRPZklnbm9yZWRTcGFjZXMubV9wb3MgPSBtX2N1cnJlbnQubV9wb3M7CisgICAg
ICAgICAgICAvLyBTcGFjZXMgYWZ0ZXIgcmlnaHQtYWxpZ25lZCB0ZXh0IGFuZCBiZWZvcmUgYSBs
aW5lLWJyZWFrIGdldCBjb2xsYXBzZWQgYXdheSBjb21wbGV0ZWx5IHNvIHRoYXQgdGhlIHRyYWls
aW5nCisgICAgICAgICAgICAvLyBzcGFjZSBkb2Vzbid0IHNlZW0gdG8gcHVzaCB0aGUgdGV4dCBv
dXQgZnJvbSB0aGUgcmlnaHQtaGFuZCBlZGdlLgorICAgICAgICAgICAgLy8gRklYTUU6IERvIHRo
aXMgcmVnYXJkbGVzcyBvZiB0aGUgY29udGFpbmVyJ3MgYWxpZ25tZW50IC0gd2lsbCByZXF1aXJl
IHJlYmFzZWxpbmluZyBhIGxvdCBvZiB0ZXN0IHJlc3VsdHMuCisgICAgICAgICAgICBpZiAobV9u
ZXh0T2JqZWN0ICYmIG1fbmV4dE9iamVjdC0+aXNCUigpICYmIChtX2Jsb2NrU3R5bGUudGV4dEFs
aWduKCkgPT0gUklHSFQgfHwgbV9ibG9ja1N0eWxlLnRleHRBbGlnbigpID09IFdFQktJVF9SSUdI
VCkpIHsKKyAgICAgICAgICAgICAgICBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLm1fcG9zLS07Cisg
ICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBqdXN0IGEgc2luZ2xlIHRyYWlsaW5nIHNwYWNl
IHN0YXJ0IGlnbm9yaW5nIGl0IG5vdyBzbyBpdCBjb2xsYXBzZXMgYXdheS4KKyAgICAgICAgICAg
ICAgICBpZiAobV9jdXJyZW50Lm1fcG9zID09IHJlbmRlclRleHQtPnRleHRMZW5ndGgoKSAtIDEp
CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0SWdub3JpbmdTcGFjZXMobV9saW5lTWlkcG9pbnRT
dGF0ZSwgbV9zdGFydE9mSWdub3JlZFNwYWNlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KworICAgICAgICBpZiAoIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgcHJldmlvdXNDaGFy
YWN0ZXJJc1dTKSB7CisgICAgICAgICAgICBpZiAobV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRTdHls
ZS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkpCisgICAgICAgICAgICAgICAgbV9saW5lQnJl
YWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1fcG9zLCBtX2N1cnJlbnQubV9u
ZXh0QnJlYWthYmxlUG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fY29sbGFw
c2VXaGl0ZVNwYWNlICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgIW1faWdub3JpbmdT
cGFjZXMpCisgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5zZXRUcmFpbGluZ1doaXRlc3Bh
Y2UodG9SZW5kZXJUZXh0KG1fY3VycmVudC5tX29iaikpOworICAgICAgICBlbHNlIGlmICghbV9j
dXJyZW50U3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpIHx8ICFtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlKQorICAgICAgICAgICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKKworICAgICAg
ICBtX2F0U3RhcnQgPSBmYWxzZTsKKyAgICAgICAgbmV4dENoYXJhY3RlcihjLCBsYXN0Q2hhcmFj
dGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpOworICAgIH0KKworICAgIG1fcmVuZGVyVGV4dElu
Zm8ubV9saW5lQnJlYWtJdGVyYXRvci5zZXRQcmlvckNvbnRleHQobGFzdENoYXJhY3Rlciwgc2Vj
b25kVG9MYXN0Q2hhcmFjdGVyKTsKKworICAgIHdvcmRNZWFzdXJlbWVudHMuZ3Jvdyh3b3JkTWVh
c3VyZW1lbnRzLnNpemUoKSArIDEpOworICAgIFdvcmRNZWFzdXJlbWVudCYgd29yZE1lYXN1cmVt
ZW50ID0gd29yZE1lYXN1cmVtZW50cy5sYXN0KCk7CisgICAgd29yZE1lYXN1cmVtZW50LnJlbmRl
cmVyID0gcmVuZGVyVGV4dDsKKworICAgIC8vIElNUE9SVEFOVDogY3VycmVudC5tX3BvcyBpcyA+
IGxlbmd0aCBoZXJlIQorICAgIGZsb2F0IGFkZGl0aW9uYWxUZW1wV2lkdGggPSBtX2lnbm9yaW5n
U3BhY2VzID8gMCA6IHRleHRXaWR0aChyZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVudC5t
X3BvcyAtIGxhc3RTcGFjZSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBp
dGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMs
IHRleHRMYXlvdXQpOworICAgIHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCA9IGxhc3RTcGFj
ZTsKKyAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9jdXJyZW50Lm1fcG9zOworICAg
IHdvcmRNZWFzdXJlbWVudC53aWR0aCA9IG1faWdub3JpbmdTcGFjZXMgPyAwIDogYWRkaXRpb25h
bFRlbXBXaWR0aCArIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50OworICAgIGFkZGl0aW9u
YWxUZW1wV2lkdGggKz0gbGFzdFNwYWNlV29yZFNwYWNpbmc7CisKKyAgICBmbG9hdCBpbmxpbmVM
b2dpY2FsVGVtcFdpZHRoID0gaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaiwgIW1f
YXBwbGllZFN0YXJ0V2lkdGgsIG1faW5jbHVkZUVuZFdpZHRoKTsKKyAgICBtX3dpZHRoLmFkZFVu
Y29tbWl0dGVkV2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0aCArIGlubGluZUxvZ2ljYWxUZW1wV2lk
dGgpOworCisgICAgaWYgKHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSAm
JiAhZmFsbGJhY2tGb250cy5pc0VtcHR5KCkpCisgICAgICAgIHdvcmRNZWFzdXJlbWVudC5mYWxs
YmFja0ZvbnRzLnN3YXAoZmFsbGJhY2tGb250cyk7CisgICAgZmFsbGJhY2tGb250cy5jbGVhcigp
OworCisgICAgaWYgKG1fY29sbGFwc2VXaGl0ZVNwYWNlICYmIG1fY3VycmVudENoYXJhY3Rlcklz
U3BhY2UgJiYgYWRkaXRpb25hbFRlbXBXaWR0aCkKKyAgICAgICAgbV93aWR0aC5zZXRUcmFpbGlu
Z1doaXRlc3BhY2VXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoLCBpbmxpbmVMb2dpY2FsVGVtcFdp
ZHRoKTsKKworICAgIG1faW5jbHVkZUVuZFdpZHRoID0gZmFsc2U7CisKKyAgICBpZiAoIW1fd2lk
dGguZml0c09uTGluZSgpKSB7CisgICAgICAgIGlmIChjYW5IeXBoZW5hdGUpCisgICAgICAgICAg
ICB0cnlIeXBoZW5hdGluZyhyZW5kZXJUZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwgY29uc2Vj
dXRpdmVIeXBoZW5hdGVkTGluZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMo
KSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0
QWZ0ZXIoKSwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MsIG1fd2lkdGguY3VycmVudFdpZHRo
KCkgLSBhZGRpdGlvbmFsVGVtcFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCksIGlzRml4
ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBtX2xp
bmVCcmVhaywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBtX2xpbmVCcmVha2Vy
Lm1faHlwaGVuYXRlZCk7CisKKyAgICAgICAgaWYgKCFoeXBoZW5hdGVkICYmIG1fbGluZUJyZWFr
LnByZXZpb3VzSW5TYW1lTm9kZSgpID09IHNvZnRIeXBoZW4gJiYgc3R5bGUuaHlwaGVucygpICE9
IEh5cGhlbnNOb25lKSB7CisgICAgICAgICAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKKyAgICAgICAg
ICAgIG1fYXRFbmQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsK
K30KKworaW5saW5lIGJvb2wgdGV4dEJlZ2luc1dpdGhCcmVha2FibGVQb3NpdGlvbihSZW5kZXJP
YmplY3QqIG5leHQpCit7CisgICAgQVNTRVJUKG5leHQtPmlzVGV4dCgpKTsKKyAgICBSZW5kZXJU
ZXh0KiBuZXh0VGV4dCA9IHRvUmVuZGVyVGV4dChuZXh0KTsKKyAgICBpZiAoIW5leHRUZXh0LT50
ZXh0TGVuZ3RoKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBVQ2hhciBjID0gbmV4dFRl
eHQtPmNoYXJhY3RlckF0KDApOworICAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdcdCcgfHwg
KGMgPT0gJ1xuJyAmJiAhbmV4dFRleHQtPnByZXNlcnZlc05ld2xpbmUoKSk7Cit9CisKK2lubGlu
ZSBib29sIEJyZWFraW5nQ29udGV4dDo6Y2FuQnJlYWtBdFRoaXNQb3NpdGlvbigpCit7CisgICAg
Ly8gSWYgd2UgYXJlIG5vLXdyYXAgYW5kIGhhdmUgZm91bmQgYSBsaW5lLWJyZWFraW5nIG9wcG9y
dHVuaXR5IGFscmVhZHkgdGhlbiB3ZSBzaG91bGQgdGFrZSBpdC4KKyAgICBpZiAobV93aWR0aC5j
b21taXR0ZWRXaWR0aCgpICYmICFtX3dpZHRoLmZpdHNPbkxpbmUobV9jdXJyZW50Q2hhcmFjdGVy
SXNTcGFjZSkgJiYgbV9jdXJyV1MgPT0gTk9XUkFQKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgIC8vIEF2b2lkIGJyZWFraW5nIGJlZm9yZSBlbXB0eSBpbmxpbmVzLgorICAgIGlmIChtX25l
eHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5pc1JlbmRlcklubGluZSgpICYmIGlzRW1wdHlJbmxp
bmUodG9SZW5kZXJJbmxpbmUoKm1fbmV4dE9iamVjdCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICAvLyBSZXR1cm4gZWFybHkgaWYgd2UgYXV0b3dyYXAgYW5kIHRoZSBjdXJyZW50IGNo
YXJhY3RlciBpcyBhIHNwYWNlIGFzIHdlIHdpbGwgYWx3YXlzIHdhbnQgdG8gYnJlYWsgYXQgc3Vj
aCBhIHBvc2l0aW9uLgorICAgIGlmIChtX2F1dG9XcmFwICYmIG1fY3VycmVudENoYXJhY3Rlcklz
U3BhY2UpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKG1fbmV4dE9iamVjdCAmJiBt
X25leHRPYmplY3QtPmlzTGluZUJyZWFrT3Bwb3J0dW5pdHkoKSkKKyAgICAgICAgcmV0dXJuIG1f
YXV0b1dyYXA7CisKKyAgICBib29sIG5leHRJc0F1dG9XcmFwcGluZ1RleHQgPSAobV9uZXh0T2Jq
ZWN0ICYmIG1fbmV4dE9iamVjdC0+aXNUZXh0KCkgJiYgKG1fYXV0b1dyYXAgfHwgbV9uZXh0T2Jq
ZWN0LT5zdHlsZSgpLmF1dG9XcmFwKCkpKTsKKyAgICBpZiAoIW5leHRJc0F1dG9XcmFwcGluZ1Rl
eHQpCisgICAgICAgIHJldHVybiBtX2F1dG9XcmFwOworICAgIGJvb2wgY3VycmVudElzVGV4dE9y
RW1wdHlJbmxpbmUgPSBtX2N1cnJlbnQubV9vYmotPmlzVGV4dCgpIHx8IChtX2N1cnJlbnQubV9v
YmotPmlzUmVuZGVySW5saW5lKCkgJiYgaXNFbXB0eUlubGluZSh0b1JlbmRlcklubGluZSgqbV9j
dXJyZW50Lm1fb2JqKSkpOworICAgIGlmICghY3VycmVudElzVGV4dE9yRW1wdHlJbmxpbmUpCisg
ICAgICAgIHJldHVybiBtX2F1dG9XcmFwOworCisgICAgYm9vbCBjYW5CcmVha0hlcmUgPSAhbV9j
dXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiB0ZXh0QmVnaW5zV2l0aEJyZWFrYWJsZVBvc2l0aW9u
KG1fbmV4dE9iamVjdCk7CisKKyAgICAvLyBTZWUgaWYgYXR0ZW1wdGluZyB0byBmaXQgYmVsb3cg
ZmxvYXRzIGNyZWF0ZXMgbW9yZSBhdmFpbGFibGUgd2lkdGggb24gdGhlIGxpbmUuCisgICAgaWYg
KCFtX3dpZHRoLmZpdHNPbkxpbmUoKSAmJiAhbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpKQorICAg
ICAgICBtX3dpZHRoLmZpdEJlbG93RmxvYXRzKCk7CisKKyAgICBib29sIGNhblBsYWNlT25MaW5l
ID0gbV93aWR0aC5maXRzT25MaW5lKCkgfHwgIW1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZTsK
KworICAgIGlmIChjYW5QbGFjZU9uTGluZSAmJiBjYW5CcmVha0hlcmUpCisgICAgICAgIGNvbW1p
dExpbmVCcmVha0F0Q3VycmVudFdpZHRoKG1fbmV4dE9iamVjdCk7CisKKyAgICByZXR1cm4gY2Fu
QnJlYWtIZXJlOworfQorCitpbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmNvbW1pdEFuZFVw
ZGF0ZUxpbmVCcmVha0lmTmVlZGVkKCkKK3sKKyAgICBib29sIGNoZWNrRm9yQnJlYWsgPSBjYW5C
cmVha0F0VGhpc1Bvc2l0aW9uKCk7CisKKyAgICBpZiAoY2hlY2tGb3JCcmVhayAmJiAhbV93aWR0
aC5maXRzT25MaW5lKG1faWdub3JpbmdTcGFjZXMpKSB7CisgICAgICAgIC8vIGlmIHdlIGhhdmUg
ZmxvYXRzLCB0cnkgdG8gZ2V0IGJlbG93IHRoZW0uCisgICAgICAgIGlmIChtX2N1cnJlbnRDaGFy
YWN0ZXJJc1NwYWNlICYmICFtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jb2xs
YXBzZVdoaXRlU3BhY2UoKSkKKyAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7
CisKKyAgICAgICAgaWYgKG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSkgeworICAgICAgICAgICAg
bV9hdEVuZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAg
ICBtX3dpZHRoLmZpdEJlbG93RmxvYXRzKCk7CisKKyAgICAgICAgLy8gfHdpZHRofCBtYXkgaGF2
ZSBiZWVuIGFkanVzdGVkIGJlY2F1c2Ugd2UgZ290IHNob3ZlZCBkb3duIHBhc3QgYSBmbG9hdCAo
dGh1cworICAgICAgICAvLyBnaXZpbmcgdXMgbW9yZSByb29tKSwgc28gd2UgbmVlZCB0byByZXRl
c3QsIGFuZCBvbmx5IGp1bXAgdG8KKyAgICAgICAgLy8gdGhlIGVuZCBsYWJlbCBpZiB3ZSBzdGls
bCBkb24ndCBmaXQgb24gdGhlIGxpbmUuIC1kd2gKKyAgICAgICAgaWYgKCFtX3dpZHRoLmZpdHNP
bkxpbmUobV9pZ25vcmluZ1NwYWNlcykpIHsKKyAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOwor
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtX2Jsb2NrU3R5
bGUuYXV0b1dyYXAoKSAmJiAhbV93aWR0aC5maXRzT25MaW5lKCkgJiYgIW1fd2lkdGguY29tbWl0
dGVkV2lkdGgoKSkgeworICAgICAgICAvLyBJZiB0aGUgY29udGFpbmVyIGF1dG93cmFwcyBidXQg
dGhlIGN1cnJlbnQgY2hpbGQgZG9lcyBub3QgdGhlbiB3ZSBzdGlsbCBuZWVkIHRvIGVuc3VyZSB0
aGF0IGl0CisgICAgICAgIC8vIHdyYXBzIGFuZCBtb3ZlcyBiZWxvdyBhbnkgZmxvYXRzLgorICAg
ICAgICBtX3dpZHRoLmZpdEJlbG93RmxvYXRzKCk7CisgICAgfQorCisgICAgaWYgKCFtX2N1cnJl
bnQubV9vYmotPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkgeworICAgICAgICBt
X2xhc3RPYmplY3QgPSBtX2N1cnJlbnQubV9vYmo7CisgICAgICAgIGlmIChtX2xhc3RPYmplY3Qt
PmlzUmVwbGFjZWQoKSAmJiBtX2F1dG9XcmFwICYmICghbV9sYXN0T2JqZWN0LT5pc0ltYWdlKCkg
fHwgbV9hbGxvd0ltYWdlc1RvQnJlYWspICYmICghbV9sYXN0T2JqZWN0LT5pc0xpc3RNYXJrZXIo
KSB8fCB0b1JlbmRlckxpc3RNYXJrZXIoKm1fbGFzdE9iamVjdCkuaXNJbnNpZGUoKSkpIHsKKyAg
ICAgICAgICAgIG1fd2lkdGguY29tbWl0KCk7CisgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3Zl
VG9TdGFydE9mKG1fbmV4dE9iamVjdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2lubGluZSB2
b2lkIGNoZWNrTWlkcG9pbnRzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwg
SW5saW5lSXRlcmF0b3ImIGxCcmVhaykKK3sKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgb3VyIGxh
c3QgbWlkcG9pbnQgaXMgYSBzdGFydCBwb2ludCBiZXlvbmQgdGhlIGxpbmUgYnJlYWsuIElmIHNv
LAorICAgIC8vIHNoYXZlIGl0IG9mZiB0aGUgbGlzdCwgYW5kIHNoYXZlIG9mZiBhIHRyYWlsaW5n
IHNwYWNlIGlmIHRoZSBwcmV2aW91cyBlbmQgcG9pbnQgZG9lc24ndAorICAgIC8vIHByZXNlcnZl
IHdoaXRlc3BhY2UuCisgICAgaWYgKGxCcmVhay5tX29iaiAmJiBsaW5lTWlkcG9pbnRTdGF0ZS5u
dW1NaWRwb2ludHMgJiYgIShsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgJSAyKSkgewor
ICAgICAgICBJbmxpbmVJdGVyYXRvciogbWlkcG9pbnRzID0gbGluZU1pZHBvaW50U3RhdGUubWlk
cG9pbnRzLmRhdGEoKTsKKyAgICAgICAgSW5saW5lSXRlcmF0b3ImIGVuZHBvaW50ID0gbWlkcG9p
bnRzW2xpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAtIDJdOworICAgICAgICBjb25zdCBJ
bmxpbmVJdGVyYXRvciYgc3RhcnRwb2ludCA9IG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0ZS5u
dW1NaWRwb2ludHMgLSAxXTsKKyAgICAgICAgSW5saW5lSXRlcmF0b3IgY3VycnBvaW50ID0gZW5k
cG9pbnQ7CisgICAgICAgIHdoaWxlICghY3VycnBvaW50LmF0RW5kKCkgJiYgY3VycnBvaW50ICE9
IHN0YXJ0cG9pbnQgJiYgY3VycnBvaW50ICE9IGxCcmVhaykKKyAgICAgICAgICAgIGN1cnJwb2lu
dC5pbmNyZW1lbnQoKTsKKyAgICAgICAgaWYgKGN1cnJwb2ludCA9PSBsQnJlYWspIHsKKyAgICAg
ICAgICAgIC8vIFdlIGhpdCB0aGUgbGluZSBicmVhayBiZWZvcmUgdGhlIHN0YXJ0IHBvaW50LiBT
aGF2ZSBvZmYgdGhlIHN0YXJ0IHBvaW50LgorICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUu
bnVtTWlkcG9pbnRzLS07CisgICAgICAgICAgICBpZiAoZW5kcG9pbnQubV9vYmotPnN0eWxlKCku
Y29sbGFwc2VXaGl0ZVNwYWNlKCkgJiYgZW5kcG9pbnQubV9vYmotPmlzVGV4dCgpKQorICAgICAg
ICAgICAgICAgIGVuZHBvaW50Lm1fcG9zLS07CisgICAgICAgIH0KKyAgICB9Cit9CisKK0lubGlu
ZUl0ZXJhdG9yIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRW5kT2ZMaW5lKCkKK3sKKyNpZiBFTkFC
TEUoQ1NTX1NIQVBFUykKKyAgICBTaGFwZUluc2lkZUluZm8qIHNoYXBlSW5mbyA9IG1fYmxvY2su
bGF5b3V0U2hhcGVJbnNpZGVJbmZvKCk7CisgICAgYm9vbCBzZWdtZW50QWxsb3dzT3ZlcmZsb3cg
PSAhc2hhcGVJbmZvIHx8ICFzaGFwZUluZm8tPmhhc1NlZ21lbnRzKCk7CisjZWxzZQorICAgIGJv
b2wgc2VnbWVudEFsbG93c092ZXJmbG93ID0gdHJ1ZTsKKyNlbmRpZgorICAgIGlmIChzZWdtZW50
QWxsb3dzT3ZlcmZsb3cpIHsKKyAgICAgICAgaWYgKG1fbGluZUJyZWFrID09IG1fcmVzb2x2ZXIu
cG9zaXRpb24oKSkgeworICAgICAgICAgICAgaWYgKCFtX2xpbmVCcmVhay5tX29iaiB8fCAhbV9s
aW5lQnJlYWsubV9vYmotPmlzQlIoKSkgeworICAgICAgICAgICAgICAgIC8vIHdlIGp1c3QgYWRk
IGFzIG11Y2ggYXMgcG9zc2libGUKKyAgICAgICAgICAgICAgICBpZiAobV9ibG9ja1N0eWxlLndo
aXRlU3BhY2UoKSA9PSBQUkUgJiYgIW1fY3VycmVudC5tX3BvcykgeworICAgICAgICAgICAgICAg
ICAgICBtX2xpbmVCcmVhay5tb3ZlVG8obV9sYXN0T2JqZWN0LCBtX2xhc3RPYmplY3QtPmlzVGV4
dCgpID8gbV9sYXN0T2JqZWN0LT5sZW5ndGgoKSA6IDApOworICAgICAgICAgICAgICAgIH0gZWxz
ZSBpZiAobV9saW5lQnJlYWsubV9vYmopIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3Qg
ZXZlciBicmVhayBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBpZiB3ZSBjYW4gaGVscCBpdC4KKyAg
ICAgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyByb29tIGF0IGFsbC4gV2UganVzdCBoYXZl
IHRvIGJlIG9uIHRoaXMgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiB0aG91Z2gg
d2UnbGwgc3BpbGwgb3V0LgorICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG8o
bV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MpOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBjb25zdW1lIGF0IGxlYXN0
IG9uZSBjaGFyL29iamVjdC4KKyAgICAgICAgICAgIGlmIChtX2xpbmVCcmVhayA9PSBtX3Jlc29s
dmVyLnBvc2l0aW9uKCkpCisgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7
CisgICAgICAgIH0gZWxzZSBpZiAoIW1fY3VycmVudC5tX3BvcyAmJiAhbV93aWR0aC5jb21taXR0
ZWRXaWR0aCgpICYmIG1fd2lkdGgudW5jb21taXR0ZWRXaWR0aCgpICYmICFtX2hhZFVuY29tbWl0
dGVkV2lkdGhCZWZvcmVDdXJyZW50KSB7CisgICAgICAgICAgICAvLyBEbyBub3QgcHVzaCB0aGUg
Y3VycmVudCBvYmplY3QgdG8gdGhlIG5leHQgbGluZSwgd2hlbiB0aGlzIGxpbmUgaGFzIHNvbWUg
Y29udGVudCwgYnV0IGl0IGlzIHN0aWxsIGNvbnNpZGVyZWQgZW1wdHkuCisgICAgICAgICAgICAv
LyBFbXB0eSBpbmxpbmUgZWxlbWVudHMgbGlrZSA8c3Bhbj48L3NwYW4+IGNhbiBwcm9kdWNlIHN1
Y2ggbGluZXMgYW5kIG5vdyB3ZSBqdXN0IGlnbm9yZSB0aGVzZSBicmVhayBvcHBvcnR1bml0aWVz
CisgICAgICAgICAgICAvLyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLCBpZiBubyB3aWR0aCBoYXMg
YmVlbiBjb21taXR0ZWQgeWV0LgorICAgICAgICAgICAgLy8gQmVoYXZlIGFzIGlmIGl0IHdhcyBh
Y3R1YWxseSBlbXB0eSBhbmQgY29uc3VtZSBhdCBsZWFzdCBvbmUgb2JqZWN0LgorICAgICAgICAg
ICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBT
YW5pdHkgY2hlY2sgb3VyIG1pZHBvaW50cy4KKyAgICBjaGVja01pZHBvaW50cyhtX2xpbmVNaWRw
b2ludFN0YXRlLCBtX2xpbmVCcmVhayk7CisKKyAgICBtX3RyYWlsaW5nT2JqZWN0cy51cGRhdGVN
aWRwb2ludHNGb3JUcmFpbGluZ0JveGVzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fbGluZUJyZWFr
LCBUcmFpbGluZ09iamVjdHM6OkNvbGxhcHNlRmlyc3RTcGFjZSk7CisKKyAgICAvLyBXZSBtaWdo
dCBoYXZlIG1hZGUgbGluZUJyZWFrIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHBhc3QgdGhlIGVu
ZAorICAgIC8vIG9mIHRoZSBvYmplY3QuIERvIHRoaXMgYWRqdXN0bWVudCB0byBtYWtlIGl0IHBv
aW50IHRvIHRoZSBzdGFydAorICAgIC8vIG9mIHRoZSBuZXh0IG9iamVjdCBpbnN0ZWFkIHRvIGF2
b2lkIGNvbmZ1c2luZyB0aGUgcmVzdCBvZiB0aGUKKyAgICAvLyBjb2RlLgorICAgIGlmIChtX2xp
bmVCcmVhay5tX3BvcyA+IDApIHsKKyAgICAgICAgbV9saW5lQnJlYWsubV9wb3MtLTsKKyAgICAg
ICAgbV9saW5lQnJlYWsuaW5jcmVtZW50KCk7CisgICAgfQorCisgICAgcmV0dXJuIG1fbGluZUJy
ZWFrOworfQorCit9CisKKyNlbmRpZiAvLyBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzX2gK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjkzYmJjCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIuY3BwCkBAIC0wLDAgKzEs
ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9y
ZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwg
MjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChD
KSAyMDEzIENoYW5nU2VvayBPaCA8c2hpdmFtaWRvd0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQg
KEMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJMaW5lQnJlYWtlci5oIgorCisjaW5jbHVkZSAiUmVu
ZGVyQ29tYmluZVRleHQuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIExpbmVCcmVh
a2VyOjpyZXNldCgpCit7CisgICAgbV9wb3NpdGlvbmVkT2JqZWN0cy5jbGVhcigpOworICAgIG1f
aHlwaGVuYXRlZCA9IGZhbHNlOworICAgIG1fY2xlYXIgPSBDTk9ORTsKK30KKworLy8gRklYTUU6
IFRoZSBlbnRpcmUgY29uY2VwdCBvZiB0aGUgc2tpcFRyYWlsaW5nV2hpdGVzcGFjZSBmdW5jdGlv
biBpcyBmbGF3ZWQsIHNpbmNlIHdlIHJlYWxseSBuZWVkIHRvIGJlIGJ1aWxkaW5nCisvLyBsaW5l
IGJveGVzIGV2ZW4gZm9yIGNvbnRhaW5lcnMgdGhhdCBtYXkgdWx0aW1hdGVseSBjb2xsYXBzZSBh
d2F5LiBPdGhlcndpc2Ugd2UnbGwgbmV2ZXIgZ2V0IHBvc2l0aW9uZWQKKy8vIGVsZW1lbnRzIHF1
aXRlIHJpZ2h0LiBJbiBvdGhlciB3b3Jkcywgd2UgbmVlZCB0byBidWlsZCB0aGlzIGZ1bmN0aW9u
J3Mgd29yayBpbnRvIHRoZSBub3JtYWwgbGluZQorLy8gb2JqZWN0IGl0ZXJhdGlvbiBwcm9jZXNz
LgorLy8gTkIuIHRoaXMgZnVuY3Rpb24gd2lsbCBpbnNlcnQgYW55IGZsb2F0aW5nIGVsZW1lbnRz
IHRoYXQgd291bGQgb3RoZXJ3aXNlCisvLyBiZSBza2lwcGVkIGJ1dCBpdCB3aWxsIG5vdCBwb3Np
dGlvbiB0aGVtLgordm9pZCBMaW5lQnJlYWtlcjo6c2tpcFRyYWlsaW5nV2hpdGVzcGFjZShJbmxp
bmVJdGVyYXRvciYgaXRlcmF0b3IsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykKK3sKKyAgICB3
aGlsZSAoIWl0ZXJhdG9yLmF0RW5kKCkgJiYgIXJlcXVpcmVzTGluZUJveChpdGVyYXRvciwgbGlu
ZUluZm8sIFRyYWlsaW5nV2hpdGVzcGFjZSkpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0JiBvYmpl
Y3QgPSAqaXRlcmF0b3IubV9vYmo7CisgICAgICAgIGlmIChvYmplY3QuaXNPdXRPZkZsb3dQb3Np
dGlvbmVkKCkpCisgICAgICAgICAgICBzZXRTdGF0aWNQb3NpdGlvbnMobV9ibG9jaywgdG9SZW5k
ZXJCb3gob2JqZWN0KSk7CisgICAgICAgIGVsc2UgaWYgKG9iamVjdC5pc0Zsb2F0aW5nKCkpCisg
ICAgICAgICAgICBtX2Jsb2NrLmluc2VydEZsb2F0aW5nT2JqZWN0KHRvUmVuZGVyQm94KG9iamVj
dCkpOworICAgICAgICBpdGVyYXRvci5pbmNyZW1lbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgTGlu
ZUJyZWFrZXI6OnNraXBMZWFkaW5nV2hpdGVzcGFjZShJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29s
dmVyLCBMaW5lSW5mbyYgbGluZUluZm8sIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJl
dmlvdXNMaW5lLCBMaW5lV2lkdGgmIHdpZHRoKQoreworICAgIHdoaWxlICghcmVzb2x2ZXIucG9z
aXRpb24oKS5hdEVuZCgpICYmICFyZXF1aXJlc0xpbmVCb3gocmVzb2x2ZXIucG9zaXRpb24oKSwg
bGluZUluZm8sIExlYWRpbmdXaGl0ZXNwYWNlKSkgeworICAgICAgICBSZW5kZXJPYmplY3QmIG9i
amVjdCA9ICpyZXNvbHZlci5wb3NpdGlvbigpLm1fb2JqOworICAgICAgICBpZiAob2JqZWN0Lmlz
T3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7CisgICAgICAgICAgICBzZXRTdGF0aWNQb3NpdGlvbnMo
bV9ibG9jaywgdG9SZW5kZXJCb3gob2JqZWN0KSk7CisgICAgICAgICAgICBpZiAob2JqZWN0LnN0
eWxlKCkuaXNPcmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBy
ZXNvbHZlci5ydW5zKCkuYWRkUnVuKG5ldyBCaWRpUnVuKDAsIDEsIG9iamVjdCwgcmVzb2x2ZXIu
Y29udGV4dCgpLCByZXNvbHZlci5kaXIoKSkpOworICAgICAgICAgICAgICAgIGxpbmVJbmZvLmlu
Y3JlbWVudFJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfSBlbHNlIGlmIChvYmplY3QuaXNGbG9hdGluZygpKSB7CisgICAgICAgICAgICAvLyBUaGUg
dG9wIG1hcmdpbiBlZGdlIG9mIGEgc2VsZi1jb2xsYXBzaW5nIGJsb2NrIHRoYXQgY2xlYXJzIGEg
ZmxvYXQgaW50cnVkZXMgdXAgaW50byBpdCBieSB0aGUgaGVpZ2h0IG9mIHRoZSBtYXJnaW4sCisg
ICAgICAgICAgICAvLyBzbyBpbiBvcmRlciB0byBwbGFjZSB0aGlzIGZpcnN0IGNoaWxkIGZsb2F0
IGF0IHRoZSB0b3AgY29udGVudCBlZGdlIG9mIHRoZSBzZWxmLWNvbGxhcHNpbmcgYmxvY2sgYWRk
IHRoZSBtYXJnaW4gYmFjayBpbiBiZWZvcmUgcGxhY2VtZW50LgorICAgICAgICAgICAgTGF5b3V0
VW5pdCBtYXJnaW5PZmZzZXQgPSAoIW9iamVjdC5wcmV2aW91c1NpYmxpbmcoKSAmJiBtX2Jsb2Nr
LmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpICYmIG1fYmxvY2suc3R5bGUoKS5jbGVhcigpICYmIG1f
YmxvY2suZ2V0Q2xlYXJEZWx0YShtX2Jsb2NrLCBMYXlvdXRVbml0KCkpKSA/IG1fYmxvY2suY29s
bGFwc2VkTWFyZ2luQmVmb3JlRm9yQ2hpbGQobV9ibG9jaykgOiBMYXlvdXRVbml0KCk7CisgICAg
ICAgICAgICBMYXlvdXRVbml0IG9sZExvZ2ljYWxIZWlnaHQgPSBtX2Jsb2NrLmxvZ2ljYWxIZWln
aHQoKTsKKyAgICAgICAgICAgIG1fYmxvY2suc2V0TG9naWNhbEhlaWdodChvbGRMb2dpY2FsSGVp
Z2h0ICsgbWFyZ2luT2Zmc2V0KTsKKyAgICAgICAgICAgIG1fYmxvY2sucG9zaXRpb25OZXdGbG9h
dE9uTGluZShtX2Jsb2NrLmluc2VydEZsb2F0aW5nT2JqZWN0KHRvUmVuZGVyQm94KG9iamVjdCkp
LCBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBsaW5lSW5mbywgd2lkdGgpOworICAgICAgICAg
ICAgbV9ibG9jay5zZXRMb2dpY2FsSGVpZ2h0KG9sZExvZ2ljYWxIZWlnaHQpOworICAgICAgICB9
IGVsc2UgaWYgKG9iamVjdC5pc1RleHQoKSAmJiBvYmplY3Quc3R5bGUoKS5oYXNUZXh0Q29tYmlu
ZSgpICYmIG9iamVjdC5pc0NvbWJpbmVUZXh0KCkgJiYgIXRvUmVuZGVyQ29tYmluZVRleHQob2Jq
ZWN0KS5pc0NvbWJpbmVkKCkpIHsKKyAgICAgICAgICAgIHRvUmVuZGVyQ29tYmluZVRleHQob2Jq
ZWN0KS5jb21iaW5lVGV4dCgpOworICAgICAgICAgICAgaWYgKHRvUmVuZGVyQ29tYmluZVRleHQo
b2JqZWN0KS5pc0NvbWJpbmVkKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IH0KKyAgICAgICAgcmVzb2x2ZXIuaW5jcmVtZW50KCk7CisgICAgfQorICAgIHJlc29sdmVyLmNv
bW1pdEV4cGxpY2l0RW1iZWRkaW5nKCk7Cit9CisKK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmggYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvbGluZS9MaW5lQnJlYWtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
Ljc1ZWNmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGlu
ZS9MaW5lQnJlYWtlci5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDAgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAw
NCwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdo
dCByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEzIENoYW5nU2VvayBPaCA8c2hpdmFtaWRv
d0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmMuIEFs
bCByaWdodCByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0x
MzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgTGluZUJyZWFrZXJfaAorI2RlZmluZSBMaW5l
QnJlYWtlcl9oCisKKyNpbmNsdWRlICJJbmxpbmVJdGVyYXRvci5oIgorI2luY2x1ZGUgIkxpbmVJ
bmZvLmgiCisjaW5jbHVkZSAiTGluZUlubGluZUhlYWRlcnMuaCIKKyNpbmNsdWRlIDx3dGYvVmVj
dG9yLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUmVuZGVyVGV4dDsKKworc3Ry
dWN0IFJlbmRlclRleHRJbmZvIHsKKyAgICAvLyBEZXN0cnVjdGlvbiBvZiBtX2xheW91dCByZXF1
aXJlcyBUZXh0TGF5b3V0IHRvIGJlIGEgY29tcGxldGUgdHlwZSwgc28gdGhlIGNvbnN0cnVjdG9y
IGFuZCBkZXN0cnVjdG9yIGFyZSBtYWRlIG5vbi1pbmxpbmUgdG8gYXZvaWQgY29tcGlsYXRpb24g
ZXJyb3JzLgorICAgIFJlbmRlclRleHRJbmZvKCk7CisgICAgflJlbmRlclRleHRJbmZvKCk7CisK
KyAgICBSZW5kZXJUZXh0KiBtX3RleHQ7CisgICAgT3duUHRyPFRleHRMYXlvdXQ+IG1fbGF5b3V0
OworICAgIExhenlMaW5lQnJlYWtJdGVyYXRvciBtX2xpbmVCcmVha0l0ZXJhdG9yOworICAgIGNv
bnN0IEZvbnQqIG1fZm9udDsKK307CisKK2NsYXNzIExpbmVCcmVha2VyIHsKK3B1YmxpYzoKKyAg
ICBmcmllbmQgY2xhc3MgQnJlYWtpbmdDb250ZXh0OworICAgIExpbmVCcmVha2VyKFJlbmRlckJs
b2NrRmxvdyYgYmxvY2spCisgICAgICAgIDogbV9ibG9jayhibG9jaykKKyAgICB7CisgICAgICAg
IHJlc2V0KCk7CisgICAgfQorCisgICAgSW5saW5lSXRlcmF0b3IgbmV4dExpbmVCcmVhayhJbmxp
bmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYsIFJlbmRlclRleHRJbmZvJiwgRmxvYXRpbmdPYmpl
Y3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVu
YXRlZExpbmVzLCBXb3JkTWVhc3VyZW1lbnRzJik7CisKKyAgICBib29sIGxpbmVXYXNIeXBoZW5h
dGVkKCkgeyByZXR1cm4gbV9oeXBoZW5hdGVkOyB9CisgICAgY29uc3QgVmVjdG9yPFJlbmRlckJv
eCo+JiBwb3NpdGlvbmVkT2JqZWN0cygpIHsgcmV0dXJuIG1fcG9zaXRpb25lZE9iamVjdHM7IH0K
KyAgICBFQ2xlYXIgY2xlYXIoKSB7IHJldHVybiBtX2NsZWFyOyB9CisKK3ByaXZhdGU6CisgICAg
dm9pZCByZXNldCgpOworCisgICAgSW5saW5lSXRlcmF0b3IgbmV4dFNlZ21lbnRCcmVhayhJbmxp
bmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYsIFJlbmRlclRleHRJbmZvJiwgRmxvYXRpbmdPYmpl
Y3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVu
YXRlZExpbmVzLCBXb3JkTWVhc3VyZW1lbnRzJik7CisgICAgdm9pZCBza2lwVHJhaWxpbmdXaGl0
ZXNwYWNlKElubGluZUl0ZXJhdG9yJiwgY29uc3QgTGluZUluZm8mKTsKKyAgICB2b2lkIHNraXBM
ZWFkaW5nV2hpdGVzcGFjZShJbmxpbmVCaWRpUmVzb2x2ZXImLCBMaW5lSW5mbyYsIEZsb2F0aW5n
T2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBMaW5lV2lkdGgmKTsKKworICAgIFJl
bmRlckJsb2NrRmxvdyYgbV9ibG9jazsKKyAgICBib29sIG1faHlwaGVuYXRlZDsKKyAgICBFQ2xl
YXIgbV9jbGVhcjsKKyAgICBWZWN0b3I8UmVuZGVyQm94Kj4gbV9wb3NpdGlvbmVkT2JqZWN0czsK
K307CisKK30KKworI2VuZGlmIC8vIExpbmVCcmVha2VyX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmZvLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9saW5lL0xpbmVJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li5kYTcxOGFkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xp
bmUvTGluZUluZm8uY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgY29w
eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcK
KyAqICAgIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgZGlzY2xhaW1lciBpbiB0
aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRQorICogQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyAq
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJMaW5lSW5mby5oIgorCisjaW5jbHVkZSAiUmVuZGVyQmxvY2suaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIExpbmVJbmZvOjpzZXRFbXB0eShib29sIGVtcHR5
LCBSZW5kZXJCbG9jayogYmxvY2ssIExpbmVXaWR0aCogbGluZVdpZHRoKQoreworICAgIGlmICht
X2lzRW1wdHkgPT0gZW1wdHkpCisgICAgICAgIHJldHVybjsKKyAgICBtX2lzRW1wdHkgPSBlbXB0
eTsKKyAgICBpZiAoIWVtcHR5ICYmIGJsb2NrICYmIGZsb2F0UGFnaW5hdGlvblN0cnV0KCkpIHsK
KyAgICAgICAgYmxvY2stPnNldExvZ2ljYWxIZWlnaHQoYmxvY2stPmxvZ2ljYWxIZWlnaHQoKSAr
IGZsb2F0UGFnaW5hdGlvblN0cnV0KCkpOworICAgICAgICBzZXRGbG9hdFBhZ2luYXRpb25TdHJ1
dCgwKTsKKyAgICAgICAgbGluZVdpZHRoLT51cGRhdGVBdmFpbGFibGVXaWR0aCgpOworICAgIH0K
K30KKworfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUlu
Zm8uaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmZvLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzNjZjNwotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmZvLmgKQEAgLTAsMCArMSw3NiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlCisgKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
CisgKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMKKyAqICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBDT1BZUklHSFQg
SE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2lmbmRlZiBMaW5lSW5mb19oCisjZGVmaW5lIExpbmVJbmZvX2gKKworI2luY2x1ZGUg
IkxpbmVXaWR0aC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFJlbmRlckJsb2Nr
OworCitjbGFzcyBMaW5lSW5mbyB7CitwdWJsaWM6CisgICAgTGluZUluZm8oKQorICAgICAgICA6
IG1faXNGaXJzdExpbmUodHJ1ZSkKKyAgICAgICAgLCBtX2lzTGFzdExpbmUoZmFsc2UpCisgICAg
ICAgICwgbV9pc0VtcHR5KHRydWUpCisgICAgICAgICwgbV9wcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHkodHJ1ZSkKKyAgICAgICAgLCBtX2Zsb2F0UGFnaW5hdGlvblN0cnV0KDApCisgICAgICAgICwg
bV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKDApCisgICAgeyB9CisKKyAgICBib29sIGlzRmly
c3RMaW5lKCkgY29uc3QgeyByZXR1cm4gbV9pc0ZpcnN0TGluZTsgfQorICAgIGJvb2wgaXNMYXN0
TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNMYXN0TGluZTsgfQorICAgIGJvb2wgaXNFbXB0eSgp
IGNvbnN0IHsgcmV0dXJuIG1faXNFbXB0eTsgfQorICAgIGJvb2wgcHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5KCkgY29uc3QgeyByZXR1cm4gbV9wcmV2aW91c0xpbmVCcm9rZUNsZWFubHk7IH0KKyAg
ICBMYXlvdXRVbml0IGZsb2F0UGFnaW5hdGlvblN0cnV0KCkgY29uc3QgeyByZXR1cm4gbV9mbG9h
dFBhZ2luYXRpb25TdHJ1dDsgfQorICAgIHVuc2lnbmVkIHJ1bnNGcm9tTGVhZGluZ1doaXRlc3Bh
Y2UoKSBjb25zdCB7IHJldHVybiBtX3J1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2U7IH0KKyAgICB2
b2lkIHJlc2V0UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgpIHsgbV9ydW5zRnJvbUxlYWRpbmdX
aGl0ZXNwYWNlID0gMDsgfQorICAgIHZvaWQgaW5jcmVtZW50UnVuc0Zyb21MZWFkaW5nV2hpdGVz
cGFjZSgpIHsgbV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKys7IH0KKworICAgIHZvaWQgc2V0
Rmlyc3RMaW5lKGJvb2wgZmlyc3RMaW5lKSB7IG1faXNGaXJzdExpbmUgPSBmaXJzdExpbmU7IH0K
KyAgICB2b2lkIHNldExhc3RMaW5lKGJvb2wgbGFzdExpbmUpIHsgbV9pc0xhc3RMaW5lID0gbGFz
dExpbmU7IH0KKyAgICB2b2lkIHNldEVtcHR5KGJvb2wgZW1wdHksIFJlbmRlckJsb2NrKiBibG9j
ayA9IDAsIExpbmVXaWR0aCogbGluZVdpZHRoID0gMCk7CisgICAgdm9pZCBzZXRQcmV2aW91c0xp
bmVCcm9rZUNsZWFubHkoYm9vbCBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHkpIHsgbV9wcmV2aW91
c0xpbmVCcm9rZUNsZWFubHkgPSBwcmV2aW91c0xpbmVCcm9rZUNsZWFubHk7IH0KKyAgICB2b2lk
IHNldEZsb2F0UGFnaW5hdGlvblN0cnV0KExheW91dFVuaXQgc3RydXQpIHsgbV9mbG9hdFBhZ2lu
YXRpb25TdHJ1dCA9IHN0cnV0OyB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtX2lzRmlyc3RMaW5l
OworICAgIGJvb2wgbV9pc0xhc3RMaW5lOworICAgIGJvb2wgbV9pc0VtcHR5OworICAgIGJvb2wg
bV9wcmV2aW91c0xpbmVCcm9rZUNsZWFubHk7CisgICAgTGF5b3V0VW5pdCBtX2Zsb2F0UGFnaW5h
dGlvblN0cnV0OworICAgIHVuc2lnbmVkIG1fcnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZTsKK307
CisKK30KKworI2VuZGlmIC8vIExpbmVJbmZvX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9saW5lL0xpbmVJbmxpbmVIZWFkZXJzLmggYi9Tb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvbGluZS9MaW5lSW5saW5lSGVhZGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjc1YTFiZWUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvbGluZS9MaW5lSW5saW5lSGVhZGVycy5oCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDAwIExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiBDb3B5cmln
aHQgKEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgQXBw
bGUgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBDaGFuZ1Nl
b2sgT2ggPHNoaXZhbWlkb3dAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2Jl
IFN5c3RlbXMgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIExpbmVJbmxpbmVI
ZWFkZXJzX2gKKyNkZWZpbmUgTGluZUlubGluZUhlYWRlcnNfaAorCisjaW5jbHVkZSAiUmVuZGVy
TGF5ZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitlbnVtIFdoaXRlc3BhY2VQb3NpdGlv
biB7IExlYWRpbmdXaGl0ZXNwYWNlLCBUcmFpbGluZ1doaXRlc3BhY2UgfTsKKworaW5saW5lIGJv
b2wgaGFzSW5saW5lRGlyZWN0aW9uQm9yZGVyc1BhZGRpbmdPck1hcmdpbihjb25zdCBSZW5kZXJJ
bmxpbmUmIGZsb3cpCit7CisgICAgLy8gV2hlcmUgYW4gZW1wdHkgaW5saW5lIGlzIHNwbGl0IGFj
cm9zcyBhbm9ueW1vdXMgYmxvY2tzIHdlIHNob3VsZCBvbmx5IGdpdmUgbGluZWJveGVzIHRvIHRo
ZSAnc2lkZXMnIG9mIHRoZQorICAgIC8vIGlubGluZSB0aGF0IGhhdmUgYm9yZGVycywgcGFkZGlu
ZyBvciBtYXJnaW4uCisgICAgYm9vbCBzaG91bGRBcHBseVN0YXJ0Qm9yZGVyUGFkZGluZ09yTWFy
Z2luID0gIWZsb3cucGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSB8fCAhZmxvdy5pc0lubGlu
ZUVsZW1lbnRDb250aW51YXRpb24oKTsKKyAgICBpZiAoc2hvdWxkQXBwbHlTdGFydEJvcmRlclBh
ZGRpbmdPck1hcmdpbiAmJiAoZmxvdy5ib3JkZXJTdGFydCgpIHx8IGZsb3cubWFyZ2luU3RhcnQo
KSB8fCBmbG93LnBhZGRpbmdTdGFydCgpKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBi
b29sIHNob3VsZEFwcGx5RW5kQm9yZGVyUGFkZGluZ09yTWFyZ2luID0gIWZsb3cucGFyZW50KCkt
PmlzQW5vbnltb3VzQmxvY2soKSB8fCBmbG93LmlzSW5saW5lRWxlbWVudENvbnRpbnVhdGlvbigp
IHx8ICFmbG93LmlubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsKKyAgICByZXR1cm4gc2hvdWxk
QXBwbHlFbmRCb3JkZXJQYWRkaW5nT3JNYXJnaW4gJiYgKGZsb3cuYm9yZGVyRW5kKCkgfHwgZmxv
dy5tYXJnaW5FbmQoKSB8fCBmbG93LnBhZGRpbmdFbmQoKSk7Cit9CisKK2lubGluZSBjb25zdCBS
ZW5kZXJTdHlsZSYgbGluZVN0eWxlKGNvbnN0IFJlbmRlckVsZW1lbnQmIHJlbmRlcmVyLCBjb25z
dCBMaW5lSW5mbyYgbGluZUluZm8pCit7CisgICAgcmV0dXJuIGxpbmVJbmZvLmlzRmlyc3RMaW5l
KCkgPyByZW5kZXJlci5maXJzdExpbmVTdHlsZSgpIDogcmVuZGVyZXIuc3R5bGUoKTsKK30KKwor
aW5saW5lIGJvb2wgcmVxdWlyZXNMaW5lQm94Rm9yQ29udGVudChjb25zdCBSZW5kZXJJbmxpbmUm
IGZsb3csIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykKK3sKKyAgICBSZW5kZXJFbGVtZW50KiBw
YXJlbnQgPSBmbG93LnBhcmVudCgpOworICAgIGlmIChmbG93LmRvY3VtZW50KCkuaW5Ob1F1aXJr
c01vZGUoKSkgeworICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYgZmxvd1N0eWxlID0gbGluZVN0
eWxlKGZsb3csIGxpbmVJbmZvKTsKKyAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUmIHBhcmVudFN0
eWxlID0gbGluZVN0eWxlKCpwYXJlbnQsIGxpbmVJbmZvKTsKKyAgICAgICAgaWYgKGZsb3dTdHls
ZS5saW5lSGVpZ2h0KCkgIT0gcGFyZW50U3R5bGUubGluZUhlaWdodCgpCisgICAgICAgICAgICB8
fCBmbG93U3R5bGUudmVydGljYWxBbGlnbigpICE9IHBhcmVudFN0eWxlLnZlcnRpY2FsQWxpZ24o
KQorICAgICAgICAgICAgfHwgIXBhcmVudFN0eWxlLmZvbnQoKS5mb250TWV0cmljcygpLmhhc0lk
ZW50aWNhbEFzY2VudERlc2NlbnRBbmRMaW5lR2FwKGZsb3dTdHlsZS5mb250KCkuZm9udE1ldHJp
Y3MoKSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK2lubGluZSBib29sIHNob3VsZENvbGxhcHNlV2hpdGVTcGFjZShjb25zdCBSZW5kZXJTdHls
ZSogc3R5bGUsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbywgV2hpdGVzcGFjZVBvc2l0aW9uIHdo
aXRlc3BhY2VQb3NpdGlvbikKK3sKKyAgICAvLyBDU1MyIDE2LjYuMQorICAgIC8vIElmIGEgc3Bh
Y2UgKFUrMDAyMCkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgaGFzICd3aGl0ZS1zcGFjZScg
c2V0IHRvICdub3JtYWwnLCAnbm93cmFwJywgb3IgJ3ByZS1saW5lJywgaXQgaXMgcmVtb3ZlZC4K
KyAgICAvLyBJZiBhIHNwYWNlIChVKzAwMjApIGF0IHRoZSBlbmQgb2YgYSBsaW5lIGhhcyAnd2hp
dGUtc3BhY2UnIHNldCB0byAnbm9ybWFsJywgJ25vd3JhcCcsIG9yICdwcmUtbGluZScsIGl0IGlz
IGFsc28gcmVtb3ZlZC4KKyAgICAvLyBJZiBzcGFjZXMgKFUrMDAyMCkgb3IgdGFicyAoVSswMDA5
KSBhdCB0aGUgZW5kIG9mIGEgbGluZSBoYXZlICd3aGl0ZS1zcGFjZScgc2V0IHRvICdwcmUtd3Jh
cCcsIFVBcyBtYXkgdmlzdWFsbHkgY29sbGFwc2UgdGhlbS4KKyAgICByZXR1cm4gc3R5bGUtPmNv
bGxhcHNlV2hpdGVTcGFjZSgpCisgICAgICAgIHx8ICh3aGl0ZXNwYWNlUG9zaXRpb24gPT0gVHJh
aWxpbmdXaGl0ZXNwYWNlICYmIHN0eWxlLT53aGl0ZVNwYWNlKCkgPT0gUFJFX1dSQVAgJiYgKCFs
aW5lSW5mby5pc0VtcHR5KCkgfHwgIWxpbmVJbmZvLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgp
KSk7Cit9CisKK2lubGluZSBib29sIHNraXBOb25CcmVha2luZ1NwYWNlKGNvbnN0IElubGluZUl0
ZXJhdG9yJiBpdCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQoreworICAgIGlmIChpdC5tX29i
ai0+c3R5bGUoKS5uYnNwTW9kZSgpICE9IFNQQUNFIHx8IGl0LmN1cnJlbnQoKSAhPSBub0JyZWFr
U3BhY2UpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEZJWE1FOiBUaGlzIGlzIGJh
ZC4gSXQgbWFrZXMgbmJzcCBpbmNvbnNpc3RlbnQgd2l0aCBzcGFjZSBhbmQgd29uJ3Qgd29yayBj
b3JyZWN0bHkKKyAgICAvLyB3aXRoIG1fbWluV2lkdGgvbV9tYXhXaWR0aC4KKyAgICAvLyBEbyBu
b3Qgc2tpcCBhIG5vbi1icmVha2luZyBzcGFjZSBpZiBpdCBpcyB0aGUgZmlyc3QgY2hhcmFjdGVy
CisgICAgLy8gb24gYSBsaW5lIGFmdGVyIGEgY2xlYW4gbGluZSBicmVhayAob3Igb24gdGhlIGZp
cnN0IGxpbmUsIHNpbmNlIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSBzdGFydHMgb2ZmCisgICAg
Ly8gfHRydWV8KS4KKyAgICBpZiAobGluZUluZm8uaXNFbXB0eSgpICYmIGxpbmVJbmZvLnByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworaW5saW5lIGJvb2wgYWx3YXlzUmVxdWlyZXNMaW5lQm94KGNvbnN0IFJl
bmRlcklubGluZSYgZmxvdykKK3sKKyAgICAvLyBGSVhNRTogUmlnaHQgbm93LCB3ZSBvbmx5IGFs
bG93IGxpbmUgYm94ZXMgZm9yIGlubGluZXMgdGhhdCBhcmUgdHJ1bHkgZW1wdHkuCisgICAgLy8g
V2UgbmVlZCB0byBmaXggdGhpcywgdGhvdWdoLCBiZWNhdXNlIGF0IHRoZSB2ZXJ5IGxlYXN0LCBp
bmxpbmVzIGNvbnRhaW5pbmcgb25seQorICAgIC8vIGlnbm9yYWJsZSB3aGl0ZXNwYWNlIHNob3Vs
ZCBzaG91bGQgYWxzbyBoYXZlIGxpbmUgYm94ZXMuCisgICAgcmV0dXJuIGlzRW1wdHlJbmxpbmUo
ZmxvdykgJiYgaGFzSW5saW5lRGlyZWN0aW9uQm9yZGVyc1BhZGRpbmdPck1hcmdpbihmbG93KTsK
K30KKworaW5saW5lIGJvb2wgcmVxdWlyZXNMaW5lQm94KGNvbnN0IElubGluZUl0ZXJhdG9yJiBp
dCwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvID0gTGluZUluZm8oKSwgV2hpdGVzcGFjZVBvc2l0
aW9uIHdoaXRlc3BhY2VQb3NpdGlvbiA9IExlYWRpbmdXaGl0ZXNwYWNlKQoreworICAgIGlmIChp
dC5tX29iai0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBpZiAoaXQubV9vYmotPmlzQlIoKSkKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisKKyAgICBib29sIHJlbmRlcmVySXNFbXB0eUlubGluZSA9IGZhbHNlOworICAgIGlmIChp
dC5tX29iai0+aXNSZW5kZXJJbmxpbmUoKSkgeworICAgICAgICBjb25zdCBSZW5kZXJJbmxpbmUm
IGlubGluZVJlbmRlcmVyID0gdG9SZW5kZXJJbmxpbmUoKml0Lm1fb2JqKTsKKyAgICAgICAgaWYg
KCFhbHdheXNSZXF1aXJlc0xpbmVCb3goaW5saW5lUmVuZGVyZXIpICYmICFyZXF1aXJlc0xpbmVC
b3hGb3JDb250ZW50KGlubGluZVJlbmRlcmVyLCBsaW5lSW5mbykpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIHJlbmRlcmVySXNFbXB0eUlubGluZSA9IGlzRW1wdHlJbmxpbmUo
aW5saW5lUmVuZGVyZXIpOworICAgIH0KKworICAgIGlmICghc2hvdWxkQ29sbGFwc2VXaGl0ZVNw
YWNlKCZpdC5tX29iai0+c3R5bGUoKSwgbGluZUluZm8sIHdoaXRlc3BhY2VQb3NpdGlvbikpCisg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgVUNoYXIgY3VycmVudCA9IGl0LmN1cnJlbnQoKTsK
KyAgICBib29sIG5vdEp1c3RXaGl0ZXNwYWNlID0gY3VycmVudCAhPSAnICcgJiYgY3VycmVudCAh
PSAnXHQnICYmIGN1cnJlbnQgIT0gc29mdEh5cGhlbiAmJiAoY3VycmVudCAhPSAnXG4nIHx8IGl0
Lm1fb2JqLT5wcmVzZXJ2ZXNOZXdsaW5lKCkpICYmICFza2lwTm9uQnJlYWtpbmdTcGFjZShpdCwg
bGluZUluZm8pOworICAgIHJldHVybiBub3RKdXN0V2hpdGVzcGFjZSB8fCByZW5kZXJlcklzRW1w
dHlJbmxpbmU7Cit9CisKK2lubGluZSB2b2lkIHNldFN0YXRpY1Bvc2l0aW9ucyhSZW5kZXJCbG9j
a0Zsb3cmIGJsb2NrLCBSZW5kZXJCb3gmIGNoaWxkKQoreworICAgIC8vIEZJWE1FOiBUaGUgbWF0
aCBoZXJlIGlzIGFjdHVhbGx5IG5vdCByZWFsbHkgcmlnaHQuIEl0J3MgYSBiZXN0LWd1ZXNzIGFw
cHJveGltYXRpb24gdGhhdAorICAgIC8vIHdpbGwgd29yayBmb3IgdGhlIGNvbW1vbiBjYXNlcwor
ICAgIFJlbmRlckVsZW1lbnQqIGNvbnRhaW5lckJsb2NrID0gY2hpbGQuY29udGFpbmVyKCk7Cisg
ICAgTGF5b3V0VW5pdCBibG9ja0hlaWdodCA9IGJsb2NrLmxvZ2ljYWxIZWlnaHQoKTsKKyAgICBp
ZiAoY29udGFpbmVyQmxvY2stPmlzUmVuZGVySW5saW5lKCkpIHsKKyAgICAgICAgLy8gQSByZWxh
dGl2ZSBwb3NpdGlvbmVkIGlubGluZSBlbmNsb3NlcyB1cy4gSW4gdGhpcyBjYXNlLCB3ZSBhbHNv
IGhhdmUgdG8gZGV0ZXJtaW5lIG91cgorICAgICAgICAvLyBwb3NpdGlvbiBhcyB0aG91Z2ggd2Ug
d2VyZSBhbiBpbmxpbmUuIFNldCB8c3RhdGljSW5saW5lUG9zaXRpb258IGFuZCB8c3RhdGljQmxv
Y2tQb3NpdGlvbnwgb24gdGhlIHJlbGF0aXZlIHBvc2l0aW9uZWQKKyAgICAgICAgLy8gaW5saW5l
IHNvIHRoYXQgd2UgY2FuIG9idGFpbiB0aGUgdmFsdWUgbGF0ZXIuCisgICAgICAgIHRvUmVuZGVy
SW5saW5lKGNvbnRhaW5lckJsb2NrKS0+bGF5ZXIoKS0+c2V0U3RhdGljSW5saW5lUG9zaXRpb24o
YmxvY2suc3RhcnRBbGlnbmVkT2Zmc2V0Rm9yTGluZShibG9ja0hlaWdodCwgZmFsc2UpKTsKKyAg
ICAgICAgdG9SZW5kZXJJbmxpbmUoY29udGFpbmVyQmxvY2spLT5sYXllcigpLT5zZXRTdGF0aWNC
bG9ja1Bvc2l0aW9uKGJsb2NrSGVpZ2h0KTsKKyAgICB9CisgICAgYmxvY2sudXBkYXRlU3RhdGlj
SW5saW5lUG9zaXRpb25Gb3JDaGlsZChjaGlsZCwgYmxvY2tIZWlnaHQpOworICAgIGNoaWxkLmxh
eWVyKCktPnNldFN0YXRpY0Jsb2NrUG9zaXRpb24oYmxvY2tIZWlnaHQpOworfQorCit9CisKKyNl
bmRpZgo=
</data>
<flag name="commit-queue"
          id="240017"
          type_id="3"
          status="-"
          setter="buildbot"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>216979</attachid>
            <date>2013-11-14 14:15:07 -0800</date>
            <delta_ts>2013-11-14 16:46:14 -0800</delta_ts>
            <desc>EWS bullet4 - style won&apos;t make it (expected)</desc>
            <filename>refactorLB.patch</filename>
            <type>text/plain</type>
            <size>181530</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNv
cmUvQ01ha2VMaXN0cy50eHQKaW5kZXggNzRlMzhmNC4uZTE1ZDhlZiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0
cy50eHQKQEAgLTc2LDYgKzc2LDcgQEAgc2V0KFdlYkNvcmVfSU5DTFVERV9ESVJFQ1RPUklFUwog
ICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS90ZXh0IgogICAgICIke1dFQkNPUkVfRElSfS9w
bHVnaW5zIgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmciCisgICAgIiR7V0VCQ09SRV9E
SVJ9L3JlbmRlcmluZy9saW5lIgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmcvbWF0aG1s
IgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmcvc2hhcGVzIgogICAgICIke1dFQkNPUkVf
RElSfS9yZW5kZXJpbmcvc3R5bGUiCkBAIC0yMjA5LDYgKzIyMTAsOSBAQCBzZXQoV2ViQ29yZV9T
T1VSQ0VTCiAgICAgcmVuZGVyaW5nL1RleHRQYWludGVyLmNwcAogICAgIHJlbmRlcmluZy9icmVh
a19saW5lcy5jcHAKIAorICAgIHJlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcAorICAgIHJl
bmRlcmluZy9saW5lL0xpbmVJbmZvLmNwcAorCiAgICAgcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJN
YXRoTUxCbG9jay5jcHAKICAgICByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTEZlbmNlZC5j
cHAKICAgICByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTEZyYWN0aW9uLmNwcApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9n
CmluZGV4IDYyNDc3MDguLjg2N2EwZTIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMDkgQEAKKzIw
MTMtMTEtMTQgIFpvbHRhbiBIb3J2YXRoICA8em9sdGFuQHdlYmtpdC5vcmc+CisKKyAgICAgICAg
TW92ZSBCcmVha2luZ0NvbnRleHQgYW5kIExpbmVCcmVha2VyIGludG8gdGhlaXIgb3duIGZpbGVz
CisgICAgICAgIDxodHRwczovL3dlYmtpdC5vcmcvYi8xMjQzMzY+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW4gdGhpcyBjaGFuZ2UgSSBpbnRyb2R1
Y2VkICdsaW5lJyBzdWJkaXJlY3RvcnkgaW5zaWRlICdyZW5kZXJpbmcnLCB0aGlzIGRpcmVjdG9y
eSB3aWxsIGNvbnRhaW4gYWxsIHRoZSBjbGFzc2VzCisgICAgICAgIHdoaWNoIGhhdmUgYmVlbiBy
ZWZhY3RvcmVkIGZyb20gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4gVGhpcyBjaGFuZ2UgY29u
dGFpbnMgdGhlIHNlcGFyYXRpb24gb2YgQnJlYWtpbmdDb250ZXh0LAorICAgICAgICBhbmQgdGhl
IHNlcGFyYXRpb24gb2YgTGluZUJyZWFrZXIgY2xhc3Nlcy4gU2luY2UgSSB3YW50ZWQgdG8ga2Vl
cCB0aGUgaGVscGVyIGZ1bmN0aW9ucyBvcmdhbml6ZWQsIEkgYWxzbyBhZGRlZCBhCisgICAgICAg
IG5ldyBmaWxlIGNhbGxlZCBMaW5lSW5saW5lSGVhZGVycy5oLCB3aGljaCBjb250YWlucyB0aGUg
ZnVuY3Rpb25zIHdoaWNoIHVzZWQgaW4gTGluZUJyZWFrZXIuaCBhbmQgQnJlYWtpbmdDb250ZXh0
LmguCisgICAgICAgIEkgbW92ZWQgTGluZUluZm8gY2xhc3MgaW50byBsaW5lIGRpcmVjdG9yeS4g
SXQgd2FzIG5lY2Vzc2FyeSB0aGlzIHRpbWUsIHNpbmNlIEkgYWRkZWQgYSBjcHAgZm9yIGl0LiBJ
J2xsIG1vdmUgdGhlCisgICAgICAgIHJlc3Qgb2YgdGhlIGxpbmUgbGF5b3V0IHJlbGF0ZWQgaGVs
cGVyIGNsYXNzZXMgbGF0ZXIuIChJIHdhbnRlZCB0byBtaW5pbWl6ZSBtZXJnZSBjb25mbGljdHMu
KQorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgbm8gYmVoYXZpb3IgY2hhbmdlLgorCisgICAgICAg
ICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogR05VbWFrZWZpbGUuYW06CisgICAgICAgICog
R05VbWFrZWZpbGUubGlzdC5hbToKKyAgICAgICAgKiBXZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52
Y3hwcm9qOgorICAgICAgICAqIFdlYkNvcmUudmN4cHJvai9XZWJDb3JlQ29tbW9uLnByb3BzOgor
ICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBy
ZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNy
ZWF0ZVJ1bik6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5l
SGVhZGVycy5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OldvcmRNZWFzdXJlbWVudDo6V29y
ZE1lYXN1cmVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6VHJhaWxp
bmdPYmplY3RzKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6c2V0VHJhaWxp
bmdXaGl0ZXNwYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6Y2xlYXIp
OgorICAgICAgICAoV2ViQ29yZTo6VHJhaWxpbmdPYmplY3RzOjphcHBlbmRCb3hJZk5lZWRlZCk6
CisgICAgICAgIChXZWJDb3JlOjpkZXByZWNhdGVkQWRkTWlkcG9pbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6c3RhcnRJZ25vcmluZ1NwYWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpzdG9wSWdub3Jp
bmdTcGFjZXMpOgorICAgICAgICAoV2ViQ29yZTo6ZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRT
cGFjZXMpOgorICAgICAgICAoV2ViQ29yZTo6VHJhaWxpbmdPYmplY3RzOjp1cGRhdGVNaWRwb2lu
dHNGb3JUcmFpbGluZ0JveGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6
QnJlYWtpbmdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6Y3Vy
cmVudE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVCcmVh
ayk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVCcmVha1JlZik6Cisg
ICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVXaWR0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmF0RW5kKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFr
aW5nQ29udGV4dDo6Y2xlYXJMaW5lQnJlYWtJZkZpdHNPbkxpbmUpOgorICAgICAgICAoV2ViQ29y
ZTo6QnJlYWtpbmdDb250ZXh0Ojpjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aCk6CisgICAg
ICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmluaXRpYWxpemVGb3JDdXJyZW50T2JqZWN0
KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aGFuZGxlQlIpOgorICAgICAgICAoV2ViQ29y
ZTo6Ym9yZGVyUGFkZGluZ01hcmdpblN0YXJ0KToKKyAgICAgICAgKFdlYkNvcmU6OmJvcmRlclBh
ZGRpbmdNYXJnaW5FbmQpOgorICAgICAgICAoV2ViQ29yZTo6c2hvdWxkQWRkQm9yZGVyUGFkZGlu
Z01hcmdpbik6CisgICAgICAgIChXZWJDb3JlOjpwcmV2aW91c0luRmxvd1NpYmxpbmcpOgorICAg
ICAgICAoV2ViQ29yZTo6aW5saW5lTG9naWNhbFdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkJy
ZWFraW5nQ29udGV4dDo6aGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZCk6CisgICAgICAgIChXZWJD
b3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUZsb2F0KToKKyAgICAgICAgKFdlYkNvcmU6OnNo
b3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpC
cmVha2luZ0NvbnRleHQ6OmhhbmRsZUVtcHR5SW5saW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkJy
ZWFraW5nQ29udGV4dDo6aGFuZGxlUmVwbGFjZWQpOgorICAgICAgICAoV2ViQ29yZTo6Zmlyc3RQ
b3NpdGl2ZVdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OnVwZGF0ZVNlZ21lbnRzRm9yU2hhcGVz
KToKKyAgICAgICAgKFdlYkNvcmU6Oml0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVU
ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6Om5leHRDaGFyYWN0ZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6dXBkYXRlQ291bnRlcklmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6Om1lYXN1cmVIeXBo
ZW5XaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0V2lkdGgpOgorICAgICAgICAoV2ViQ29y
ZTo6ZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gpOgorICAgICAgICAoV2ViQ29yZTo6dHJ5SHlw
aGVuYXRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0
KToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpjYW5CcmVha0F0VGhpc1Bvc2l0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6Y29tbWl0QW5kVXBkYXRlTGlu
ZUJyZWFrSWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tNaWRwb2ludHMpOgorICAg
ICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbmRPZkxpbmUpOgorICAgICAg
ICAqIHJlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpMaW5lQnJlYWtlcjo6cmVzZXQpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJyZWFrZXI6
OnNraXBUcmFpbGluZ1doaXRlc3BhY2UpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJyZWFrZXI6
OnNraXBMZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvTGluZUJy
ZWFrZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6TGluZUJyZWFr
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJyZWFrZXI6OmxpbmVXYXNIeXBoZW5hdGVkKToK
KyAgICAgICAgKFdlYkNvcmU6OkxpbmVCcmVha2VyOjpwb3NpdGlvbmVkT2JqZWN0cyk6CisgICAg
ICAgIChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6Y2xlYXIpOgorICAgICAgICAqIHJlbmRlcmluZy9s
aW5lL0xpbmVJbmZvLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6c2V0
RW1wdHkpOgorICAgICAgICAqIHJlbmRlcmluZy9saW5lL0xpbmVJbmZvLmg6IFJlbmFtZWQgZnJv
bSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvTGluZUluZm8uaC4KKyAgICAgICAgKFdlYkNvcmU6
OkxpbmVJbmZvOjpMaW5lSW5mbyk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6aXNGaXJz
dExpbmUpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OmlzTGFzdExpbmUpOgorICAgICAg
ICAoV2ViQ29yZTo6TGluZUluZm86OmlzRW1wdHkpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUlu
Zm86OnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5m
bzo6ZmxvYXRQYWdpbmF0aW9uU3RydXQpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OnJ1
bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OnJl
c2V0UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5m
bzo6aW5jcmVtZW50UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAgIChXZWJDb3Jl
OjpMaW5lSW5mbzo6c2V0Rmlyc3RMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVJbmZvOjpz
ZXRMYXN0TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6c2V0UHJldmlvdXNMaW5l
QnJva2VDbGVhbmx5KToKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVJbmZvOjpzZXRGbG9hdFBhZ2lu
YXRpb25TdHJ1dCk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvTGluZUlubGluZUhlYWRlcnMu
aDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpoYXNJbmxpbmVEaXJlY3Rpb25Cb3JkZXJzUGFk
ZGluZ09yTWFyZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OmxpbmVTdHlsZSk6CisgICAgICAgIChX
ZWJDb3JlOjpyZXF1aXJlc0xpbmVCb3hGb3JDb250ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OnNo
b3VsZENvbGxhcHNlV2hpdGVTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpza2lwTm9uQnJlYWtp
bmdTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjphbHdheXNSZXF1aXJlc0xpbmVCb3gpOgorICAg
ICAgICAoV2ViQ29yZTo6cmVxdWlyZXNMaW5lQm94KToKKyAgICAgICAgKFdlYkNvcmU6OnNldFN0
YXRpY1Bvc2l0aW9ucyk6CisKIDIwMTMtMTEtMTQgIEpvc2VwaCBQZWNvcmFybyAgPHBlY29yYXJv
QGFwcGxlLmNvbT4KIAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBDbGVhbmVyIEJhY2tlbmQgTWV0
aG9kIENhbGxpbmcgQ29kZSBHZW5lcmF0aW9uCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9H
TlVtYWtlZmlsZS5hbSBiL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCmluZGV4IGQ0N2Q2
YjcuLmJlMmFiMGEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCisr
KyBiL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCkBAIC05MCw2ICs5MCw3IEBAIHdlYmNv
cmVfY3BwZmxhZ3MgKz0gXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsdWdpbnMgXAog
CS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsdWdpbnMvd2luIFwKIAktSSQoc3JjZGlyKS9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcgXAorCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9saW5lIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbWF0
aG1sIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc2hhcGVzIFwKIAkt
SSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3R5bGUgXApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbSBiL1NvdXJjZS9XZWJDb3JlL0dOVW1h
a2VmaWxlLmxpc3QuYW0KaW5kZXggOTFiOTNkMi4uYjk2MTUwNyAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQorKysgYi9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtl
ZmlsZS5saXN0LmFtCkBAIC00Mjk4LDcgKzQyOTgsNiBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAog
CVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9Mb2dpY2FsU2VsZWN0aW9uT2Zmc2V0Q2FjaGVzLmgg
XAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MYXlvdXRSZXBhaW50ZXIuaCBcCiAJU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL0xheW91dFJlcGFpbnRlci5jcHAgXAotCVNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9MaW5lSW5mby5oIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvTGluZUxh
eW91dFN0YXRlLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lV2lkdGguaCBcCiAJ
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xpbmVXaWR0aC5jcHAgXApAQCAtNDUwMyw2ICs0NTAy
LDEyIEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Rl
eHRQYWludGVyLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0UGFpbnRTdHlsZS5o
IFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVmVydGljYWxQb3NpdGlvbkNhY2hlLmggXAor
CVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0JyZWFraW5nQ29udGV4dElubGluZUhlYWRl
cnMuaCBcCisJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUluZm8uaCBcCisJU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUluZm8uY3BwIFwKKwlTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5oIFwKKwlTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvbGluZS9MaW5lQnJlYWtlci5jcHAgXAorCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5l
L0xpbmVJbmxpbmVIZWFkZXJzLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9tYXRobWwv
UmVuZGVyTWF0aE1MQmxvY2suY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbWF0aG1s
L1JlbmRlck1hdGhNTEJsb2NrLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9tYXRobWwv
UmVuZGVyTWF0aE1MRmVuY2VkLmNwcCBcCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hw
cm9qL1dlYkNvcmUudmN4cHJvagppbmRleCAxNzU0N2M5Li4zOGUyNDgyIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2oKQEAgLTExMDUwLDYgKzEx
MDUwLDggQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xTaW1wbGVMaW5l
TGF5b3V0LmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xTaW1w
bGVMaW5lTGF5b3V0RnVuY3Rpb25zLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4u
XHJlbmRlcmluZ1xUZXh0UGFpbnRTdHlsZS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRl
PSIuLlxyZW5kZXJpbmdcbGluZVxMaW5lQnJlYWtlci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJ
bmNsdWRlPSIuLlxyZW5kZXJpbmdcbGluZVxMaW5lSW5mby5jcHAiIC8+CiAgICAgPENsQ29tcGls
ZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcc2hhcGVzXFBvbHlnb25TaGFwZS5jcHAiIC8+CiAgICAg
PENsQ29tcGlsZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcc2hhcGVzXFJhc3RlclNoYXBlLmNwcCIg
Lz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xzaGFwZXNcUmVjdGFuZ2xl
U2hhcGUuY3BwIiAvPgpAQCAtMTk3NjUsNyArMTk3NjcsNiBAQAogICAgIDxDbEluY2x1ZGUgSW5j
bHVkZT0iLi5ccmVuZGVyaW5nXElubGluZVRleHRCb3guaCIgLz4KICAgICA8Q2xJbmNsdWRlIElu
Y2x1ZGU9Ii4uXHJlbmRlcmluZ1xMYXlvdXRSZXBhaW50ZXIuaCIgLz4KICAgICA8Q2xJbmNsdWRl
IEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xMYXlvdXRTdGF0ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUg
SW5jbHVkZT0iLi5ccmVuZGVyaW5nXExpbmVJbmZvLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNs
dWRlPSIuLlxyZW5kZXJpbmdcTGluZUxheW91dFN0YXRlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJ
bmNsdWRlPSIuLlxyZW5kZXJpbmdcTGluZVdpZHRoLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNs
dWRlPSIuLlxyZW5kZXJpbmdcT3JkZXJJdGVyYXRvci5oIiAvPgpAQCAtMTk4NDAsNiArMTk4NDEs
MTAgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xSZW5kZXJTZWxlY3Rp
b25JbmZvLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcUmVuZGVy
U2xpZGVyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcUmVuZGVy
U25hcHNob3R0ZWRQbHVnSW4uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRl
cmluZ1xsaW5lXEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCIgLz4KKyAgICA8Q2xJbmNs
dWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xsaW5lXExpbmVCcmVha2VyLmgiIC8+CisgICAgPENs
SW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcbGluZVxMaW5lSW5mby5oIiAvPgorICAgIDxD
bEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXGxpbmVcTGluZUlubGluZUhlYWRlcnMuaCIg
Lz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xzaGFwZXNcUG9seWdvblNo
YXBlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcc2hhcGVzXFJh
c3RlclNoYXBlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcc2hh
cGVzXFJlY3RhbmdsZVNoYXBlLmgiIC8+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLnZjeHByb2ovV2ViQ29yZUNvbW1vbi5wcm9wcyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
dmN4cHJvai9XZWJDb3JlQ29tbW9uLnByb3BzCmluZGV4IDk0ZjVlMTguLmYxZDg5MGQgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlQ29tbW9uLnByb3Bz
CisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlQ29tbW9uLnByb3Bz
CkBAIC03LDExICs3LDExIEBACiAgIDwvUHJvcGVydHlHcm91cD4NCiAgIDxJdGVtRGVmaW5pdGlv
bkdyb3VwPg0KICAgICA8Q2xDb21waWxlPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVj
dG9yaWVzPiQoUHJvamVjdERpcikuLjskKFByb2plY3REaXIpLi5cTW9kdWxlc1xtZWRpYWNvbnRy
b2xzOyQoUHJvamVjdERpcikuLlxNb2R1bGVzXG1lZGlhc3RyZWFtOyQoUHJvamVjdERpcikuLlxN
b2R1bGVzXGZpbGVzeXN0ZW07JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNcZ2VvbG9jYXRpb247JChQ
cm9qZWN0RGlyKS4uXE1vZHVsZXNcaW5kZXhlZGRiOyQoUHJvamVjdERpcikuLlxNb2R1bGVzXG1l
ZGlhc291cmNlOyQoUHJvamVjdERpcikuLlxNb2R1bGVzXG5hdmlnYXRvcmNvbnRlbnR1dGlsczsk
KFByb2plY3REaXIpLi5cTW9kdWxlc1xzcGVlY2g7JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNccHJv
eGltaXR5OyQoUHJvamVjdERpcikuLlxNb2R1bGVzXHF1b3RhOyQoUHJvamVjdERpcikuLlxNb2R1
bGVzXG5vdGlmaWNhdGlvbnM7JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNcd2ViZGF0YWJhc2U7JChQ
cm9qZWN0RGlyKS4uXE1vZHVsZXNcd2Vic29ja2V0czskKFByb2plY3REaXIpLi5cYWNjZXNzaWJp
bGl0eTskKFByb2plY3REaXIpLi5cYWNjZXNzaWJpbGl0eVx3aW47JChQcm9qZWN0RGlyKS4uXGJy
aWRnZTskKFByb2plY3REaXIpLi5cYnJpZGdlXGM7JChQcm9qZWN0RGlyKS4uXGJyaWRnZVxqc2M7
JChQcm9qZWN0RGlyKS4uXGNzczskKFByb2plY3REaXIpLi5cZWRpdGluZzskKFByb2plY3REaXIp
Li5cZmlsZWFwaTskKFByb2plY3REaXIpLi5ccmVuZGVyaW5nOyQoUHJvamVjdERpcikuLlxyZW5k
ZXJpbmdcbWF0aG1sOyQoUHJvamVjdERpcikuLlxyZW5kZXJpbmdcc2hhcGVzOyQoUHJvamVjdERp
cikuLlxyZW5kZXJpbmdcc3R5bGU7JChQcm9qZWN0RGlyKS4uXHJlbmRlcmluZ1xzdmc7JChQcm9q
ZWN0RGlyKS4uXGJpbmRpbmdzOyQoUHJvamVjdERpcikuLlxiaW5kaW5nc1xnZW5lcmljOyQoUHJv
amVjdERpcikuLlxiaW5kaW5nc1xqczskKFByb2plY3REaXIpLi5cYmluZGluZ3NcanNcc3BlY2lh
bGl6YXRpb247JChQcm9qZWN0RGlyKS4uXGRvbTskKFByb2plY3REaXIpLi5cZG9tXGRlZmF1bHQ7
JChQcm9qZWN0RGlyKS4uXGhpc3Rvcnk7JChQcm9qZWN0RGlyKS4uXGh0bWw7JChQcm9qZWN0RGly
KS4uXGh0bWxcY2FudmFzOyQoUHJvamVjdERpcikuLlxodG1sXGZvcm1zOyQoUHJvamVjdERpciku
LlxodG1sXHBhcnNlcjskKFByb2plY3REaXIpLi5caHRtbFxzaGFkb3c7JChQcm9qZWN0RGlyKS4u
XGh0bWxcdHJhY2s7JChQcm9qZWN0RGlyKS4uXGluc3BlY3RvcjskKFByb2plY3REaXIpLi5cbG9h
ZGVyOyQoUHJvamVjdERpcikuLlxsb2FkZXJcYXBwY2FjaGU7JChQcm9qZWN0RGlyKS4uXGxvYWRl
clxhcmNoaXZlOyQoUHJvamVjdERpcikuLlxsb2FkZXJcYXJjaGl2ZVxjZjskKFByb2plY3REaXIp
Li5cbG9hZGVyXGNhY2hlOyQoUHJvamVjdERpcikuLlxsb2FkZXJcaWNvbjskKFByb2plY3REaXIp
Li5cbWF0aG1sOyQoUHJvamVjdERpcikuLlxwYWdlOyQoUHJvamVjdERpcikuLlxwYWdlXGFuaW1h
dGlvbjskKFByb2plY3REaXIpLi5ccGFnZVxzY3JvbGxpbmc7JChQcm9qZWN0RGlyKS4uXHBhZ2Vc
d2luOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybTskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cYW5p
bWF0aW9uOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxtb2NrOyQoUHJvamVjdERpcikuLlxwbGF0
Zm9ybVxzcWw7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXHdpbjskKFByb2plY3REaXIpLi5ccGxh
dGZvcm1cbmV0d29yazskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cbmV0d29ya1x3aW47JChQcm9q
ZWN0RGlyKS4uXHBsYXRmb3JtXGNmOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxncmFwaGljczsk
KFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3NcY2E7JChQcm9qZWN0RGlyKS4uXHBsYXRm
b3JtXGdyYXBoaWNzXGNwdVxhcm1cZmlsdGVyczskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3Jh
cGhpY3NcZmlsdGVyczskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3NcZmlsdGVyc1xh
cm07JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXG9wZW50eXBlOyQoUHJvamVjdERp
cikuLlxwbGF0Zm9ybVxncmFwaGljc1x0cmFuc2Zvcm1zOyQoUHJvamVjdERpcikuLlxwbGF0Zm9y
bVx0ZXh0OyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVx0ZXh0XHRyYW5zY29kZXI7JChQcm9qZWN0
RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpbjskKFByb2plY3REaXIpLi5ceG1sOyQoUHJvamVj
dERpcikuLlx4bWxccGFyc2VyOyQoQ29uZmlndXJhdGlvbkJ1aWxkRGlyKVxvYmokKFBsYXRmb3Jt
QXJjaGl0ZWN0dXJlKVxXZWJDb3JlXERlcml2ZWRTb3VyY2VzOyQoUHJvamVjdERpcikuLlxwbHVn
aW5zOyQoUHJvamVjdERpcikuLlxwbHVnaW5zXHdpbjskKFByb2plY3REaXIpLi5cc3ZnXGFuaW1h
dGlvbjskKFByb2plY3REaXIpLi5cc3ZnXGdyYXBoaWNzOyQoUHJvamVjdERpcikuLlxzdmdccHJv
cGVydGllczskKFByb2plY3REaXIpLi5cc3ZnXGdyYXBoaWNzXGZpbHRlcnM7JChQcm9qZWN0RGly
KS4uXHN2ZzskKFByb2plY3REaXIpLi5cdGVzdGluZzskKFByb2plY3REaXIpLi5cY3J5cHRvOyQo
UHJvamVjdERpcikuLlx3bWw7JChQcm9qZWN0RGlyKS4uXHN0b3JhZ2U7JChQcm9qZWN0RGlyKS4u
XHN0eWxlOyQoUHJvamVjdERpcikuLlx3ZWJzb2NrZXRzOyQoUHJvamVjdERpcikuLlx3b3JrZXJz
OyQoQ29uZmlndXJhdGlvbkJ1aWxkRGlyKVxpbmNsdWRlOyQoQ29uZmlndXJhdGlvbkJ1aWxkRGly
KVxpbmNsdWRlXHByaXZhdGU7JChDb25maWd1cmF0aW9uQnVpbGREaXIpXGluY2x1ZGVcSmF2YVNj
cmlwdENvcmU7JChDb25maWd1cmF0aW9uQnVpbGREaXIpXGluY2x1ZGVccHJpdmF0ZVxKYXZhU2Ny
aXB0Q29yZTskKFByb2plY3REaXIpLi5cRm9yd2FyZGluZ0hlYWRlcnM7JChQcm9qZWN0RGlyKS4u
XHBsYXRmb3JtXGdyYXBoaWNzXGdwdTskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3Nc
ZWdsOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxncmFwaGljc1xzdXJmYWNlczskKFByb2plY3RE
aXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncc3VyZmFjZXNcZWdsOyQoUHJvamVjdERpcikuLlxwbGF0
Zm9ybVxncmFwaGljc1xvcGVuZ2w7JChXZWJLaXRfTGlicmFyaWVzKVxpbmNsdWRlOyQoV2ViS2l0
X0xpYnJhcmllcylcaW5jbHVkZVxwcml2YXRlOyQoV2ViS2l0X0xpYnJhcmllcylcaW5jbHVkZVxw
cml2YXRlXEphdmFTY3JpcHRDb3JlOyQoV2ViS2l0X0xpYnJhcmllcylcaW5jbHVkZVxzcWxpdGU7
JChXZWJLaXRfTGlicmFyaWVzKVxpbmNsdWRlXEphdmFTY3JpcHRDb3JlOyQoV2ViS2l0X0xpYnJh
cmllcylcaW5jbHVkZVx6bGliOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0
aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0
b3JpZXM+JChQcm9qZWN0RGlyKS4uOyQoUHJvamVjdERpcikuLlxNb2R1bGVzXG1lZGlhY29udHJv
bHM7JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNcbWVkaWFzdHJlYW07JChQcm9qZWN0RGlyKS4uXE1v
ZHVsZXNcZmlsZXN5c3RlbTskKFByb2plY3REaXIpLi5cTW9kdWxlc1xnZW9sb2NhdGlvbjskKFBy
b2plY3REaXIpLi5cTW9kdWxlc1xpbmRleGVkZGI7JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNcbWVk
aWFzb3VyY2U7JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNcbmF2aWdhdG9yY29udGVudHV0aWxzOyQo
UHJvamVjdERpcikuLlxNb2R1bGVzXHNwZWVjaDskKFByb2plY3REaXIpLi5cTW9kdWxlc1xwcm94
aW1pdHk7JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNccXVvdGE7JChQcm9qZWN0RGlyKS4uXE1vZHVs
ZXNcbm90aWZpY2F0aW9uczskKFByb2plY3REaXIpLi5cTW9kdWxlc1x3ZWJkYXRhYmFzZTskKFBy
b2plY3REaXIpLi5cTW9kdWxlc1x3ZWJzb2NrZXRzOyQoUHJvamVjdERpcikuLlxhY2Nlc3NpYmls
aXR5OyQoUHJvamVjdERpcikuLlxhY2Nlc3NpYmlsaXR5XHdpbjskKFByb2plY3REaXIpLi5cYnJp
ZGdlOyQoUHJvamVjdERpcikuLlxicmlkZ2VcYzskKFByb2plY3REaXIpLi5cYnJpZGdlXGpzYzsk
KFByb2plY3REaXIpLi5cY3NzOyQoUHJvamVjdERpcikuLlxlZGl0aW5nOyQoUHJvamVjdERpciku
LlxmaWxlYXBpOyQoUHJvamVjdERpcikuLlxyZW5kZXJpbmc7JChQcm9qZWN0RGlyKS4uXHJlbmRl
cmluZ1xsaW5lOyQoUHJvamVjdERpcikuLlxyZW5kZXJpbmdcbWF0aG1sOyQoUHJvamVjdERpciku
LlxyZW5kZXJpbmdcc2hhcGVzOyQoUHJvamVjdERpcikuLlxyZW5kZXJpbmdcc3R5bGU7JChQcm9q
ZWN0RGlyKS4uXHJlbmRlcmluZ1xzdmc7JChQcm9qZWN0RGlyKS4uXGJpbmRpbmdzOyQoUHJvamVj
dERpcikuLlxiaW5kaW5nc1xnZW5lcmljOyQoUHJvamVjdERpcikuLlxiaW5kaW5nc1xqczskKFBy
b2plY3REaXIpLi5cYmluZGluZ3NcanNcc3BlY2lhbGl6YXRpb247JChQcm9qZWN0RGlyKS4uXGRv
bTskKFByb2plY3REaXIpLi5cZG9tXGRlZmF1bHQ7JChQcm9qZWN0RGlyKS4uXGhpc3Rvcnk7JChQ
cm9qZWN0RGlyKS4uXGh0bWw7JChQcm9qZWN0RGlyKS4uXGh0bWxcY2FudmFzOyQoUHJvamVjdERp
cikuLlxodG1sXGZvcm1zOyQoUHJvamVjdERpcikuLlxodG1sXHBhcnNlcjskKFByb2plY3REaXIp
Li5caHRtbFxzaGFkb3c7JChQcm9qZWN0RGlyKS4uXGh0bWxcdHJhY2s7JChQcm9qZWN0RGlyKS4u
XGluc3BlY3RvcjskKFByb2plY3REaXIpLi5cbG9hZGVyOyQoUHJvamVjdERpcikuLlxsb2FkZXJc
YXBwY2FjaGU7JChQcm9qZWN0RGlyKS4uXGxvYWRlclxhcmNoaXZlOyQoUHJvamVjdERpcikuLlxs
b2FkZXJcYXJjaGl2ZVxjZjskKFByb2plY3REaXIpLi5cbG9hZGVyXGNhY2hlOyQoUHJvamVjdERp
cikuLlxsb2FkZXJcaWNvbjskKFByb2plY3REaXIpLi5cbWF0aG1sOyQoUHJvamVjdERpcikuLlxw
YWdlOyQoUHJvamVjdERpcikuLlxwYWdlXGFuaW1hdGlvbjskKFByb2plY3REaXIpLi5ccGFnZVxz
Y3JvbGxpbmc7JChQcm9qZWN0RGlyKS4uXHBhZ2Vcd2luOyQoUHJvamVjdERpcikuLlxwbGF0Zm9y
bTskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cYW5pbWF0aW9uOyQoUHJvamVjdERpcikuLlxwbGF0
Zm9ybVxtb2NrOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxzcWw7JChQcm9qZWN0RGlyKS4uXHBs
YXRmb3JtXHdpbjskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cbmV0d29yazskKFByb2plY3REaXIp
Li5ccGxhdGZvcm1cbmV0d29ya1x3aW47JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGNmOyQoUHJv
amVjdERpcikuLlxwbGF0Zm9ybVxncmFwaGljczskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3Jh
cGhpY3NcY2E7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXGNwdVxhcm1cZmlsdGVy
czskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3NcZmlsdGVyczskKFByb2plY3REaXIp
Li5ccGxhdGZvcm1cZ3JhcGhpY3NcZmlsdGVyc1xhcm07JChQcm9qZWN0RGlyKS4uXHBsYXRmb3Jt
XGdyYXBoaWNzXG9wZW50eXBlOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxncmFwaGljc1x0cmFu
c2Zvcm1zOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVx0ZXh0OyQoUHJvamVjdERpcikuLlxwbGF0
Zm9ybVx0ZXh0XHRyYW5zY29kZXI7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXHdp
bjskKFByb2plY3REaXIpLi5ceG1sOyQoUHJvamVjdERpcikuLlx4bWxccGFyc2VyOyQoQ29uZmln
dXJhdGlvbkJ1aWxkRGlyKVxvYmokKFBsYXRmb3JtQXJjaGl0ZWN0dXJlKVxXZWJDb3JlXERlcml2
ZWRTb3VyY2VzOyQoUHJvamVjdERpcikuLlxwbHVnaW5zOyQoUHJvamVjdERpcikuLlxwbHVnaW5z
XHdpbjskKFByb2plY3REaXIpLi5cc3ZnXGFuaW1hdGlvbjskKFByb2plY3REaXIpLi5cc3ZnXGdy
YXBoaWNzOyQoUHJvamVjdERpcikuLlxzdmdccHJvcGVydGllczskKFByb2plY3REaXIpLi5cc3Zn
XGdyYXBoaWNzXGZpbHRlcnM7JChQcm9qZWN0RGlyKS4uXHN2ZzskKFByb2plY3REaXIpLi5cdGVz
dGluZzskKFByb2plY3REaXIpLi5cY3J5cHRvOyQoUHJvamVjdERpcikuLlx3bWw7JChQcm9qZWN0
RGlyKS4uXHN0b3JhZ2U7JChQcm9qZWN0RGlyKS4uXHN0eWxlOyQoUHJvamVjdERpcikuLlx3ZWJz
b2NrZXRzOyQoUHJvamVjdERpcikuLlx3b3JrZXJzOyQoQ29uZmlndXJhdGlvbkJ1aWxkRGlyKVxp
bmNsdWRlOyQoQ29uZmlndXJhdGlvbkJ1aWxkRGlyKVxpbmNsdWRlXHByaXZhdGU7JChDb25maWd1
cmF0aW9uQnVpbGREaXIpXGluY2x1ZGVcSmF2YVNjcmlwdENvcmU7JChDb25maWd1cmF0aW9uQnVp
bGREaXIpXGluY2x1ZGVccHJpdmF0ZVxKYXZhU2NyaXB0Q29yZTskKFByb2plY3REaXIpLi5cRm9y
d2FyZGluZ0hlYWRlcnM7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXGdwdTskKFBy
b2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3NcZWdsOyQoUHJvamVjdERpcikuLlxwbGF0Zm9y
bVxncmFwaGljc1xzdXJmYWNlczskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncc3Vy
ZmFjZXNcZWdsOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxncmFwaGljc1xvcGVuZ2w7JChXZWJL
aXRfTGlicmFyaWVzKVxpbmNsdWRlOyQoV2ViS2l0X0xpYnJhcmllcylcaW5jbHVkZVxwcml2YXRl
OyQoV2ViS2l0X0xpYnJhcmllcylcaW5jbHVkZVxwcml2YXRlXEphdmFTY3JpcHRDb3JlOyQoV2Vi
S2l0X0xpYnJhcmllcylcaW5jbHVkZVxzcWxpdGU7JChXZWJLaXRfTGlicmFyaWVzKVxpbmNsdWRl
XEphdmFTY3JpcHRDb3JlOyQoV2ViS2l0X0xpYnJhcmllcylcaW5jbHVkZVx6bGliOyUoQWRkaXRp
b25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQog
ICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkRJU0FCTEVfM0RfUkVOREVSSU5HO1dFQkNP
UkVfQ09OVEVYVF9NRU5VUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29y
RGVmaW5pdGlvbnM+DQogICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPlVzZTwvUHJlY29tcGlsZWRI
ZWFkZXI+DQogICAgICAgPFByZWNvbXBpbGVkSGVhZGVyRmlsZT5XZWJDb3JlUHJlZml4Lmg8L1By
ZWNvbXBpbGVkSGVhZGVyRmlsZT4NCiAgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPldlYkNvcmVQ
cmVmaXguaDtJQ1VWZXJzaW9uLmg7JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRl
RmlsZXM+DQogICAgIDwvQ2xDb21waWxlPg0KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KLTwv
UHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+DQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIv
U291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IDEz
MzBiZDguLjMxOTkzNGIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oKQEAgLTM0MzYsNyArMzQzNiw2IEBACiAJCTlGQTM3RUZEMTE3MkZE
QTYwMEM0Q0Q1NSAvKiBKU1NjcmlwdFByb2ZpbGVOb2RlLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5RkEzN0VGOTExNzJGRDkzMDBDNENENTUgLyogSlNT
Y3JpcHRQcm9maWxlTm9kZS5oICovOyB9OwogCQlBMDI0NTc1MTE2Q0VBQTI3MDAwRTU2NzEgLyog
RVhURHJhd0J1ZmZlcnMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gQTAyNDU3NEUxNkNFQUEyNzAwMEU1NjcxIC8qIEVYVERyYXdCdWZmZXJzLmNwcCAq
LzsgfTsKIAkJQTAyNDU3NTIxNkNFQUEyNzAwMEU1NjcxIC8qIEVYVERyYXdCdWZmZXJzLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBMDI0NTc0RjE2Q0VB
QTI3MDAwRTU2NzEgLyogRVhURHJhd0J1ZmZlcnMuaCAqLzsgfTsKLQkJQTA2QkZFMkUxN0RGQjQz
RjAwODMwMkJCIC8qIExpbmVJbmZvLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBBMDZCRkUyQzE3REZCNDMzMDA4MzAyQkIgLyogTGluZUluZm8uaCAqLzsg
fTsKIAkJQTA3RDMzNTUxNTJCNjMwRTAwMUI2MzkzIC8qIEpTV2ViR0xTaGFkZXJQcmVjaXNpb25G
b3JtYXQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QTA3RDMzNTMxNTJCNjMwRTAwMUI2MzkzIC8qIEpTV2ViR0xTaGFkZXJQcmVjaXNpb25Gb3JtYXQu
Y3BwICovOyB9OwogCQlBMDdEMzM1NjE1MkI2MzBFMDAxQjYzOTMgLyogSlNXZWJHTFNoYWRlclBy
ZWNpc2lvbkZvcm1hdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gQTA3RDMzNTQxNTJCNjMwRTAwMUI2MzkzIC8qIEpTV2ViR0xTaGFkZXJQcmVjaXNpb25G
b3JtYXQuaCAqLzsgfTsKIAkJQTA3RDMzNTgxNTJCNjMyRDAwMUI2MzkzIC8qIFdlYkdMU2hhZGVy
UHJlY2lzaW9uRm9ybWF0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBBMDdEMzM1NzE1MkI2MzJEMDAxQjYzOTMgLyogV2ViR0xTaGFkZXJQcmVjaXNpb25G
b3JtYXQuaCAqLzsgfTsKQEAgLTYzMDEsNiArNjMwMCw4IEBACiAJCUZFRTE4MTE0MTZDMzE5RTgw
MDA4NDg0OSAvKiBTUUxUcmFuc2FjdGlvbkJhY2tlbmQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZFRTE4MTEyMTZDMzE5RTgwMDA4NDg0OSAvKiBTUUxU
cmFuc2FjdGlvbkJhY2tlbmQuaCAqLzsgfTsKIAkJRkY5NDVFQ0IxNjFGN0YzNjAwOTcxQkM4IC8q
IFBzZXVkb0VsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gRkY5NDVFQzkxNjFGN0YzNjAwOTcxQkM4IC8qIFBzZXVkb0VsZW1lbnQuY3BwICov
OyB9OwogCQlGRjk0NUVDQzE2MUY3RjM2MDA5NzFCQzggLyogUHNldWRvRWxlbWVudC5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkY5NDVFQ0ExNjFGN0Yz
NjAwOTcxQkM4IC8qIFBzZXVkb0VsZW1lbnQuaCAqLzsgfTsKKwkJRkZCNjk4Q0MxODMzRUUwRDAw
MTU4QTMxIC8qIExpbmVCcmVha2VyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEZGQjY5OENBMTgzM0VDMzgwMDE1OEEzMSAvKiBMaW5lQnJlYWtlci5j
cHAgKi87IH07CisJCUZGQjY5OENGMTgzNDAyQkIwMDE1OEEzMSAvKiBMaW5lSW5mby5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRkI2OThDRDE4MzNG
MTc2MDAxNThBMzEgLyogTGluZUluZm8uY3BwICovOyB9OwogCQlGRkQ1Qjk3QTEzNUNDOTc4MDBE
NUU5MkEgLyogUGFnZVZpc2liaWxpdHlTdGF0ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRkQ1Qjk3NzEzNUNDOTc4MDBENUU5MkEgLyogUGFnZVZp
c2liaWxpdHlTdGF0ZS5jcHAgKi87IH07CiAJCUZGRDVCOTdCMTM1Q0M5NzgwMEQ1RTkyQSAvKiBQ
YWdlVmlzaWJpbGl0eVN0YXRlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBGRkQ1Qjk3ODEzNUNDOTc4MDBENUU5MkEgLyogUGFnZVZpc2liaWxpdHlTdGF0
ZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAvKiBF
bmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KQEAgLTEwMjA3LDcgKzEwMjA4LDYgQEAKIAkJQTAy
NDU3NEUxNkNFQUEyNzAwMEU1NjcxIC8qIEVYVERyYXdCdWZmZXJzLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IEVYVERyYXdCdWZmZXJzLmNwcDsgcGF0aCA9IGNhbnZh
cy9FWFREcmF3QnVmZmVycy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUEwMjQ1
NzRGMTZDRUFBMjcwMDBFNTY3MSAvKiBFWFREcmF3QnVmZmVycy5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IG5hbWUgPSBFWFREcmF3QnVmZmVycy5oOyBwYXRoID0gY2FudmFzL0VYVERyYXdC
dWZmZXJzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUEwMjQ1NzUwMTZDRUFBMjcw
MDBFNTY3MSAvKiBFWFREcmF3QnVmZmVycy5pZGwgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gRVhU
RHJhd0J1ZmZlcnMuaWRsOyBwYXRoID0gY2FudmFzL0VYVERyYXdCdWZmZXJzLmlkbDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJQTA2QkZFMkMxN0RGQjQzMzAwODMwMkJCIC8qIExpbmVJ
bmZvLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IExpbmVJbmZvLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUEwNzE4QkU4MTdFMjZGMTYwMEY2QkY0NCAvKiBMaW5l
TGF5b3V0U3RhdGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTGluZUxheW91
dFN0YXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUEwN0QzMzUzMTUyQjYzMEUw
MDFCNjM5MyAvKiBKU1dlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0LmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTV2ViR0xTaGFkZXJQcmVjaXNpb25Gb3JtYXQuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBMDdEMzM1NDE1MkI2MzBFMDAxQjYzOTMg
LyogSlNXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBKU1dlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0Lmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CkBAIC0xMzQ3Niw2ICsxMzQ3NiwxMSBAQAogCQlGRUUxODExMjE2QzMxOUU4
MDAwODQ4NDkgLyogU1FMVHJhbnNhY3Rpb25CYWNrZW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IFNRTFRyYW5zYWN0aW9uQmFja2VuZC5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQlGRjk0NUVDOTE2MUY3RjM2MDA5NzFCQzggLyogUHNldWRvRWxlbWVudC5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBQc2V1ZG9FbGVtZW50LmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkY5NDVFQ0ExNjFGN0YzNjAwOTcxQkM4IC8q
IFBzZXVkb0VsZW1lbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUHNldWRv
RWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGRkI2OThDOTE4MzJGMTBC
MDAxNThBMzEgLyogQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZGQjY5OENBMTgzM0VDMzgwMDE1OEEzMSAvKiBMaW5l
QnJlYWtlci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBMaW5lQnJl
YWtlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZGQjY5OENCMTgzM0VDMzgw
MDE1OEEzMSAvKiBMaW5lQnJlYWtlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBMaW5lQnJlYWtlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGRkI2OThDRDE4
MzNGMTc2MDAxNThBMzEgLyogTGluZUluZm8uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gTGluZUluZm8uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlG
RkI2OThDRTE4MzNGMTc2MDAxNThBMzEgLyogTGluZUluZm8uaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gTGluZUluZm8uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
RkZENUI5NzcxMzVDQzk3ODAwRDVFOTJBIC8qIFBhZ2VWaXNpYmlsaXR5U3RhdGUuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUGFnZVZpc2liaWxpdHlTdGF0ZS5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZGRDVCOTc4MTM1Q0M5NzgwMEQ1RTkyQSAv
KiBQYWdlVmlzaWJpbGl0eVN0YXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IFBhZ2VWaXNpYmlsaXR5U3RhdGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIC8qIEVu
ZCBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KQEAgLTIwOTA3LDYgKzIwOTEyLDcgQEAKIAkJ
RjUyM0QyRjMwMkRFNDQzQjAxODYzNUNBIC8qIHJlbmRlcmluZyAqLyA9IHsKIAkJCWlzYSA9IFBC
WEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCisJCQkJRkZCNjk4QzgxODMyRjEwQjAwMTU4QTMxIC8q
IGxpbmUgKi8sCiAJCQkJQ0RFN0ZDNDIxODE5MDRCMTAwMkJCQjc3IC8qIE9yZGVySXRlcmF0b3Iu
Y3BwICovLAogCQkJCUNERTdGQzQzMTgxOTA0QjEwMDJCQkI3NyAvKiBPcmRlckl0ZXJhdG9yLmgg
Ki8sCiAJCQkJNDM5MDQ2QzIxMkRBMjVDRTAwQUY4MEEyIC8qIG1hdGhtbCAqLywKQEAgLTIwOTU1
LDcgKzIwOTYxLDYgQEAKIAkJCQlBMTIwQUNBMDEzRjk5ODM3MDBGRTRBQzcgLyogTGF5b3V0UmVw
YWludGVyLmggKi8sCiAJCQkJMkQ5MDY2MDQwQkUxNDFENDAwOTU2OTk4IC8qIExheW91dFN0YXRl
LmNwcCAqLywKIAkJCQkyRDkwNjYwNTBCRTE0MUQ0MDA5NTY5OTggLyogTGF5b3V0U3RhdGUuaCAq
LywKLQkJCQlBMDZCRkUyQzE3REZCNDMzMDA4MzAyQkIgLyogTGluZUluZm8uaCAqLywKIAkJCQlB
MDcxOEJFODE3RTI2RjE2MDBGNkJGNDQgLyogTGluZUxheW91dFN0YXRlLmggKi8sCiAJCQkJQTBD
QjAwMjMxN0RGODFBQzAwMTc4OTZCIC8qIExpbmVXaWR0aC5jcHAgKi8sCiAJCQkJQTBDQjAwMjEx
N0RFOUNEMDAwMTc4OTZCIC8qIExpbmVXaWR0aC5oICovLApAQCAtMjE4OTUsNiArMjE5MDAsMTgg
QEAKIAkJCW5hbWUgPSBXZWJBdWRpbzsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CiAJCX07
CisJCUZGQjY5OEM4MTgzMkYxMEIwMDE1OEEzMSAvKiBsaW5lICovID0geworCQkJaXNhID0gUEJY
R3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlGRkI2OThDRDE4MzNGMTc2MDAxNThBMzEgLyog
TGluZUluZm8uY3BwICovLAorCQkJCUZGQjY5OENFMTgzM0YxNzYwMDE1OEEzMSAvKiBMaW5lSW5m
by5oICovLAorCQkJCUZGQjY5OENBMTgzM0VDMzgwMDE1OEEzMSAvKiBMaW5lQnJlYWtlci5jcHAg
Ki8sCisJCQkJRkZCNjk4Q0IxODMzRUMzODAwMTU4QTMxIC8qIExpbmVCcmVha2VyLmggKi8sCisJ
CQkJRkZCNjk4QzkxODMyRjEwQjAwMTU4QTMxIC8qIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRl
cnMuaCAqLywKKwkJCSk7CisJCQlwYXRoID0gbGluZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7CisJCX07CiAvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLwogCiAvKiBCZWdpbiBQQlhIZWFk
ZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCkBAIC0yNTE4Nyw3ICsyNTIwNCw2IEBACiAJCQkJQkUx
NkM1OTUxN0NGRTE3MjAwODUyQzA0IC8qIEluYmFuZFdlYlZUVFRleHRUcmFjay5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJQkMxMEQ3NjgxN0Q4RUU3MTAwNUUyNjI2IC8qIFJlbmRlckJsb2NrRmxvdy5o
IGluIEhlYWRlcnMgKi8sCiAJCQkJQTBDQjAwMjUxN0RGODI2QzAwMTc4OTZCIC8qIExpbmVXaWR0
aC5oIGluIEhlYWRlcnMgKi8sCi0JCQkJQTA2QkZFMkUxN0RGQjQzRjAwODMwMkJCIC8qIExpbmVJ
bmZvLmggaW4gSGVhZGVycyAqLywKIAkJCQlDRDNFMjUxQzE4MDQ2QjA2MDBFMjdGNTYgLyogR3Jp
ZENvb3JkaW5hdGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUNEM0UyNTI0MTgwNDZCQ0QwMEUyN0Y1
NiAvKiBDU1NHcmlkVGVtcGxhdGVWYWx1ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQ0RFRjRGRDcx
N0U4NUM4RjAwQUVFMjRCIC8qIEdyaWRMZW5ndGguaCBpbiBIZWFkZXJzICovLApAQCAtMjU3NzMs
NiArMjU3ODksNyBAQAogCQkJCTk3N0IzODYyMTIyODgzRTkwMEI4MUZGOCAvKiBDU1NQcmVsb2Fk
U2Nhbm5lci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODBFNkQwNTBBMTk4OUNBMDA3RkI4QzUg
LyogQ1NTUHJpbWl0aXZlVmFsdWUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTgwRTZDRjcwQTE5
ODlDQTAwN0ZCOEM1IC8qIENTU1Byb3BlcnR5LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUZGQjY5
OENDMTgzM0VFMEQwMDE1OEEzMSAvKiBMaW5lQnJlYWtlci5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQk3OEQwMkJDNTE1NEExOERGMDBCNjJEMDUgLyogQ1NTUHJvcGVydHlBbmltYXRpb24uY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJMUFCQTc2Q0ExMUQyMEU1MDAwNEMyMDFDIC8qIENTU1Byb3BlcnR5
TmFtZXMuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMDdDNTlCNTYxN0Y0QUMxNTAwMEZCQ0JCIC8q
IFZpZGVvU3RyZWFtVHJhY2suY3BwIGluIFNvdXJjZXMgKi8sCkBAIC0yNjU3OSw2ICsyNjU5Niw3
IEBACiAJCQkJMDcwMzYzRTUxODFBMUNEQzAwQzA3NEE1IC8qIEFWTWVkaWFDYXB0dXJlU291cmNl
Lm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJOTM5MjI2MkYxMDMyMTA4NDAwNkU3RDVEIC8qIEpTQ1NT
UnVsZUxpc3RDdXN0b20uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQyMDExQjYwQTAwMzEzMzAw
ODMwM0Y5IC8qIEpTQ1NTU3R5bGVEZWNsYXJhdGlvbi5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlG
RkI2OThDRjE4MzQwMkJCMDAxNThBMzEgLyogTGluZUluZm8uY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJQkM1ODI1RjMwQzBCODkzODAwNTNGMUI1IC8qIEpTQ1NTU3R5bGVEZWNsYXJhdGlvbkN1c3Rv
bS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQzQ2QzIwNjBDMEREQ0ExMDAyMENGQzMgLyogSlND
U1NTdHlsZVJ1bGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNDNUJFMDAwQzBFOTMxMTAwMTFD
MkRCIC8qIEpTQ1NTU3R5bGVTaGVldC5jcHAgaW4gU291cmNlcyAqLywKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lSW5mby5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL0xpbmVJbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2FlNjYuLjAw
MDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xpbmVJbmZvLmgKKysrIC9kZXYv
bnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5
c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKLSAqICAgIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZQotICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICogICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwot
ICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUKLSAqIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwKLSAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gKiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikK
LSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIExpbmVJbmZvX2gKLSNkZWZpbmUg
TGluZUluZm9faAotCi0jaW5jbHVkZSAiTGluZVdpZHRoLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3Jl
IHsKLQotY2xhc3MgTGluZUluZm8gewotcHVibGljOgotICAgIExpbmVJbmZvKCkKLSAgICAgICAg
OiBtX2lzRmlyc3RMaW5lKHRydWUpCi0gICAgICAgICwgbV9pc0xhc3RMaW5lKGZhbHNlKQotICAg
ICAgICAsIG1faXNFbXB0eSh0cnVlKQotICAgICAgICAsIG1fcHJldmlvdXNMaW5lQnJva2VDbGVh
bmx5KHRydWUpCi0gICAgICAgICwgbV9mbG9hdFBhZ2luYXRpb25TdHJ1dCgwKQotICAgICAgICAs
IG1fcnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgwKQotICAgIHsgfQotCi0gICAgYm9vbCBpc0Zp
cnN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNGaXJzdExpbmU7IH0KLSAgICBib29sIGlzTGFz
dExpbmUoKSBjb25zdCB7IHJldHVybiBtX2lzTGFzdExpbmU7IH0KLSAgICBib29sIGlzRW1wdHko
KSBjb25zdCB7IHJldHVybiBtX2lzRW1wdHk7IH0KLSAgICBib29sIHByZXZpb3VzTGluZUJyb2tl
Q2xlYW5seSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5OyB9Ci0g
ICAgTGF5b3V0VW5pdCBmbG9hdFBhZ2luYXRpb25TdHJ1dCgpIGNvbnN0IHsgcmV0dXJuIG1fZmxv
YXRQYWdpbmF0aW9uU3RydXQ7IH0KLSAgICB1bnNpZ25lZCBydW5zRnJvbUxlYWRpbmdXaGl0ZXNw
YWNlKCkgY29uc3QgeyByZXR1cm4gbV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlOyB9Ci0gICAg
dm9pZCByZXNldFJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UoKSB7IG1fcnVuc0Zyb21MZWFkaW5n
V2hpdGVzcGFjZSA9IDA7IH0KLSAgICB2b2lkIGluY3JlbWVudFJ1bnNGcm9tTGVhZGluZ1doaXRl
c3BhY2UoKSB7IG1fcnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSsrOyB9Ci0KLSAgICB2b2lkIHNl
dEZpcnN0TGluZShib29sIGZpcnN0TGluZSkgeyBtX2lzRmlyc3RMaW5lID0gZmlyc3RMaW5lOyB9
Ci0gICAgdm9pZCBzZXRMYXN0TGluZShib29sIGxhc3RMaW5lKSB7IG1faXNMYXN0TGluZSA9IGxh
c3RMaW5lOyB9Ci0gICAgdm9pZCBzZXRFbXB0eShib29sIGVtcHR5LCBSZW5kZXJCbG9jayogYmxv
Y2sgPSAwLCBMaW5lV2lkdGgqIGxpbmVXaWR0aCA9IDApCi0gICAgewotICAgICAgICBpZiAobV9p
c0VtcHR5ID09IGVtcHR5KQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX2lzRW1wdHkg
PSBlbXB0eTsKLSAgICAgICAgaWYgKCFlbXB0eSAmJiBibG9jayAmJiBmbG9hdFBhZ2luYXRpb25T
dHJ1dCgpKSB7Ci0gICAgICAgICAgICBibG9jay0+c2V0TG9naWNhbEhlaWdodChibG9jay0+bG9n
aWNhbEhlaWdodCgpICsgZmxvYXRQYWdpbmF0aW9uU3RydXQoKSk7Ci0gICAgICAgICAgICBzZXRG
bG9hdFBhZ2luYXRpb25TdHJ1dCgwKTsKLSAgICAgICAgICAgIGxpbmVXaWR0aC0+dXBkYXRlQXZh
aWxhYmxlV2lkdGgoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0UHJldmlvdXNM
aW5lQnJva2VDbGVhbmx5KGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KSB7IG1fcHJldmlv
dXNMaW5lQnJva2VDbGVhbmx5ID0gcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5OyB9Ci0gICAgdm9p
ZCBzZXRGbG9hdFBhZ2luYXRpb25TdHJ1dChMYXlvdXRVbml0IHN0cnV0KSB7IG1fZmxvYXRQYWdp
bmF0aW9uU3RydXQgPSBzdHJ1dDsgfQotCi1wcml2YXRlOgotICAgIGJvb2wgbV9pc0ZpcnN0TGlu
ZTsKLSAgICBib29sIG1faXNMYXN0TGluZTsKLSAgICBib29sIG1faXNFbXB0eTsKLSAgICBib29s
IG1fcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5OwotICAgIExheW91dFVuaXQgbV9mbG9hdFBhZ2lu
YXRpb25TdHJ1dDsKLSAgICB1bnNpZ25lZCBtX3J1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2U7Ci19
OwotCi19Ci0KLSNlbmRpZiAvLyBMaW5lSW5mb19oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCmluZGV4IGU1N2JjODUuLjIxNTY2NTMg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlv
dXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlv
dXQuY3BwCkBAIC0zLDYgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA2
LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0IHJlc2Vy
dmVkLgogICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hhbmdTZW9rIE9oIDxzaGl2YW1pZG93QGdtYWls
LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluYy4gQWxsIHJpZ2h0
IHJlc2VydmVkLgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCkBAIC0yNSwxMzggKzI2LDMxIEBACiAKICNp
bmNsdWRlICJBWE9iamVjdENhY2hlLmgiCiAjaW5jbHVkZSAiQmlkaVJlc29sdmVyLmgiCisjaW5j
bHVkZSAiQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oIgogI2luY2x1ZGUgIkZsb2F0aW5n
T2JqZWN0cy5oIgotI2luY2x1ZGUgIkh5cGhlbmF0aW9uLmgiCiAjaW5jbHVkZSAiSW5saW5lRWxl
bWVudEJveC5oIgogI2luY2x1ZGUgIklubGluZUl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiSW5saW5l
VGV4dEJveC5oIgotI2luY2x1ZGUgIkxpbmVJbmZvLmgiCiAjaW5jbHVkZSAiTGluZUxheW91dFN0
YXRlLmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlJlbmRlckJsb2NrRmxvdy5o
IgotI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0LmgiCi0jaW5jbHVkZSAiUmVuZGVyQ291bnRl
ci5oIgogI2luY2x1ZGUgIlJlbmRlckZsb3dUaHJlYWQuaCIKLSNpbmNsdWRlICJSZW5kZXJJbmxp
bmUuaCIKLSNpbmNsdWRlICJSZW5kZXJMYXllci5oIgogI2luY2x1ZGUgIlJlbmRlckxpbmVCcmVh
ay5oIgotI2luY2x1ZGUgIlJlbmRlckxpc3RNYXJrZXIuaCIKICNpbmNsdWRlICJSZW5kZXJSZWdp
b24uaCIKLSNpbmNsdWRlICJSZW5kZXJSdWJ5UnVuLmgiCiAjaW5jbHVkZSAiUmVuZGVyVmlldy5o
IgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAjaW5jbHVkZSAiU2ltcGxlTGluZUxheW91dEZ1bmN0
aW9ucy5oIgogI2luY2x1ZGUgIlRyYWlsaW5nRmxvYXRzUm9vdElubGluZUJveC5oIgogI2luY2x1
ZGUgIlZlcnRpY2FsUG9zaXRpb25DYWNoZS5oIgotI2luY2x1ZGUgImJyZWFrX2xpbmVzLmgiCiAj
aW5jbHVkZSA8d3RmL1JlZkNvdW50ZWRMZWFrQ291bnRlci5oPgogI2luY2x1ZGUgPHd0Zi9TdGRM
aWJFeHRyYXMuaD4KLSNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8d3RmL3VuaWNv
ZGUvQ2hhcmFjdGVyTmFtZXMuaD4KLQotI2lmIEVOQUJMRShDU1NfU0hBUEVTKQotI2luY2x1ZGUg
IlNoYXBlSW5zaWRlSW5mby5oIgotI2VuZGlmCiAKICNpZiBFTkFCTEUoU1ZHKQotI2luY2x1ZGUg
IlJlbmRlclNWR0lubGluZVRleHQuaCIKICNpbmNsdWRlICJTVkdSb290SW5saW5lQm94LmgiCiAj
ZW5kaWYKIAotdXNpbmcgbmFtZXNwYWNlIFdURjsKLXVzaW5nIG5hbWVzcGFjZSBVbmljb2RlOwot
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLS8vIFdlIGRvbid0IGxldCBvdXIgbGluZSBib3ggdHJl
ZSBmb3IgYSBzaW5nbGUgbGluZSBnZXQgYW55IGRlZXBlciB0aGFuIHRoaXMuCi1jb25zdCB1bnNp
Z25lZCBjTWF4TGluZURlcHRoID0gMjAwOwotCi1zdHJ1Y3QgUmVuZGVyVGV4dEluZm8gewotICAg
IC8vIERlc3RydWN0aW9uIG9mIG1fbGF5b3V0IHJlcXVpcmVzIFRleHRMYXlvdXQgdG8gYmUgYSBj
b21wbGV0ZSB0eXBlLCBzbyB0aGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgYXJlIG1hZGUg
bm9uLWlubGluZSB0byBhdm9pZCBjb21waWxhdGlvbiBlcnJvcnMuCi0gICAgUmVuZGVyVGV4dElu
Zm8oKTsKLSAgICB+UmVuZGVyVGV4dEluZm8oKTsKLQotICAgIFJlbmRlclRleHQqIG1fdGV4dDsK
LSAgICBPd25QdHI8VGV4dExheW91dD4gbV9sYXlvdXQ7Ci0gICAgTGF6eUxpbmVCcmVha0l0ZXJh
dG9yIG1fbGluZUJyZWFrSXRlcmF0b3I7Ci0gICAgY29uc3QgRm9udCogbV9mb250OwotfTsKLQot
Y2xhc3MgTGluZUJyZWFrZXIgewotcHVibGljOgotICAgIGZyaWVuZCBjbGFzcyBCcmVha2luZ0Nv
bnRleHQ7Ci0gICAgTGluZUJyZWFrZXIoUmVuZGVyQmxvY2tGbG93JiBibG9jaykKLSAgICAgICAg
OiBtX2Jsb2NrKGJsb2NrKQotICAgIHsKLSAgICAgICAgcmVzZXQoKTsKLSAgICB9Ci0KLSAgICBJ
bmxpbmVJdGVyYXRvciBuZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIExpbmVJbmZv
JiwgUmVuZGVyVGV4dEluZm8mLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3Vz
TGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIFdvcmRNZWFzdXJlbWVu
dHMmKTsKLQotICAgIGJvb2wgbGluZVdhc0h5cGhlbmF0ZWQoKSB7IHJldHVybiBtX2h5cGhlbmF0
ZWQ7IH0KLSAgICBjb25zdCBWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmplY3RzKCkg
eyByZXR1cm4gbV9wb3NpdGlvbmVkT2JqZWN0czsgfQotICAgIEVDbGVhciBjbGVhcigpIHsgcmV0
dXJuIG1fY2xlYXI7IH0KLQotcHJpdmF0ZToKLSAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICBJbmxp
bmVJdGVyYXRvciBuZXh0U2VnbWVudEJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIExpbmVJbmZv
JiwgUmVuZGVyVGV4dEluZm8mLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3Vz
TGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIFdvcmRNZWFzdXJlbWVu
dHMmKTsKLSAgICB2b2lkIHNraXBUcmFpbGluZ1doaXRlc3BhY2UoSW5saW5lSXRlcmF0b3ImLCBj
b25zdCBMaW5lSW5mbyYpOwotICAgIHZvaWQgc2tpcExlYWRpbmdXaGl0ZXNwYWNlKElubGluZUJp
ZGlSZXNvbHZlciYsIExpbmVJbmZvJiwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2
aW91c0xpbmUsIExpbmVXaWR0aCYpOwotCi0gICAgUmVuZGVyQmxvY2tGbG93JiBtX2Jsb2NrOwot
ICAgIGJvb2wgbV9oeXBoZW5hdGVkOwotICAgIEVDbGVhciBtX2NsZWFyOwotICAgIFZlY3RvcjxS
ZW5kZXJCb3gqPiBtX3Bvc2l0aW9uZWRPYmplY3RzOwotfTsKLQotc3RhdGljIGlubGluZSBMYXlv
dXRVbml0IGJvcmRlclBhZGRpbmdNYXJnaW5TdGFydChjb25zdCBSZW5kZXJJbmxpbmUmIGNoaWxk
KQotewotICAgIHJldHVybiBjaGlsZC5tYXJnaW5TdGFydCgpICsgY2hpbGQucGFkZGluZ1N0YXJ0
KCkgKyBjaGlsZC5ib3JkZXJTdGFydCgpOwotfQotCi1zdGF0aWMgaW5saW5lIExheW91dFVuaXQg
Ym9yZGVyUGFkZGluZ01hcmdpbkVuZChjb25zdCBSZW5kZXJJbmxpbmUmIGNoaWxkKQotewotICAg
IHJldHVybiBjaGlsZC5tYXJnaW5FbmQoKSArIGNoaWxkLnBhZGRpbmdFbmQoKSArIGNoaWxkLmJv
cmRlckVuZCgpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkQWRkQm9yZGVyUGFkZGlu
Z01hcmdpbihSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIC8vIFdoZW4gZGVjaWRpbmcgd2hl
dGhlciB3ZSdyZSBhdCB0aGUgZWRnZSBvZiBhbiBpbmxpbmUsIGFkamFjZW50IGNvbGxhcHNlZCB3
aGl0ZXNwYWNlIGlzIHRoZSBzYW1lIGFzIG5vIHNpYmxpbmcgYXQgYWxsLgotICAgIHJldHVybiAh
Y2hpbGQgfHwgKGNoaWxkLT5pc1RleHQoKSAmJiAhdG9SZW5kZXJUZXh0KGNoaWxkKS0+dGV4dExl
bmd0aCgpKTsKLX0KLQotc3RhdGljIFJlbmRlck9iamVjdCogcHJldmlvdXNJbkZsb3dTaWJsaW5n
KFJlbmRlck9iamVjdCogY2hpbGQpCi17Ci0gICAgY2hpbGQgPSBjaGlsZC0+cHJldmlvdXNTaWJs
aW5nKCk7Ci0gICAgd2hpbGUgKGNoaWxkICYmIGNoaWxkLT5pc091dE9mRmxvd1Bvc2l0aW9uZWQo
KSkKLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgcmV0dXJu
IGNoaWxkOwotfQotCi1zdGF0aWMgTGF5b3V0VW5pdCBpbmxpbmVMb2dpY2FsV2lkdGgoUmVuZGVy
T2JqZWN0KiBjaGlsZCwgYm9vbCBjaGVja1N0YXJ0RWRnZSA9IHRydWUsIGJvb2wgY2hlY2tFbmRF
ZGdlID0gdHJ1ZSkKLXsKLSAgICB1bnNpZ25lZCBsaW5lRGVwdGggPSAxOwotICAgIExheW91dFVu
aXQgZXh0cmFXaWR0aCA9IDA7Ci0gICAgUmVuZGVyRWxlbWVudCogcGFyZW50ID0gY2hpbGQtPnBh
cmVudCgpOwotICAgIHdoaWxlIChwYXJlbnQtPmlzUmVuZGVySW5saW5lKCkgJiYgbGluZURlcHRo
KysgPCBjTWF4TGluZURlcHRoKSB7Ci0gICAgICAgIGNvbnN0IFJlbmRlcklubGluZSYgcGFyZW50
QXNSZW5kZXJJbmxpbmUgPSB0b1JlbmRlcklubGluZSgqcGFyZW50KTsKLSAgICAgICAgaWYgKCFp
c0VtcHR5SW5saW5lKHBhcmVudEFzUmVuZGVySW5saW5lKSkgewotICAgICAgICAgICAgY2hlY2tT
dGFydEVkZ2UgPSBjaGVja1N0YXJ0RWRnZSAmJiBzaG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2lu
KHByZXZpb3VzSW5GbG93U2libGluZyhjaGlsZCkpOwotICAgICAgICAgICAgaWYgKGNoZWNrU3Rh
cnRFZGdlKQotICAgICAgICAgICAgICAgIGV4dHJhV2lkdGggKz0gYm9yZGVyUGFkZGluZ01hcmdp
blN0YXJ0KHBhcmVudEFzUmVuZGVySW5saW5lKTsKLSAgICAgICAgICAgIGNoZWNrRW5kRWRnZSA9
IGNoZWNrRW5kRWRnZSAmJiBzaG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2luKGNoaWxkLT5uZXh0
U2libGluZygpKTsKLSAgICAgICAgICAgIGlmIChjaGVja0VuZEVkZ2UpCi0gICAgICAgICAgICAg
ICAgZXh0cmFXaWR0aCArPSBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKHBhcmVudEFzUmVuZGVySW5s
aW5lKTsKLSAgICAgICAgICAgIGlmICghY2hlY2tTdGFydEVkZ2UgJiYgIWNoZWNrRW5kRWRnZSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFXaWR0aDsKLSAgICAgICAgfQotICAgICAgICBj
aGlsZCA9IHBhcmVudDsKLSAgICAgICAgcGFyZW50ID0gY2hpbGQtPnBhcmVudCgpOwotICAgIH0K
LSAgICByZXR1cm4gZXh0cmFXaWR0aDsKLX0KLQogc3RhdGljIHZvaWQgZGV0ZXJtaW5lRGlyZWN0
aW9uYWxpdHkoVGV4dERpcmVjdGlvbiYgZGlyLCBJbmxpbmVJdGVyYXRvciBpdGVyKQogewogICAg
IHdoaWxlICghaXRlci5hdEVuZCgpKSB7CkBAIC0xNzcsNjcgKzcxLDcgQEAgc3RhdGljIHZvaWQg
ZGV0ZXJtaW5lRGlyZWN0aW9uYWxpdHkoVGV4dERpcmVjdGlvbiYgZGlyLCBJbmxpbmVJdGVyYXRv
ciBpdGVyKQogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2hlY2tNaWRwb2ludHMoTGluZU1pZHBv
aW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvciYgbEJyZWFrKQotewot
ICAgIC8vIENoZWNrIHRvIHNlZSBpZiBvdXIgbGFzdCBtaWRwb2ludCBpcyBhIHN0YXJ0IHBvaW50
IGJleW9uZCB0aGUgbGluZSBicmVhay4gIElmIHNvLAotICAgIC8vIHNoYXZlIGl0IG9mZiB0aGUg
bGlzdCwgYW5kIHNoYXZlIG9mZiBhIHRyYWlsaW5nIHNwYWNlIGlmIHRoZSBwcmV2aW91cyBlbmQg
cG9pbnQgZG9lc24ndAotICAgIC8vIHByZXNlcnZlIHdoaXRlc3BhY2UuCi0gICAgaWYgKGxCcmVh
ay5tX29iaiAmJiBsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgJiYgIShsaW5lTWlkcG9p
bnRTdGF0ZS5udW1NaWRwb2ludHMgJSAyKSkgewotICAgICAgICBJbmxpbmVJdGVyYXRvciogbWlk
cG9pbnRzID0gbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmRhdGEoKTsKLSAgICAgICAgSW5s
aW5lSXRlcmF0b3ImIGVuZHBvaW50ID0gbWlkcG9pbnRzW2xpbmVNaWRwb2ludFN0YXRlLm51bU1p
ZHBvaW50cyAtIDJdOwotICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgc3RhcnRwb2ludCA9
IG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxXTsKLSAgICAgICAg
SW5saW5lSXRlcmF0b3IgY3VycnBvaW50ID0gZW5kcG9pbnQ7Ci0gICAgICAgIHdoaWxlICghY3Vy
cnBvaW50LmF0RW5kKCkgJiYgY3VycnBvaW50ICE9IHN0YXJ0cG9pbnQgJiYgY3VycnBvaW50ICE9
IGxCcmVhaykKLSAgICAgICAgICAgIGN1cnJwb2ludC5pbmNyZW1lbnQoKTsKLSAgICAgICAgaWYg
KGN1cnJwb2ludCA9PSBsQnJlYWspIHsKLSAgICAgICAgICAgIC8vIFdlIGhpdCB0aGUgbGluZSBi
cmVhayBiZWZvcmUgdGhlIHN0YXJ0IHBvaW50LiAgU2hhdmUgb2ZmIHRoZSBzdGFydCBwb2ludC4K
LSAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cy0tOwotICAgICAgICAg
ICAgaWYgKGVuZHBvaW50Lm1fb2JqLT5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIGVu
ZHBvaW50Lm1fb2JqLT5pc1RleHQoKSkKLSAgICAgICAgICAgICAgICBlbmRwb2ludC5tX3Bvcy0t
OwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBEb24ndCBjYWxsIHRoaXMgZGlyZWN0bHkuIFVz
ZSBvbmUgb2YgdGhlIGRlc2NyaXB0aXZlIGhlbHBlciBmdW5jdGlvbnMgYmVsb3cuCi1zdGF0aWMg
dm9pZCBkZXByZWNhdGVkQWRkTWlkcG9pbnQoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2lu
dFN0YXRlLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbWlkcG9pbnQpCi17Ci0gICAgaWYgKGxpbmVN
aWRwb2ludFN0YXRlLm1pZHBvaW50cy5zaXplKCkgPD0gbGluZU1pZHBvaW50U3RhdGUubnVtTWlk
cG9pbnRzKQotICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHMuZ3JvdyhsaW5lTWlk
cG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgKyAxMCk7Ci0KLSAgICBJbmxpbmVJdGVyYXRvciogbWlk
cG9pbnRzID0gbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmRhdGEoKTsKLSAgICBtaWRwb2lu
dHNbbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKytdID0gbWlkcG9pbnQ7Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgdm9pZCBzdGFydElnbm9yaW5nU3BhY2VzKExpbmVNaWRwb2ludFN0YXRlJiBs
aW5lTWlkcG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQotewotICAg
IEFTU0VSVCghKGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAlIDIpKTsKLSAgICBkZXBy
ZWNhdGVkQWRkTWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIG1pZHBvaW50KTsKLX0KLQotc3Rh
dGljIGlubGluZSB2b2lkIHN0b3BJZ25vcmluZ1NwYWNlcyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGlu
ZU1pZHBvaW50U3RhdGUsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBtaWRwb2ludCkKLXsKLSAgICBB
U1NFUlQobGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzICUgMik7Ci0gICAgZGVwcmVjYXRl
ZEFkZE1pZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBtaWRwb2ludCk7Ci19Ci0KLS8vIFdoZW4g
aWdub3Jpbmcgc3BhY2VzLCB0aGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBmb3Igb2JqZWN0cyB0aGF0
IG5lZWQgbGluZSBib3hlcyBzdWNoIGFzIFJlbmRlcklubGluZXMgb3IKLS8vIGhhcmQgbGluZSBi
cmVha3MgdG8gZW5zdXJlIHRoYXQgdGhleSdyZSBub3QgaWdub3JlZC4KLXN0YXRpYyBpbmxpbmUg
dm9pZCBlbnN1cmVMaW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcyhMaW5lTWlkcG9pbnRTdGF0ZSYg
bGluZU1pZHBvaW50U3RhdGUsIFJlbmRlck9iamVjdCogcmVuZGVyZXIpCi17Ci0gICAgSW5saW5l
SXRlcmF0b3IgbWlkcG9pbnQoMCwgcmVuZGVyZXIsIDApOwotICAgIHN0b3BJZ25vcmluZ1NwYWNl
cyhsaW5lTWlkcG9pbnRTdGF0ZSwgbWlkcG9pbnQpOwotICAgIHN0YXJ0SWdub3JpbmdTcGFjZXMo
bGluZU1pZHBvaW50U3RhdGUsIG1pZHBvaW50KTsKLX0KLQotLy8gQWRkaW5nIGEgcGFpciBvZiBt
aWRwb2ludHMgYmVmb3JlIGEgY2hhcmFjdGVyIHdpbGwgc3BsaXQgaXQgb3V0IGludG8gYSBuZXcg
bGluZSBib3guCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3go
TGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvciYgdGV4
dFBhcmFncmFwaFNlcGFyYXRvcikKLXsKLSAgICBJbmxpbmVJdGVyYXRvciBtaWRwb2ludCgwLCB0
ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fb2JqLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fcG9z
KTsKLSAgICBzdGFydElnbm9yaW5nU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVy
YXRvcigwLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fb2JqLCB0ZXh0UGFyYWdyYXBoU2VwYXJh
dG9yLm1fcG9zIC0gMSkpOwotICAgIHN0b3BJZ25vcmluZ1NwYWNlcyhsaW5lTWlkcG9pbnRTdGF0
ZSwgSW5saW5lSXRlcmF0b3IoMCwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX29iaiwgdGV4dFBh
cmFncmFwaFNlcGFyYXRvci5tX3BvcykpOwotfQotCi1zdGF0aWMgaW5saW5lIEJpZGlSdW4qIGNy
ZWF0ZVJ1bihpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCogb2JqLCBJbmxpbmVCaWRp
UmVzb2x2ZXImIHJlc29sdmVyKQoraW5saW5lIEJpZGlSdW4qIGNyZWF0ZVJ1bihpbnQgc3RhcnQs
IGludCBlbmQsIFJlbmRlck9iamVjdCogb2JqLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVy
KQogewogICAgIEFTU0VSVChvYmopOwogICAgIHJldHVybiBuZXcgQmlkaVJ1bihzdGFydCwgZW5k
LCAqb2JqLCByZXNvbHZlci5jb250ZXh0KCksIHJlc29sdmVyLmRpcigpKTsKQEAgLTMwMyw3ICsx
MzcsNiBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUFuZEFwcGVuZFJv
b3RJbmxpbmVCb3goKQogICAgIHJldHVybiByb290Qm94OwogfQogCi0KIHN0YXRpYyBpbmxpbmUg
SW5saW5lQm94KiBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwg
Ym9vbCBpc1Jvb3RMaW5lQm94LCBib29sIGlzT25seVJ1biA9IGZhbHNlKQogewogICAgIGlmIChp
c1Jvb3RMaW5lQm94KQpAQCAtMzI5LDE1ICsxNjIsNiBAQCBzdGF0aWMgaW5saW5lIElubGluZUJv
eCogY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGJvb2wgaXNS
bwogICAgIHJldHVybiB0b1JlbmRlcklubGluZShvYmopLT5jcmVhdGVBbmRBcHBlbmRJbmxpbmVG
bG93Qm94KCk7CiB9CiAKLS8vIEZJWE1FOiBEb24ndCBsZXQgY291bnRlcnMgbWFyayB0aGVtc2Vs
dmVzIGFzIG5lZWRpbmcgcHJlZiB3aWR0aCByZWNhbGNzIGR1cmluZyBsYXlvdXQKLS8vIHNvIHdl
IGRvbid0IG5lZWQgdGhpcyBoYWNrLgotc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZUNvdW50ZXJJ
Zk5lZWRlZChSZW5kZXJUZXh0JiByZW5kZXJUZXh0KQotewotICAgIGlmICghcmVuZGVyVGV4dC5w
cmVmZXJyZWRMb2dpY2FsV2lkdGhzRGlydHkoKSB8fCAhcmVuZGVyVGV4dC5pc0NvdW50ZXIoKSkK
LSAgICAgICAgcmV0dXJuOwotICAgIHRvUmVuZGVyQ291bnRlcihyZW5kZXJUZXh0KS51cGRhdGVD
b3VudGVyKCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkaXJ0eUxpbmVCb3hlc0ZvclJlbmRl
cmVyKFJlbmRlck9iamVjdCYgcmVuZGVyZXIsIGJvb2wgZnVsbExheW91dCkKIHsKICAgICBpZiAo
cmVuZGVyZXIuaXNUZXh0KCkpIHsKQEAgLTYwNSwzNCArNDI5LDYgQEAgdm9pZCBSZW5kZXJCbG9j
a0Zsb3c6OnNldE1hcmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4qIHJ1biwgUmVuZGVyUnVieVJ1biYg
cmVuZGVyZXIKICAgICBzZXRNYXJnaW5FbmRGb3JDaGlsZChyZW5kZXJlciwgLWVuZE92ZXJoYW5n
KTsKIH0KIAotc3RhdGljIGlubGluZSBmbG9hdCBtZWFzdXJlSHlwaGVuV2lkdGgoUmVuZGVyVGV4
dCogcmVuZGVyZXIsIGNvbnN0IEZvbnQmIGZvbnQsIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERh
dGEqPiogZmFsbGJhY2tGb250cyA9IDApCi17Ci0gICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxl
ID0gcmVuZGVyZXItPnN0eWxlKCk7Ci0gICAgcmV0dXJuIGZvbnQud2lkdGgoUmVuZGVyQmxvY2s6
OmNvbnN0cnVjdFRleHRSdW4ocmVuZGVyZXIsIGZvbnQsIHN0eWxlLmh5cGhlblN0cmluZygpLnN0
cmluZygpLCBzdHlsZSksIGZhbGxiYWNrRm9udHMpOwotfQotCi1jbGFzcyBXb3JkTWVhc3VyZW1l
bnQgewotcHVibGljOgotICAgIFdvcmRNZWFzdXJlbWVudCgpCi0gICAgICAgIDogcmVuZGVyZXIo
MCkKLSAgICAgICAgLCB3aWR0aCgwKQotICAgICAgICAsIHN0YXJ0T2Zmc2V0KDApCi0gICAgICAg
ICwgZW5kT2Zmc2V0KDApCi0gICAgewotICAgIH0KLSAgICAKLSAgICBSZW5kZXJUZXh0KiByZW5k
ZXJlcjsKLSAgICBmbG9hdCB3aWR0aDsKLSAgICBpbnQgc3RhcnRPZmZzZXQ7Ci0gICAgaW50IGVu
ZE9mZnNldDsKLSAgICBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4gZmFsbGJhY2tGb250
czsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgY29uc3QgUmVuZGVyU3R5bGUmIGxpbmVTdHlsZShjb25z
dCBSZW5kZXJFbGVtZW50JiByZW5kZXJlciwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQotewot
ICAgIHJldHVybiBsaW5lSW5mby5pc0ZpcnN0TGluZSgpID8gcmVuZGVyZXIuZmlyc3RMaW5lU3R5
bGUoKSA6IHJlbmRlcmVyLnN0eWxlKCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dp
Y2FsV2lkdGhGb3JUZXh0UnVuKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1biwg
UmVuZGVyVGV4dCogcmVuZGVyZXIsIGZsb2F0IHhQb3MsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5m
bywKICAgICBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4dEJveERhdGFNYXAs
IFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlLCBXb3JkTWVhc3Vy
ZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewpAQCAtOTk3LDI0ICs3OTMsNiBAQCBzdGF0aWMg
aW5saW5lIGJvb2wgaXNDb2xsYXBzaWJsZVNwYWNlKFVDaGFyIGNoYXJhY3RlciwgY29uc3QgUmVu
ZGVyVGV4dCYgcmVuZGVyZQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotCi1zdGF0aWMgdm9pZCBz
ZXRTdGF0aWNQb3NpdGlvbnMoUmVuZGVyQmxvY2tGbG93JiBibG9jaywgUmVuZGVyQm94JiBjaGls
ZCkKLXsKLSAgICAvLyBGSVhNRTogVGhlIG1hdGggaGVyZSBpcyBhY3R1YWxseSBub3QgcmVhbGx5
IHJpZ2h0LiBJdCdzIGEgYmVzdC1ndWVzcyBhcHByb3hpbWF0aW9uIHRoYXQKLSAgICAvLyB3aWxs
IHdvcmsgZm9yIHRoZSBjb21tb24gY2FzZXMKLSAgICBSZW5kZXJFbGVtZW50KiBjb250YWluZXJC
bG9jayA9IGNoaWxkLmNvbnRhaW5lcigpOwotICAgIExheW91dFVuaXQgYmxvY2tIZWlnaHQgPSBi
bG9jay5sb2dpY2FsSGVpZ2h0KCk7Ci0gICAgaWYgKGNvbnRhaW5lckJsb2NrLT5pc1JlbmRlcklu
bGluZSgpKSB7Ci0gICAgICAgIC8vIEEgcmVsYXRpdmUgcG9zaXRpb25lZCBpbmxpbmUgZW5jbG9z
ZXMgdXMuIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBoYXZlIHRvIGRldGVybWluZSBvdXIKLSAgICAg
ICAgLy8gcG9zaXRpb24gYXMgdGhvdWdoIHdlIHdlcmUgYW4gaW5saW5lLiBTZXQgfHN0YXRpY0lu
bGluZVBvc2l0aW9ufCBhbmQgfHN0YXRpY0Jsb2NrUG9zaXRpb258IG9uIHRoZSByZWxhdGl2ZSBw
b3NpdGlvbmVkCi0gICAgICAgIC8vIGlubGluZSBzbyB0aGF0IHdlIGNhbiBvYnRhaW4gdGhlIHZh
bHVlIGxhdGVyLgotICAgICAgICB0b1JlbmRlcklubGluZShjb250YWluZXJCbG9jayktPmxheWVy
KCktPnNldFN0YXRpY0lubGluZVBvc2l0aW9uKGJsb2NrLnN0YXJ0QWxpZ25lZE9mZnNldEZvckxp
bmUoYmxvY2tIZWlnaHQsIGZhbHNlKSk7Ci0gICAgICAgIHRvUmVuZGVySW5saW5lKGNvbnRhaW5l
ckJsb2NrKS0+bGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlvbihibG9ja0hlaWdodCk7Ci0g
ICAgfQotICAgIGJsb2NrLnVwZGF0ZVN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hpbGQoY2hpbGQs
IGJsb2NrSGVpZ2h0KTsKLSAgICBjaGlsZC5sYXllcigpLT5zZXRTdGF0aWNCbG9ja1Bvc2l0aW9u
KGJsb2NrSGVpZ2h0KTsKLX0KLQogdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJhY3RlclR5cGU+CiBz
dGF0aWMgaW5saW5lIGludCBmaW5kRmlyc3RUcmFpbGluZ1NwYWNlKGNvbnN0IFJlbmRlclRleHQm
IGxhc3RUZXh0LCBjb25zdCBDaGFyYWN0ZXJUeXBlKiBjaGFyYWN0ZXJzLCBpbnQgc3RhcnQsIGlu
dCBzdG9wKQogewpAQCAtMTQ2NiwxNSArMTI0NCw2IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1
cGRhdGVTaGFwZUFuZFNlZ21lbnRzRm9yQ3VycmVudExpbmVJbkZsb3dUaHJlYWQoU2hhcGVJbnNp
CiAgICAgICAgIHB1c2hTaGFwZUNvbnRlbnRPdmVyZmxvd0JlbG93VGhlQ29udGVudEJveCh0aGlz
LCBzaGFwZUluc2lkZUluZm8sIGxpbmVUb3AsIGxpbmVIZWlnaHQpOwogfQogCi1zdGF0aWMgaW5s
aW5lIGZsb2F0IGZpcnN0UG9zaXRpdmVXaWR0aChjb25zdCBXb3JkTWVhc3VyZW1lbnRzJiB3b3Jk
TWVhc3VyZW1lbnRzKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd29yZE1lYXN1cmVt
ZW50cy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAod29yZE1lYXN1cmVtZW50c1tpXS53aWR0
aCA+IDApCi0gICAgICAgICAgICByZXR1cm4gd29yZE1lYXN1cmVtZW50c1tpXS53aWR0aDsKLSAg
ICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgTGF5b3V0VW5pdCBhZGp1c3RM
b2dpY2FsTGluZVRvcChTaGFwZUluc2lkZUluZm8qIHNoYXBlSW5zaWRlSW5mbywgSW5saW5lSXRl
cmF0b3Igc3RhcnQsIElubGluZUl0ZXJhdG9yIGVuZCwgY29uc3QgV29yZE1lYXN1cmVtZW50cyYg
d29yZE1lYXN1cmVtZW50cykKIHsKICAgICBpZiAoIXNoYXBlSW5zaWRlSW5mbyB8fCBlbmQgIT0g
c3RhcnQpCkBAIC0yMjI1LDkxICsxOTk0LDYgQEAgYm9vbCBSZW5kZXJCbG9ja0Zsb3c6Om1hdGNo
ZWRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIGNvbnN0IElubGluZUIKICAg
ICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBza2lwTm9uQnJlYWtpbmdT
cGFjZShjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykK
LXsKLSAgICBpZiAoaXQubV9vYmotPnN0eWxlKCkubmJzcE1vZGUoKSAhPSBTUEFDRSB8fCBpdC5j
dXJyZW50KCkgIT0gbm9CcmVha1NwYWNlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAv
LyBGSVhNRTogVGhpcyBpcyBiYWQuICBJdCBtYWtlcyBuYnNwIGluY29uc2lzdGVudCB3aXRoIHNw
YWNlIGFuZCB3b24ndCB3b3JrIGNvcnJlY3RseQotICAgIC8vIHdpdGggbV9taW5XaWR0aC9tX21h
eFdpZHRoLgotICAgIC8vIERvIG5vdCBza2lwIGEgbm9uLWJyZWFraW5nIHNwYWNlIGlmIGl0IGlz
IHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICAvLyBvbiBhIGxpbmUgYWZ0ZXIgYSBjbGVhbiBsaW5l
IGJyZWFrIChvciBvbiB0aGUgZmlyc3QgbGluZSwgc2luY2UgcHJldmlvdXNMaW5lQnJva2VDbGVh
bmx5IHN0YXJ0cyBvZmYKLSAgICAvLyB8dHJ1ZXwpLgotICAgIGlmIChsaW5lSW5mby5pc0VtcHR5
KCkgJiYgbGluZUluZm8ucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1lbnVtIFdoaXRlc3BhY2VQb3NpdGlv
biB7IExlYWRpbmdXaGl0ZXNwYWNlLCBUcmFpbGluZ1doaXRlc3BhY2UgfTsKLXN0YXRpYyBpbmxp
bmUgYm9vbCBzaG91bGRDb2xsYXBzZVdoaXRlU3BhY2UoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxl
LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIFdoaXRlc3BhY2VQb3NpdGlvbiB3aGl0ZXNwYWNl
UG9zaXRpb24pCi17Ci0gICAgLy8gQ1NTMiAxNi42LjEKLSAgICAvLyBJZiBhIHNwYWNlIChVKzAw
MjApIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGhhcyAnd2hpdGUtc3BhY2UnIHNldCB0byAn
bm9ybWFsJywgJ25vd3JhcCcsIG9yICdwcmUtbGluZScsIGl0IGlzIHJlbW92ZWQuCi0gICAgLy8g
SWYgYSBzcGFjZSAoVSswMDIwKSBhdCB0aGUgZW5kIG9mIGEgbGluZSBoYXMgJ3doaXRlLXNwYWNl
JyBzZXQgdG8gJ25vcm1hbCcsICdub3dyYXAnLCBvciAncHJlLWxpbmUnLCBpdCBpcyBhbHNvIHJl
bW92ZWQuCi0gICAgLy8gSWYgc3BhY2VzIChVKzAwMjApIG9yIHRhYnMgKFUrMDAwOSkgYXQgdGhl
IGVuZCBvZiBhIGxpbmUgaGF2ZSAnd2hpdGUtc3BhY2UnIHNldCB0byAncHJlLXdyYXAnLCBVQXMg
bWF5IHZpc3VhbGx5IGNvbGxhcHNlIHRoZW0uCi0gICAgcmV0dXJuIHN0eWxlLT5jb2xsYXBzZVdo
aXRlU3BhY2UoKQotICAgICAgICB8fCAod2hpdGVzcGFjZVBvc2l0aW9uID09IFRyYWlsaW5nV2hp
dGVzcGFjZSAmJiBzdHlsZS0+d2hpdGVTcGFjZSgpID09IFBSRV9XUkFQICYmICghbGluZUluZm8u
aXNFbXB0eSgpIHx8ICFsaW5lSW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSkpOwotfQot
Ci1zdGF0aWMgYm9vbCByZXF1aXJlc0xpbmVCb3hGb3JDb250ZW50KGNvbnN0IFJlbmRlcklubGlu
ZSYgZmxvdywgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQotewotICAgIFJlbmRlckVsZW1lbnQq
IHBhcmVudCA9IGZsb3cucGFyZW50KCk7Ci0gICAgaWYgKGZsb3cuZG9jdW1lbnQoKS5pbk5vUXVp
cmtzTW9kZSgpKSB7Ci0gICAgICAgIGNvbnN0IFJlbmRlclN0eWxlJiBmbG93U3R5bGUgPSBsaW5l
U3R5bGUoZmxvdywgbGluZUluZm8pOwotICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYgcGFyZW50
U3R5bGUgPSBsaW5lU3R5bGUoKnBhcmVudCwgbGluZUluZm8pOwotICAgICAgICBpZiAoZmxvd1N0
eWxlLmxpbmVIZWlnaHQoKSAhPSBwYXJlbnRTdHlsZS5saW5lSGVpZ2h0KCkKLSAgICAgICAgICAg
IHx8IGZsb3dTdHlsZS52ZXJ0aWNhbEFsaWduKCkgIT0gcGFyZW50U3R5bGUudmVydGljYWxBbGln
bigpCi0gICAgICAgICAgICB8fCAhcGFyZW50U3R5bGUuZm9udCgpLmZvbnRNZXRyaWNzKCkuaGFz
SWRlbnRpY2FsQXNjZW50RGVzY2VudEFuZExpbmVHYXAoZmxvd1N0eWxlLmZvbnQoKS5mb250TWV0
cmljcygpKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsK
LX0KLQotc3RhdGljIGJvb2wgaGFzSW5saW5lRGlyZWN0aW9uQm9yZGVyc1BhZGRpbmdPck1hcmdp
bihjb25zdCBSZW5kZXJJbmxpbmUmIGZsb3cpCi17Ci0gICAgLy8gV2hlcmUgYW4gZW1wdHkgaW5s
aW5lIGlzIHNwbGl0IGFjcm9zcyBhbm9ueW1vdXMgYmxvY2tzIHdlIHNob3VsZCBvbmx5IGdpdmUg
bGluZWJveGVzIHRvIHRoZSAnc2lkZXMnIG9mIHRoZQotICAgIC8vIGlubGluZSB0aGF0IGhhdmUg
Ym9yZGVycywgcGFkZGluZyBvciBtYXJnaW4uCi0gICAgYm9vbCBzaG91bGRBcHBseVN0YXJ0Qm9y
ZGVyUGFkZGluZ09yTWFyZ2luID0gIWZsb3cucGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSB8
fCAhZmxvdy5pc0lubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsKLSAgICBpZiAoc2hvdWxkQXBw
bHlTdGFydEJvcmRlclBhZGRpbmdPck1hcmdpbiAmJiAoZmxvdy5ib3JkZXJTdGFydCgpIHx8IGZs
b3cubWFyZ2luU3RhcnQoKSB8fCBmbG93LnBhZGRpbmdTdGFydCgpKSkKLSAgICAgICAgcmV0dXJu
IHRydWU7Ci0KLSAgICBib29sIHNob3VsZEFwcGx5RW5kQm9yZGVyUGFkZGluZ09yTWFyZ2luID0g
IWZsb3cucGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSB8fCBmbG93LmlzSW5saW5lRWxlbWVu
dENvbnRpbnVhdGlvbigpIHx8ICFmbG93LmlubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsKLSAg
ICByZXR1cm4gc2hvdWxkQXBwbHlFbmRCb3JkZXJQYWRkaW5nT3JNYXJnaW4gJiYgKGZsb3cuYm9y
ZGVyRW5kKCkgfHwgZmxvdy5tYXJnaW5FbmQoKSB8fCBmbG93LnBhZGRpbmdFbmQoKSk7Ci19Ci0K
LXN0YXRpYyBib29sIGFsd2F5c1JlcXVpcmVzTGluZUJveChjb25zdCBSZW5kZXJJbmxpbmUmIGZs
b3cpCi17Ci0gICAgLy8gRklYTUU6IFJpZ2h0IG5vdywgd2Ugb25seSBhbGxvdyBsaW5lIGJveGVz
IGZvciBpbmxpbmVzIHRoYXQgYXJlIHRydWx5IGVtcHR5LgotICAgIC8vIFdlIG5lZWQgdG8gZml4
IHRoaXMsIHRob3VnaCwgYmVjYXVzZSBhdCB0aGUgdmVyeSBsZWFzdCwgaW5saW5lcyBjb250YWlu
aW5nIG9ubHkKLSAgICAvLyBpZ25vcmFibGUgd2hpdGVzcGFjZSBzaG91bGQgc2hvdWxkIGFsc28g
aGF2ZSBsaW5lIGJveGVzLgotICAgIHJldHVybiBpc0VtcHR5SW5saW5lKGZsb3cpICYmIGhhc0lu
bGluZURpcmVjdGlvbkJvcmRlcnNQYWRkaW5nT3JNYXJnaW4oZmxvdyk7Ci19Ci0KLXN0YXRpYyBi
b29sIHJlcXVpcmVzTGluZUJveChjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQsIGNvbnN0IExpbmVJ
bmZvJiBsaW5lSW5mbyA9IExpbmVJbmZvKCksIFdoaXRlc3BhY2VQb3NpdGlvbiB3aGl0ZXNwYWNl
UG9zaXRpb24gPSBMZWFkaW5nV2hpdGVzcGFjZSkKLXsKLSAgICBpZiAoaXQubV9vYmotPmlzRmxv
YXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgaWYgKGl0Lm1fb2JqLT5pc0JSKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgYm9v
bCByZW5kZXJlcklzRW1wdHlJbmxpbmUgPSBmYWxzZTsKLSAgICBpZiAoaXQubV9vYmotPmlzUmVu
ZGVySW5saW5lKCkpIHsKLSAgICAgICAgY29uc3QgUmVuZGVySW5saW5lJiBpbmxpbmVSZW5kZXJl
ciA9IHRvUmVuZGVySW5saW5lKCppdC5tX29iaik7Ci0gICAgICAgIGlmICghYWx3YXlzUmVxdWly
ZXNMaW5lQm94KGlubGluZVJlbmRlcmVyKSAmJiAhcmVxdWlyZXNMaW5lQm94Rm9yQ29udGVudChp
bmxpbmVSZW5kZXJlciwgbGluZUluZm8pKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICByZW5kZXJlcklzRW1wdHlJbmxpbmUgPSBpc0VtcHR5SW5saW5lKGlubGluZVJlbmRlcmVy
KTsKLSAgICB9Ci0KLSAgICBpZiAoIXNob3VsZENvbGxhcHNlV2hpdGVTcGFjZSgmaXQubV9vYmot
PnN0eWxlKCksIGxpbmVJbmZvLCB3aGl0ZXNwYWNlUG9zaXRpb24pKQotICAgICAgICByZXR1cm4g
dHJ1ZTsKLQotICAgIFVDaGFyIGN1cnJlbnQgPSBpdC5jdXJyZW50KCk7Ci0gICAgYm9vbCBub3RK
dXN0V2hpdGVzcGFjZSA9IGN1cnJlbnQgIT0gJyAnICYmIGN1cnJlbnQgIT0gJ1x0JyAmJiBjdXJy
ZW50ICE9IHNvZnRIeXBoZW4gJiYgKGN1cnJlbnQgIT0gJ1xuJyB8fCBpdC5tX29iai0+cHJlc2Vy
dmVzTmV3bGluZSgpKSAmJiAhc2tpcE5vbkJyZWFraW5nU3BhY2UoaXQsIGxpbmVJbmZvKTsKLSAg
ICByZXR1cm4gbm90SnVzdFdoaXRlc3BhY2UgfHwgcmVuZGVyZXJJc0VtcHR5SW5saW5lOwotfQot
CiBib29sIFJlbmRlckJsb2NrOjpnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZChSZW5k
ZXJPYmplY3QqIGlubGluZU9iaikKIHsKICAgICBBU1NFUlQoaW5saW5lT2JqLT5wYXJlbnQoKSA9
PSB0aGlzKTsKQEAgLTIzMjIsMjQ5ICsyMDA2LDYgQEAgYm9vbCBSZW5kZXJCbG9jazo6Z2VuZXJh
dGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQoUmVuZGVyT2JqZWN0KiBpbmxpbmVPYmopCiAgICAg
cmV0dXJuICFpdC5hdEVuZCgpOwogfQogCi0vLyBGSVhNRTogVGhlIGVudGlyZSBjb25jZXB0IG9m
IHRoZSBza2lwVHJhaWxpbmdXaGl0ZXNwYWNlIGZ1bmN0aW9uIGlzIGZsYXdlZCwgc2luY2Ugd2Ug
cmVhbGx5IG5lZWQgdG8gYmUgYnVpbGRpbmcKLS8vIGxpbmUgYm94ZXMgZXZlbiBmb3IgY29udGFp
bmVycyB0aGF0IG1heSB1bHRpbWF0ZWx5IGNvbGxhcHNlIGF3YXkuIE90aGVyd2lzZSB3ZSdsbCBu
ZXZlciBnZXQgcG9zaXRpb25lZAotLy8gZWxlbWVudHMgcXVpdGUgcmlnaHQuIEluIG90aGVyIHdv
cmRzLCB3ZSBuZWVkIHRvIGJ1aWxkIHRoaXMgZnVuY3Rpb24ncyB3b3JrIGludG8gdGhlIG5vcm1h
bCBsaW5lCi0vLyBvYmplY3QgaXRlcmF0aW9uIHByb2Nlc3MuCi0vLyBOQi4gdGhpcyBmdW5jdGlv
biB3aWxsIGluc2VydCBhbnkgZmxvYXRpbmcgZWxlbWVudHMgdGhhdCB3b3VsZCBvdGhlcndpc2UK
LS8vIGJlIHNraXBwZWQgYnV0IGl0IHdpbGwgbm90IHBvc2l0aW9uIHRoZW0uCi12b2lkIExpbmVC
cmVha2VyOjpza2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiBpdGVyYXRvciwg
Y29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQotewotICAgIHdoaWxlICghaXRlcmF0b3IuYXRFbmQo
KSAmJiAhcmVxdWlyZXNMaW5lQm94KGl0ZXJhdG9yLCBsaW5lSW5mbywgVHJhaWxpbmdXaGl0ZXNw
YWNlKSkgewotICAgICAgICBSZW5kZXJPYmplY3QmIG9iamVjdCA9ICppdGVyYXRvci5tX29iajsK
LSAgICAgICAgaWYgKG9iamVjdC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAg
IHNldFN0YXRpY1Bvc2l0aW9ucyhtX2Jsb2NrLCB0b1JlbmRlckJveChvYmplY3QpKTsKLSAgICAg
ICAgZWxzZSBpZiAob2JqZWN0LmlzRmxvYXRpbmcoKSkKLSAgICAgICAgICAgIG1fYmxvY2suaW5z
ZXJ0RmxvYXRpbmdPYmplY3QodG9SZW5kZXJCb3gob2JqZWN0KSk7Ci0gICAgICAgIGl0ZXJhdG9y
LmluY3JlbWVudCgpOwotICAgIH0KLX0KLQotdm9pZCBMaW5lQnJlYWtlcjo6c2tpcExlYWRpbmdX
aGl0ZXNwYWNlKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJbmZvJiBsaW5lSW5m
bywgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIExpbmVXaWR0aCYg
d2lkdGgpCi17Ci0gICAgd2hpbGUgKCFyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkgJiYgIXJl
cXVpcmVzTGluZUJveChyZXNvbHZlci5wb3NpdGlvbigpLCBsaW5lSW5mbywgTGVhZGluZ1doaXRl
c3BhY2UpKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCYgb2JqZWN0ID0gKnJlc29sdmVyLnBvc2l0
aW9uKCkubV9vYmo7Ci0gICAgICAgIGlmIChvYmplY3QuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkp
IHsKLSAgICAgICAgICAgIHNldFN0YXRpY1Bvc2l0aW9ucyhtX2Jsb2NrLCB0b1JlbmRlckJveChv
YmplY3QpKTsKLSAgICAgICAgICAgIGlmIChvYmplY3Quc3R5bGUoKS5pc09yaWdpbmFsRGlzcGxh
eUlubGluZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIHJlc29sdmVyLnJ1bnMoKS5hZGRSdW4o
Y3JlYXRlUnVuKDAsIDEsICZvYmplY3QsIHJlc29sdmVyKSk7Ci0gICAgICAgICAgICAgICAgbGlu
ZUluZm8uaW5jcmVtZW50UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgpOwotICAgICAgICAgICAg
fQotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdC5pc0Zsb2F0aW5nKCkpIHsKLSAgICAgICAgICAg
IC8vIFRoZSB0b3AgbWFyZ2luIGVkZ2Ugb2YgYSBzZWxmLWNvbGxhcHNpbmcgYmxvY2sgdGhhdCBj
bGVhcnMgYSBmbG9hdCBpbnRydWRlcyB1cCBpbnRvIGl0IGJ5IHRoZSBoZWlnaHQgb2YgdGhlIG1h
cmdpbiwKLSAgICAgICAgICAgIC8vIHNvIGluIG9yZGVyIHRvIHBsYWNlIHRoaXMgZmlyc3QgY2hp
bGQgZmxvYXQgYXQgdGhlIHRvcCBjb250ZW50IGVkZ2Ugb2YgdGhlIHNlbGYtY29sbGFwc2luZyBi
bG9jayBhZGQgdGhlIG1hcmdpbiBiYWNrIGluIGJlZm9yZSBwbGFjZW1lbnQuCi0gICAgICAgICAg
ICBMYXlvdXRVbml0IG1hcmdpbk9mZnNldCA9ICghb2JqZWN0LnByZXZpb3VzU2libGluZygpICYm
IG1fYmxvY2suaXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkgJiYgbV9ibG9jay5zdHlsZSgpLmNsZWFy
KCkgJiYgbV9ibG9jay5nZXRDbGVhckRlbHRhKG1fYmxvY2ssIExheW91dFVuaXQoKSkpID8gbV9i
bG9jay5jb2xsYXBzZWRNYXJnaW5CZWZvcmVGb3JDaGlsZChtX2Jsb2NrKSA6IExheW91dFVuaXQo
KTsKLSAgICAgICAgICAgIExheW91dFVuaXQgb2xkTG9naWNhbEhlaWdodCA9IG1fYmxvY2subG9n
aWNhbEhlaWdodCgpOwotICAgICAgICAgICAgbV9ibG9jay5zZXRMb2dpY2FsSGVpZ2h0KG9sZExv
Z2ljYWxIZWlnaHQgKyBtYXJnaW5PZmZzZXQpOwotICAgICAgICAgICAgbV9ibG9jay5wb3NpdGlv
bk5ld0Zsb2F0T25MaW5lKG1fYmxvY2suaW5zZXJ0RmxvYXRpbmdPYmplY3QodG9SZW5kZXJCb3go
b2JqZWN0KSksIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGxpbmVJbmZvLCB3aWR0aCk7Ci0g
ICAgICAgICAgICBtX2Jsb2NrLnNldExvZ2ljYWxIZWlnaHQob2xkTG9naWNhbEhlaWdodCk7Ci0g
ICAgICAgIH0gZWxzZSBpZiAob2JqZWN0LmlzVGV4dCgpICYmIG9iamVjdC5zdHlsZSgpLmhhc1Rl
eHRDb21iaW5lKCkgJiYgb2JqZWN0LmlzQ29tYmluZVRleHQoKSAmJiAhdG9SZW5kZXJDb21iaW5l
VGV4dChvYmplY3QpLmlzQ29tYmluZWQoKSkgewotICAgICAgICAgICAgdG9SZW5kZXJDb21iaW5l
VGV4dChvYmplY3QpLmNvbWJpbmVUZXh0KCk7Ci0gICAgICAgICAgICBpZiAodG9SZW5kZXJDb21i
aW5lVGV4dChvYmplY3QpLmlzQ29tYmluZWQoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgfQotICAgICAgICByZXNvbHZlci5pbmNyZW1lbnQoKTsKLSAgICB9Ci0gICAgcmVz
b2x2ZXIuY29tbWl0RXhwbGljaXRFbWJlZGRpbmcoKTsKLX0KLQotLy8gVGhpcyBpcyBjdXJyZW50
bHkganVzdCB1c2VkIGZvciBsaXN0IG1hcmtlcnMgYW5kIGlubGluZSBmbG93cyB0aGF0IGhhdmUg
bGluZSBib3hlcy4gTmVpdGhlciBzaG91bGQKLS8vIGhhdmUgYW4gZWZmZWN0IG9uIHdoaXRlc3Bh
Y2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgotc3RhdGljIGJvb2wgc2hvdWxkU2tpcFdoaXRl
c3BhY2VBZnRlclN0YXJ0T2JqZWN0KFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIFJlbmRlck9iamVj
dCogbywgTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlKQotewotICAgIFJlbmRl
ck9iamVjdCogbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ssIG8pOwot
ICAgIHdoaWxlIChuZXh0ICYmIG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQo
KSkKLSAgICAgICAgbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ssIG5l
eHQpOwotCi0gICAgaWYgKG5leHQgJiYgbmV4dC0+aXNUZXh0KCkgJiYgdG9SZW5kZXJUZXh0KG5l
eHQpLT50ZXh0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIFJlbmRlclRleHQqIG5leHRUZXh0ID0g
dG9SZW5kZXJUZXh0KG5leHQpOwotICAgICAgICBVQ2hhciBuZXh0Q2hhciA9IG5leHRUZXh0LT5j
aGFyYWN0ZXJBdCgwKTsKLSAgICAgICAgaWYgKG5leHRUZXh0LT5zdHlsZSgpLmlzQ29sbGFwc2li
bGVXaGl0ZVNwYWNlKG5leHRDaGFyKSkgewotICAgICAgICAgICAgc3RhcnRJZ25vcmluZ1NwYWNl
cyhsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgMCkpOwotICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLXN0YXRpYyBBTFdBWVNfSU5MSU5FIGZsb2F0IHRleHRXaWR0aChSZW5kZXJUZXh0KiB0ZXh0
LCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4sIGNvbnN0IEZvbnQmIGZvbnQsIGZsb2F0IHhQ
b3MsIGJvb2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgSGFzaFNldDxj
b25zdCBTaW1wbGVGb250RGF0YSo+JiBmYWxsYmFja0ZvbnRzLCBUZXh0TGF5b3V0KiBsYXlvdXQg
PSAwKQotewotICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IHRleHQtPnN0eWxlKCk7Ci0K
LSAgICBHbHlwaE92ZXJmbG93IGdseXBoT3ZlcmZsb3c7Ci0gICAgaWYgKGlzRml4ZWRQaXRjaCB8
fCAoIWZyb20gJiYgbGVuID09IHRleHQtPnRleHRMZW5ndGgoKSkgfHwgc3R5bGUuaGFzVGV4dENv
bWJpbmUoKSkKLSAgICAgICAgcmV0dXJuIHRleHQtPndpZHRoKGZyb20sIGxlbiwgZm9udCwgeFBv
cywgJmZhbGxiYWNrRm9udHMsICZnbHlwaE92ZXJmbG93KTsKLQotICAgIGlmIChsYXlvdXQpCi0g
ICAgICAgIHJldHVybiBGb250Ojp3aWR0aCgqbGF5b3V0LCBmcm9tLCBsZW4sICZmYWxsYmFja0Zv
bnRzKTsKLQotICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4o
dGV4dCwgZm9udCwgdGV4dCwgZnJvbSwgbGVuLCBzdHlsZSk7Ci0gICAgcnVuLnNldENoYXJhY3Rl
cnNMZW5ndGgodGV4dC0+dGV4dExlbmd0aCgpIC0gZnJvbSk7Ci0gICAgQVNTRVJUKHJ1bi5jaGFy
YWN0ZXJzTGVuZ3RoKCkgPj0gcnVuLmxlbmd0aCgpKTsKLQotICAgIHJ1bi5zZXRDaGFyYWN0ZXJT
Y2FuRm9yQ29kZVBhdGgoIXRleHQtPmNhblVzZVNpbXBsZUZvbnRDb2RlUGF0aCgpKTsKLSAgICBy
dW4uc2V0VGFiU2l6ZSghY29sbGFwc2VXaGl0ZVNwYWNlLCBzdHlsZS50YWJTaXplKCkpOwotICAg
IHJ1bi5zZXRYUG9zKHhQb3MpOwotICAgIHJldHVybiBmb250LndpZHRoKHJ1biwgJmZhbGxiYWNr
Rm9udHMsICZnbHlwaE92ZXJmbG93KTsKLX0KLQotc3RhdGljIHZvaWQgdHJ5SHlwaGVuYXRpbmco
UmVuZGVyVGV4dCogdGV4dCwgY29uc3QgRm9udCYgZm9udCwgY29uc3QgQXRvbWljU3RyaW5nJiBs
b2NhbGVJZGVudGlmaWVyLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgaW50
IGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzTGltaXQsIGludCBtaW5pbXVtUHJlZml4TGltaXQs
IGludCBtaW5pbXVtU3VmZml4TGltaXQsIHVuc2lnbmVkIGxhc3RTcGFjZSwgdW5zaWduZWQgcG9z
LCBmbG9hdCB4UG9zLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGJvb2wgaXNGaXhlZFBpdGNoLCBib29s
IGNvbGxhcHNlV2hpdGVTcGFjZSwgaW50IGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBJbmxpbmVJdGVy
YXRvciYgbGluZUJyZWFrLCBpbnQgbmV4dEJyZWFrYWJsZSwgYm9vbCYgaHlwaGVuYXRlZCkKLXsK
LSAgICAvLyBNYXAgJ2h5cGhlbmF0ZS1saW1pdC17YmVmb3JlLGFmdGVyfTogYXV0bzsnIHRvIDIu
Ci0gICAgdW5zaWduZWQgbWluaW11bVByZWZpeExlbmd0aDsKLSAgICB1bnNpZ25lZCBtaW5pbXVt
U3VmZml4TGVuZ3RoOwotCi0gICAgaWYgKG1pbmltdW1QcmVmaXhMaW1pdCA8IDApCi0gICAgICAg
IG1pbmltdW1QcmVmaXhMZW5ndGggPSAyOwotICAgIGVsc2UKLSAgICAgICAgbWluaW11bVByZWZp
eExlbmd0aCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihtaW5pbXVtUHJlZml4TGltaXQpOwotCi0g
ICAgaWYgKG1pbmltdW1TdWZmaXhMaW1pdCA8IDApCi0gICAgICAgIG1pbmltdW1TdWZmaXhMZW5n
dGggPSAyOwotICAgIGVsc2UKLSAgICAgICAgbWluaW11bVN1ZmZpeExlbmd0aCA9IHN0YXRpY19j
YXN0PHVuc2lnbmVkPihtaW5pbXVtU3VmZml4TGltaXQpOwotCi0gICAgaWYgKHBvcyAtIGxhc3RT
cGFjZSA8PSBtaW5pbXVtU3VmZml4TGVuZ3RoKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAo
Y29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXNMaW1pdCA+PSAwICYmIGNvbnNlY3V0aXZlSHlwaGVu
YXRlZExpbmVzID49IHN0YXRpY19jYXN0PHVuc2lnbmVkPihjb25zZWN1dGl2ZUh5cGhlbmF0ZWRM
aW5lc0xpbWl0KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW50IGh5cGhlbldpZHRoID0gbWVh
c3VyZUh5cGhlbldpZHRoKHRleHQsIGZvbnQpOwotCi0gICAgZmxvYXQgbWF4UHJlZml4V2lkdGgg
PSBhdmFpbGFibGVXaWR0aCAtIHhQb3MgLSBoeXBoZW5XaWR0aCAtIGxhc3RTcGFjZVdvcmRTcGFj
aW5nOwotICAgIC8vIElmIHRoZSBtYXhpbXVtIHdpZHRoIGF2YWlsYWJsZSBmb3IgdGhlIHByZWZp
eCBiZWZvcmUgdGhlIGh5cGhlbiBpcyBzbWFsbCwgdGhlbiBpdCBpcyB2ZXJ5IHVubGlrZWx5Ci0g
ICAgLy8gdGhhdCBhbiBoeXBoZW5hdGlvbiBvcHBvcnR1bml0eSBleGlzdHMsIHNvIGRvIG5vdCBi
b3RoZXIgdG8gbG9vayBmb3IgaXQuCi0gICAgaWYgKG1heFByZWZpeFdpZHRoIDw9IGZvbnQucGl4
ZWxTaXplKCkgKiA1IC8gNCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgUmVuZGVyU3R5
bGUmIHN0eWxlID0gdGV4dC0+c3R5bGUoKTsKLSAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2Nr
Ojpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHRleHQsIGxhc3RTcGFjZSwgcG9zIC0gbGFz
dFNwYWNlLCBzdHlsZSk7Ci0gICAgcnVuLnNldENoYXJhY3RlcnNMZW5ndGgodGV4dC0+dGV4dExl
bmd0aCgpIC0gbGFzdFNwYWNlKTsKLSAgICBBU1NFUlQocnVuLmNoYXJhY3RlcnNMZW5ndGgoKSA+
PSBydW4ubGVuZ3RoKCkpOwotCi0gICAgcnVuLnNldFRhYlNpemUoIWNvbGxhcHNlV2hpdGVTcGFj
ZSwgc3R5bGUudGFiU2l6ZSgpKTsKLSAgICBydW4uc2V0WFBvcyh4UG9zICsgbGFzdFNwYWNlV29y
ZFNwYWNpbmcpOwotCi0gICAgdW5zaWduZWQgcHJlZml4TGVuZ3RoID0gZm9udC5vZmZzZXRGb3JQ
b3NpdGlvbihydW4sIG1heFByZWZpeFdpZHRoLCBmYWxzZSk7Ci0gICAgaWYgKHByZWZpeExlbmd0
aCA8IG1pbmltdW1QcmVmaXhMZW5ndGgpCi0gICAgICAgIHJldHVybjsKLQotICAgIHByZWZpeExl
bmd0aCA9IGxhc3RIeXBoZW5Mb2NhdGlvbih0ZXh0LT5jaGFyYWN0ZXJzKCkgKyBsYXN0U3BhY2Us
IHBvcyAtIGxhc3RTcGFjZSwgc3RkOjptaW4ocHJlZml4TGVuZ3RoLCBwb3MgLSBsYXN0U3BhY2Ug
LSBtaW5pbXVtU3VmZml4TGVuZ3RoKSArIDEsIGxvY2FsZUlkZW50aWZpZXIpOwotICAgIGlmICgh
cHJlZml4TGVuZ3RoIHx8IHByZWZpeExlbmd0aCA8IG1pbmltdW1QcmVmaXhMZW5ndGgpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIC8vIFdoZW4gbGFzdFNhcGNlIGlzIGEgc3BhY2UsIHdoaWNoIGl0
IGFsd2F5cyBpcyBleGNlcHQgc29tZXRpbWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIG9y
IGFmdGVyIGNvbGxhcHNlZAotICAgIC8vIHNwYWNlLCBpdCBzaG91bGQgbm90IGNvdW50IHRvd2Fy
ZHMgaHlwaGVuYXRlLWxpbWl0LWJlZm9yZS4KLSAgICBpZiAocHJlZml4TGVuZ3RoID09IG1pbmlt
dW1QcmVmaXhMZW5ndGgpIHsKLSAgICAgICAgVUNoYXIgY2hhcmFjdGVyQXRMYXN0U3BhY2UgPSB0
ZXh0LT5jaGFyYWN0ZXJBdChsYXN0U3BhY2UpOwotICAgICAgICBpZiAoY2hhcmFjdGVyQXRMYXN0
U3BhY2UgPT0gJyAnIHx8IGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICdcbicgfHwgY2hhcmFjdGVy
QXRMYXN0U3BhY2UgPT0gJ1x0JyB8fCBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSBub0JyZWFrU3Bh
Y2UpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQVNTRVJUKHBvcyAtIGxhc3RT
cGFjZSAtIHByZWZpeExlbmd0aCA+PSBtaW5pbXVtU3VmZml4TGVuZ3RoKTsKLQotI2lmICFBU1NF
UlRfRElTQUJMRUQKLSAgICBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4gZmFsbGJhY2tG
b250czsKLSAgICBmbG9hdCBwcmVmaXhXaWR0aCA9IGh5cGhlbldpZHRoICsgdGV4dFdpZHRoKHRl
eHQsIGxhc3RTcGFjZSwgcHJlZml4TGVuZ3RoLCBmb250LCB4UG9zLCBpc0ZpeGVkUGl0Y2gsIGNv
bGxhcHNlV2hpdGVTcGFjZSwgZmFsbGJhY2tGb250cykgKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsK
LSAgICBBU1NFUlQoeFBvcyArIHByZWZpeFdpZHRoIDw9IGF2YWlsYWJsZVdpZHRoKTsKLSNlbHNl
Ci0gICAgVU5VU0VEX1BBUkFNKGlzRml4ZWRQaXRjaCk7Ci0jZW5kaWYKLQotICAgIGxpbmVCcmVh
ay5tb3ZlVG8odGV4dCwgbGFzdFNwYWNlICsgcHJlZml4TGVuZ3RoLCBuZXh0QnJlYWthYmxlKTsK
LSAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKLX0KLQotY2xhc3MgVHJhaWxpbmdPYmplY3RzIHsKLXB1
YmxpYzoKLSAgICBUcmFpbGluZ09iamVjdHMoKTsKLSAgICB2b2lkIHNldFRyYWlsaW5nV2hpdGVz
cGFjZShSZW5kZXJUZXh0Kik7Ci0gICAgdm9pZCBjbGVhcigpOwotICAgIHZvaWQgYXBwZW5kQm94
SWZOZWVkZWQoUmVuZGVyQm94TW9kZWxPYmplY3QqKTsKLQotICAgIGVudW0gQ29sbGFwc2VGaXJz
dFNwYWNlT3JOb3QgeyBEb05vdENvbGxhcHNlRmlyc3RTcGFjZSwgQ29sbGFwc2VGaXJzdFNwYWNl
IH07Ci0KLSAgICB2b2lkIHVwZGF0ZU1pZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMoTGluZU1pZHBv
aW50U3RhdGUmLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbEJyZWFrLCBDb2xsYXBzZUZpcnN0U3Bh
Y2VPck5vdCk7Ci0KLXByaXZhdGU6Ci0gICAgUmVuZGVyVGV4dCogbV93aGl0ZXNwYWNlOwotICAg
IFZlY3RvcjxSZW5kZXJCb3hNb2RlbE9iamVjdCosIDQ+IG1fYm94ZXM7Ci19OwotCi1UcmFpbGlu
Z09iamVjdHM6OlRyYWlsaW5nT2JqZWN0cygpCi0gICAgOiBtX3doaXRlc3BhY2UoMCkKLXsKLX0K
LQotaW5saW5lIHZvaWQgVHJhaWxpbmdPYmplY3RzOjpzZXRUcmFpbGluZ1doaXRlc3BhY2UoUmVu
ZGVyVGV4dCogd2hpdGVzcGFjZSkKLXsKLSAgICBBU1NFUlQod2hpdGVzcGFjZSk7Ci0gICAgbV93
aGl0ZXNwYWNlID0gd2hpdGVzcGFjZTsKLX0KLQotaW5saW5lIHZvaWQgVHJhaWxpbmdPYmplY3Rz
OjpjbGVhcigpCi17Ci0gICAgbV93aGl0ZXNwYWNlID0gMDsKLSAgICBtX2JveGVzLnNocmluaygw
KTsgLy8gVXNlIHNocmluaygwKSBpbnN0ZWFkIG9mIGNsZWFyKCkgdG8gcmV0YWluIG91ciBjYXBh
Y2l0eS4KLX0KLQotaW5saW5lIHZvaWQgVHJhaWxpbmdPYmplY3RzOjphcHBlbmRCb3hJZk5lZWRl
ZChSZW5kZXJCb3hNb2RlbE9iamVjdCogYm94KQotewotICAgIGlmIChtX3doaXRlc3BhY2UpCi0g
ICAgICAgIG1fYm94ZXMuYXBwZW5kKGJveCk7Ci19Ci0KLXZvaWQgVHJhaWxpbmdPYmplY3RzOjp1
cGRhdGVNaWRwb2ludHNGb3JUcmFpbGluZ0JveGVzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlk
cG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGxCcmVhaywgQ29sbGFwc2VGaXJzdFNw
YWNlT3JOb3QgY29sbGFwc2VGaXJzdFNwYWNlKQotewotICAgIGlmICghbV93aGl0ZXNwYWNlKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBUaGlzIG9iamVjdCBpcyBlaXRoZXIgZ29pbmcgdG8g
YmUgcGFydCBvZiB0aGUgbGFzdCBtaWRwb2ludCwgb3IgaXQgaXMgZ29pbmcgdG8gYmUgdGhlIGFj
dHVhbCBlbmRwb2ludC4KLSAgICAvLyBJbiBib3RoIGNhc2VzIHdlIGp1c3QgZGVjcmVhc2Ugb3Vy
IHBvcyBieSAxIGxldmVsIHRvIGV4Y2x1ZGUgdGhlIHNwYWNlLCBhbGxvd2luZyBpdCB0byAtIGlu
IGVmZmVjdCAtIGNvbGxhcHNlIGludG8gdGhlIG5ld2xpbmUuCi0gICAgaWYgKGxpbmVNaWRwb2lu
dFN0YXRlLm51bU1pZHBvaW50cyAlIDIpIHsKLSAgICAgICAgLy8gRmluZCB0aGUgdHJhaWxpbmcg
c3BhY2Ugb2JqZWN0J3MgbWlkcG9pbnQuCi0gICAgICAgIGludCB0cmFpbGluZ1NwYWNlTWlkcG9p
bnQgPSBsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxOwotICAgICAgICBmb3IgKCA7
IHRyYWlsaW5nU3BhY2VNaWRwb2ludCA+IDAgJiYgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRz
W3RyYWlsaW5nU3BhY2VNaWRwb2ludF0ubV9vYmogIT0gbV93aGl0ZXNwYWNlOyAtLXRyYWlsaW5n
U3BhY2VNaWRwb2ludCkgeyB9Ci0gICAgICAgIEFTU0VSVCh0cmFpbGluZ1NwYWNlTWlkcG9pbnQg
Pj0gMCk7Ci0gICAgICAgIGlmIChjb2xsYXBzZUZpcnN0U3BhY2UgPT0gQ29sbGFwc2VGaXJzdFNw
YWNlKQotICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzW3RyYWlsaW5nU3Bh
Y2VNaWRwb2ludF0ubV9wb3MtLTsKLQotICAgICAgICAvLyBOb3cgbWFrZSBzdXJlIGV2ZXJ5IHNp
bmdsZSB0cmFpbGluZ1Bvc2l0aW9uZWRCb3ggZm9sbG93aW5nIHRoZSB0cmFpbGluZ1NwYWNlTWlk
cG9pbnQgcHJvcGVybHkgc3RvcHMgYW5kIHN0YXJ0cwotICAgICAgICAvLyBpZ25vcmluZyBzcGFj
ZXMuCi0gICAgICAgIHNpemVfdCBjdXJyZW50TWlkcG9pbnQgPSB0cmFpbGluZ1NwYWNlTWlkcG9p
bnQgKyAxOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fYm94ZXMuc2l6ZSgpOyAr
K2kpIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TWlkcG9pbnQgPj0gbGluZU1pZHBvaW50U3Rh
dGUubnVtTWlkcG9pbnRzKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIG1p
ZHBvaW50IGZvciB0aGlzIGJveCB5ZXQuCi0gICAgICAgICAgICAgICAgZW5zdXJlTGluZUJveElu
c2lkZUlnbm9yZWRTcGFjZXMobGluZU1pZHBvaW50U3RhdGUsIG1fYm94ZXNbaV0pOwotICAgICAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQobGluZU1pZHBvaW50U3RhdGUu
bWlkcG9pbnRzW2N1cnJlbnRNaWRwb2ludF0ubV9vYmogPT0gbV9ib3hlc1tpXSk7Ci0gICAgICAg
ICAgICAgICAgQVNTRVJUKGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50c1tjdXJyZW50TWlkcG9p
bnQgKyAxXS5tX29iaiA9PSBtX2JveGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGN1cnJlbnRNaWRwb2ludCArPSAyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghbEJyZWFr
Lm1fb2JqKSB7Ci0gICAgICAgIEFTU0VSVChtX3doaXRlc3BhY2UtPmlzVGV4dCgpKTsKLSAgICAg
ICAgQVNTRVJUKGNvbGxhcHNlRmlyc3RTcGFjZSA9PSBDb2xsYXBzZUZpcnN0U3BhY2UpOwotICAg
ICAgICAvLyBBZGQgYSBuZXcgZW5kIG1pZHBvaW50IHRoYXQgc3RvcHMgcmlnaHQgYXQgdGhlIHZl
cnkgZW5kLgotICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBtX3doaXRlc3BhY2UtPnRleHRMZW5n
dGgoKTsKLSAgICAgICAgdW5zaWduZWQgcG9zID0gbGVuZ3RoID49IDIgPyBsZW5ndGggLSAyIDog
VUlOVF9NQVg7Ci0gICAgICAgIElubGluZUl0ZXJhdG9yIGVuZE1pZCgwLCBtX3doaXRlc3BhY2Us
IHBvcyk7Ci0gICAgICAgIHN0YXJ0SWdub3JpbmdTcGFjZXMobGluZU1pZHBvaW50U3RhdGUsIGVu
ZE1pZCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9ib3hlcy5zaXplKCk7ICsr
aSkgewotICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobGluZU1p
ZHBvaW50U3RhdGUsIG1fYm94ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIExp
bmVCcmVha2VyOjpyZXNldCgpCi17Ci0gICAgbV9wb3NpdGlvbmVkT2JqZWN0cy5jbGVhcigpOwot
ICAgIG1faHlwaGVuYXRlZCA9IGZhbHNlOwotICAgIG1fY2xlYXIgPSBDTk9ORTsKLX0KLQogSW5s
aW5lSXRlcmF0b3IgTGluZUJyZWFrZXI6Om5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlciwgTGluZUluZm8mIGxpbmVJbmZvLCBSZW5kZXJUZXh0SW5mbyYgcmVuZGVyVGV4
dEluZm8sIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25l
ZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1
cmVtZW50cykKIHsKICNpZiAhRU5BQkxFKENTU19TSEFQRVMpCkBAIC0yNjE5LDg2MyArMjA2MCw2
IEBAIElubGluZUl0ZXJhdG9yIExpbmVCcmVha2VyOjpuZXh0TGluZUJyZWFrKElubGluZUJpZGlS
ZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJbmZvCiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSBi
b29sIGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KGNvbnN0IElubGluZUl0
ZXJhdG9yJiBpdGVyLCBSZW5kZXJDb21iaW5lVGV4dCYgcmVuZGVyZXIpCi17Ci0gICAgcmV0dXJu
IGl0ZXIubV9vYmogPT0gJnJlbmRlcmVyICYmIGl0ZXIubV9wb3MgPj0gcmVuZGVyZXIudGV4dExl
bmd0aCgpOwotfQotCi0jaWYgRU5BQkxFKENTU19TSEFQRVMpCi1zdGF0aWMgdm9pZCB1cGRhdGVT
ZWdtZW50c0ZvclNoYXBlcyhSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBjb25zdCBGbG9hdGluZ09i
amVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgY29uc3QgV29yZE1lYXN1cmVtZW50cyYg
d29yZE1lYXN1cmVtZW50cywgTGluZVdpZHRoJiB3aWR0aCwgYm9vbCBpc0ZpcnN0TGluZSkKLXsK
LSAgICBBU1NFUlQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7Ci0KLSAgICBTaGFwZUluc2lk
ZUluZm8qIHNoYXBlSW5zaWRlSW5mbyA9IGJsb2NrLmxheW91dFNoYXBlSW5zaWRlSW5mbygpOwot
ICAgIGlmICghbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZS0+aXNQbGFjZWQoKSB8fCAhc2hhcGVJ
bnNpZGVJbmZvKQotICAgICAgICByZXR1cm47Ci0KLSAgICBib29sIGlzSG9yaXpvbnRhbFdyaXRp
bmdNb2RlID0gYmxvY2suaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKTsKLSAgICBMYXlvdXRVbml0
IGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWluZXIgPSBibG9jay5sb2dpY2FsT2Zmc2V0RnJv
bVNoYXBlQW5jZXN0b3JDb250YWluZXIoc2hhcGVJbnNpZGVJbmZvLT5vd25lcigpKS5oZWlnaHQo
KTsKLQotICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxUb3AgPSBibG9jay5sb2dpY2FsSGVpZ2h0
KCkgKyBsb2dpY2FsT2Zmc2V0RnJvbVNoYXBlQ29udGFpbmVyOwotICAgIExheW91dFVuaXQgbGlu
ZUxvZ2ljYWxIZWlnaHQgPSBibG9jay5saW5lSGVpZ2h0KGlzRmlyc3RMaW5lLCBpc0hvcml6b250
YWxXcml0aW5nTW9kZSA/IEhvcml6b250YWxMaW5lIDogVmVydGljYWxMaW5lLCBQb3NpdGlvbk9m
SW50ZXJpb3JMaW5lQm94ZXMpOwotICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxCb3R0b20gPSBs
aW5lTG9naWNhbFRvcCArIGxpbmVMb2dpY2FsSGVpZ2h0OwotCi0gICAgTGF5b3V0VW5pdCBmbG9h
dExvZ2ljYWxUb3AgPSBibG9jay5sb2dpY2FsVG9wRm9yRmxvYXQobGFzdEZsb2F0RnJvbVByZXZp
b3VzTGluZSk7Ci0gICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxCb3R0b20gPSBibG9jay5sb2dp
Y2FsQm90dG9tRm9yRmxvYXQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7Ci0KLSAgICBib29s
IGxpbmVPdmVybGFwc1dpdGhGbG9hdCA9IChmbG9hdExvZ2ljYWxUb3AgPCBsaW5lTG9naWNhbEJv
dHRvbSkgJiYgKGxpbmVMb2dpY2FsVG9wIDwgZmxvYXRMb2dpY2FsQm90dG9tKTsKLSAgICBpZiAo
IWxpbmVPdmVybGFwc1dpdGhGbG9hdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZmxvYXQgbWlu
U2VnbWVudFdpZHRoID0gZmlyc3RQb3NpdGl2ZVdpZHRoKHdvcmRNZWFzdXJlbWVudHMpOwotCi0g
ICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxXaWR0aCA9IGJsb2NrLmxvZ2ljYWxXaWR0aEZvckZs
b2F0KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpOwotICAgIExheW91dFVuaXQgYXZhaWxhYmxl
TG9naWNhbFdpZHRoID0gYmxvY2subG9naWNhbFdpZHRoKCkgLSBibG9jay5sb2dpY2FsUmlnaHRG
b3JGbG9hdChsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKTsKLSAgICBpZiAoYXZhaWxhYmxlTG9n
aWNhbFdpZHRoIDwgbWluU2VnbWVudFdpZHRoKQotICAgICAgICBibG9jay5zZXRMb2dpY2FsSGVp
Z2h0KGZsb2F0TG9naWNhbEJvdHRvbSk7Ci0KLSAgICBpZiAoYmxvY2subG9naWNhbEhlaWdodCgp
IDwgZmxvYXRMb2dpY2FsVG9wKSB7Ci0gICAgICAgIHNoYXBlSW5zaWRlSW5mby0+YWRqdXN0TG9n
aWNhbExpbmVUb3AobWluU2VnbWVudFdpZHRoICsgZmxvYXRMb2dpY2FsV2lkdGgpOwotICAgICAg
ICBibG9jay5zZXRMb2dpY2FsSGVpZ2h0KHNoYXBlSW5zaWRlSW5mby0+bG9naWNhbExpbmVUb3Ao
KSAtIGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWluZXIpOwotICAgIH0KLQotICAgIGxpbmVM
b2dpY2FsVG9wID0gYmxvY2subG9naWNhbEhlaWdodCgpICsgbG9naWNhbE9mZnNldEZyb21TaGFw
ZUNvbnRhaW5lcjsKLQotICAgIHNoYXBlSW5zaWRlSW5mby0+dXBkYXRlU2VnbWVudHNGb3JMaW5l
KGxpbmVMb2dpY2FsVG9wLCBsaW5lTG9naWNhbEhlaWdodCk7Ci0gICAgd2lkdGgudXBkYXRlQ3Vy
cmVudFNoYXBlU2VnbWVudCgpOwotICAgIHdpZHRoLnVwZGF0ZUF2YWlsYWJsZVdpZHRoKCk7Ci19
Ci0jZW5kaWYKLQotY2xhc3MgQnJlYWtpbmdDb250ZXh0IHsKLXB1YmxpYzoKLSAgICBCcmVha2lu
Z0NvbnRleHQoTGluZUJyZWFrZXImIGxpbmVCcmVha2VyLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJl
c29sdmVyLCBMaW5lSW5mbyYgaW5MaW5lSW5mbywgTGluZVdpZHRoJiBsaW5lV2lkdGgsIFJlbmRl
clRleHRJbmZvJiBpblJlbmRlclRleHRJbmZvLCBGbG9hdGluZ09iamVjdCogaW5MYXN0RmxvYXRG
cm9tUHJldmlvdXNMaW5lLCBib29sIGFwcGxpZWRTdGFydFdpZHRoLCBSZW5kZXJCbG9ja0Zsb3cm
IGJsb2NrKQotICAgICAgICA6IG1fbGluZUJyZWFrZXIobGluZUJyZWFrZXIpCi0gICAgICAgICwg
bV9yZXNvbHZlcihyZXNvbHZlcikKLSAgICAgICAgLCBtX2N1cnJlbnQocmVzb2x2ZXIucG9zaXRp
b24oKSkKLSAgICAgICAgLCBtX2xpbmVCcmVhayhyZXNvbHZlci5wb3NpdGlvbigpKQotICAgICAg
ICAsIG1fYmxvY2soYmxvY2spCi0gICAgICAgICwgbV9sYXN0T2JqZWN0KG1fY3VycmVudC5tX29i
aikKLSAgICAgICAgLCBtX25leHRPYmplY3QoMCkKLSAgICAgICAgLCBtX2N1cnJlbnRTdHlsZSgw
KQotICAgICAgICAsIG1fYmxvY2tTdHlsZShibG9jay5zdHlsZSgpKQotICAgICAgICAsIG1fbGlu
ZUluZm8oaW5MaW5lSW5mbykKLSAgICAgICAgLCBtX3JlbmRlclRleHRJbmZvKGluUmVuZGVyVGV4
dEluZm8pCi0gICAgICAgICwgbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKGluTGFzdEZsb2F0
RnJvbVByZXZpb3VzTGluZSkKLSAgICAgICAgLCBtX3dpZHRoKGxpbmVXaWR0aCkKLSAgICAgICAg
LCBtX2N1cnJXUyhOT1JNQUwpCi0gICAgICAgICwgbV9sYXN0V1MoTk9STUFMKQotICAgICAgICAs
IG1fcHJlc2VydmVzTmV3bGluZShmYWxzZSkKLSAgICAgICAgLCBtX2F0U3RhcnQodHJ1ZSkKLSAg
ICAgICAgLCBtX2lnbm9yaW5nU3BhY2VzKGZhbHNlKQotICAgICAgICAsIG1fY3VycmVudENoYXJh
Y3RlcklzU3BhY2UoZmFsc2UpCi0gICAgICAgICwgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyhmYWxz
ZSkKLSAgICAgICAgLCBtX2FwcGxpZWRTdGFydFdpZHRoKGFwcGxpZWRTdGFydFdpZHRoKQotICAg
ICAgICAsIG1faW5jbHVkZUVuZFdpZHRoKHRydWUpCi0gICAgICAgICwgbV9hdXRvV3JhcChmYWxz
ZSkKLSAgICAgICAgLCBtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUoZmFsc2UpCi0gICAgICAg
ICwgbV9mbG9hdHNGaXRPbkxpbmUodHJ1ZSkKLSAgICAgICAgLCBtX2NvbGxhcHNlV2hpdGVTcGFj
ZShmYWxzZSkKLSAgICAgICAgLCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoKG1fbGluZUluZm8ucHJl
dmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpCi0gICAgICAgICwgbV9hbGxvd0ltYWdlc1RvQnJlYWso
IWJsb2NrLmRvY3VtZW50KCkuaW5RdWlya3NNb2RlKCkgfHwgIWJsb2NrLmlzVGFibGVDZWxsKCkg
fHwgIW1fYmxvY2tTdHlsZS5sb2dpY2FsV2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQotICAg
ICAgICAsIG1fYXRFbmQoZmFsc2UpCi0gICAgICAgICwgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVm
b3JlQ3VycmVudChmYWxzZSkKLSAgICAgICAgLCBtX2xpbmVNaWRwb2ludFN0YXRlKHJlc29sdmVy
Lm1pZHBvaW50U3RhdGUoKSkKLSAgICB7Ci0gICAgICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNM
aW5lQnJva2VDbGVhbmx5KGZhbHNlKTsKLSAgICB9Ci0KLSAgICBSZW5kZXJPYmplY3QqIGN1cnJl
bnRPYmplY3QoKSB7IHJldHVybiBtX2N1cnJlbnQubV9vYmo7IH0KLSAgICBJbmxpbmVJdGVyYXRv
ciBsaW5lQnJlYWsoKSB7IHJldHVybiBtX2xpbmVCcmVhazsgfQotICAgIElubGluZUl0ZXJhdG9y
JiBsaW5lQnJlYWtSZWYoKSB7cmV0dXJuIG1fbGluZUJyZWFrOyB9Ci0gICAgTGluZVdpZHRoJiBs
aW5lV2lkdGgoKSB7IHJldHVybiBtX3dpZHRoOyB9Ci0gICAgYm9vbCBhdEVuZCgpIHsgcmV0dXJu
IG1fYXRFbmQ7IH0KLQotICAgIHZvaWQgaW5pdGlhbGl6ZUZvckN1cnJlbnRPYmplY3QoKTsKLQot
ICAgIHZvaWQgaW5jcmVtZW50KCk7Ci0KLSAgICB2b2lkIGhhbmRsZUJSKEVDbGVhciYpOwotICAg
IHZvaWQgaGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZChWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0
aW9uZWRPYmplY3RzKTsKLSAgICB2b2lkIGhhbmRsZUZsb2F0KCk7Ci0gICAgdm9pZCBoYW5kbGVF
bXB0eUlubGluZSgpOwotICAgIHZvaWQgaGFuZGxlUmVwbGFjZWQoKTsKLSAgICBib29sIGhhbmRs
ZVRleHQoV29yZE1lYXN1cmVtZW50cyYsIGJvb2wmIGh5cGhlbmF0ZWQsIHVuc2lnbmVkJiBjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7Ci0gICAgYm9vbCBjYW5CcmVha0F0VGhpc1Bvc2l0aW9u
KCk7Ci0gICAgdm9pZCBjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJZk5lZWRlZCgpOwotICAgIElu
bGluZUl0ZXJhdG9yIGhhbmRsZUVuZE9mTGluZSgpOwotCi0gICAgdm9pZCBjbGVhckxpbmVCcmVh
a0lmRml0c09uTGluZShib29sIGlnbm9yaW5nVHJhaWxpbmdTcGFjZSA9IGZhbHNlKQotICAgIHsK
LSAgICAgICAgaWYgKG1fd2lkdGguZml0c09uTGluZShpZ25vcmluZ1RyYWlsaW5nU3BhY2UpIHx8
IG1fbGFzdFdTID09IE5PV1JBUCkKLSAgICAgICAgICAgIG1fbGluZUJyZWFrLmNsZWFyKCk7Ci0g
ICAgfQotCi0gICAgdm9pZCBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aChSZW5kZXJPYmpl
Y3QqIG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0ID0gMCwgaW50IG5leHRCcmVhayA9IC0xKQotICAg
IHsKLSAgICAgICAgbV93aWR0aC5jb21taXQoKTsKLSAgICAgICAgbV9saW5lQnJlYWsubW92ZVRv
KG9iamVjdCwgb2Zmc2V0LCBuZXh0QnJlYWspOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBMaW5l
QnJlYWtlciYgbV9saW5lQnJlYWtlcjsKLSAgICBJbmxpbmVCaWRpUmVzb2x2ZXImIG1fcmVzb2x2
ZXI7Ci0KLSAgICBJbmxpbmVJdGVyYXRvciBtX2N1cnJlbnQ7Ci0gICAgSW5saW5lSXRlcmF0b3Ig
bV9saW5lQnJlYWs7Ci0gICAgSW5saW5lSXRlcmF0b3IgbV9zdGFydE9mSWdub3JlZFNwYWNlczsK
LQotICAgIFJlbmRlckJsb2NrRmxvdyYgbV9ibG9jazsKLSAgICBSZW5kZXJPYmplY3QqIG1fbGFz
dE9iamVjdDsKLSAgICBSZW5kZXJPYmplY3QqIG1fbmV4dE9iamVjdDsKLQotICAgIFJlbmRlclN0
eWxlKiBtX2N1cnJlbnRTdHlsZTsKLQotICAgIC8vIEZpcmVmb3ggYW5kIE9wZXJhIHdpbGwgYWxs
b3cgYSB0YWJsZSBjZWxsIHRvIGdyb3cgdG8gZml0IGFuIGltYWdlIGluc2lkZSBpdCB1bmRlcgot
ICAgIC8vIHZlcnkgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcyAoaW4gb3JkZXIgdG8gbWF0Y2ggY29t
bW9uIFdpbklFIHJlbmRlcmluZ3MpLgotICAgIC8vIE5vdCBzdXBwb3J0aW5nIHRoZSBxdWlyayBo
YXMgY2F1c2VkIHVzIHRvIG1pcy1yZW5kZXIgc29tZSByZWFsIHNpdGVzLiAoU2VlIEJ1Z3ppbGxh
IDEwNTE3LikKLSAgICBSZW5kZXJTdHlsZSYgbV9ibG9ja1N0eWxlOwotCi0gICAgTGluZUluZm8m
IG1fbGluZUluZm87Ci0KLSAgICBSZW5kZXJUZXh0SW5mbyYgbV9yZW5kZXJUZXh0SW5mbzsKLQot
ICAgIEZsb2F0aW5nT2JqZWN0KiBtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmU7Ci0KLSAgICBM
aW5lV2lkdGggbV93aWR0aDsKLQotICAgIEVXaGl0ZVNwYWNlIG1fY3VycldTOwotICAgIEVXaGl0
ZVNwYWNlIG1fbGFzdFdTOwotCi0gICAgYm9vbCBtX3ByZXNlcnZlc05ld2xpbmU7Ci0gICAgYm9v
bCBtX2F0U3RhcnQ7Ci0KLSAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgb25seSBpZiB3aGl0
ZXNwYWNlIGlzbid0IHNldCB0byBQUkUsIGFuZCBpdCB0ZWxscyB1cyB3aGV0aGVyCi0gICAgLy8g
b3Igbm90IHdlIGFyZSBjdXJyZW50bHkgaWdub3Jpbmcgd2hpdGVzcGFjZS4KLSAgICBib29sIG1f
aWdub3JpbmdTcGFjZXM7Ci0KLSAgICAvLyBUaGlzIHZhcmlhYmxlIHRyYWNrcyB3aGV0aGVyIHRo
ZSB2ZXJ5IGxhc3QgY2hhcmFjdGVyIHdlIHNhdyB3YXMgYSBzcGFjZS4gIFdlIHVzZQotICAgIC8v
IHRoaXMgdG8gZGV0ZWN0IHdoZW4gd2UgZW5jb3VudGVyIGEgc2Vjb25kIHNwYWNlIHNvIHdlIGtu
b3cgd2UgaGF2ZSB0byB0ZXJtaW5hdGUKLSAgICAvLyBhIHJ1bi4KLSAgICBib29sIG1fY3VycmVu
dENoYXJhY3RlcklzU3BhY2U7Ci0gICAgYm9vbCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTOwotICAg
IGJvb2wgbV9hcHBsaWVkU3RhcnRXaWR0aDsKLSAgICBib29sIG1faW5jbHVkZUVuZFdpZHRoOwot
ICAgIGJvb2wgbV9hdXRvV3JhcDsKLSAgICBib29sIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGlu
ZTsKLSAgICBib29sIG1fZmxvYXRzRml0T25MaW5lOwotICAgIGJvb2wgbV9jb2xsYXBzZVdoaXRl
U3BhY2U7Ci0gICAgYm9vbCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoOwotICAgIGJvb2wgbV9hbGxv
d0ltYWdlc1RvQnJlYWs7Ci0gICAgYm9vbCBtX2F0RW5kOwotICAgIGJvb2wgbV9oYWRVbmNvbW1p
dHRlZFdpZHRoQmVmb3JlQ3VycmVudDsKLQotICAgIExpbmVNaWRwb2ludFN0YXRlJiBtX2xpbmVN
aWRwb2ludFN0YXRlOwotCi0gICAgVHJhaWxpbmdPYmplY3RzIG1fdHJhaWxpbmdPYmplY3RzOwot
fTsKLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojppbml0aWFsaXplRm9yQ3VycmVudE9i
amVjdCgpCi17Ci0gICAgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudCA9ICEhbV93
aWR0aC51bmNvbW1pdHRlZFdpZHRoKCk7Ci0KLSAgICBtX2N1cnJlbnRTdHlsZSA9ICZtX2N1cnJl
bnQubV9vYmotPnN0eWxlKCk7Ci0KLSAgICBBU1NFUlQobV9jdXJyZW50U3R5bGUpOwotCi0gICAg
bV9uZXh0T2JqZWN0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhtX2Jsb2NrLCBtX2N1
cnJlbnQubV9vYmopOwotICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5wYXJl
bnQoKSAmJiAhbV9uZXh0T2JqZWN0LT5wYXJlbnQoKS0+aXNEZXNjZW5kYW50T2YobV9jdXJyZW50
Lm1fb2JqLT5wYXJlbnQoKSkpCi0gICAgICAgIG1faW5jbHVkZUVuZFdpZHRoID0gdHJ1ZTsKLQot
ICAgIG1fY3VycldTID0gbV9jdXJyZW50Lm1fb2JqLT5pc1JlcGxhY2VkKCkgPyBtX2N1cnJlbnQu
bV9vYmotPnBhcmVudCgpLT5zdHlsZSgpLndoaXRlU3BhY2UoKSA6IG1fY3VycmVudFN0eWxlLT53
aGl0ZVNwYWNlKCk7Ci0gICAgbV9sYXN0V1MgPSBtX2xhc3RPYmplY3QtPmlzUmVwbGFjZWQoKSA/
IG1fbGFzdE9iamVjdC0+cGFyZW50KCktPnN0eWxlKCkud2hpdGVTcGFjZSgpIDogbV9sYXN0T2Jq
ZWN0LT5zdHlsZSgpLndoaXRlU3BhY2UoKTsKLQotICAgIG1fYXV0b1dyYXAgPSBSZW5kZXJTdHls
ZTo6YXV0b1dyYXAobV9jdXJyV1MpOwotICAgIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9
IG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSB8fCBtX2F1dG9XcmFwOwotCi0jaWYgRU5BQkxF
KFNWRykKLSAgICBtX3ByZXNlcnZlc05ld2xpbmUgPSBtX2N1cnJlbnQubV9vYmotPmlzU1ZHSW5s
aW5lVGV4dCgpID8gZmFsc2UgOiBSZW5kZXJTdHlsZTo6cHJlc2VydmVOZXdsaW5lKG1fY3VycldT
KTsKLSNlbHNlCi0gICAgbV9wcmVzZXJ2ZXNOZXdsaW5lID0gUmVuZGVyU3R5bGU6OnByZXNlcnZl
TmV3bGluZShtX2N1cnJXUyk7Ci0jZW5kaWYKLQotICAgIG1fY29sbGFwc2VXaGl0ZVNwYWNlID0g
UmVuZGVyU3R5bGU6OmNvbGxhcHNlV2hpdGVTcGFjZShtX2N1cnJXUyk7Ci19Ci0KLWlubGluZSB2
b2lkIEJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KCkKLXsKLSAgICAvLyBDbGVhciBvdXQgb3Vy
IGNoYXJhY3RlciBzcGFjZSBib29sLCBzaW5jZSBpbmxpbmUgPHByZT5zIGRvbid0IGNvbGxhcHNl
IHdoaXRlc3BhY2UKLSAgICAvLyB3aXRoIGFkamFjZW50IGlubGluZSBub3JtYWwvbm93cmFwIHNw
YW5zLgotICAgIGlmICghbV9jb2xsYXBzZVdoaXRlU3BhY2UpCi0gICAgICAgIG1fY3VycmVudENo
YXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKLQotICAgIG1fY3VycmVudC5tb3ZlVG9TdGFydE9mKG1f
bmV4dE9iamVjdCk7Ci0gICAgbV9hdFN0YXJ0ID0gZmFsc2U7Ci19Ci0KLWlubGluZSB2b2lkIEJy
ZWFraW5nQ29udGV4dDo6aGFuZGxlQlIoRUNsZWFyJiBjbGVhcikKLXsKLSAgICBpZiAobV93aWR0
aC5maXRzT25MaW5lKCkpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBiciA9IG1fY3VycmVudC5t
X29iajsKLSAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvU3RhcnRPZihicik7Ci0gICAgICAgIG1f
bGluZUJyZWFrLmluY3JlbWVudCgpOwotCi0gICAgICAgIC8vIEEgPGJyPiBhbHdheXMgYnJlYWtz
IGEgbGluZSwgc28gZG9uJ3QgbGV0IHRoZSBsaW5lIGJlIGNvbGxhcHNlZAotICAgICAgICAvLyBh
d2F5LiBBbHNvLCB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aCBhIDxicj4gZG9l
cyBub3QKLSAgICAgICAgLy8gZ2V0IGNvbGxhcHNlZCBhd2F5LiBJdCBvbmx5IGRvZXMgdGhpcyBp
ZiB0aGUgcHJldmlvdXMgbGluZSBicm9rZQotICAgICAgICAvLyBjbGVhbmx5LiBPdGhlcndpc2Ug
dGhlIDxicj4gaGFzIG5vIGVmZmVjdCBvbiB3aGV0aGVyIHRoZSBsaW5lIGlzCi0gICAgICAgIC8v
IGVtcHR5IG9yIG5vdC4KLSAgICAgICAgaWYgKG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGgpCi0gICAg
ICAgICAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAmbV9ibG9jaywgJm1fd2lkdGgpOwot
ICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOwotICAgICAgICBtX2xpbmVJbmZvLnNl
dFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKLQotICAgICAgICAvLyBBIDxicj4gd2l0
aCBjbGVhcmFuY2UgYWx3YXlzIG5lZWRzIGEgbGluZWJveCBpbiBjYXNlIHRoZSBsaW5lcyBiZWxv
dyBpdCBnZXQgZGlydGllZCBsYXRlciBhbmQKLSAgICAgICAgLy8gbmVlZCB0byBjaGVjayBmb3Ig
ZmxvYXRzIHRvIGNsZWFyIC0gc28gaWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCBzdG9wIGlnbm9y
aW5nIHRoZW0gYW5kIGFkZCBhCi0gICAgICAgIC8vIHJ1biBmb3IgdGhpcyBvYmplY3QuCi0gICAg
ICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jbGVhcigpICE9IENO
T05FKQotICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9saW5l
TWlkcG9pbnRTdGF0ZSwgYnIpOwotICAgICAgICAvLyBJZiB3ZSB3ZXJlIHByZWNlZGVkIGJ5IGNv
bGxhcHNpbmcgc3BhY2UgYW5kIGFyZSBpbiBhIHJpZ2h0LWFsaWduZWQgY29udGFpbmVyIHdlIG5l
ZWQgdG8gZW5zdXJlIHRoZSBzcGFjZSBnZXRzCi0gICAgICAgIC8vIGNvbGxhcHNlZCBhd2F5IHNv
IHRoYXQgaXQgZG9lc24ndCBwdXNoIHRoZSB0ZXh0IG91dCBmcm9tIHRoZSBjb250YWluZXIncyBy
aWdodC1oYW5kIGVkZ2UuCi0gICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2FyZGxlc3Mgb2Yg
dGhlIGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2VsaW5pbmcgYSBs
b3Qgb2YgdGVzdCByZXN1bHRzLgotICAgICAgICBlbHNlIGlmIChtX2lnbm9yaW5nU3BhY2VzICYm
IChtX2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gUklHSFQgfHwgbV9ibG9ja1N0eWxlLnRleHRB
bGlnbigpID09IFdFQktJVF9SSUdIVCkpCi0gICAgICAgICAgICBzdG9wSWdub3JpbmdTcGFjZXMo
bV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50Lm1fb2JqLCBt
X2N1cnJlbnQubV9wb3MpKTsKLQotICAgICAgICBpZiAoIW1fbGluZUluZm8uaXNFbXB0eSgpKQot
ICAgICAgICAgICAgY2xlYXIgPSBtX2N1cnJlbnRTdHlsZS0+Y2xlYXIoKTsKLSAgICB9Ci0gICAg
bV9hdEVuZCA9IHRydWU7Ci19Ci0KLWlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxl
T3V0T2ZGbG93UG9zaXRpb25lZChWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmplY3Rz
KQotewotICAgIC8vIElmIG91ciBvcmlnaW5hbCBkaXNwbGF5IHdhc24ndCBhbiBpbmxpbmUgdHlw
ZSwgdGhlbiB3ZSBjYW4KLSAgICAvLyBnbyBhaGVhZCBhbmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMg
aW5saW5lIHBvc2l0aW9uIG5vdy4KLSAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94KG1f
Y3VycmVudC5tX29iaik7Ci0gICAgYm9vbCBpc0lubGluZVR5cGUgPSBib3gtPnN0eWxlKCkuaXNP
cmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCk7Ci0gICAgaWYgKCFpc0lubGluZVR5cGUpCi0gICAg
ICAgIG1fYmxvY2suc2V0U3RhdGljSW5saW5lUG9zaXRpb25Gb3JDaGlsZCgqYm94LCBtX2Jsb2Nr
LmxvZ2ljYWxIZWlnaHQoKSwgbV9ibG9jay5zdGFydE9mZnNldEZvckNvbnRlbnQobV9ibG9jay5s
b2dpY2FsSGVpZ2h0KCkpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgLy8gSWYgb3VyIG9yaWdpbmFs
IGRpc3BsYXkgd2FzIGFuIElOTElORSB0eXBlLCB0aGVuIHdlIGNhbiBnbyBhaGVhZAotICAgICAg
ICAvLyBhbmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMgeSBwb3NpdGlvbiBub3cuCi0gICAgICAgIGJv
eC0+bGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlvbihtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQo
KSk7Ci0gICAgfQotCi0gICAgLy8gSWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCB3ZSBoYXZlIHRv
IHN0b3AgYW5kIGluY2x1ZGUgdGhpcyBvYmplY3QgYW5kCi0gICAgLy8gdGhlbiBzdGFydCBpZ25v
cmluZyBzcGFjZXMgYWdhaW4uCi0gICAgaWYgKGlzSW5saW5lVHlwZSB8fCBib3gtPmNvbnRhaW5l
cigpLT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzKQot
ICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9saW5lTWlkcG9p
bnRTdGF0ZSwgYm94KTsKLSAgICAgICAgbV90cmFpbGluZ09iamVjdHMuYXBwZW5kQm94SWZOZWVk
ZWQoYm94KTsKLSAgICB9IGVsc2UKLSAgICAgICAgcG9zaXRpb25lZE9iamVjdHMuYXBwZW5kKGJv
eCk7Ci0KLSAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoaW5saW5lTG9naWNhbFdpZHRo
KGJveCkpOwotICAgIC8vIFJlc2V0IHByaW9yIGxpbmUgYnJlYWsgY29udGV4dCBjaGFyYWN0ZXJz
LgotICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNldFByaW9yQ29u
dGV4dCgpOwotfQotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUZsb2F0KCkK
LXsKLSAgICBSZW5kZXJCb3gmIGZsb2F0Qm94ID0gdG9SZW5kZXJCb3goKm1fY3VycmVudC5tX29i
aik7Ci0gICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gbV9ibG9jay5pbnNlcnRG
bG9hdGluZ09iamVjdChmbG9hdEJveCk7Ci0gICAgLy8gY2hlY2sgaWYgaXQgZml0cyBpbiB0aGUg
Y3VycmVudCBsaW5lLgotICAgIC8vIElmIGl0IGRvZXMsIHBvc2l0aW9uIGl0IG5vdywgb3RoZXJ3
aXNlLCBwb3NpdGlvbgotICAgIC8vIGl0IGFmdGVyIG1vdmluZyB0byBuZXh0IGxpbmUgKGluIG5l
d0xpbmUoKSBmdW5jKQotICAgIC8vIEZJWE1FOiBCdWcgMTEwMzcyOiBQcm9wZXJseSBwb3NpdGlv
biBtdWx0aXBsZSBzdGFja2VkIGZsb2F0cyB3aXRoIG5vbi1yZWN0YW5ndWxhciBzaGFwZSBvdXRz
aWRlLgotICAgIGlmIChtX2Zsb2F0c0ZpdE9uTGluZSAmJiBtX3dpZHRoLmZpdHNPbkxpbmVFeGNs
dWRpbmdUcmFpbGluZ1doaXRlc3BhY2UobV9ibG9jay5sb2dpY2FsV2lkdGhGb3JGbG9hdChmbG9h
dGluZ09iamVjdCkpKSB7Ci0gICAgICAgIG1fYmxvY2sucG9zaXRpb25OZXdGbG9hdE9uTGluZShm
bG9hdGluZ09iamVjdCwgbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBtX2xpbmVJbmZvLCBt
X3dpZHRoKTsKLSAgICAgICAgaWYgKG1fbGluZUJyZWFrLm1fb2JqID09IG1fY3VycmVudC5tX29i
aikgewotICAgICAgICAgICAgQVNTRVJUKCFtX2xpbmVCcmVhay5tX3Bvcyk7Ci0gICAgICAgICAg
ICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAg
ICBtX2Zsb2F0c0ZpdE9uTGluZSA9IGZhbHNlOwotICAgIC8vIFVwZGF0ZSBwcmlvciBsaW5lIGJy
ZWFrIGNvbnRleHQgY2hhcmFjdGVycywgdXNpbmcgVStGRkZEIChPQkpFQ1QgUkVQTEFDRU1FTlQg
Q0hBUkFDVEVSKSBmb3IgZmxvYXRpbmcgZWxlbWVudC4KLSAgICBtX3JlbmRlclRleHRJbmZvLm1f
bGluZUJyZWFrSXRlcmF0b3IudXBkYXRlUHJpb3JDb250ZXh0KHJlcGxhY2VtZW50Q2hhcmFjdGVy
KTsKLX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbXB0eUlubGluZSgp
Ci17Ci0gICAgUmVuZGVySW5saW5lJiBmbG93Qm94ID0gdG9SZW5kZXJJbmxpbmUoKm1fY3VycmVu
dC5tX29iaik7Ci0KLSAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGVuZCB1cCBiZWluZyBjYWxsZWQg
b24gZW1wdHkgaW5saW5lcwotICAgIEFTU0VSVChpc0VtcHR5SW5saW5lKGZsb3dCb3gpKTsKLQot
ICAgIC8vIE5vdyB0aGF0IHNvbWUgaW5saW5lIGZsb3dzIGhhdmUgbGluZSBib3hlcywgaWYgd2Ug
YXJlIGFscmVhZHkgaWdub3Jpbmcgc3BhY2VzLCB3ZSBuZWVkCi0gICAgLy8gdG8gbWFrZSBzdXJl
IHRoYXQgd2Ugc3RvcCB0byBpbmNsdWRlIHRoaXMgb2JqZWN0IGFuZCB0aGVuIHN0YXJ0IGlnbm9y
aW5nIHNwYWNlcyBhZ2Fpbi4KLSAgICAvLyBJZiB0aGlzIG9iamVjdCBpcyBhdCB0aGUgc3RhcnQg
b2YgdGhlIGxpbmUsIHdlIG5lZWQgdG8gYmVoYXZlIGxpa2UgbGlzdCBtYXJrZXJzIGFuZAotICAg
IC8vIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcy4KLSAgICBib29sIHJlcXVpcmVzTGluZUJveCA9IGFs
d2F5c1JlcXVpcmVzTGluZUJveChmbG93Qm94KTsKLSAgICBpZiAocmVxdWlyZXNMaW5lQm94IHx8
IHJlcXVpcmVzTGluZUJveEZvckNvbnRlbnQoZmxvd0JveCwgbV9saW5lSW5mbykpIHsKLSAgICAg
ICAgLy8gQW4gZW1wdHkgaW5saW5lIHRoYXQgb25seSBoYXMgbGluZS1oZWlnaHQsIHZlcnRpY2Fs
LWFsaWduIG9yIGZvbnQtbWV0cmljcyB3aWxsIG9ubHkgZ2V0IGEKLSAgICAgICAgLy8gbGluZSBi
b3ggdG8gYWZmZWN0IHRoZSBoZWlnaHQgb2YgdGhlIGxpbmUgaWYgdGhlIHJlc3Qgb2YgdGhlIGxp
bmUgaXMgbm90IGVtcHR5LgotICAgICAgICBpZiAocmVxdWlyZXNMaW5lQm94KQotICAgICAgICAg
ICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKLSAgICAg
ICAgaWYgKG1faWdub3JpbmdTcGFjZXMpIHsKLSAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3Rz
LmNsZWFyKCk7Ci0gICAgICAgICAgICBlbnN1cmVMaW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcyht
X2xpbmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQubV9vYmopOwotICAgICAgICB9IGVsc2UgaWYg
KG1fYmxvY2tTdHlsZS5jb2xsYXBzZVdoaXRlU3BhY2UoKSAmJiBtX3Jlc29sdmVyLnBvc2l0aW9u
KCkubV9vYmogPT0gbV9jdXJyZW50Lm1fb2JqCi0gICAgICAgICAgICAmJiBzaG91bGRTa2lwV2hp
dGVzcGFjZUFmdGVyU3RhcnRPYmplY3QobV9ibG9jaywgbV9jdXJyZW50Lm1fb2JqLCBtX2xpbmVN
aWRwb2ludFN0YXRlKSkgewotICAgICAgICAgICAgLy8gTGlrZSB3aXRoIGxpc3QgbWFya2Vycywg
d2Ugc3RhcnQgaWdub3Jpbmcgc3BhY2VzIHRvIG1ha2Ugc3VyZSB0aGF0IGFueQotICAgICAgICAg
ICAgLy8gYWRkaXRpb25hbCBzcGFjZXMgd2Ugc2VlIHdpbGwgYmUgZGlzY2FyZGVkLgotICAgICAg
ICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IHRydWU7Ci0gICAgICAgICAgICBtX2N1
cnJlbnRDaGFyYWN0ZXJJc1dTID0gdHJ1ZTsKLSAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMg
PSB0cnVlOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmFw
cGVuZEJveElmTmVlZGVkKCZmbG93Qm94KTsKLSAgICB9Ci0KLSAgICBtX3dpZHRoLmFkZFVuY29t
bWl0dGVkV2lkdGgoaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaikgKyBib3JkZXJQ
YWRkaW5nTWFyZ2luU3RhcnQoZmxvd0JveCkgKyBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKGZsb3dC
b3gpKTsKLX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVSZXBsYWNlZCgp
Ci17Ci0gICAgUmVuZGVyQm94JiByZXBsYWNlZEJveCA9IHRvUmVuZGVyQm94KCptX2N1cnJlbnQu
bV9vYmopOwotCi0gICAgaWYgKG1fYXRTdGFydCkKLSAgICAgICAgbV93aWR0aC51cGRhdGVBdmFp
bGFibGVXaWR0aChyZXBsYWNlZEJveC5sb2dpY2FsSGVpZ2h0KCkpOwotCi0gICAgLy8gQnJlYWsg
b24gcmVwbGFjZWQgZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUtc3BhY2UuCi0g
ICAgaWYgKChtX2F1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChtX2xhc3RXUykpICYm
ICghbV9jdXJyZW50Lm1fb2JqLT5pc0ltYWdlKCkgfHwgbV9hbGxvd0ltYWdlc1RvQnJlYWspKSB7
Ci0gICAgICAgIG1fd2lkdGguY29tbWl0KCk7Ci0gICAgICAgIG1fbGluZUJyZWFrLm1vdmVUb1N0
YXJ0T2YobV9jdXJyZW50Lm1fb2JqKTsKLSAgICB9Ci0KLSAgICBpZiAobV9pZ25vcmluZ1NwYWNl
cykKLSAgICAgICAgc3RvcElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIElubGlu
ZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5tX29iaiwgMCkpOwotCi0gICAgbV9saW5lSW5mby5zZXRF
bXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKLSAgICBtX2lnbm9yaW5nU3BhY2VzID0g
ZmFsc2U7Ci0gICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOwotICAgIG1fY3Vy
cmVudENoYXJhY3RlcklzV1MgPSBmYWxzZTsKLSAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigp
OwotCi0gICAgLy8gT3B0aW1pemUgZm9yIGEgY29tbW9uIGNhc2UuIElmIHdlIGNhbid0IGZpbmQg
d2hpdGVzcGFjZSBhZnRlciB0aGUgbGlzdAotICAgIC8vIGl0ZW0sIHRoZW4gdGhpcyBpcyBhbGwg
bW9vdC4KLSAgICBMYXlvdXRVbml0IHJlcGxhY2VkTG9naWNhbFdpZHRoID0gbV9ibG9jay5sb2dp
Y2FsV2lkdGhGb3JDaGlsZChyZXBsYWNlZEJveCkgKyBtX2Jsb2NrLm1hcmdpblN0YXJ0Rm9yQ2hp
bGQocmVwbGFjZWRCb3gpICsgbV9ibG9jay5tYXJnaW5FbmRGb3JDaGlsZChyZXBsYWNlZEJveCkg
KyBpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50Lm1fb2JqKTsKLSAgICBpZiAobV9jdXJyZW50
Lm1fb2JqLT5pc0xpc3RNYXJrZXIoKSkgewotICAgICAgICBpZiAobV9ibG9ja1N0eWxlLmNvbGxh
cHNlV2hpdGVTcGFjZSgpICYmIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdCht
X2Jsb2NrLCBtX2N1cnJlbnQubV9vYmosIG1fbGluZU1pZHBvaW50U3RhdGUpKSB7Ci0gICAgICAg
ICAgICAvLyBMaWtlIHdpdGggaW5saW5lIGZsb3dzLCB3ZSBzdGFydCBpZ25vcmluZyBzcGFjZXMg
dG8gbWFrZSBzdXJlIHRoYXQgYW55Ci0gICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHNwYWNlcyB3
ZSBzZWUgd2lsbCBiZSBkaXNjYXJkZWQuCi0gICAgICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSBmYWxz
ZTsKLSAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSB0cnVlOwotICAgICAgICB9Ci0gICAg
ICAgIGlmICh0b1JlbmRlckxpc3RNYXJrZXIoKm1fY3VycmVudC5tX29iaikuaXNJbnNpZGUoKSkK
LSAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChyZXBsYWNlZExvZ2ljYWxX
aWR0aCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChy
ZXBsYWNlZExvZ2ljYWxXaWR0aCk7Ci0gICAgaWYgKG1fY3VycmVudC5tX29iai0+aXNSdWJ5UnVu
KCkpCi0gICAgICAgIG1fd2lkdGguYXBwbHlPdmVyaGFuZyh0b1JlbmRlclJ1YnlSdW4obV9jdXJy
ZW50Lm1fb2JqKSwgbV9sYXN0T2JqZWN0LCBtX25leHRPYmplY3QpOwotICAgIC8vIFVwZGF0ZSBw
cmlvciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVycywgdXNpbmcgVStGRkZEIChPQkpFQ1Qg
UkVQTEFDRU1FTlQgQ0hBUkFDVEVSKSBmb3IgcmVwbGFjZWQgZWxlbWVudC4KLSAgICBtX3JlbmRl
clRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IudXBkYXRlUHJpb3JDb250ZXh0KHJlcGxhY2Vt
ZW50Q2hhcmFjdGVyKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmV4dENoYXJhY3RlcihV
Q2hhciYgY3VycmVudENoYXJhY3RlciwgVUNoYXImIGxhc3RDaGFyYWN0ZXIsIFVDaGFyJiBzZWNv
bmRUb0xhc3RDaGFyYWN0ZXIpCi17Ci0gICAgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gbGFzdENo
YXJhY3RlcjsKLSAgICBsYXN0Q2hhcmFjdGVyID0gY3VycmVudENoYXJhY3RlcjsKLX0KLQotaW5s
aW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdv
cmRNZWFzdXJlbWVudHMsIGJvb2wmIGh5cGhlbmF0ZWQsICB1bnNpZ25lZCYgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXMpCi17Ci0gICAgaWYgKCFtX2N1cnJlbnQubV9wb3MpCi0gICAgICAgIG1f
YXBwbGllZFN0YXJ0V2lkdGggPSBmYWxzZTsKLQotICAgIFJlbmRlclRleHQqIHJlbmRlclRleHQg
PSB0b1JlbmRlclRleHQobV9jdXJyZW50Lm1fb2JqKTsKLQotI2lmIEVOQUJMRShTVkcpCi0gICAg
Ym9vbCBpc1NWR1RleHQgPSByZW5kZXJUZXh0LT5pc1NWR0lubGluZVRleHQoKTsKLSNlbmRpZgot
Ci0gICAgLy8gSWYgd2UgaGF2ZSBsZWZ0IGEgbm8td3JhcCBpbmxpbmUgYW5kIGVudGVyZWQgYW4g
YXV0b3dyYXAgaW5saW5lIHdoaWxlIGlnbm9yaW5nIHNwYWNlcwotICAgIC8vIHRoZW4gd2UgbmVl
ZCB0byBtYXJrIHRoZSBzdGFydCBvZiB0aGUgYXV0b3dyYXAgaW5saW5lIGFzIGEgcG90ZW50aWFs
IGxpbmVicmVhayBub3cuCi0gICAgaWYgKG1fYXV0b1dyYXAgJiYgIVJlbmRlclN0eWxlOjphdXRv
V3JhcChtX2xhc3RXUykgJiYgbV9pZ25vcmluZ1NwYWNlcykKLSAgICAgICAgY29tbWl0TGluZUJy
ZWFrQXRDdXJyZW50V2lkdGgobV9jdXJyZW50Lm1fb2JqKTsKLQotICAgIGlmIChyZW5kZXJUZXh0
LT5zdHlsZSgpLmhhc1RleHRDb21iaW5lKCkgJiYgbV9jdXJyZW50Lm1fb2JqLT5pc0NvbWJpbmVU
ZXh0KCkgJiYgIXRvUmVuZGVyQ29tYmluZVRleHQoKm1fY3VycmVudC5tX29iaikuaXNDb21iaW5l
ZCgpKSB7Ci0gICAgICAgIFJlbmRlckNvbWJpbmVUZXh0JiBjb21iaW5lUmVuZGVyZXIgPSB0b1Jl
bmRlckNvbWJpbmVUZXh0KCptX2N1cnJlbnQubV9vYmopOwotICAgICAgICBjb21iaW5lUmVuZGVy
ZXIuY29tYmluZVRleHQoKTsKLSAgICAgICAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcmVuZGVyZXIn
cyB0ZXh0IG1heSBoYXZlIGNoYW5nZWQuIEluY3JlbWVudCBzdGFsZSBpdGVyYXRvciBwb3NpdGlv
bnMKLSAgICAgICAgaWYgKGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KG1f
bGluZUJyZWFrLCBjb21iaW5lUmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICBBU1NFUlQoaXRlcmF0
b3JJc0JleW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQobV9yZXNvbHZlci5wb3NpdGlvbigpLCBj
b21iaW5lUmVuZGVyZXIpKTsKLSAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOwot
ICAgICAgICAgICAgbV9yZXNvbHZlci5pbmNyZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQot
ICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IGxpbmVTdHlsZSgqcmVuZGVyVGV4dC0+cGFy
ZW50KCksIG1fbGluZUluZm8pOwotICAgIGNvbnN0IEZvbnQmIGZvbnQgPSBzdHlsZS5mb250KCk7
Ci0gICAgYm9vbCBpc0ZpeGVkUGl0Y2ggPSBmb250LmlzRml4ZWRQaXRjaCgpOwotICAgIGJvb2wg
Y2FuSHlwaGVuYXRlID0gc3R5bGUuaHlwaGVucygpID09IEh5cGhlbnNBdXRvICYmIFdlYkNvcmU6
OmNhbkh5cGhlbmF0ZShzdHlsZS5sb2NhbGUoKSk7Ci0KLSAgICB1bnNpZ25lZCBsYXN0U3BhY2Ug
PSBtX2N1cnJlbnQubV9wb3M7Ci0gICAgZmxvYXQgd29yZFNwYWNpbmcgPSBtX2N1cnJlbnRTdHls
ZS0+d29yZFNwYWNpbmcoKTsKLSAgICBmbG9hdCBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IDA7Ci0g
ICAgZmxvYXQgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAwOwotCi0gICAgZmxvYXQg
d3JhcFcgPSBtX3dpZHRoLnVuY29tbWl0dGVkV2lkdGgoKSArIGlubGluZUxvZ2ljYWxXaWR0aCht
X2N1cnJlbnQubV9vYmosICFtX2FwcGxpZWRTdGFydFdpZHRoLCB0cnVlKTsKLSAgICBmbG9hdCBj
aGFyV2lkdGggPSAwOwotICAgIGJvb2wgYnJlYWtOQlNQID0gbV9hdXRvV3JhcCAmJiBtX2N1cnJl
bnRTdHlsZS0+bmJzcE1vZGUoKSA9PSBTUEFDRTsKLSAgICAvLyBBdXRvLXdyYXBwaW5nIHRleHQg
c2hvdWxkIHdyYXAgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgb25seSBpZiBpdCBjb3VsZCBub3Qg
d3JhcCBiZWZvcmUgdGhlIHdvcmQsCi0gICAgLy8gd2hpY2ggaXMgb25seSBwb3NzaWJsZSBpZiB0
aGUgd29yZCBpcyB0aGUgZmlyc3QgdGhpbmcgb24gdGhlIGxpbmUsIHRoYXQgaXMsIGlmIHx3fCBp
cyB6ZXJvLgotICAgIGJvb2wgYnJlYWtXb3JkcyA9IG1fY3VycmVudFN0eWxlLT5icmVha1dvcmRz
KCkgJiYgKChtX2F1dG9XcmFwICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHx8IG1fY3Vy
cldTID09IFBSRSk7Ci0gICAgYm9vbCBtaWRXb3JkQnJlYWsgPSBmYWxzZTsKLSAgICBib29sIGJy
ZWFrQWxsID0gbV9jdXJyZW50U3R5bGUtPndvcmRCcmVhaygpID09IEJyZWFrQWxsV29yZEJyZWFr
ICYmIG1fYXV0b1dyYXA7Ci0gICAgZmxvYXQgaHlwaGVuV2lkdGggPSAwOwotI2lmIEVOQUJMRShT
VkcpCi0gICAgaWYgKGlzU1ZHVGV4dCkgewotICAgICAgICBicmVha1dvcmRzID0gZmFsc2U7Ci0g
ICAgICAgIGJyZWFrQWxsID0gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAobV9yZW5k
ZXJUZXh0SW5mby5tX3RleHQgIT0gcmVuZGVyVGV4dCkgewotICAgICAgICB1cGRhdGVDb3VudGVy
SWZOZWVkZWQoKnJlbmRlclRleHQpOwotICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fdGV4dCA9
IHJlbmRlclRleHQ7Ci0gICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9mb250ID0gJmZvbnQ7Ci0g
ICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgPSBmb250LmNyZWF0ZUxheW91dChyZW5k
ZXJUZXh0LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSk7Ci0g
ICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNldFN0cmluZ0Fu
ZFJlbGVhc2VJdGVyYXRvcihyZW5kZXJUZXh0LT50ZXh0KCksIHN0eWxlLmxvY2FsZSgpKTsKLSAg
ICB9IGVsc2UgaWYgKG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgJiYgbV9yZW5kZXJUZXh0SW5m
by5tX2ZvbnQgIT0gJmZvbnQpIHsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2ZvbnQgPSAm
Zm9udDsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xheW91dCA9IGZvbnQuY3JlYXRlTGF5
b3V0KHJlbmRlclRleHQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIG1fY29sbGFwc2VXaGl0ZVNw
YWNlKTsKLSAgICB9Ci0KLSAgICBUZXh0TGF5b3V0KiB0ZXh0TGF5b3V0ID0gbV9yZW5kZXJUZXh0
SW5mby5tX2xheW91dC5nZXQoKTsKLQotICAgIC8vIE5vbi16ZXJvIG9ubHkgd2hlbiBrZXJuaW5n
IGlzIGVuYWJsZWQgYW5kIFRleHRMYXlvdXQgaXNuJ3QgdXNlZCwgaW4gd2hpY2ggY2FzZSB3ZSBt
ZWFzdXJlCi0gICAgLy8gd29yZHMgd2l0aCB0aGVpciB0cmFpbGluZyBzcGFjZSwgdGhlbiBzdWJ0
cmFjdCBpdHMgd2lkdGguCi0gICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+IGZhbGxi
YWNrRm9udHM7Ci0gICAgZmxvYXQgd29yZFRyYWlsaW5nU3BhY2VXaWR0aCA9IChmb250LnR5cGVz
ZXR0aW5nRmVhdHVyZXMoKSAmIEtlcm5pbmcpICYmICF0ZXh0TGF5b3V0ID8gZm9udC53aWR0aChS
ZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bihyZW5kZXJUZXh0LCBmb250LCAmc3BhY2UsIDEs
IHN0eWxlKSwgJmZhbGxiYWNrRm9udHMpICsgd29yZFNwYWNpbmcgOiAwOwotCi0gICAgVUNoYXIg
bGFzdENoYXJhY3RlciA9IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5sYXN0
Q2hhcmFjdGVyKCk7Ci0gICAgVUNoYXIgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gbV9yZW5kZXJU
ZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLnNlY29uZFRvTGFzdENoYXJhY3RlcigpOwotICAg
IGZvciAoOyBtX2N1cnJlbnQubV9wb3MgPCByZW5kZXJUZXh0LT50ZXh0TGVuZ3RoKCk7IG1fY3Vy
cmVudC5mYXN0SW5jcmVtZW50SW5UZXh0Tm9kZSgpKSB7Ci0gICAgICAgIGJvb2wgcHJldmlvdXND
aGFyYWN0ZXJJc1NwYWNlID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKLSAgICAgICAgYm9v
bCBwcmV2aW91c0NoYXJhY3RlcklzV1MgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTOwotICAgICAg
ICBVQ2hhciBjID0gbV9jdXJyZW50LmN1cnJlbnQoKTsKLSAgICAgICAgbV9jdXJyZW50Q2hhcmFj
dGVySXNTcGFjZSA9IGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCAoIW1fcHJlc2VydmVzTmV3bGlu
ZSAmJiAoYyA9PSAnXG4nKSk7Ci0KLSAgICAgICAgaWYgKCFtX2NvbGxhcHNlV2hpdGVTcGFjZSB8
fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKLSAgICAgICAgICAgIG1fbGluZUluZm8uc2V0
RW1wdHkoZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7Ci0KLSAgICAgICAgaWYgKGMgPT0gc29m
dEh5cGhlbiAmJiBtX2F1dG9XcmFwICYmICFoeXBoZW5XaWR0aCAmJiBzdHlsZS5oeXBoZW5zKCkg
IT0gSHlwaGVuc05vbmUpIHsKLSAgICAgICAgICAgIGh5cGhlbldpZHRoID0gbWVhc3VyZUh5cGhl
bldpZHRoKHJlbmRlclRleHQsIGZvbnQsICZmYWxsYmFja0ZvbnRzKTsKLSAgICAgICAgICAgIG1f
d2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChoeXBoZW5XaWR0aCk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBib29sIGFwcGx5V29yZFNwYWNpbmcgPSBmYWxzZTsKLQotICAgICAgICBtX2N1cnJlbnRD
aGFyYWN0ZXJJc1dTID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSB8fCAoYnJlYWtOQlNQICYm
IGMgPT0gbm9CcmVha1NwYWNlKTsKLQotICAgICAgICBpZiAoKGJyZWFrQWxsIHx8IGJyZWFrV29y
ZHMpICYmICFtaWRXb3JkQnJlYWsgJiYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlIHx8IHN0
eWxlLndoaXRlU3BhY2UoKSAhPSBQUkVfV1JBUCkpIHsKLSAgICAgICAgICAgIHdyYXBXICs9IGNo
YXJXaWR0aDsKLSAgICAgICAgICAgIGJvb2wgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQ
YWlyID0gVTE2X0lTX0xFQUQoYykgJiYgbV9jdXJyZW50Lm1fcG9zICsgMSA8IHJlbmRlclRleHQt
PnRleHRMZW5ndGgoKSAmJiBVMTZfSVNfVFJBSUwoKCpyZW5kZXJUZXh0KVttX2N1cnJlbnQubV9w
b3MgKyAxXSk7Ci0gICAgICAgICAgICBjaGFyV2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwg
bV9jdXJyZW50Lm1fcG9zLCBtaWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPyAyIDog
MSwgZm9udCwgbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcsIGlzRml4ZWRQaXRjaCwg
bV9jb2xsYXBzZVdoaXRlU3BhY2UsIGZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOwotICAgICAg
ICAgICAgbWlkV29yZEJyZWFrID0gbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcgKyBj
aGFyV2lkdGggPiBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCk7Ci0gICAgICAgIH0KLQotICAgICAg
ICBib29sIGJldHdlZW5Xb3JkcyA9IGMgPT0gJ1xuJyB8fCAobV9jdXJyV1MgIT0gUFJFICYmICFt
X2F0U3RhcnQgJiYgaXNCcmVha2FibGUobV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJh
dG9yLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2FibGVQb3NpdGlvbiwg
YnJlYWtOQlNQKQotICAgICAgICAgICAgJiYgKHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9u
ZSB8fCAobV9jdXJyZW50LnByZXZpb3VzSW5TYW1lTm9kZSgpICE9IHNvZnRIeXBoZW4pKSk7Ci0K
LSAgICAgICAgaWYgKGJldHdlZW5Xb3JkcyB8fCBtaWRXb3JkQnJlYWspIHsKLSAgICAgICAgICAg
IGJvb2wgc3RvcHBlZElnbm9yaW5nU3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobV9p
Z25vcmluZ1NwYWNlcykgewotICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0g
MDsKLSAgICAgICAgICAgICAgICBpZiAoIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpIHsKLSAg
ICAgICAgICAgICAgICAgICAgLy8gU3RvcCBpZ25vcmluZyBzcGFjZXMgYW5kIGJlZ2luIGF0IHRo
aXMKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHBvaW50LgotICAgICAgICAgICAgICAgICAg
ICBtX2lnbm9yaW5nU3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRTcGFj
aW5nRm9yV29yZE1lYXN1cmVtZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFNwYWNl
ID0gbV9jdXJyZW50Lm1fcG9zOyAvLyBlLmcuLCAiRm9vICAgIGdvbyIsIGRvbid0IGFkZCBpbiBh
bnkgb2YgdGhlIGlnbm9yZWQgc3BhY2VzLgotICAgICAgICAgICAgICAgICAgICBzdG9wSWdub3Jp
bmdTcGFjZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50
Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcHBlZEln
bm9yaW5nU3BhY2VzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgICAgICAgICAvLyBKdXN0IGtlZXAgaWdub3JpbmcgdGhlc2Ugc3BhY2VzLgotICAgICAgICAg
ICAgICAgICAgICBuZXh0Q2hhcmFjdGVyKGMsIGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENo
YXJhY3Rlcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50cy5ncm93KHdv
cmRNZWFzdXJlbWVudHMuc2l6ZSgpICsgMSk7Ci0gICAgICAgICAgICBXb3JkTWVhc3VyZW1lbnQm
IHdvcmRNZWFzdXJlbWVudCA9IHdvcmRNZWFzdXJlbWVudHMubGFzdCgpOwotCi0gICAgICAgICAg
ICB3b3JkTWVhc3VyZW1lbnQucmVuZGVyZXIgPSByZW5kZXJUZXh0OwotICAgICAgICAgICAgd29y
ZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fY3VycmVudC5tX3BvczsKLSAgICAgICAgICAgIHdv
cmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCA9IGxhc3RTcGFjZTsKLQotICAgICAgICAgICAgZmxv
YXQgYWRkaXRpb25hbFRlbXBXaWR0aDsKLSAgICAgICAgICAgIGlmICh3b3JkVHJhaWxpbmdTcGFj
ZVdpZHRoICYmIGMgPT0gJyAnKQotICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGgg
PSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MgKyAxIC0g
bGFzdFNwYWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1f
Y29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExh
eW91dCkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoOwotICAgICAgICAgICAgZWxzZQotICAgICAg
ICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbGFz
dFNwYWNlLCBtX2N1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVu
dFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJl
bWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKLQotICAgICAgICAgICAgaWYgKHdvcmRN
ZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSAmJiAhZmFsbGJhY2tGb250cy5pc0Vt
cHR5KCkpCi0gICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuc3dh
cChmYWxsYmFja0ZvbnRzKTsKLSAgICAgICAgICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKLQot
ICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0gYWRkaXRpb25hbFRlbXBXaWR0aCAr
IHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50OwotICAgICAgICAgICAgYWRkaXRpb25hbFRl
bXBXaWR0aCArPSBsYXN0U3BhY2VXb3JkU3BhY2luZzsKLSAgICAgICAgICAgIG1fd2lkdGguYWRk
VW5jb21taXR0ZWRXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoKTsKLQotICAgICAgICAgICAgaWYg
KG1fY29sbGFwc2VXaGl0ZVNwYWNlICYmIHByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSAmJiBtX2N1
cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0aW9uYWxUZW1wV2lkdGgpCi0gICAgICAgICAg
ICAgICAgbV93aWR0aC5zZXRUcmFpbGluZ1doaXRlc3BhY2VXaWR0aChhZGRpdGlvbmFsVGVtcFdp
ZHRoKTsKLQotICAgICAgICAgICAgaWYgKCFtX2FwcGxpZWRTdGFydFdpZHRoKSB7Ci0gICAgICAg
ICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlubGluZUxvZ2ljYWxXaWR0aCht
X2N1cnJlbnQubV9vYmosIHRydWUsIGZhbHNlKSk7Ci0gICAgICAgICAgICAgICAgbV9hcHBsaWVk
U3RhcnRXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX1NIQVBF
UykKLSAgICAgICAgICAgIGlmIChtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpCi0gICAgICAg
ICAgICAgICAgdXBkYXRlU2VnbWVudHNGb3JTaGFwZXMobV9ibG9jaywgbV9sYXN0RmxvYXRGcm9t
UHJldmlvdXNMaW5lLCB3b3JkTWVhc3VyZW1lbnRzLCBtX3dpZHRoLCBtX2xpbmVJbmZvLmlzRmly
c3RMaW5lKCkpOwotI2VuZGlmCi0gICAgICAgICAgICBhcHBseVdvcmRTcGFjaW5nID0gd29yZFNw
YWNpbmcgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKLQotICAgICAgICAgICAgaWYgKCFt
X3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgJiYgbV9hdXRvV3JhcCAmJiAhbV93aWR0aC5maXRzT25M
aW5lKCkpCi0gICAgICAgICAgICAgICAgbV93aWR0aC5maXRCZWxvd0Zsb2F0cygpOwotCi0gICAg
ICAgICAgICBpZiAobV9hdXRvV3JhcCB8fCBicmVha1dvcmRzKSB7Ci0gICAgICAgICAgICAgICAg
Ly8gSWYgd2UgYnJlYWsgb25seSBhZnRlciB3aGl0ZS1zcGFjZSwgY29uc2lkZXIgdGhlIGN1cnJl
bnQgY2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgLy8gYXMgY2FuZGlkYXRlIHdpZHRoIGZvciB0
aGlzIGxpbmUuCi0gICAgICAgICAgICAgICAgYm9vbCBsaW5lV2FzVG9vV2lkZSA9IGZhbHNlOwot
ICAgICAgICAgICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoKSAmJiBtX2N1cnJlbnRDaGFy
YWN0ZXJJc1NwYWNlICYmIG1fY3VycmVudFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRlU3BhY2Uo
KSAmJiAhbWlkV29yZEJyZWFrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGNoYXJXaWR0
aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBtX2N1cnJlbnQubV9wb3MsIDEsIGZvbnQsIG1fd2lk
dGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdv
cmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSArIChhcHBseVdvcmRTcGFj
aW5nID8gd29yZFNwYWNpbmcgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYg
bGluZSBpcyB0b28gYmlnIGV2ZW4gd2l0aG91dCB0aGUgZXh0cmEgc3BhY2UKLSAgICAgICAgICAg
ICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gSWYgaXQgaXMgbm90LCBkbyBub3Ro
aW5nLgotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBuZWVkcyB0aGUgZXh0cmEg
d2hpdGVzcGFjZSB0byBiZSB0b28gbG9uZywKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBt
b3ZlIHRoZSBsaW5lIGJyZWFrIHRvIHRoZSBzcGFjZSBhbmQgc2tpcCBhbGwKLSAgICAgICAgICAg
ICAgICAgICAgLy8gYWRkaXRpb25hbCB3aGl0ZXNwYWNlLgotICAgICAgICAgICAgICAgICAgICBp
ZiAoIW1fd2lkdGguZml0c09uTGluZUluY2x1ZGluZ0V4dHJhV2lkdGgoY2hhcldpZHRoKSkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgbGluZVdhc1Rvb1dpZGUgPSB0cnVlOwotICAgICAgICAg
ICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJy
ZW50Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOwotICAgICAgICAg
ICAgICAgICAgICAgICAgbV9saW5lQnJlYWtlci5za2lwVHJhaWxpbmdXaGl0ZXNwYWNlKG1fbGlu
ZUJyZWFrLCBtX2xpbmVJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZVdhc1Rvb1dpZGUgfHwgIW1fd2lkdGguZml0
c09uTGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYW5IeXBoZW5hdGUgJiYgIW1f
d2lkdGguZml0c09uTGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnlIeXBoZW5h
dGluZyhyZW5kZXJUZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwgY29uc2VjdXRpdmVIeXBoZW5h
dGVkTGluZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMoKSwgc3R5bGUuaHlw
aGVuYXRpb25MaW1pdEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QWZ0ZXIoKSwgbGFz
dFNwYWNlLCBtX2N1cnJlbnQubV9wb3MsIG1fd2lkdGguY3VycmVudFdpZHRoKCkgLSBhZGRpdGlv
bmFsVGVtcFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9j
b2xsYXBzZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBtX2xpbmVCcmVhaywgbV9j
dXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBtX2xpbmVCcmVha2VyLm1faHlwaGVuYXRl
ZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWtlci5tX2h5cGhlbmF0
ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1f
bGluZUJyZWFrLmF0VGV4dFBhcmFncmFwaFNlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQubV9wb3MgPiAw
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94
KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fbGlu
ZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm1fcG9zOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVh
ay5tX29iaiAmJiBtX2xpbmVCcmVhay5tX3BvcyAmJiBtX2xpbmVCcmVhay5tX29iai0+aXNUZXh0
KCkgJiYgdG9SZW5kZXJUZXh0KG1fbGluZUJyZWFrLm1fb2JqKS0+dGV4dExlbmd0aCgpICYmIHRv
UmVuZGVyVGV4dChtX2xpbmVCcmVhay5tX29iaiktPmNoYXJhY3RlckF0KG1fbGluZUJyZWFrLm1f
cG9zIC0gMSkgPT0gc29mdEh5cGhlbiAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUp
Ci0gICAgICAgICAgICAgICAgICAgICAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKLSAgICAgICAgICAg
ICAgICAgICAgaWYgKG1fbGluZUJyZWFrLm1fcG9zICYmIG1fbGluZUJyZWFrLm1fcG9zICE9ICh1
bnNpZ25lZCl3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ICYmICF3b3JkTWVhc3VyZW1lbnQud2lk
dGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyV2lkdGgpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9saW5lQnJl
YWsubV9wb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50Lndp
ZHRoID0gY2hhcldpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIERpZG4ndCBmaXQuIEp1bXAgdG8gdGhl
IGVuZCB1bmxlc3MgdGhlcmUncyBzdGlsbCBhbiBvcHBvcnR1bml0eSB0byBjb2xsYXBzZSB3aGl0
ZXNwYWNlLgotICAgICAgICAgICAgICAgICAgICBpZiAobV9pZ25vcmluZ1NwYWNlcyB8fCAhbV9j
b2xsYXBzZVdoaXRlU3BhY2UgfHwgIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgfHwgIXByZXZp
b3VzQ2hhcmFjdGVySXNTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9hdEVuZCA9
IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAg
ICBpZiAoIWJldHdlZW5Xb3JkcyB8fCAobWlkV29yZEJyZWFrICYmICFtX2F1dG9XcmFwKSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aCgtYWRkaXRp
b25hbFRlbXBXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoeXBoZW5XaWR0aCkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VidHJhY3QgdGhlIHdpZHRoIG9mIHRoZSBzb2Z0
IGh5cGhlbiBvdXQgc2luY2Ugd2UgZml0IG9uIGEgbGluZS4KLSAgICAgICAgICAgICAgICAgICAg
ICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aCgtaHlwaGVuV2lkdGgpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgaHlwaGVuV2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYyA9PSAn
XG4nICYmIG1fcHJlc2VydmVzTmV3bGluZSkgewotICAgICAgICAgICAgICAgIGlmICghc3RvcHBl
ZElnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudC5tX3BvcyA+IDApCi0gICAgICAgICAgICAgICAg
ICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3Vy
cmVudCk7Ci0gICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29i
aiwgbV9jdXJyZW50Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOwot
ICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOwotICAgICAgICAgICAgICAg
IG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwotICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobV9h
dXRvV3JhcCAmJiBiZXR3ZWVuV29yZHMpIHsKLSAgICAgICAgICAgICAgICBtX3dpZHRoLmNvbW1p
dCgpOwotICAgICAgICAgICAgICAgIHdyYXBXID0gMDsKLSAgICAgICAgICAgICAgICBtX2xpbmVC
cmVhay5tb3ZlVG8obV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5t
X25leHRCcmVha2FibGVQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgLy8gQXV0by13cmFwcGlu
ZyB0ZXh0IHNob3VsZCBub3Qgd3JhcCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBvbmNlIGl0IGhh
cyBoYWQgYW4KLSAgICAgICAgICAgICAgICAvLyBvcHBvcnR1bml0eSB0byBicmVhayBhZnRlciBh
IHdvcmQuCi0gICAgICAgICAgICAgICAgYnJlYWtXb3JkcyA9IGZhbHNlOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICBpZiAobWlkV29yZEJyZWFrICYmICFVMTZfSVNfVFJBSUwoYykgJiYg
IShVX0dFVF9HQ19NQVNLKGMpICYgVV9HQ19NX01BU0spKSB7Ci0gICAgICAgICAgICAgICAgLy8g
UmVtZW1iZXIgdGhpcyBhcyBhIGJyZWFrYWJsZSBwb3NpdGlvbiBpbiBjYXNlCi0gICAgICAgICAg
ICAgICAgLy8gYWRkaW5nIHRoZSBlbmQgd2lkdGggZm9yY2VzIGEgYnJlYWsuCi0gICAgICAgICAg
ICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1fcG9z
LCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIG1p
ZFdvcmRCcmVhayAmPSAoYnJlYWtXb3JkcyB8fCBicmVha0FsbCk7Ci0gICAgICAgICAgICB9Ci0K
LSAgICAgICAgICAgIGlmIChiZXR3ZWVuV29yZHMpIHsKLSAgICAgICAgICAgICAgICBsYXN0U3Bh
Y2VXb3JkU3BhY2luZyA9IGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7Ci0gICAg
ICAgICAgICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAoYXBwbHlXb3JkU3Bh
Y2luZyAmJiB3b3JkTWVhc3VyZW1lbnQud2lkdGgpID8gd29yZFNwYWNpbmcgOiAwOwotICAgICAg
ICAgICAgICAgIGxhc3RTcGFjZSA9IG1fY3VycmVudC5tX3BvczsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgaWYgKCFtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jb2xs
YXBzZVdoaXRlU3BhY2UoKSkgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIGVuY291bnRlciBh
IG5ld2xpbmUsIG9yIGlmIHdlIGVuY291bnRlciBhCi0gICAgICAgICAgICAgICAgLy8gc2Vjb25k
IHNwYWNlLCB3ZSBuZWVkIHRvIGdvIGFoZWFkIGFuZCBicmVhayB1cCB0aGlzCi0gICAgICAgICAg
ICAgICAgLy8gcnVuIGFuZCBlbnRlciBhIG1vZGUgd2hlcmUgd2Ugc3RhcnQgY29sbGFwc2luZyBz
cGFjZXMuCi0gICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYg
cHJldmlvdXNDaGFyYWN0ZXJJc1NwYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1faWdub3Jp
bmdTcGFjZXMgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGp1c3QgZW50ZXJl
ZCBhIG1vZGUgd2hlcmUgd2UgYXJlIGlnbm9yaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHNw
YWNlcy4gQ3JlYXRlIGEgbWlkcG9pbnQgdG8gdGVybWluYXRlIHRoZSBydW4KLSAgICAgICAgICAg
ICAgICAgICAgLy8gYmVmb3JlIHRoZSBzZWNvbmQgc3BhY2UuCi0gICAgICAgICAgICAgICAgICAg
IHN0YXJ0SWdub3JpbmdTcGFjZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9zdGFydE9mSWdub3Jl
ZFNwYWNlcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLnVwZGF0ZU1p
ZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0
b3IoKSwgVHJhaWxpbmdPYmplY3RzOjpEb05vdENvbGxhcHNlRmlyc3RTcGFjZSk7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1faWdub3JpbmdT
cGFjZXMpIHsKLSAgICAgICAgICAgIC8vIFN0b3AgaWdub3Jpbmcgc3BhY2VzIGFuZCBiZWdpbiBh
dCB0aGlzCi0gICAgICAgICAgICAvLyBuZXcgcG9pbnQuCi0gICAgICAgICAgICBtX2lnbm9yaW5n
U3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IGFwcGx5
V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7Ci0gICAgICAgICAgICB3b3JkU3BhY2luZ0Zv
cldvcmRNZWFzdXJlbWVudCA9IChhcHBseVdvcmRTcGFjaW5nICYmIHdvcmRNZWFzdXJlbWVudHMu
bGFzdCgpLndpZHRoKSA/IHdvcmRTcGFjaW5nIDogMDsKLSAgICAgICAgICAgIGxhc3RTcGFjZSA9
IG1fY3VycmVudC5tX3BvczsgLy8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQgaW4gYW55
IG9mIHRoZSBpZ25vcmVkIHNwYWNlcy4KLSAgICAgICAgICAgIHN0b3BJZ25vcmluZ1NwYWNlcyht
X2xpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJlbnQubV9vYmosIG1f
Y3VycmVudC5tX3BvcykpOwotICAgICAgICB9Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgaWYg
KGlzU1ZHVGV4dCAmJiBtX2N1cnJlbnQubV9wb3MgPiAwKSB7Ci0gICAgICAgICAgICAvLyBGb3Jj
ZSBjcmVhdGlvbiBvZiBuZXcgSW5saW5lQm94ZXMgZm9yIGVhY2ggYWJzb2x1dGUgcG9zaXRpb25l
ZCBjaGFyYWN0ZXIgKHRob3NlIHRoYXQgc3RhcnQgbmV3IHRleHQgY2h1bmtzKS4KLSAgICAgICAg
ICAgIGlmICh0b1JlbmRlclNWR0lubGluZVRleHQocmVuZGVyVGV4dCktPmNoYXJhY3RlclN0YXJ0
c05ld1RleHRDaHVuayhtX2N1cnJlbnQubV9wb3MpKQotICAgICAgICAgICAgICAgIGVuc3VyZUNo
YXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7Ci0gICAg
ICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGlmIChtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYm
ICFwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UpIHsKLSAgICAgICAgICAgIG1fc3RhcnRPZklnbm9y
ZWRTcGFjZXMubV9vYmogPSBtX2N1cnJlbnQubV9vYmo7Ci0gICAgICAgICAgICBtX3N0YXJ0T2ZJ
Z25vcmVkU3BhY2VzLm1fcG9zID0gbV9jdXJyZW50Lm1fcG9zOwotICAgICAgICAgICAgLy8gU3Bh
Y2VzIGFmdGVyIHJpZ2h0LWFsaWduZWQgdGV4dCBhbmQgYmVmb3JlIGEgbGluZS1icmVhayBnZXQg
Y29sbGFwc2VkIGF3YXkgY29tcGxldGVseSBzbyB0aGF0IHRoZSB0cmFpbGluZwotICAgICAgICAg
ICAgLy8gc3BhY2UgZG9lc24ndCBzZWVtIHRvIHB1c2ggdGhlIHRleHQgb3V0IGZyb20gdGhlIHJp
Z2h0LWhhbmQgZWRnZS4KLSAgICAgICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2FyZGxlc3Mg
b2YgdGhlIGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2VsaW5pbmcg
YSBsb3Qgb2YgdGVzdCByZXN1bHRzLgotICAgICAgICAgICAgaWYgKG1fbmV4dE9iamVjdCAmJiBt
X25leHRPYmplY3QtPmlzQlIoKSAmJiAobV9ibG9ja1N0eWxlLnRleHRBbGlnbigpID09IFJJR0hU
IHx8IG1fYmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfUklHSFQpKSB7Ci0gICAgICAg
ICAgICAgICAgbV9zdGFydE9mSWdub3JlZFNwYWNlcy5tX3Bvcy0tOwotICAgICAgICAgICAgICAg
IC8vIElmIHRoZXJlJ3MganVzdCBhIHNpbmdsZSB0cmFpbGluZyBzcGFjZSBzdGFydCBpZ25vcmlu
ZyBpdCBub3cgc28gaXQgY29sbGFwc2VzIGF3YXkuCi0gICAgICAgICAgICAgICAgaWYgKG1fY3Vy
cmVudC5tX3BvcyA9PSByZW5kZXJUZXh0LT50ZXh0TGVuZ3RoKCkgLSAxKQotICAgICAgICAgICAg
ICAgICAgICBzdGFydElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fc3RhcnRP
Zklnbm9yZWRTcGFjZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYg
KCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIHByZXZpb3VzQ2hhcmFjdGVySXNXUykgewot
ICAgICAgICAgICAgaWYgKG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUtPmJyZWFrT25seUFm
dGVyV2hpdGVTcGFjZSgpKQotICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1
cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3BvcywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBv
c2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2NvbGxhcHNlV2hpdGVTcGFjZSAm
JiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFtX2lnbm9yaW5nU3BhY2VzKQotICAgICAg
ICAgICAgbV90cmFpbGluZ09iamVjdHMuc2V0VHJhaWxpbmdXaGl0ZXNwYWNlKHRvUmVuZGVyVGV4
dChtX2N1cnJlbnQubV9vYmopKTsKLSAgICAgICAgZWxzZSBpZiAoIW1fY3VycmVudFN0eWxlLT5j
b2xsYXBzZVdoaXRlU3BhY2UoKSB8fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKLSAgICAg
ICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7Ci0KLSAgICAgICAgbV9hdFN0YXJ0ID0g
ZmFsc2U7Ci0gICAgICAgIG5leHRDaGFyYWN0ZXIoYywgbGFzdENoYXJhY3Rlciwgc2Vjb25kVG9M
YXN0Q2hhcmFjdGVyKTsKLSAgICB9Ci0KLSAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFr
SXRlcmF0b3Iuc2V0UHJpb3JDb250ZXh0KGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJh
Y3Rlcik7Ci0KLSAgICB3b3JkTWVhc3VyZW1lbnRzLmdyb3cod29yZE1lYXN1cmVtZW50cy5zaXpl
KCkgKyAxKTsKLSAgICBXb3JkTWVhc3VyZW1lbnQmIHdvcmRNZWFzdXJlbWVudCA9IHdvcmRNZWFz
dXJlbWVudHMubGFzdCgpOwotICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9IHJlbmRlclRl
eHQ7Ci0KLSAgICAvLyBJTVBPUlRBTlQ6IGN1cnJlbnQubV9wb3MgaXMgPiBsZW5ndGggaGVyZSEK
LSAgICBmbG9hdCBhZGRpdGlvbmFsVGVtcFdpZHRoID0gbV9pZ25vcmluZ1NwYWNlcyA/IDAgOiB0
ZXh0V2lkdGgocmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MgLSBsYXN0U3Bh
Y2UsIGZvbnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBz
ZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsK
LSAgICB3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQgPSBsYXN0U3BhY2U7Ci0gICAgd29yZE1l
YXN1cmVtZW50LmVuZE9mZnNldCA9IG1fY3VycmVudC5tX3BvczsKLSAgICB3b3JkTWVhc3VyZW1l
bnQud2lkdGggPSBtX2lnbm9yaW5nU3BhY2VzID8gMCA6IGFkZGl0aW9uYWxUZW1wV2lkdGggKyB3
b3JkU3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudDsKLSAgICBhZGRpdGlvbmFsVGVtcFdpZHRoICs9
IGxhc3RTcGFjZVdvcmRTcGFjaW5nOwotCi0gICAgZmxvYXQgaW5saW5lTG9naWNhbFRlbXBXaWR0
aCA9IGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQubV9vYmosICFtX2FwcGxpZWRTdGFydFdp
ZHRoLCBtX2luY2x1ZGVFbmRXaWR0aCk7Ci0gICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRo
KGFkZGl0aW9uYWxUZW1wV2lkdGggKyBpbmxpbmVMb2dpY2FsVGVtcFdpZHRoKTsKLQotICAgIGlm
ICh3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5pc0VtcHR5KCkgJiYgIWZhbGxiYWNrRm9u
dHMuaXNFbXB0eSgpKQotICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5zd2Fw
KGZhbGxiYWNrRm9udHMpOwotICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKLQotICAgIGlmICht
X2NvbGxhcHNlV2hpdGVTcGFjZSAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0
aW9uYWxUZW1wV2lkdGgpCi0gICAgICAgIG1fd2lkdGguc2V0VHJhaWxpbmdXaGl0ZXNwYWNlV2lk
dGgoYWRkaXRpb25hbFRlbXBXaWR0aCwgaW5saW5lTG9naWNhbFRlbXBXaWR0aCk7Ci0KLSAgICBt
X2luY2x1ZGVFbmRXaWR0aCA9IGZhbHNlOwotCi0gICAgaWYgKCFtX3dpZHRoLmZpdHNPbkxpbmUo
KSkgewotICAgICAgICBpZiAoY2FuSHlwaGVuYXRlKQotICAgICAgICAgICAgdHJ5SHlwaGVuYXRp
bmcocmVuZGVyVGV4dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNvbnNlY3V0aXZlSHlwaGVuYXRl
ZExpbmVzLCBtX2Jsb2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCksIHN0eWxlLmh5cGhl
bmF0aW9uTGltaXRCZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCksIGxhc3RT
cGFjZSwgbV9jdXJyZW50Lm1fcG9zLCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpIC0gYWRkaXRpb25h
bFRlbXBXaWR0aCwgbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29s
bGFwc2VXaGl0ZVNwYWNlLCBsYXN0U3BhY2VXb3JkU3BhY2luZywgbV9saW5lQnJlYWssIG1fY3Vy
cmVudC5tX25leHRCcmVha2FibGVQb3NpdGlvbiwgbV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQp
OwotCi0gICAgICAgIGlmICghaHlwaGVuYXRlZCAmJiBtX2xpbmVCcmVhay5wcmV2aW91c0luU2Ft
ZU5vZGUoKSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkg
ewotICAgICAgICAgICAgaHlwaGVuYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICBtX2F0RW5kID0g
dHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBi
b29sIHRleHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRpb24oUmVuZGVyT2JqZWN0KiBuZXh0KQot
ewotICAgIEFTU0VSVChuZXh0LT5pc1RleHQoKSk7Ci0gICAgUmVuZGVyVGV4dCogbmV4dFRleHQg
PSB0b1JlbmRlclRleHQobmV4dCk7Ci0gICAgaWYgKCFuZXh0VGV4dC0+dGV4dExlbmd0aCgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgVUNoYXIgYyA9IG5leHRUZXh0LT5jaGFyYWN0ZXJB
dCgwKTsKLSAgICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IChjID09ICdcbicgJiYg
IW5leHRUZXh0LT5wcmVzZXJ2ZXNOZXdsaW5lKCkpOwotfQotCi1pbmxpbmUgYm9vbCBCcmVha2lu
Z0NvbnRleHQ6OmNhbkJyZWFrQXRUaGlzUG9zaXRpb24oKQotewotICAgIC8vIElmIHdlIGFyZSBu
by13cmFwIGFuZCBoYXZlIGZvdW5kIGEgbGluZS1icmVha2luZyBvcHBvcnR1bml0eSBhbHJlYWR5
IHRoZW4gd2Ugc2hvdWxkIHRha2UgaXQuCi0gICAgaWYgKG1fd2lkdGguY29tbWl0dGVkV2lkdGgo
KSAmJiAhbV93aWR0aC5maXRzT25MaW5lKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpICYmIG1f
Y3VycldTID09IE5PV1JBUCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBBdm9pZCBi
cmVha2luZyBiZWZvcmUgZW1wdHkgaW5saW5lcy4KLSAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1f
bmV4dE9iamVjdC0+aXNSZW5kZXJJbmxpbmUoKSAmJiBpc0VtcHR5SW5saW5lKHRvUmVuZGVySW5s
aW5lKCptX25leHRPYmplY3QpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gUmV0
dXJuIGVhcmx5IGlmIHdlIGF1dG93cmFwIGFuZCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYSBz
cGFjZSBhcyB3ZSB3aWxsIGFsd2F5cyB3YW50IHRvIGJyZWFrIGF0IHN1Y2ggYSBwb3NpdGlvbi4K
LSAgICBpZiAobV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5p
c0xpbmVCcmVha09wcG9ydHVuaXR5KCkpCi0gICAgICAgIHJldHVybiBtX2F1dG9XcmFwOwotCi0g
ICAgYm9vbCBuZXh0SXNBdXRvV3JhcHBpbmdUZXh0ID0gKG1fbmV4dE9iamVjdCAmJiBtX25leHRP
YmplY3QtPmlzVGV4dCgpICYmIChtX2F1dG9XcmFwIHx8IG1fbmV4dE9iamVjdC0+c3R5bGUoKS5h
dXRvV3JhcCgpKSk7Ci0gICAgaWYgKCFuZXh0SXNBdXRvV3JhcHBpbmdUZXh0KQotICAgICAgICBy
ZXR1cm4gbV9hdXRvV3JhcDsKLSAgICBib29sIGN1cnJlbnRJc1RleHRPckVtcHR5SW5saW5lID0g
bV9jdXJyZW50Lm1fb2JqLT5pc1RleHQoKSB8fCAobV9jdXJyZW50Lm1fb2JqLT5pc1JlbmRlcklu
bGluZSgpICYmIGlzRW1wdHlJbmxpbmUodG9SZW5kZXJJbmxpbmUoKm1fY3VycmVudC5tX29iaikp
KTsKLSAgICBpZiAoIWN1cnJlbnRJc1RleHRPckVtcHR5SW5saW5lKQotICAgICAgICByZXR1cm4g
bV9hdXRvV3JhcDsKLQotICAgIGJvb2wgY2FuQnJlYWtIZXJlID0gIW1fY3VycmVudENoYXJhY3Rl
cklzU3BhY2UgJiYgdGV4dEJlZ2luc1dpdGhCcmVha2FibGVQb3NpdGlvbihtX25leHRPYmplY3Qp
OwotCi0gICAgLy8gU2VlIGlmIGF0dGVtcHRpbmcgdG8gZml0IGJlbG93IGZsb2F0cyBjcmVhdGVz
IG1vcmUgYXZhaWxhYmxlIHdpZHRoIG9uIHRoZSBsaW5lLgotICAgIGlmICghbV93aWR0aC5maXRz
T25MaW5lKCkgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSkKLSAgICAgICAgbV93aWR0aC5m
aXRCZWxvd0Zsb2F0cygpOwotCi0gICAgYm9vbCBjYW5QbGFjZU9uTGluZSA9IG1fd2lkdGguZml0
c09uTGluZSgpIHx8ICFtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmU7Ci0KLSAgICBpZiAoY2Fu
UGxhY2VPbkxpbmUgJiYgY2FuQnJlYWtIZXJlKQotICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1
cnJlbnRXaWR0aChtX25leHRPYmplY3QpOwotCi0gICAgcmV0dXJuIGNhbkJyZWFrSGVyZTsKLX0K
LQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojpjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJ
Zk5lZWRlZCgpCi17Ci0gICAgYm9vbCBjaGVja0ZvckJyZWFrID0gY2FuQnJlYWtBdFRoaXNQb3Np
dGlvbigpOwotCi0gICAgaWYgKGNoZWNrRm9yQnJlYWsgJiYgIW1fd2lkdGguZml0c09uTGluZSht
X2lnbm9yaW5nU3BhY2VzKSkgewotICAgICAgICAvLyBpZiB3ZSBoYXZlIGZsb2F0cywgdHJ5IHRv
IGdldCBiZWxvdyB0aGVtLgotICAgICAgICBpZiAobV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAm
JiAhbV9pZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VXaGl0ZVNwYWNl
KCkpCi0gICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOwotCi0gICAgICAgIGlm
IChtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsKLSAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVl
OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbV93aWR0aC5maXRC
ZWxvd0Zsb2F0cygpOwotCi0gICAgICAgIC8vIHx3aWR0aHwgbWF5IGhhdmUgYmVlbiBhZGp1c3Rl
ZCBiZWNhdXNlIHdlIGdvdCBzaG92ZWQgZG93biBwYXN0IGEgZmxvYXQgKHRodXMKLSAgICAgICAg
Ly8gZ2l2aW5nIHVzIG1vcmUgcm9vbSksIHNvIHdlIG5lZWQgdG8gcmV0ZXN0LCBhbmQgb25seSBq
dW1wIHRvCi0gICAgICAgIC8vIHRoZSBlbmQgbGFiZWwgaWYgd2Ugc3RpbGwgZG9uJ3QgZml0IG9u
IHRoZSBsaW5lLiAtZHdoCi0gICAgICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lKG1faWdub3Jp
bmdTcGFjZXMpKSB7Ci0gICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9ibG9ja1N0eWxlLmF1dG9XcmFwKCkg
JiYgIW1fd2lkdGguZml0c09uTGluZSgpICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsK
LSAgICAgICAgLy8gSWYgdGhlIGNvbnRhaW5lciBhdXRvd3JhcHMgYnV0IHRoZSBjdXJyZW50IGNo
aWxkIGRvZXMgbm90IHRoZW4gd2Ugc3RpbGwgbmVlZCB0byBlbnN1cmUgdGhhdCBpdAotICAgICAg
ICAvLyB3cmFwcyBhbmQgbW92ZXMgYmVsb3cgYW55IGZsb2F0cy4KLSAgICAgICAgbV93aWR0aC5m
aXRCZWxvd0Zsb2F0cygpOwotICAgIH0KLQotICAgIGlmICghbV9jdXJyZW50Lm1fb2JqLT5pc0Zs
b2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgbV9sYXN0T2JqZWN0ID0g
bV9jdXJyZW50Lm1fb2JqOwotICAgICAgICBpZiAobV9sYXN0T2JqZWN0LT5pc1JlcGxhY2VkKCkg
JiYgbV9hdXRvV3JhcCAmJiAoIW1fbGFzdE9iamVjdC0+aXNJbWFnZSgpIHx8IG1fYWxsb3dJbWFn
ZXNUb0JyZWFrKSAmJiAoIW1fbGFzdE9iamVjdC0+aXNMaXN0TWFya2VyKCkgfHwgdG9SZW5kZXJM
aXN0TWFya2VyKCptX2xhc3RPYmplY3QpLmlzSW5zaWRlKCkpKSB7Ci0gICAgICAgICAgICBtX3dp
ZHRoLmNvbW1pdCgpOwotICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvU3RhcnRPZihtX25l
eHRPYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1JbmxpbmVJdGVyYXRvciBCcmVha2lu
Z0NvbnRleHQ6OmhhbmRsZUVuZE9mTGluZSgpCi17Ci0jaWYgRU5BQkxFKENTU19TSEFQRVMpCi0g
ICAgU2hhcGVJbnNpZGVJbmZvKiBzaGFwZUluZm8gPSBtX2Jsb2NrLmxheW91dFNoYXBlSW5zaWRl
SW5mbygpOwotICAgIGJvb2wgc2VnbWVudEFsbG93c092ZXJmbG93ID0gIXNoYXBlSW5mbyB8fCAh
c2hhcGVJbmZvLT5oYXNTZWdtZW50cygpOwotI2Vsc2UKLSAgICBib29sIHNlZ21lbnRBbGxvd3NP
dmVyZmxvdyA9IHRydWU7Ci0jZW5kaWYKLSAgICBpZiAoc2VnbWVudEFsbG93c092ZXJmbG93KSB7
Ci0gICAgICAgIGlmIChtX2xpbmVCcmVhayA9PSBtX3Jlc29sdmVyLnBvc2l0aW9uKCkpIHsKLSAg
ICAgICAgICAgIGlmICghbV9saW5lQnJlYWsubV9vYmogfHwgIW1fbGluZUJyZWFrLm1fb2JqLT5p
c0JSKCkpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGFkZCBhcyBtdWNoIGFzIHBvc3Np
YmxlCi0gICAgICAgICAgICAgICAgaWYgKG1fYmxvY2tTdHlsZS53aGl0ZVNwYWNlKCkgPT0gUFJF
ICYmICFtX2N1cnJlbnQubV9wb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsu
bW92ZVRvKG1fbGFzdE9iamVjdCwgbV9sYXN0T2JqZWN0LT5pc1RleHQoKSA/IG1fbGFzdE9iamVj
dC0+bGVuZ3RoKCkgOiAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fbGluZUJyZWFr
Lm1fb2JqKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGV2ZXIgYnJlYWsgaW4gdGhl
IG1pZGRsZSBvZiBhIHdvcmQgaWYgd2UgY2FuIGhlbHAgaXQuCi0gICAgICAgICAgICAgICAgICAg
IC8vIFRoZXJlJ3Mgbm8gcm9vbSBhdCBhbGwuIFdlIGp1c3QgaGF2ZSB0byBiZSBvbiB0aGlzIGxp
bmUsCi0gICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gdGhvdWdoIHdlJ2xsIHNwaWxsIG91dC4K
LSAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwg
bV9jdXJyZW50Lm1fcG9zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAvLyBtYWtlIHN1cmUgd2UgY29uc3VtZSBhdCBsZWFzdCBvbmUgY2hhci9vYmplY3Qu
Ci0gICAgICAgICAgICBpZiAobV9saW5lQnJlYWsgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigpKQot
ICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOwotICAgICAgICB9IGVsc2Ug
aWYgKCFtX2N1cnJlbnQubV9wb3MgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiBtX3dp
ZHRoLnVuY29tbWl0dGVkV2lkdGgoKSAmJiAhbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3Vy
cmVudCkgewotICAgICAgICAgICAgLy8gRG8gbm90IHB1c2ggdGhlIGN1cnJlbnQgb2JqZWN0IHRv
IHRoZSBuZXh0IGxpbmUsIHdoZW4gdGhpcyBsaW5lIGhhcyBzb21lIGNvbnRlbnQsIGJ1dCBpdCBp
cyBzdGlsbCBjb25zaWRlcmVkIGVtcHR5LgotICAgICAgICAgICAgLy8gRW1wdHkgaW5saW5lIGVs
ZW1lbnRzIGxpa2UgPHNwYW4+PC9zcGFuPiBjYW4gcHJvZHVjZSBzdWNoIGxpbmVzIGFuZCBub3cg
d2UganVzdCBpZ25vcmUgdGhlc2UgYnJlYWsgb3Bwb3J0dW5pdGllcwotICAgICAgICAgICAgLy8g
YXQgdGhlIHN0YXJ0IG9mIGEgbGluZSwgaWYgbm8gd2lkdGggaGFzIGJlZW4gY29tbWl0dGVkIHll
dC4KLSAgICAgICAgICAgIC8vIEJlaGF2ZSBhcyBpZiBpdCB3YXMgYWN0dWFsbHkgZW1wdHkgYW5k
IGNvbnN1bWUgYXQgbGVhc3Qgb25lIG9iamVjdC4KLSAgICAgICAgICAgIG1fbGluZUJyZWFrLmlu
Y3JlbWVudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2FuaXR5IGNoZWNrIG91ciBt
aWRwb2ludHMuCi0gICAgY2hlY2tNaWRwb2ludHMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5l
QnJlYWspOwotCi0gICAgbV90cmFpbGluZ09iamVjdHMudXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxp
bmdCb3hlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2xpbmVCcmVhaywgVHJhaWxpbmdPYmplY3Rz
OjpDb2xsYXBzZUZpcnN0U3BhY2UpOwotCi0gICAgLy8gV2UgbWlnaHQgaGF2ZSBtYWRlIGxpbmVC
cmVhayBhbiBpdGVyYXRvciB0aGF0IHBvaW50cyBwYXN0IHRoZSBlbmQKLSAgICAvLyBvZiB0aGUg
b2JqZWN0LiBEbyB0aGlzIGFkanVzdG1lbnQgdG8gbWFrZSBpdCBwb2ludCB0byB0aGUgc3RhcnQK
LSAgICAvLyBvZiB0aGUgbmV4dCBvYmplY3QgaW5zdGVhZCB0byBhdm9pZCBjb25mdXNpbmcgdGhl
IHJlc3Qgb2YgdGhlCi0gICAgLy8gY29kZS4KLSAgICBpZiAobV9saW5lQnJlYWsubV9wb3MgPiAw
KSB7Ci0gICAgICAgIG1fbGluZUJyZWFrLm1fcG9zLS07Ci0gICAgICAgIG1fbGluZUJyZWFrLmlu
Y3JlbWVudCgpOwotICAgIH0KLQotICAgIHJldHVybiBtX2xpbmVCcmVhazsKLX0KLQogSW5saW5l
SXRlcmF0b3IgTGluZUJyZWFrZXI6Om5leHRTZWdtZW50QnJlYWsoSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlciwgTGluZUluZm8mIGxpbmVJbmZvLCBSZW5kZXJUZXh0SW5mbyYgcmVuZGVyVGV4
dEluZm8sIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25l
ZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1
cmVtZW50cykKIHsKICAgICByZXNldCgpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oIGIvU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzUzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJz
LmgKQEAgLTAsMCArMSwxMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIExhcnMgS25v
bGwgKGtub2xsQGtkZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIw
MDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21haWwuY29t
PgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmlnaHQgcmVz
ZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICoKKyAqLworCisjaWZuZGVmIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnNfaAorI2RlZmlu
ZSBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzX2gKKworI2luY2x1ZGUgIkh5cGhlbmF0aW9u
LmgiCisjaW5jbHVkZSAiTGluZUJyZWFrZXIuaCIKKyNpbmNsdWRlICJMaW5lSW5mby5oIgorI2lu
Y2x1ZGUgIkxpbmVXaWR0aC5oIgorI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0LmgiCisjaW5j
bHVkZSAiUmVuZGVyQ291bnRlci5oIgorI2luY2x1ZGUgIlJlbmRlcklubGluZS5oIgorI2luY2x1
ZGUgIlJlbmRlckxpc3RNYXJrZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJSdWJ5UnVuLmgiCisjaW5j
bHVkZSAiYnJlYWtfbGluZXMuaCIKKyNpbmNsdWRlIDx3dGYvdW5pY29kZS9DaGFyYWN0ZXJOYW1l
cy5oPgorCisjaWYgRU5BQkxFKFNWRykKKyNpbmNsdWRlICJSZW5kZXJTVkdJbmxpbmVUZXh0Lmgi
CisjZW5kaWYKKworI2lmIEVOQUJMRShDU1NfU0hBUEVTKQorI2luY2x1ZGUgIlNoYXBlSW5zaWRl
SW5mby5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gV2UgZG9uJ3QgbGV0
IG91ciBsaW5lIGJveCB0cmVlIGZvciBhIHNpbmdsZSBsaW5lIGdldCBhbnkgZGVlcGVyIHRoYW4g
dGhpcy4KK2NvbnN0IHVuc2lnbmVkIGNNYXhMaW5lRGVwdGggPSAyMDA7CisKK2NsYXNzIFdvcmRN
ZWFzdXJlbWVudCB7CitwdWJsaWM6CisgICAgV29yZE1lYXN1cmVtZW50KCkKKyAgICAgICAgOiBy
ZW5kZXJlcigwKQorICAgICAgICAsIHdpZHRoKDApCisgICAgICAgICwgc3RhcnRPZmZzZXQoMCkK
KyAgICAgICAgLCBlbmRPZmZzZXQoMCkKKyAgICB7CisgICAgfQorCisgICAgUmVuZGVyVGV4dCog
cmVuZGVyZXI7CisgICAgZmxvYXQgd2lkdGg7CisgICAgaW50IHN0YXJ0T2Zmc2V0OworICAgIGlu
dCBlbmRPZmZzZXQ7CisgICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+IGZhbGxiYWNr
Rm9udHM7Cit9OworCitjbGFzcyBUcmFpbGluZ09iamVjdHMgeworcHVibGljOgorICAgIFRyYWls
aW5nT2JqZWN0cygpOworICAgIHZvaWQgc2V0VHJhaWxpbmdXaGl0ZXNwYWNlKFJlbmRlclRleHQq
KTsKKyAgICB2b2lkIGNsZWFyKCk7CisgICAgdm9pZCBhcHBlbmRCb3hJZk5lZWRlZChSZW5kZXJC
b3hNb2RlbE9iamVjdCopOworCisgICAgZW51bSBDb2xsYXBzZUZpcnN0U3BhY2VPck5vdCB7IERv
Tm90Q29sbGFwc2VGaXJzdFNwYWNlLCBDb2xsYXBzZUZpcnN0U3BhY2UgfTsKKworICAgIHZvaWQg
dXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxpbmdCb3hlcyhMaW5lTWlkcG9pbnRTdGF0ZSYsIGNvbnN0
IElubGluZUl0ZXJhdG9yJiBsQnJlYWssIENvbGxhcHNlRmlyc3RTcGFjZU9yTm90KTsKKworcHJp
dmF0ZToKKyAgICBSZW5kZXJUZXh0KiBtX3doaXRlc3BhY2U7CisgICAgVmVjdG9yPFJlbmRlckJv
eE1vZGVsT2JqZWN0KiwgND4gbV9ib3hlczsKK307CisKK1RyYWlsaW5nT2JqZWN0czo6VHJhaWxp
bmdPYmplY3RzKCkKKyAgICA6IG1fd2hpdGVzcGFjZSgwKQoreworfQorCitpbmxpbmUgdm9pZCBU
cmFpbGluZ09iamVjdHM6OnNldFRyYWlsaW5nV2hpdGVzcGFjZShSZW5kZXJUZXh0KiB3aGl0ZXNw
YWNlKQoreworICAgIEFTU0VSVCh3aGl0ZXNwYWNlKTsKKyAgICBtX3doaXRlc3BhY2UgPSB3aGl0
ZXNwYWNlOworfQorCitpbmxpbmUgdm9pZCBUcmFpbGluZ09iamVjdHM6OmNsZWFyKCkKK3sKKyAg
ICBtX3doaXRlc3BhY2UgPSAwOworICAgIG1fYm94ZXMuc2hyaW5rKDApOyAvLyBVc2Ugc2hyaW5r
KDApIGluc3RlYWQgb2YgY2xlYXIoKSB0byByZXRhaW4gb3VyIGNhcGFjaXR5LgorfQorCitpbmxp
bmUgdm9pZCBUcmFpbGluZ09iamVjdHM6OmFwcGVuZEJveElmTmVlZGVkKFJlbmRlckJveE1vZGVs
T2JqZWN0KiBib3gpCit7CisgICAgaWYgKG1fd2hpdGVzcGFjZSkKKyAgICAgICAgbV9ib3hlcy5h
cHBlbmQoYm94KTsKK30KKworLy8gRG9uJ3QgY2FsbCB0aGlzIGRpcmVjdGx5LiBVc2Ugb25lIG9m
IHRoZSBkZXNjcmlwdGl2ZSBoZWxwZXIgZnVuY3Rpb25zIGJlbG93LgoraW5saW5lIHZvaWQgZGVw
cmVjYXRlZEFkZE1pZHBvaW50KExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwg
Y29uc3QgSW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQoreworICAgIGlmIChsaW5lTWlkcG9pbnRT
dGF0ZS5taWRwb2ludHMuc2l6ZSgpIDw9IGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cykK
KyAgICAgICAgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmdyb3cobGluZU1pZHBvaW50U3Rh
dGUubnVtTWlkcG9pbnRzICsgMTApOworCisgICAgSW5saW5lSXRlcmF0b3IqIG1pZHBvaW50cyA9
IGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50cy5kYXRhKCk7CisgICAgbWlkcG9pbnRzW2xpbmVN
aWRwb2ludFN0YXRlLm51bU1pZHBvaW50cysrXSA9IG1pZHBvaW50OworfQorCitpbmxpbmUgdm9p
ZCBzdGFydElnbm9yaW5nU3BhY2VzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0
ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQoreworICAgIEFTU0VSVCghKGxpbmVN
aWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAlIDIpKTsKKyAgICBkZXByZWNhdGVkQWRkTWlkcG9p
bnQobGluZU1pZHBvaW50U3RhdGUsIG1pZHBvaW50KTsKK30KKworaW5saW5lIHZvaWQgc3RvcEln
bm9yaW5nU3BhY2VzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgY29uc3Qg
SW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQoreworICAgIEFTU0VSVChsaW5lTWlkcG9pbnRTdGF0
ZS5udW1NaWRwb2ludHMgJSAyKTsKKyAgICBkZXByZWNhdGVkQWRkTWlkcG9pbnQobGluZU1pZHBv
aW50U3RhdGUsIG1pZHBvaW50KTsKK30KKworLy8gV2hlbiBpZ25vcmluZyBzcGFjZXMsIHRoaXMg
bmVlZHMgdG8gYmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgbmVlZCBsaW5lIGJveGVzIHN1Y2gg
YXMgUmVuZGVySW5saW5lcyBvcgorLy8gaGFyZCBsaW5lIGJyZWFrcyB0byBlbnN1cmUgdGhhdCB0
aGV5J3JlIG5vdCBpZ25vcmVkLgoraW5saW5lIHZvaWQgZW5zdXJlTGluZUJveEluc2lkZUlnbm9y
ZWRTcGFjZXMoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBSZW5kZXJPYmpl
Y3QqIHJlbmRlcmVyKQoreworICAgIElubGluZUl0ZXJhdG9yIG1pZHBvaW50KDAsIHJlbmRlcmVy
LCAwKTsKKyAgICBzdG9wSWdub3JpbmdTcGFjZXMobGluZU1pZHBvaW50U3RhdGUsIG1pZHBvaW50
KTsKKyAgICBzdGFydElnbm9yaW5nU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBtaWRwb2ludCk7
Cit9CisKK3ZvaWQgVHJhaWxpbmdPYmplY3RzOjp1cGRhdGVNaWRwb2ludHNGb3JUcmFpbGluZ0Jv
eGVzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRl
cmF0b3ImIGxCcmVhaywgQ29sbGFwc2VGaXJzdFNwYWNlT3JOb3QgY29sbGFwc2VGaXJzdFNwYWNl
KQoreworICAgIGlmICghbV93aGl0ZXNwYWNlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBU
aGlzIG9iamVjdCBpcyBlaXRoZXIgZ29pbmcgdG8gYmUgcGFydCBvZiB0aGUgbGFzdCBtaWRwb2lu
dCwgb3IgaXQgaXMgZ29pbmcgdG8gYmUgdGhlIGFjdHVhbCBlbmRwb2ludC4KKyAgICAvLyBJbiBi
b3RoIGNhc2VzIHdlIGp1c3QgZGVjcmVhc2Ugb3VyIHBvcyBieSAxIGxldmVsIHRvIGV4Y2x1ZGUg
dGhlIHNwYWNlLCBhbGxvd2luZyBpdCB0byAtIGluIGVmZmVjdCAtIGNvbGxhcHNlIGludG8gdGhl
IG5ld2xpbmUuCisgICAgaWYgKGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAlIDIpIHsK
KyAgICAgICAgLy8gRmluZCB0aGUgdHJhaWxpbmcgc3BhY2Ugb2JqZWN0J3MgbWlkcG9pbnQuCisg
ICAgICAgIGludCB0cmFpbGluZ1NwYWNlTWlkcG9pbnQgPSBsaW5lTWlkcG9pbnRTdGF0ZS5udW1N
aWRwb2ludHMgLSAxOworICAgICAgICBmb3IgKCA7IHRyYWlsaW5nU3BhY2VNaWRwb2ludCA+IDAg
JiYgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzW3RyYWlsaW5nU3BhY2VNaWRwb2ludF0ubV9v
YmogIT0gbV93aGl0ZXNwYWNlOyAtLXRyYWlsaW5nU3BhY2VNaWRwb2ludCkgeyB9CisgICAgICAg
IEFTU0VSVCh0cmFpbGluZ1NwYWNlTWlkcG9pbnQgPj0gMCk7CisgICAgICAgIGlmIChjb2xsYXBz
ZUZpcnN0U3BhY2UgPT0gQ29sbGFwc2VGaXJzdFNwYWNlKQorICAgICAgICAgICAgbGluZU1pZHBv
aW50U3RhdGUubWlkcG9pbnRzW3RyYWlsaW5nU3BhY2VNaWRwb2ludF0ubV9wb3MtLTsKKworICAg
ICAgICAvLyBOb3cgbWFrZSBzdXJlIGV2ZXJ5IHNpbmdsZSB0cmFpbGluZ1Bvc2l0aW9uZWRCb3gg
Zm9sbG93aW5nIHRoZSB0cmFpbGluZ1NwYWNlTWlkcG9pbnQgcHJvcGVybHkgc3RvcHMgYW5kIHN0
YXJ0cworICAgICAgICAvLyBpZ25vcmluZyBzcGFjZXMuCisgICAgICAgIHNpemVfdCBjdXJyZW50
TWlkcG9pbnQgPSB0cmFpbGluZ1NwYWNlTWlkcG9pbnQgKyAxOworICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IG1fYm94ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChjdXJy
ZW50TWlkcG9pbnQgPj0gbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKSB7CisgICAgICAg
ICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIG1pZHBvaW50IGZvciB0aGlzIGJveCB5ZXQuCisg
ICAgICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobGluZU1pZHBv
aW50U3RhdGUsIG1fYm94ZXNbaV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBBU1NFUlQobGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzW2N1cnJlbnRNaWRwb2ludF0u
bV9vYmogPT0gbV9ib3hlc1tpXSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKGxpbmVNaWRwb2lu
dFN0YXRlLm1pZHBvaW50c1tjdXJyZW50TWlkcG9pbnQgKyAxXS5tX29iaiA9PSBtX2JveGVzW2ld
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnRNaWRwb2ludCArPSAyOworICAg
ICAgICB9CisgICAgfSBlbHNlIGlmICghbEJyZWFrLm1fb2JqKSB7CisgICAgICAgIEFTU0VSVCht
X3doaXRlc3BhY2UtPmlzVGV4dCgpKTsKKyAgICAgICAgQVNTRVJUKGNvbGxhcHNlRmlyc3RTcGFj
ZSA9PSBDb2xsYXBzZUZpcnN0U3BhY2UpOworICAgICAgICAvLyBBZGQgYSBuZXcgZW5kIG1pZHBv
aW50IHRoYXQgc3RvcHMgcmlnaHQgYXQgdGhlIHZlcnkgZW5kLgorICAgICAgICB1bnNpZ25lZCBs
ZW5ndGggPSBtX3doaXRlc3BhY2UtPnRleHRMZW5ndGgoKTsKKyAgICAgICAgdW5zaWduZWQgcG9z
ID0gbGVuZ3RoID49IDIgPyBsZW5ndGggLSAyIDogVUlOVF9NQVg7CisgICAgICAgIElubGluZUl0
ZXJhdG9yIGVuZE1pZCgwLCBtX3doaXRlc3BhY2UsIHBvcyk7CisgICAgICAgIHN0YXJ0SWdub3Jp
bmdTcGFjZXMobGluZU1pZHBvaW50U3RhdGUsIGVuZE1pZCk7CisgICAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbV9ib3hlcy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIGVuc3VyZUxpbmVC
b3hJbnNpZGVJZ25vcmVkU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBtX2JveGVzW2ldKTsKKyAg
ICB9Cit9CisKK2NsYXNzIEJyZWFraW5nQ29udGV4dCB7CitwdWJsaWM6CisgICAgQnJlYWtpbmdD
b250ZXh0KExpbmVCcmVha2VyJiBsaW5lQnJlYWtlciwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNv
bHZlciwgTGluZUluZm8mIGluTGluZUluZm8sIExpbmVXaWR0aCYgbGluZVdpZHRoLCBSZW5kZXJU
ZXh0SW5mbyYgaW5SZW5kZXJUZXh0SW5mbywgRmxvYXRpbmdPYmplY3QqIGluTGFzdEZsb2F0RnJv
bVByZXZpb3VzTGluZSwgYm9vbCBhcHBsaWVkU3RhcnRXaWR0aCwgUmVuZGVyQmxvY2tGbG93JiBi
bG9jaykKKyAgICAgICAgOiBtX2xpbmVCcmVha2VyKGxpbmVCcmVha2VyKQorICAgICAgICAsIG1f
cmVzb2x2ZXIocmVzb2x2ZXIpCisgICAgICAgICwgbV9jdXJyZW50KHJlc29sdmVyLnBvc2l0aW9u
KCkpCisgICAgICAgICwgbV9saW5lQnJlYWsocmVzb2x2ZXIucG9zaXRpb24oKSkKKyAgICAgICAg
LCBtX2Jsb2NrKGJsb2NrKQorICAgICAgICAsIG1fbGFzdE9iamVjdChtX2N1cnJlbnQubV9vYmop
CisgICAgICAgICwgbV9uZXh0T2JqZWN0KDApCisgICAgICAgICwgbV9jdXJyZW50U3R5bGUoMCkK
KyAgICAgICAgLCBtX2Jsb2NrU3R5bGUoYmxvY2suc3R5bGUoKSkKKyAgICAgICAgLCBtX2xpbmVJ
bmZvKGluTGluZUluZm8pCisgICAgICAgICwgbV9yZW5kZXJUZXh0SW5mbyhpblJlbmRlclRleHRJ
bmZvKQorICAgICAgICAsIG1fbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZShpbkxhc3RGbG9hdEZy
b21QcmV2aW91c0xpbmUpCisgICAgICAgICwgbV93aWR0aChsaW5lV2lkdGgpCisgICAgICAgICwg
bV9jdXJyV1MoTk9STUFMKQorICAgICAgICAsIG1fbGFzdFdTKE5PUk1BTCkKKyAgICAgICAgLCBt
X3ByZXNlcnZlc05ld2xpbmUoZmFsc2UpCisgICAgICAgICwgbV9hdFN0YXJ0KHRydWUpCisgICAg
ICAgICwgbV9pZ25vcmluZ1NwYWNlcyhmYWxzZSkKKyAgICAgICAgLCBtX2N1cnJlbnRDaGFyYWN0
ZXJJc1NwYWNlKGZhbHNlKQorICAgICAgICAsIG1fY3VycmVudENoYXJhY3RlcklzV1MoZmFsc2Up
CisgICAgICAgICwgbV9hcHBsaWVkU3RhcnRXaWR0aChhcHBsaWVkU3RhcnRXaWR0aCkKKyAgICAg
ICAgLCBtX2luY2x1ZGVFbmRXaWR0aCh0cnVlKQorICAgICAgICAsIG1fYXV0b1dyYXAoZmFsc2Up
CisgICAgICAgICwgbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lKGZhbHNlKQorICAgICAgICAs
IG1fZmxvYXRzRml0T25MaW5lKHRydWUpCisgICAgICAgICwgbV9jb2xsYXBzZVdoaXRlU3BhY2Uo
ZmFsc2UpCisgICAgICAgICwgbV9zdGFydGluZ05ld1BhcmFncmFwaChtX2xpbmVJbmZvLnByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSgpKQorICAgICAgICAsIG1fYWxsb3dJbWFnZXNUb0JyZWFrKCFi
bG9jay5kb2N1bWVudCgpLmluUXVpcmtzTW9kZSgpIHx8ICFibG9jay5pc1RhYmxlQ2VsbCgpIHx8
ICFtX2Jsb2NrU3R5bGUubG9naWNhbFdpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKKyAgICAg
ICAgLCBtX2F0RW5kKGZhbHNlKQorICAgICAgICAsIG1faGFkVW5jb21taXR0ZWRXaWR0aEJlZm9y
ZUN1cnJlbnQoZmFsc2UpCisgICAgICAgICwgbV9saW5lTWlkcG9pbnRTdGF0ZShyZXNvbHZlci5t
aWRwb2ludFN0YXRlKCkpCisgICAgeworICAgICAgICBtX2xpbmVJbmZvLnNldFByZXZpb3VzTGlu
ZUJyb2tlQ2xlYW5seShmYWxzZSk7CisgICAgfQorCisgICAgUmVuZGVyT2JqZWN0KiBjdXJyZW50
T2JqZWN0KCkgeyByZXR1cm4gbV9jdXJyZW50Lm1fb2JqOyB9CisgICAgSW5saW5lSXRlcmF0b3Ig
bGluZUJyZWFrKCkgeyByZXR1cm4gbV9saW5lQnJlYWs7IH0KKyAgICBJbmxpbmVJdGVyYXRvciYg
bGluZUJyZWFrUmVmKCkge3JldHVybiBtX2xpbmVCcmVhazsgfQorICAgIExpbmVXaWR0aCYgbGlu
ZVdpZHRoKCkgeyByZXR1cm4gbV93aWR0aDsgfQorICAgIGJvb2wgYXRFbmQoKSB7IHJldHVybiBt
X2F0RW5kOyB9CisKKyAgICB2b2lkIGluaXRpYWxpemVGb3JDdXJyZW50T2JqZWN0KCk7CisKKyAg
ICB2b2lkIGluY3JlbWVudCgpOworCisgICAgdm9pZCBoYW5kbGVCUihFQ2xlYXImKTsKKyAgICB2
b2lkIGhhbmRsZU91dE9mRmxvd1Bvc2l0aW9uZWQoVmVjdG9yPFJlbmRlckJveCo+JiBwb3NpdGlv
bmVkT2JqZWN0cyk7CisgICAgdm9pZCBoYW5kbGVGbG9hdCgpOworICAgIHZvaWQgaGFuZGxlRW1w
dHlJbmxpbmUoKTsKKyAgICB2b2lkIGhhbmRsZVJlcGxhY2VkKCk7CisgICAgYm9vbCBoYW5kbGVU
ZXh0KFdvcmRNZWFzdXJlbWVudHMmLCBib29sJiBoeXBoZW5hdGVkLCB1bnNpZ25lZCYgY29uc2Vj
dXRpdmVIeXBoZW5hdGVkTGluZXMpOworICAgIGJvb2wgY2FuQnJlYWtBdFRoaXNQb3NpdGlvbigp
OworICAgIHZvaWQgY29tbWl0QW5kVXBkYXRlTGluZUJyZWFrSWZOZWVkZWQoKTsKKyAgICBJbmxp
bmVJdGVyYXRvciBoYW5kbGVFbmRPZkxpbmUoKTsKKworICAgIHZvaWQgY2xlYXJMaW5lQnJlYWtJ
ZkZpdHNPbkxpbmUoYm9vbCBpZ25vcmluZ1RyYWlsaW5nU3BhY2UgPSBmYWxzZSkKKyAgICB7Cisg
ICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoaWdub3JpbmdUcmFpbGluZ1NwYWNlKSB8fCBt
X2xhc3RXUyA9PSBOT1dSQVApCisgICAgICAgICAgICBtX2xpbmVCcmVhay5jbGVhcigpOworICAg
IH0KKworICAgIHZvaWQgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoUmVuZGVyT2JqZWN0
KiBvYmplY3QsIHVuc2lnbmVkIG9mZnNldCA9IDAsIGludCBuZXh0QnJlYWsgPSAtMSkKKyAgICB7
CisgICAgICAgIG1fd2lkdGguY29tbWl0KCk7CisgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhv
YmplY3QsIG9mZnNldCwgbmV4dEJyZWFrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgTGluZUJy
ZWFrZXImIG1fbGluZUJyZWFrZXI7CisgICAgSW5saW5lQmlkaVJlc29sdmVyJiBtX3Jlc29sdmVy
OworCisgICAgSW5saW5lSXRlcmF0b3IgbV9jdXJyZW50OworICAgIElubGluZUl0ZXJhdG9yIG1f
bGluZUJyZWFrOworICAgIElubGluZUl0ZXJhdG9yIG1fc3RhcnRPZklnbm9yZWRTcGFjZXM7CisK
KyAgICBSZW5kZXJCbG9ja0Zsb3cmIG1fYmxvY2s7CisgICAgUmVuZGVyT2JqZWN0KiBtX2xhc3RP
YmplY3Q7CisgICAgUmVuZGVyT2JqZWN0KiBtX25leHRPYmplY3Q7CisKKyAgICBSZW5kZXJTdHls
ZSogbV9jdXJyZW50U3R5bGU7CisKKyAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93
IGEgdGFibGUgY2VsbCB0byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKKyAg
ICAvLyB2ZXJ5IHNwZWNpZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1v
biBXaW5JRSByZW5kZXJpbmdzKS4KKyAgICAvLyBOb3Qgc3VwcG9ydGluZyB0aGUgcXVpcmsgaGFz
IGNhdXNlZCB1cyB0byBtaXMtcmVuZGVyIHNvbWUgcmVhbCBzaXRlcy4gKFNlZSBCdWd6aWxsYSAx
MDUxNy4pCisgICAgUmVuZGVyU3R5bGUmIG1fYmxvY2tTdHlsZTsKKworICAgIExpbmVJbmZvJiBt
X2xpbmVJbmZvOworCisgICAgUmVuZGVyVGV4dEluZm8mIG1fcmVuZGVyVGV4dEluZm87CisKKyAg
ICBGbG9hdGluZ09iamVjdCogbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lOworCisgICAgTGlu
ZVdpZHRoIG1fd2lkdGg7CisKKyAgICBFV2hpdGVTcGFjZSBtX2N1cnJXUzsKKyAgICBFV2hpdGVT
cGFjZSBtX2xhc3RXUzsKKworICAgIGJvb2wgbV9wcmVzZXJ2ZXNOZXdsaW5lOworICAgIGJvb2wg
bV9hdFN0YXJ0OworCisgICAgLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIG9ubHkgaWYgd2hpdGVz
cGFjZSBpc24ndCBzZXQgdG8gUFJFLCBhbmQgaXQgdGVsbHMgdXMgd2hldGhlcgorICAgIC8vIG9y
IG5vdCB3ZSBhcmUgY3VycmVudGx5IGlnbm9yaW5nIHdoaXRlc3BhY2UuCisgICAgYm9vbCBtX2ln
bm9yaW5nU3BhY2VzOworCisgICAgLy8gVGhpcyB2YXJpYWJsZSB0cmFja3Mgd2hldGhlciB0aGUg
dmVyeSBsYXN0IGNoYXJhY3RlciB3ZSBzYXcgd2FzIGEgc3BhY2UuIFdlIHVzZQorICAgIC8vIHRo
aXMgdG8gZGV0ZWN0IHdoZW4gd2UgZW5jb3VudGVyIGEgc2Vjb25kIHNwYWNlIHNvIHdlIGtub3cg
d2UgaGF2ZSB0byB0ZXJtaW5hdGUKKyAgICAvLyBhIHJ1bi4KKyAgICBib29sIG1fY3VycmVudENo
YXJhY3RlcklzU3BhY2U7CisgICAgYm9vbCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTOworICAgIGJv
b2wgbV9hcHBsaWVkU3RhcnRXaWR0aDsKKyAgICBib29sIG1faW5jbHVkZUVuZFdpZHRoOworICAg
IGJvb2wgbV9hdXRvV3JhcDsKKyAgICBib29sIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZTsK
KyAgICBib29sIG1fZmxvYXRzRml0T25MaW5lOworICAgIGJvb2wgbV9jb2xsYXBzZVdoaXRlU3Bh
Y2U7CisgICAgYm9vbCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoOworICAgIGJvb2wgbV9hbGxvd0lt
YWdlc1RvQnJlYWs7CisgICAgYm9vbCBtX2F0RW5kOworICAgIGJvb2wgbV9oYWRVbmNvbW1pdHRl
ZFdpZHRoQmVmb3JlQ3VycmVudDsKKworICAgIExpbmVNaWRwb2ludFN0YXRlJiBtX2xpbmVNaWRw
b2ludFN0YXRlOworCisgICAgVHJhaWxpbmdPYmplY3RzIG1fdHJhaWxpbmdPYmplY3RzOworfTsK
KworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojppbml0aWFsaXplRm9yQ3VycmVudE9iamVj
dCgpCit7CisgICAgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudCA9ICEhbV93aWR0
aC51bmNvbW1pdHRlZFdpZHRoKCk7CisKKyAgICBtX2N1cnJlbnRTdHlsZSA9ICZtX2N1cnJlbnQu
bV9vYmotPnN0eWxlKCk7CisKKyAgICBBU1NFUlQobV9jdXJyZW50U3R5bGUpOworCisgICAgbV9u
ZXh0T2JqZWN0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhtX2Jsb2NrLCBtX2N1cnJl
bnQubV9vYmopOworICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5wYXJlbnQo
KSAmJiAhbV9uZXh0T2JqZWN0LT5wYXJlbnQoKS0+aXNEZXNjZW5kYW50T2YobV9jdXJyZW50Lm1f
b2JqLT5wYXJlbnQoKSkpCisgICAgICAgIG1faW5jbHVkZUVuZFdpZHRoID0gdHJ1ZTsKKworICAg
IG1fY3VycldTID0gbV9jdXJyZW50Lm1fb2JqLT5pc1JlcGxhY2VkKCkgPyBtX2N1cnJlbnQubV9v
YmotPnBhcmVudCgpLT5zdHlsZSgpLndoaXRlU3BhY2UoKSA6IG1fY3VycmVudFN0eWxlLT53aGl0
ZVNwYWNlKCk7CisgICAgbV9sYXN0V1MgPSBtX2xhc3RPYmplY3QtPmlzUmVwbGFjZWQoKSA/IG1f
bGFzdE9iamVjdC0+cGFyZW50KCktPnN0eWxlKCkud2hpdGVTcGFjZSgpIDogbV9sYXN0T2JqZWN0
LT5zdHlsZSgpLndoaXRlU3BhY2UoKTsKKworICAgIG1fYXV0b1dyYXAgPSBSZW5kZXJTdHlsZTo6
YXV0b1dyYXAobV9jdXJyV1MpOworICAgIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9IG1f
YXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSB8fCBtX2F1dG9XcmFwOworCisjaWYgRU5BQkxFKFNW
RykKKyAgICBtX3ByZXNlcnZlc05ld2xpbmUgPSBtX2N1cnJlbnQubV9vYmotPmlzU1ZHSW5saW5l
VGV4dCgpID8gZmFsc2UgOiBSZW5kZXJTdHlsZTo6cHJlc2VydmVOZXdsaW5lKG1fY3VycldTKTsK
KyNlbHNlCisgICAgbV9wcmVzZXJ2ZXNOZXdsaW5lID0gUmVuZGVyU3R5bGU6OnByZXNlcnZlTmV3
bGluZShtX2N1cnJXUyk7CisjZW5kaWYKKworICAgIG1fY29sbGFwc2VXaGl0ZVNwYWNlID0gUmVu
ZGVyU3R5bGU6OmNvbGxhcHNlV2hpdGVTcGFjZShtX2N1cnJXUyk7Cit9CisKK2lubGluZSB2b2lk
IEJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KCkKK3sKKyAgICAvLyBDbGVhciBvdXQgb3VyIGNo
YXJhY3RlciBzcGFjZSBib29sLCBzaW5jZSBpbmxpbmUgPHByZT5zIGRvbid0IGNvbGxhcHNlIHdo
aXRlc3BhY2UKKyAgICAvLyB3aXRoIGFkamFjZW50IGlubGluZSBub3JtYWwvbm93cmFwIHNwYW5z
LgorICAgIGlmICghbV9jb2xsYXBzZVdoaXRlU3BhY2UpCisgICAgICAgIG1fY3VycmVudENoYXJh
Y3RlcklzU3BhY2UgPSBmYWxzZTsKKworICAgIG1fY3VycmVudC5tb3ZlVG9TdGFydE9mKG1fbmV4
dE9iamVjdCk7CisgICAgbV9hdFN0YXJ0ID0gZmFsc2U7Cit9CisKK2lubGluZSB2b2lkIEJyZWFr
aW5nQ29udGV4dDo6aGFuZGxlQlIoRUNsZWFyJiBjbGVhcikKK3sKKyAgICBpZiAobV93aWR0aC5m
aXRzT25MaW5lKCkpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiBiciA9IG1fY3VycmVudC5tX29i
ajsKKyAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvU3RhcnRPZihicik7CisgICAgICAgIG1fbGlu
ZUJyZWFrLmluY3JlbWVudCgpOworCisgICAgICAgIC8vIEEgPGJyPiBhbHdheXMgYnJlYWtzIGEg
bGluZSwgc28gZG9uJ3QgbGV0IHRoZSBsaW5lIGJlIGNvbGxhcHNlZAorICAgICAgICAvLyBhd2F5
LiBBbHNvLCB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aCBhIDxicj4gZG9lcyBu
b3QKKyAgICAgICAgLy8gZ2V0IGNvbGxhcHNlZCBhd2F5LiBJdCBvbmx5IGRvZXMgdGhpcyBpZiB0
aGUgcHJldmlvdXMgbGluZSBicm9rZQorICAgICAgICAvLyBjbGVhbmx5LiBPdGhlcndpc2UgdGhl
IDxicj4gaGFzIG5vIGVmZmVjdCBvbiB3aGV0aGVyIHRoZSBsaW5lIGlzCisgICAgICAgIC8vIGVt
cHR5IG9yIG5vdC4KKyAgICAgICAgaWYgKG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGgpCisgICAgICAg
ICAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAmbV9ibG9jaywgJm1fd2lkdGgpOworICAg
ICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOworICAgICAgICBtX2xpbmVJbmZvLnNldFBy
ZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKKworICAgICAgICAvLyBBIDxicj4gd2l0aCBj
bGVhcmFuY2UgYWx3YXlzIG5lZWRzIGEgbGluZWJveCBpbiBjYXNlIHRoZSBsaW5lcyBiZWxvdyBp
dCBnZXQgZGlydGllZCBsYXRlciBhbmQKKyAgICAgICAgLy8gbmVlZCB0byBjaGVjayBmb3IgZmxv
YXRzIHRvIGNsZWFyIC0gc28gaWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCBzdG9wIGlnbm9yaW5n
IHRoZW0gYW5kIGFkZCBhCisgICAgICAgIC8vIHJ1biBmb3IgdGhpcyBvYmplY3QuCisgICAgICAg
IGlmIChtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jbGVhcigpICE9IENOT05F
KQorICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9saW5lTWlk
cG9pbnRTdGF0ZSwgYnIpOworICAgICAgICAvLyBJZiB3ZSB3ZXJlIHByZWNlZGVkIGJ5IGNvbGxh
cHNpbmcgc3BhY2UgYW5kIGFyZSBpbiBhIHJpZ2h0LWFsaWduZWQgY29udGFpbmVyIHdlIG5lZWQg
dG8gZW5zdXJlIHRoZSBzcGFjZSBnZXRzCisgICAgICAgIC8vIGNvbGxhcHNlZCBhd2F5IHNvIHRo
YXQgaXQgZG9lc24ndCBwdXNoIHRoZSB0ZXh0IG91dCBmcm9tIHRoZSBjb250YWluZXIncyByaWdo
dC1oYW5kIGVkZ2UuCisgICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhl
IGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2VsaW5pbmcgYSBsb3Qg
b2YgdGVzdCByZXN1bHRzLgorICAgICAgICBlbHNlIGlmIChtX2lnbm9yaW5nU3BhY2VzICYmICht
X2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gUklHSFQgfHwgbV9ibG9ja1N0eWxlLnRleHRBbGln
bigpID09IFdFQktJVF9SSUdIVCkpCisgICAgICAgICAgICBzdG9wSWdub3JpbmdTcGFjZXMobV9s
aW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50Lm1fb2JqLCBtX2N1
cnJlbnQubV9wb3MpKTsKKworICAgICAgICBpZiAoIW1fbGluZUluZm8uaXNFbXB0eSgpKQorICAg
ICAgICAgICAgY2xlYXIgPSBtX2N1cnJlbnRTdHlsZS0+Y2xlYXIoKTsKKyAgICB9CisgICAgbV9h
dEVuZCA9IHRydWU7Cit9CisKK2lubGluZSBMYXlvdXRVbml0IGJvcmRlclBhZGRpbmdNYXJnaW5T
dGFydChjb25zdCBSZW5kZXJJbmxpbmUmIGNoaWxkKQoreworICAgIHJldHVybiBjaGlsZC5tYXJn
aW5TdGFydCgpICsgY2hpbGQucGFkZGluZ1N0YXJ0KCkgKyBjaGlsZC5ib3JkZXJTdGFydCgpOwor
fQorCitpbmxpbmUgTGF5b3V0VW5pdCBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKGNvbnN0IFJlbmRl
cklubGluZSYgY2hpbGQpCit7CisgICAgcmV0dXJuIGNoaWxkLm1hcmdpbkVuZCgpICsgY2hpbGQu
cGFkZGluZ0VuZCgpICsgY2hpbGQuYm9yZGVyRW5kKCk7Cit9CisKK2lubGluZSBib29sIHNob3Vs
ZEFkZEJvcmRlclBhZGRpbmdNYXJnaW4oUmVuZGVyT2JqZWN0KiBjaGlsZCkKK3sKKyAgICAvLyBX
aGVuIGRlY2lkaW5nIHdoZXRoZXIgd2UncmUgYXQgdGhlIGVkZ2Ugb2YgYW4gaW5saW5lLCBhZGph
Y2VudCBjb2xsYXBzZWQgd2hpdGVzcGFjZSBpcyB0aGUgc2FtZSBhcyBubyBzaWJsaW5nIGF0IGFs
bC4KKyAgICByZXR1cm4gIWNoaWxkIHx8IChjaGlsZC0+aXNUZXh0KCkgJiYgIXRvUmVuZGVyVGV4
dChjaGlsZCktPnRleHRMZW5ndGgoKSk7Cit9CisKK2lubGluZSBSZW5kZXJPYmplY3QqIHByZXZp
b3VzSW5GbG93U2libGluZyhSZW5kZXJPYmplY3QqIGNoaWxkKQoreworICAgIGNoaWxkID0gY2hp
bGQtPnByZXZpb3VzU2libGluZygpOworICAgIHdoaWxlIChjaGlsZCAmJiBjaGlsZC0+aXNPdXRP
ZkZsb3dQb3NpdGlvbmVkKCkpCisgICAgICAgIGNoaWxkID0gY2hpbGQtPnByZXZpb3VzU2libGlu
ZygpOworICAgIHJldHVybiBjaGlsZDsKK30KKworaW5saW5lIExheW91dFVuaXQgaW5saW5lTG9n
aWNhbFdpZHRoKFJlbmRlck9iamVjdCogY2hpbGQsIGJvb2wgY2hlY2tTdGFydEVkZ2UgPSB0cnVl
LCBib29sIGNoZWNrRW5kRWRnZSA9IHRydWUpCit7CisgICAgdW5zaWduZWQgbGluZURlcHRoID0g
MTsKKyAgICBMYXlvdXRVbml0IGV4dHJhV2lkdGggPSAwOworICAgIFJlbmRlckVsZW1lbnQqIHBh
cmVudCA9IGNoaWxkLT5wYXJlbnQoKTsKKyAgICB3aGlsZSAocGFyZW50LT5pc1JlbmRlcklubGlu
ZSgpICYmIGxpbmVEZXB0aCsrIDwgY01heExpbmVEZXB0aCkgeworICAgICAgICBjb25zdCBSZW5k
ZXJJbmxpbmUmIHBhcmVudEFzUmVuZGVySW5saW5lID0gdG9SZW5kZXJJbmxpbmUoKnBhcmVudCk7
CisgICAgICAgIGlmICghaXNFbXB0eUlubGluZShwYXJlbnRBc1JlbmRlcklubGluZSkpIHsKKyAg
ICAgICAgICAgIGNoZWNrU3RhcnRFZGdlID0gY2hlY2tTdGFydEVkZ2UgJiYgc2hvdWxkQWRkQm9y
ZGVyUGFkZGluZ01hcmdpbihwcmV2aW91c0luRmxvd1NpYmxpbmcoY2hpbGQpKTsKKyAgICAgICAg
ICAgIGlmIChjaGVja1N0YXJ0RWRnZSkKKyAgICAgICAgICAgICAgICBleHRyYVdpZHRoICs9IGJv
cmRlclBhZGRpbmdNYXJnaW5TdGFydChwYXJlbnRBc1JlbmRlcklubGluZSk7CisgICAgICAgICAg
ICBjaGVja0VuZEVkZ2UgPSBjaGVja0VuZEVkZ2UgJiYgc2hvdWxkQWRkQm9yZGVyUGFkZGluZ01h
cmdpbihjaGlsZC0+bmV4dFNpYmxpbmcoKSk7CisgICAgICAgICAgICBpZiAoY2hlY2tFbmRFZGdl
KQorICAgICAgICAgICAgICAgIGV4dHJhV2lkdGggKz0gYm9yZGVyUGFkZGluZ01hcmdpbkVuZChw
YXJlbnRBc1JlbmRlcklubGluZSk7CisgICAgICAgICAgICBpZiAoIWNoZWNrU3RhcnRFZGdlICYm
ICFjaGVja0VuZEVkZ2UpCisgICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhV2lkdGg7CisgICAg
ICAgIH0KKyAgICAgICAgY2hpbGQgPSBwYXJlbnQ7CisgICAgICAgIHBhcmVudCA9IGNoaWxkLT5w
YXJlbnQoKTsKKyAgICB9CisgICAgcmV0dXJuIGV4dHJhV2lkdGg7Cit9CisKK2lubGluZSB2b2lk
IEJyZWFraW5nQ29udGV4dDo6aGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZChWZWN0b3I8UmVuZGVy
Qm94Kj4mIHBvc2l0aW9uZWRPYmplY3RzKQoreworICAgIC8vIElmIG91ciBvcmlnaW5hbCBkaXNw
bGF5IHdhc24ndCBhbiBpbmxpbmUgdHlwZSwgdGhlbiB3ZSBjYW4KKyAgICAvLyBnbyBhaGVhZCBh
bmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMgaW5saW5lIHBvc2l0aW9uIG5vdy4KKyAgICBSZW5kZXJC
b3gqIGJveCA9IHRvUmVuZGVyQm94KG1fY3VycmVudC5tX29iaik7CisgICAgYm9vbCBpc0lubGlu
ZVR5cGUgPSBib3gtPnN0eWxlKCkuaXNPcmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCk7CisgICAg
aWYgKCFpc0lubGluZVR5cGUpCisgICAgICAgIG1fYmxvY2suc2V0U3RhdGljSW5saW5lUG9zaXRp
b25Gb3JDaGlsZCgqYm94LCBtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQoKSwgbV9ibG9jay5zdGFydE9m
ZnNldEZvckNvbnRlbnQobV9ibG9jay5sb2dpY2FsSGVpZ2h0KCkpKTsKKyAgICBlbHNlIHsKKyAg
ICAgICAgLy8gSWYgb3VyIG9yaWdpbmFsIGRpc3BsYXkgd2FzIGFuIElOTElORSB0eXBlLCB0aGVu
IHdlIGNhbiBnbyBhaGVhZAorICAgICAgICAvLyBhbmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMgeSBw
b3NpdGlvbiBub3cuCisgICAgICAgIGJveC0+bGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlv
bihtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQoKSk7CisgICAgfQorCisgICAgLy8gSWYgd2UncmUgaWdu
b3Jpbmcgc3BhY2VzLCB3ZSBoYXZlIHRvIHN0b3AgYW5kIGluY2x1ZGUgdGhpcyBvYmplY3QgYW5k
CisgICAgLy8gdGhlbiBzdGFydCBpZ25vcmluZyBzcGFjZXMgYWdhaW4uCisgICAgaWYgKGlzSW5s
aW5lVHlwZSB8fCBib3gtPmNvbnRhaW5lcigpLT5pc1JlbmRlcklubGluZSgpKSB7CisgICAgICAg
IGlmIChtX2lnbm9yaW5nU3BhY2VzKQorICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUln
bm9yZWRTcGFjZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgYm94KTsKKyAgICAgICAgbV90cmFpbGlu
Z09iamVjdHMuYXBwZW5kQm94SWZOZWVkZWQoYm94KTsKKyAgICB9IGVsc2UKKyAgICAgICAgcG9z
aXRpb25lZE9iamVjdHMuYXBwZW5kKGJveCk7CisKKyAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVk
V2lkdGgoaW5saW5lTG9naWNhbFdpZHRoKGJveCkpOworICAgIC8vIFJlc2V0IHByaW9yIGxpbmUg
YnJlYWsgY29udGV4dCBjaGFyYWN0ZXJzLgorICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJl
YWtJdGVyYXRvci5yZXNldFByaW9yQ29udGV4dCgpOworfQorCitpbmxpbmUgdm9pZCBCcmVha2lu
Z0NvbnRleHQ6OmhhbmRsZUZsb2F0KCkKK3sKKyAgICBSZW5kZXJCb3gmIGZsb2F0Qm94ID0gdG9S
ZW5kZXJCb3goKm1fY3VycmVudC5tX29iaik7CisgICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5n
T2JqZWN0ID0gbV9ibG9jay5pbnNlcnRGbG9hdGluZ09iamVjdChmbG9hdEJveCk7CisgICAgLy8g
Y2hlY2sgaWYgaXQgZml0cyBpbiB0aGUgY3VycmVudCBsaW5lLgorICAgIC8vIElmIGl0IGRvZXMs
IHBvc2l0aW9uIGl0IG5vdywgb3RoZXJ3aXNlLCBwb3NpdGlvbgorICAgIC8vIGl0IGFmdGVyIG1v
dmluZyB0byBuZXh0IGxpbmUgKGluIG5ld0xpbmUoKSBmdW5jKQorICAgIC8vIEZJWE1FOiBCdWcg
MTEwMzcyOiBQcm9wZXJseSBwb3NpdGlvbiBtdWx0aXBsZSBzdGFja2VkIGZsb2F0cyB3aXRoIG5v
bi1yZWN0YW5ndWxhciBzaGFwZSBvdXRzaWRlLgorICAgIGlmIChtX2Zsb2F0c0ZpdE9uTGluZSAm
JiBtX3dpZHRoLmZpdHNPbkxpbmVFeGNsdWRpbmdUcmFpbGluZ1doaXRlc3BhY2UobV9ibG9jay5s
b2dpY2FsV2lkdGhGb3JGbG9hdChmbG9hdGluZ09iamVjdCkpKSB7CisgICAgICAgIG1fYmxvY2su
cG9zaXRpb25OZXdGbG9hdE9uTGluZShmbG9hdGluZ09iamVjdCwgbV9sYXN0RmxvYXRGcm9tUHJl
dmlvdXNMaW5lLCBtX2xpbmVJbmZvLCBtX3dpZHRoKTsKKyAgICAgICAgaWYgKG1fbGluZUJyZWFr
Lm1fb2JqID09IG1fY3VycmVudC5tX29iaikgeworICAgICAgICAgICAgQVNTRVJUKCFtX2xpbmVC
cmVhay5tX3Bvcyk7CisgICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAg
ICAgfQorICAgIH0gZWxzZQorICAgICAgICBtX2Zsb2F0c0ZpdE9uTGluZSA9IGZhbHNlOworICAg
IC8vIFVwZGF0ZSBwcmlvciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVycywgdXNpbmcgVStG
RkZEIChPQkpFQ1QgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSKSBmb3IgZmxvYXRpbmcgZWxlbWVudC4K
KyAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IudXBkYXRlUHJpb3JDb250
ZXh0KHJlcGxhY2VtZW50Q2hhcmFjdGVyKTsKK30KKworLy8gVGhpcyBpcyBjdXJyZW50bHkganVz
dCB1c2VkIGZvciBsaXN0IG1hcmtlcnMgYW5kIGlubGluZSBmbG93cyB0aGF0IGhhdmUgbGluZSBi
b3hlcy4gTmVpdGhlciBzaG91bGQKKy8vIGhhdmUgYW4gZWZmZWN0IG9uIHdoaXRlc3BhY2UgYXQg
dGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgoraW5saW5lIGJvb2wgc2hvdWxkU2tpcFdoaXRlc3BhY2VB
ZnRlclN0YXJ0T2JqZWN0KFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIFJlbmRlck9iamVjdCogbywg
TGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlKQoreworICAgIFJlbmRlck9iamVj
dCogbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ssIG8pOworICAgIHdo
aWxlIChuZXh0ICYmIG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAg
ICAgICAgbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ssIG5leHQpOwor
CisgICAgaWYgKG5leHQgJiYgbmV4dC0+aXNUZXh0KCkgJiYgdG9SZW5kZXJUZXh0KG5leHQpLT50
ZXh0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIFJlbmRlclRleHQqIG5leHRUZXh0ID0gdG9SZW5k
ZXJUZXh0KG5leHQpOworICAgICAgICBVQ2hhciBuZXh0Q2hhciA9IG5leHRUZXh0LT5jaGFyYWN0
ZXJBdCgwKTsKKyAgICAgICAgaWYgKG5leHRUZXh0LT5zdHlsZSgpLmlzQ29sbGFwc2libGVXaGl0
ZVNwYWNlKG5leHRDaGFyKSkgeworICAgICAgICAgICAgc3RhcnRJZ25vcmluZ1NwYWNlcyhsaW5l
TWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgMCkpOworICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lu
bGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRW1wdHlJbmxpbmUoKQoreworICAgIFJl
bmRlcklubGluZSYgZmxvd0JveCA9IHRvUmVuZGVySW5saW5lKCptX2N1cnJlbnQubV9vYmopOwor
CisgICAgLy8gVGhpcyBzaG91bGQgb25seSBlbmQgdXAgYmVpbmcgY2FsbGVkIG9uIGVtcHR5IGlu
bGluZXMKKyAgICBBU1NFUlQoaXNFbXB0eUlubGluZShmbG93Qm94KSk7CisKKyAgICAvLyBOb3cg
dGhhdCBzb21lIGlubGluZSBmbG93cyBoYXZlIGxpbmUgYm94ZXMsIGlmIHdlIGFyZSBhbHJlYWR5
IGlnbm9yaW5nIHNwYWNlcywgd2UgbmVlZAorICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHN0
b3AgdG8gaW5jbHVkZSB0aGlzIG9iamVjdCBhbmQgdGhlbiBzdGFydCBpZ25vcmluZyBzcGFjZXMg
YWdhaW4uCisgICAgLy8gSWYgdGhpcyBvYmplY3QgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5l
LCB3ZSBuZWVkIHRvIGJlaGF2ZSBsaWtlIGxpc3QgbWFya2VycyBhbmQKKyAgICAvLyBzdGFydCBp
Z25vcmluZyBzcGFjZXMuCisgICAgYm9vbCByZXF1aXJlc0xpbmVCb3ggPSBhbHdheXNSZXF1aXJl
c0xpbmVCb3goZmxvd0JveCk7CisgICAgaWYgKHJlcXVpcmVzTGluZUJveCB8fCByZXF1aXJlc0xp
bmVCb3hGb3JDb250ZW50KGZsb3dCb3gsIG1fbGluZUluZm8pKSB7CisgICAgICAgIC8vIEFuIGVt
cHR5IGlubGluZSB0aGF0IG9ubHkgaGFzIGxpbmUtaGVpZ2h0LCB2ZXJ0aWNhbC1hbGlnbiBvciBm
b250LW1ldHJpY3Mgd2lsbCBvbmx5IGdldCBhCisgICAgICAgIC8vIGxpbmUgYm94IHRvIGFmZmVj
dCB0aGUgaGVpZ2h0IG9mIHRoZSBsaW5lIGlmIHRoZSByZXN0IG9mIHRoZSBsaW5lIGlzIG5vdCBl
bXB0eS4KKyAgICAgICAgaWYgKHJlcXVpcmVzTGluZUJveCkKKyAgICAgICAgICAgIG1fbGluZUlu
Zm8uc2V0RW1wdHkoZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7CisgICAgICAgIGlmIChtX2ln
bm9yaW5nU3BhY2VzKSB7CisgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOwor
ICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9saW5lTWlkcG9p
bnRTdGF0ZSwgbV9jdXJyZW50Lm1fb2JqKTsKKyAgICAgICAgfSBlbHNlIGlmIChtX2Jsb2NrU3R5
bGUuY29sbGFwc2VXaGl0ZVNwYWNlKCkgJiYgbV9yZXNvbHZlci5wb3NpdGlvbigpLm1fb2JqID09
IG1fY3VycmVudC5tX29iagorICAgICAgICAgICAgJiYgc2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRl
clN0YXJ0T2JqZWN0KG1fYmxvY2ssIG1fY3VycmVudC5tX29iaiwgbV9saW5lTWlkcG9pbnRTdGF0
ZSkpIHsKKyAgICAgICAgICAgIC8vIExpa2Ugd2l0aCBsaXN0IG1hcmtlcnMsIHdlIHN0YXJ0IGln
bm9yaW5nIHNwYWNlcyB0byBtYWtlIHN1cmUgdGhhdCBhbnkKKyAgICAgICAgICAgIC8vIGFkZGl0
aW9uYWwgc3BhY2VzIHdlIHNlZSB3aWxsIGJlIGRpc2NhcmRlZC4KKyAgICAgICAgICAgIG1fY3Vy
cmVudENoYXJhY3RlcklzU3BhY2UgPSB0cnVlOworICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFj
dGVySXNXUyA9IHRydWU7CisgICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKKyAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5hcHBlbmRCb3hJZk5l
ZWRlZCgmZmxvd0JveCk7CisgICAgfQorCisgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRo
KGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQubV9vYmopICsgYm9yZGVyUGFkZGluZ01hcmdp
blN0YXJ0KGZsb3dCb3gpICsgYm9yZGVyUGFkZGluZ01hcmdpbkVuZChmbG93Qm94KSk7Cit9CisK
K2lubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlUmVwbGFjZWQoKQoreworICAgIFJl
bmRlckJveCYgcmVwbGFjZWRCb3ggPSB0b1JlbmRlckJveCgqbV9jdXJyZW50Lm1fb2JqKTsKKwor
ICAgIGlmIChtX2F0U3RhcnQpCisgICAgICAgIG1fd2lkdGgudXBkYXRlQXZhaWxhYmxlV2lkdGgo
cmVwbGFjZWRCb3gubG9naWNhbEhlaWdodCgpKTsKKworICAgIC8vIEJyZWFrIG9uIHJlcGxhY2Vk
IGVsZW1lbnRzIGlmIGVpdGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLgorICAgIGlmICgobV9h
dXRvV3JhcCB8fCBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobV9sYXN0V1MpKSAmJiAoIW1fY3VycmVu
dC5tX29iai0+aXNJbWFnZSgpIHx8IG1fYWxsb3dJbWFnZXNUb0JyZWFrKSkgeworICAgICAgICBt
X3dpZHRoLmNvbW1pdCgpOworICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG9TdGFydE9mKG1fY3Vy
cmVudC5tX29iaik7CisgICAgfQorCisgICAgaWYgKG1faWdub3JpbmdTcGFjZXMpCisgICAgICAg
IHN0b3BJZ25vcmluZ1NwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigw
LCBtX2N1cnJlbnQubV9vYmosIDApKTsKKworICAgIG1fbGluZUluZm8uc2V0RW1wdHkoZmFsc2Us
ICZtX2Jsb2NrLCAmbV93aWR0aCk7CisgICAgbV9pZ25vcmluZ1NwYWNlcyA9IGZhbHNlOworICAg
IG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKKyAgICBtX2N1cnJlbnRDaGFyYWN0
ZXJJc1dTID0gZmFsc2U7CisgICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKKworICAgIC8v
IE9wdGltaXplIGZvciBhIGNvbW1vbiBjYXNlLiBJZiB3ZSBjYW4ndCBmaW5kIHdoaXRlc3BhY2Ug
YWZ0ZXIgdGhlIGxpc3QKKyAgICAvLyBpdGVtLCB0aGVuIHRoaXMgaXMgYWxsIG1vb3QuCisgICAg
TGF5b3V0VW5pdCByZXBsYWNlZExvZ2ljYWxXaWR0aCA9IG1fYmxvY2subG9naWNhbFdpZHRoRm9y
Q2hpbGQocmVwbGFjZWRCb3gpICsgbV9ibG9jay5tYXJnaW5TdGFydEZvckNoaWxkKHJlcGxhY2Vk
Qm94KSArIG1fYmxvY2subWFyZ2luRW5kRm9yQ2hpbGQocmVwbGFjZWRCb3gpICsgaW5saW5lTG9n
aWNhbFdpZHRoKG1fY3VycmVudC5tX29iaik7CisgICAgaWYgKG1fY3VycmVudC5tX29iai0+aXNM
aXN0TWFya2VyKCkpIHsKKyAgICAgICAgaWYgKG1fYmxvY2tTdHlsZS5jb2xsYXBzZVdoaXRlU3Bh
Y2UoKSAmJiBzaG91bGRTa2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QobV9ibG9jaywgbV9j
dXJyZW50Lm1fb2JqLCBtX2xpbmVNaWRwb2ludFN0YXRlKSkgeworICAgICAgICAgICAgLy8gTGlr
ZSB3aXRoIGlubGluZSBmbG93cywgd2Ugc3RhcnQgaWdub3Jpbmcgc3BhY2VzIHRvIG1ha2Ugc3Vy
ZSB0aGF0IGFueQorICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBzcGFjZXMgd2Ugc2VlIHdpbGwg
YmUgZGlzY2FyZGVkLgorICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IHRy
dWU7CisgICAgICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTID0gZmFsc2U7CisgICAgICAg
ICAgICBtX2lnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9S
ZW5kZXJMaXN0TWFya2VyKCptX2N1cnJlbnQubV9vYmopLmlzSW5zaWRlKCkpCisgICAgICAgICAg
ICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgocmVwbGFjZWRMb2dpY2FsV2lkdGgpOworICAg
IH0gZWxzZQorICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgocmVwbGFjZWRMb2dp
Y2FsV2lkdGgpOworICAgIGlmIChtX2N1cnJlbnQubV9vYmotPmlzUnVieVJ1bigpKQorICAgICAg
ICBtX3dpZHRoLmFwcGx5T3ZlcmhhbmcodG9SZW5kZXJSdWJ5UnVuKG1fY3VycmVudC5tX29iaiks
IG1fbGFzdE9iamVjdCwgbV9uZXh0T2JqZWN0KTsKKyAgICAvLyBVcGRhdGUgcHJpb3IgbGluZSBi
cmVhayBjb250ZXh0IGNoYXJhY3RlcnMsIHVzaW5nIFUrRkZGRCAoT0JKRUNUIFJFUExBQ0VNRU5U
IENIQVJBQ1RFUikgZm9yIHJlcGxhY2VkIGVsZW1lbnQuCisgICAgbV9yZW5kZXJUZXh0SW5mby5t
X2xpbmVCcmVha0l0ZXJhdG9yLnVwZGF0ZVByaW9yQ29udGV4dChyZXBsYWNlbWVudENoYXJhY3Rl
cik7Cit9CisKK2lubGluZSBmbG9hdCBmaXJzdFBvc2l0aXZlV2lkdGgoY29uc3QgV29yZE1lYXN1
cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHdvcmRNZWFzdXJlbWVudHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHdvcmRNZWFzdXJl
bWVudHNbaV0ud2lkdGggPiAwKQorICAgICAgICAgICAgcmV0dXJuIHdvcmRNZWFzdXJlbWVudHNb
aV0ud2lkdGg7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWYgRU5BQkxFKENTU19TSEFQ
RVMpCitpbmxpbmUgdm9pZCB1cGRhdGVTZWdtZW50c0ZvclNoYXBlcyhSZW5kZXJCbG9ja0Zsb3cm
IGJsb2NrLCBjb25zdCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwg
Y29uc3QgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cywgTGluZVdpZHRoJiB3aWR0
aCwgYm9vbCBpc0ZpcnN0TGluZSkKK3sKKyAgICBBU1NFUlQobGFzdEZsb2F0RnJvbVByZXZpb3Vz
TGluZSk7CisKKyAgICBTaGFwZUluc2lkZUluZm8qIHNoYXBlSW5zaWRlSW5mbyA9IGJsb2NrLmxh
eW91dFNoYXBlSW5zaWRlSW5mbygpOworICAgIGlmICghbGFzdEZsb2F0RnJvbVByZXZpb3VzTGlu
ZS0+aXNQbGFjZWQoKSB8fCAhc2hhcGVJbnNpZGVJbmZvKQorICAgICAgICByZXR1cm47CisKKyAg
ICBib29sIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlID0gYmxvY2suaXNIb3Jpem9udGFsV3JpdGlu
Z01vZGUoKTsKKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWluZXIg
PSBibG9jay5sb2dpY2FsT2Zmc2V0RnJvbVNoYXBlQW5jZXN0b3JDb250YWluZXIoc2hhcGVJbnNp
ZGVJbmZvLT5vd25lcigpKS5oZWlnaHQoKTsKKworICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxU
b3AgPSBibG9jay5sb2dpY2FsSGVpZ2h0KCkgKyBsb2dpY2FsT2Zmc2V0RnJvbVNoYXBlQ29udGFp
bmVyOworICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxIZWlnaHQgPSBibG9jay5saW5lSGVpZ2h0
KGlzRmlyc3RMaW5lLCBpc0hvcml6b250YWxXcml0aW5nTW9kZSA/IEhvcml6b250YWxMaW5lIDog
VmVydGljYWxMaW5lLCBQb3NpdGlvbk9mSW50ZXJpb3JMaW5lQm94ZXMpOworICAgIExheW91dFVu
aXQgbGluZUxvZ2ljYWxCb3R0b20gPSBsaW5lTG9naWNhbFRvcCArIGxpbmVMb2dpY2FsSGVpZ2h0
OworCisgICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxUb3AgPSBibG9jay5sb2dpY2FsVG9wRm9y
RmxvYXQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7CisgICAgTGF5b3V0VW5pdCBmbG9hdExv
Z2ljYWxCb3R0b20gPSBibG9jay5sb2dpY2FsQm90dG9tRm9yRmxvYXQobGFzdEZsb2F0RnJvbVBy
ZXZpb3VzTGluZSk7CisKKyAgICBib29sIGxpbmVPdmVybGFwc1dpdGhGbG9hdCA9IChmbG9hdExv
Z2ljYWxUb3AgPCBsaW5lTG9naWNhbEJvdHRvbSkgJiYgKGxpbmVMb2dpY2FsVG9wIDwgZmxvYXRM
b2dpY2FsQm90dG9tKTsKKyAgICBpZiAoIWxpbmVPdmVybGFwc1dpdGhGbG9hdCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgZmxvYXQgbWluU2VnbWVudFdpZHRoID0gZmlyc3RQb3NpdGl2ZVdpZHRo
KHdvcmRNZWFzdXJlbWVudHMpOworCisgICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxXaWR0aCA9
IGJsb2NrLmxvZ2ljYWxXaWR0aEZvckZsb2F0KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpOwor
ICAgIExheW91dFVuaXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoID0gYmxvY2subG9naWNhbFdpZHRo
KCkgLSBibG9jay5sb2dpY2FsUmlnaHRGb3JGbG9hdChsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5l
KTsKKyAgICBpZiAoYXZhaWxhYmxlTG9naWNhbFdpZHRoIDwgbWluU2VnbWVudFdpZHRoKQorICAg
ICAgICBibG9jay5zZXRMb2dpY2FsSGVpZ2h0KGZsb2F0TG9naWNhbEJvdHRvbSk7CisKKyAgICBp
ZiAoYmxvY2subG9naWNhbEhlaWdodCgpIDwgZmxvYXRMb2dpY2FsVG9wKSB7CisgICAgICAgIHNo
YXBlSW5zaWRlSW5mby0+YWRqdXN0TG9naWNhbExpbmVUb3AobWluU2VnbWVudFdpZHRoICsgZmxv
YXRMb2dpY2FsV2lkdGgpOworICAgICAgICBibG9jay5zZXRMb2dpY2FsSGVpZ2h0KHNoYXBlSW5z
aWRlSW5mby0+bG9naWNhbExpbmVUb3AoKSAtIGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWlu
ZXIpOworICAgIH0KKworICAgIGxpbmVMb2dpY2FsVG9wID0gYmxvY2subG9naWNhbEhlaWdodCgp
ICsgbG9naWNhbE9mZnNldEZyb21TaGFwZUNvbnRhaW5lcjsKKworICAgIHNoYXBlSW5zaWRlSW5m
by0+dXBkYXRlU2VnbWVudHNGb3JMaW5lKGxpbmVMb2dpY2FsVG9wLCBsaW5lTG9naWNhbEhlaWdo
dCk7CisgICAgd2lkdGgudXBkYXRlQ3VycmVudFNoYXBlU2VnbWVudCgpOworICAgIHdpZHRoLnVw
ZGF0ZUF2YWlsYWJsZVdpZHRoKCk7Cit9CisjZW5kaWYKKworaW5saW5lIGJvb2wgaXRlcmF0b3JJ
c0JleW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQoY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0ZXIs
IFJlbmRlckNvbWJpbmVUZXh0JiByZW5kZXJlcikKK3sKKyAgICByZXR1cm4gaXRlci5tX29iaiA9
PSAmcmVuZGVyZXIgJiYgaXRlci5tX3BvcyA+PSByZW5kZXJlci50ZXh0TGVuZ3RoKCk7Cit9CisK
K2lubGluZSB2b2lkIG5leHRDaGFyYWN0ZXIoVUNoYXImIGN1cnJlbnRDaGFyYWN0ZXIsIFVDaGFy
JiBsYXN0Q2hhcmFjdGVyLCBVQ2hhciYgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyKQoreworICAgIHNl
Y29uZFRvTGFzdENoYXJhY3RlciA9IGxhc3RDaGFyYWN0ZXI7CisgICAgbGFzdENoYXJhY3RlciA9
IGN1cnJlbnRDaGFyYWN0ZXI7Cit9CisKKy8vIEZJWE1FOiBEb24ndCBsZXQgY291bnRlcnMgbWFy
ayB0aGVtc2VsdmVzIGFzIG5lZWRpbmcgcHJlZiB3aWR0aCByZWNhbGNzIGR1cmluZyBsYXlvdXQK
Ky8vIHNvIHdlIGRvbid0IG5lZWQgdGhpcyBoYWNrLgoraW5saW5lIHZvaWQgdXBkYXRlQ291bnRl
cklmTmVlZGVkKFJlbmRlclRleHQmIHJlbmRlclRleHQpCit7CisgICAgaWYgKCFyZW5kZXJUZXh0
LnByZWZlcnJlZExvZ2ljYWxXaWR0aHNEaXJ0eSgpIHx8ICFyZW5kZXJUZXh0LmlzQ291bnRlcigp
KQorICAgICAgICByZXR1cm47CisgICAgdG9SZW5kZXJDb3VudGVyKHJlbmRlclRleHQpLnVwZGF0
ZUNvdW50ZXIoKTsKK30KKworaW5saW5lIGZsb2F0IG1lYXN1cmVIeXBoZW5XaWR0aChSZW5kZXJU
ZXh0KiByZW5kZXJlciwgY29uc3QgRm9udCYgZm9udCwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250
RGF0YSo+KiBmYWxsYmFja0ZvbnRzID0gMCkKK3sKKyAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5
bGUgPSByZW5kZXJlci0+c3R5bGUoKTsKKyAgICByZXR1cm4gZm9udC53aWR0aChSZW5kZXJCbG9j
azo6Y29uc3RydWN0VGV4dFJ1bihyZW5kZXJlciwgZm9udCwgc3R5bGUuaHlwaGVuU3RyaW5nKCku
c3RyaW5nKCksIHN0eWxlKSwgZmFsbGJhY2tGb250cyk7Cit9CisKK0FMV0FZU19JTkxJTkUgZmxv
YXQgdGV4dFdpZHRoKFJlbmRlclRleHQqIHRleHQsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxl
biwgY29uc3QgRm9udCYgZm9udCwgZmxvYXQgeFBvcywgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wg
Y29sbGFwc2VXaGl0ZVNwYWNlLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4mIGZhbGxi
YWNrRm9udHMsIFRleHRMYXlvdXQqIGxheW91dCA9IDApCit7CisgICAgY29uc3QgUmVuZGVyU3R5
bGUmIHN0eWxlID0gdGV4dC0+c3R5bGUoKTsKKworICAgIEdseXBoT3ZlcmZsb3cgZ2x5cGhPdmVy
ZmxvdzsKKyAgICBpZiAoaXNGaXhlZFBpdGNoIHx8ICghZnJvbSAmJiBsZW4gPT0gdGV4dC0+dGV4
dExlbmd0aCgpKSB8fCBzdHlsZS5oYXNUZXh0Q29tYmluZSgpKQorICAgICAgICByZXR1cm4gdGV4
dC0+d2lkdGgoZnJvbSwgbGVuLCBmb250LCB4UG9zLCAmZmFsbGJhY2tGb250cywgJmdseXBoT3Zl
cmZsb3cpOworCisgICAgaWYgKGxheW91dCkKKyAgICAgICAgcmV0dXJuIEZvbnQ6OndpZHRoKCps
YXlvdXQsIGZyb20sIGxlbiwgJmZhbGxiYWNrRm9udHMpOworCisgICAgVGV4dFJ1biBydW4gPSBS
ZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bih0ZXh0LCBmb250LCB0ZXh0LCBmcm9tLCBsZW4s
IHN0eWxlKTsKKyAgICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LT50ZXh0TGVuZ3RoKCkg
LSBmcm9tKTsKKyAgICBBU1NFUlQocnVuLmNoYXJhY3RlcnNMZW5ndGgoKSA+PSBydW4ubGVuZ3Ro
KCkpOworCisgICAgcnVuLnNldENoYXJhY3RlclNjYW5Gb3JDb2RlUGF0aCghdGV4dC0+Y2FuVXNl
U2ltcGxlRm9udENvZGVQYXRoKCkpOworICAgIHJ1bi5zZXRUYWJTaXplKCFjb2xsYXBzZVdoaXRl
U3BhY2UsIHN0eWxlLnRhYlNpemUoKSk7CisgICAgcnVuLnNldFhQb3MoeFBvcyk7CisgICAgcmV0
dXJuIGZvbnQud2lkdGgocnVuLCAmZmFsbGJhY2tGb250cywgJmdseXBoT3ZlcmZsb3cpOworfQor
CisvLyBBZGRpbmcgYSBwYWlyIG9mIG1pZHBvaW50cyBiZWZvcmUgYSBjaGFyYWN0ZXIgd2lsbCBz
cGxpdCBpdCBvdXQgaW50byBhIG5ldyBsaW5lIGJveC4KK2lubGluZSB2b2lkIGVuc3VyZUNoYXJh
Y3RlckdldHNMaW5lQm94KExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgSW5s
aW5lSXRlcmF0b3ImIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IpCit7CisgICAgSW5saW5lSXRlcmF0
b3IgbWlkcG9pbnQoMCwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX29iaiwgdGV4dFBhcmFncmFw
aFNlcGFyYXRvci5tX3Bvcyk7CisgICAgc3RhcnRJZ25vcmluZ1NwYWNlcyhsaW5lTWlkcG9pbnRT
dGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX29iaiwgdGV4
dFBhcmFncmFwaFNlcGFyYXRvci5tX3BvcyAtIDEpKTsKKyAgICBzdG9wSWdub3JpbmdTcGFjZXMo
bGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIHRleHRQYXJhZ3JhcGhTZXBhcmF0
b3IubV9vYmosIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IubV9wb3MpKTsKK30KKworaW5saW5lIHZv
aWQgdHJ5SHlwaGVuYXRpbmcoUmVuZGVyVGV4dCogdGV4dCwgY29uc3QgRm9udCYgZm9udCwgY29u
c3QgQXRvbWljU3RyaW5nJiBsb2NhbGVJZGVudGlmaWVyLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5
cGhlbmF0ZWRMaW5lcywgaW50IGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzTGltaXQsIGludCBt
aW5pbXVtUHJlZml4TGltaXQsIGludCBtaW5pbXVtU3VmZml4TGltaXQsIHVuc2lnbmVkIGxhc3RT
cGFjZSwgdW5zaWduZWQgcG9zLCBmbG9hdCB4UG9zLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGJvb2wg
aXNGaXhlZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgaW50IGxhc3RTcGFjZVdvcmRT
cGFjaW5nLCBJbmxpbmVJdGVyYXRvciYgbGluZUJyZWFrLCBpbnQgbmV4dEJyZWFrYWJsZSwgYm9v
bCYgaHlwaGVuYXRlZCkKK3sKKyAgICAvLyBNYXAgJ2h5cGhlbmF0ZS1saW1pdC17YmVmb3JlLGFm
dGVyfTogYXV0bzsnIHRvIDIuCisgICAgdW5zaWduZWQgbWluaW11bVByZWZpeExlbmd0aDsKKyAg
ICB1bnNpZ25lZCBtaW5pbXVtU3VmZml4TGVuZ3RoOworCisgICAgaWYgKG1pbmltdW1QcmVmaXhM
aW1pdCA8IDApCisgICAgICAgIG1pbmltdW1QcmVmaXhMZW5ndGggPSAyOworICAgIGVsc2UKKyAg
ICAgICAgbWluaW11bVByZWZpeExlbmd0aCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihtaW5pbXVt
UHJlZml4TGltaXQpOworCisgICAgaWYgKG1pbmltdW1TdWZmaXhMaW1pdCA8IDApCisgICAgICAg
IG1pbmltdW1TdWZmaXhMZW5ndGggPSAyOworICAgIGVsc2UKKyAgICAgICAgbWluaW11bVN1ZmZp
eExlbmd0aCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihtaW5pbXVtU3VmZml4TGltaXQpOworCisg
ICAgaWYgKHBvcyAtIGxhc3RTcGFjZSA8PSBtaW5pbXVtU3VmZml4TGVuZ3RoKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBpZiAoY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXNMaW1pdCA+PSAwICYm
IGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzID49IHN0YXRpY19jYXN0PHVuc2lnbmVkPihjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50
IGh5cGhlbldpZHRoID0gbWVhc3VyZUh5cGhlbldpZHRoKHRleHQsIGZvbnQpOworCisgICAgZmxv
YXQgbWF4UHJlZml4V2lkdGggPSBhdmFpbGFibGVXaWR0aCAtIHhQb3MgLSBoeXBoZW5XaWR0aCAt
IGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAgIC8vIElmIHRoZSBtYXhpbXVtIHdpZHRoIGF2YWls
YWJsZSBmb3IgdGhlIHByZWZpeCBiZWZvcmUgdGhlIGh5cGhlbiBpcyBzbWFsbCwgdGhlbiBpdCBp
cyB2ZXJ5IHVubGlrZWx5CisgICAgLy8gdGhhdCBhbiBoeXBoZW5hdGlvbiBvcHBvcnR1bml0eSBl
eGlzdHMsIHNvIGRvIG5vdCBib3RoZXIgdG8gbG9vayBmb3IgaXQuCisgICAgaWYgKG1heFByZWZp
eFdpZHRoIDw9IGZvbnQucGl4ZWxTaXplKCkgKiA1IC8gNCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gdGV4dC0+c3R5bGUoKTsKKyAgICBUZXh0UnVu
IHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHRleHQsIGxh
c3RTcGFjZSwgcG9zIC0gbGFzdFNwYWNlLCBzdHlsZSk7CisgICAgcnVuLnNldENoYXJhY3RlcnNM
ZW5ndGgodGV4dC0+dGV4dExlbmd0aCgpIC0gbGFzdFNwYWNlKTsKKyAgICBBU1NFUlQocnVuLmNo
YXJhY3RlcnNMZW5ndGgoKSA+PSBydW4ubGVuZ3RoKCkpOworCisgICAgcnVuLnNldFRhYlNpemUo
IWNvbGxhcHNlV2hpdGVTcGFjZSwgc3R5bGUudGFiU2l6ZSgpKTsKKyAgICBydW4uc2V0WFBvcyh4
UG9zICsgbGFzdFNwYWNlV29yZFNwYWNpbmcpOworCisgICAgdW5zaWduZWQgcHJlZml4TGVuZ3Ro
ID0gZm9udC5vZmZzZXRGb3JQb3NpdGlvbihydW4sIG1heFByZWZpeFdpZHRoLCBmYWxzZSk7Cisg
ICAgaWYgKHByZWZpeExlbmd0aCA8IG1pbmltdW1QcmVmaXhMZW5ndGgpCisgICAgICAgIHJldHVy
bjsKKworICAgIHByZWZpeExlbmd0aCA9IGxhc3RIeXBoZW5Mb2NhdGlvbih0ZXh0LT5jaGFyYWN0
ZXJzKCkgKyBsYXN0U3BhY2UsIHBvcyAtIGxhc3RTcGFjZSwgc3RkOjptaW4ocHJlZml4TGVuZ3Ro
LCBwb3MgLSBsYXN0U3BhY2UgLSBtaW5pbXVtU3VmZml4TGVuZ3RoKSArIDEsIGxvY2FsZUlkZW50
aWZpZXIpOworICAgIGlmICghcHJlZml4TGVuZ3RoIHx8IHByZWZpeExlbmd0aCA8IG1pbmltdW1Q
cmVmaXhMZW5ndGgpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdoZW4gbGFzdFNhcGNlIGlz
IGEgc3BhY2UsIHdoaWNoIGl0IGFsd2F5cyBpcyBleGNlcHQgc29tZXRpbWVzIGF0IHRoZSBiZWdp
bm5pbmcgb2YgYSBsaW5lIG9yIGFmdGVyIGNvbGxhcHNlZAorICAgIC8vIHNwYWNlLCBpdCBzaG91
bGQgbm90IGNvdW50IHRvd2FyZHMgaHlwaGVuYXRlLWxpbWl0LWJlZm9yZS4KKyAgICBpZiAocHJl
Zml4TGVuZ3RoID09IG1pbmltdW1QcmVmaXhMZW5ndGgpIHsKKyAgICAgICAgVUNoYXIgY2hhcmFj
dGVyQXRMYXN0U3BhY2UgPSB0ZXh0LT5jaGFyYWN0ZXJBdChsYXN0U3BhY2UpOworICAgICAgICBp
ZiAoY2hhcmFjdGVyQXRMYXN0U3BhY2UgPT0gJyAnIHx8IGNoYXJhY3RlckF0TGFzdFNwYWNlID09
ICdcbicgfHwgY2hhcmFjdGVyQXRMYXN0U3BhY2UgPT0gJ1x0JyB8fCBjaGFyYWN0ZXJBdExhc3RT
cGFjZSA9PSBub0JyZWFrU3BhY2UpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
QVNTRVJUKHBvcyAtIGxhc3RTcGFjZSAtIHByZWZpeExlbmd0aCA+PSBtaW5pbXVtU3VmZml4TGVu
Z3RoKTsKKworI2lmICFBU1NFUlRfRElTQUJMRUQKKyAgICBIYXNoU2V0PGNvbnN0IFNpbXBsZUZv
bnREYXRhKj4gZmFsbGJhY2tGb250czsKKyAgICBmbG9hdCBwcmVmaXhXaWR0aCA9IGh5cGhlbldp
ZHRoICsgdGV4dFdpZHRoKHRleHQsIGxhc3RTcGFjZSwgcHJlZml4TGVuZ3RoLCBmb250LCB4UG9z
LCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgZmFsbGJhY2tGb250cykgKyBsYXN0
U3BhY2VXb3JkU3BhY2luZzsKKyAgICBBU1NFUlQoeFBvcyArIHByZWZpeFdpZHRoIDw9IGF2YWls
YWJsZVdpZHRoKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGlzRml4ZWRQaXRjaCk7CisjZW5k
aWYKKworICAgIGxpbmVCcmVhay5tb3ZlVG8odGV4dCwgbGFzdFNwYWNlICsgcHJlZml4TGVuZ3Ro
LCBuZXh0QnJlYWthYmxlKTsKKyAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKK30KKworaW5saW5lIGJv
b2wgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFz
dXJlbWVudHMsIGJvb2wmIGh5cGhlbmF0ZWQsICB1bnNpZ25lZCYgY29uc2VjdXRpdmVIeXBoZW5h
dGVkTGluZXMpCit7CisgICAgaWYgKCFtX2N1cnJlbnQubV9wb3MpCisgICAgICAgIG1fYXBwbGll
ZFN0YXJ0V2lkdGggPSBmYWxzZTsKKworICAgIFJlbmRlclRleHQqIHJlbmRlclRleHQgPSB0b1Jl
bmRlclRleHQobV9jdXJyZW50Lm1fb2JqKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgYm9vbCBp
c1NWR1RleHQgPSByZW5kZXJUZXh0LT5pc1NWR0lubGluZVRleHQoKTsKKyNlbmRpZgorCisgICAg
Ly8gSWYgd2UgaGF2ZSBsZWZ0IGEgbm8td3JhcCBpbmxpbmUgYW5kIGVudGVyZWQgYW4gYXV0b3dy
YXAgaW5saW5lIHdoaWxlIGlnbm9yaW5nIHNwYWNlcworICAgIC8vIHRoZW4gd2UgbmVlZCB0byBt
YXJrIHRoZSBzdGFydCBvZiB0aGUgYXV0b3dyYXAgaW5saW5lIGFzIGEgcG90ZW50aWFsIGxpbmVi
cmVhayBub3cuCisgICAgaWYgKG1fYXV0b1dyYXAgJiYgIVJlbmRlclN0eWxlOjphdXRvV3JhcCht
X2xhc3RXUykgJiYgbV9pZ25vcmluZ1NwYWNlcykKKyAgICAgICAgY29tbWl0TGluZUJyZWFrQXRD
dXJyZW50V2lkdGgobV9jdXJyZW50Lm1fb2JqKTsKKworICAgIGlmIChyZW5kZXJUZXh0LT5zdHls
ZSgpLmhhc1RleHRDb21iaW5lKCkgJiYgbV9jdXJyZW50Lm1fb2JqLT5pc0NvbWJpbmVUZXh0KCkg
JiYgIXRvUmVuZGVyQ29tYmluZVRleHQoKm1fY3VycmVudC5tX29iaikuaXNDb21iaW5lZCgpKSB7
CisgICAgICAgIFJlbmRlckNvbWJpbmVUZXh0JiBjb21iaW5lUmVuZGVyZXIgPSB0b1JlbmRlckNv
bWJpbmVUZXh0KCptX2N1cnJlbnQubV9vYmopOworICAgICAgICBjb21iaW5lUmVuZGVyZXIuY29t
YmluZVRleHQoKTsKKyAgICAgICAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcmVuZGVyZXIncyB0ZXh0
IG1heSBoYXZlIGNoYW5nZWQuIEluY3JlbWVudCBzdGFsZSBpdGVyYXRvciBwb3NpdGlvbnMKKyAg
ICAgICAgaWYgKGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KG1fbGluZUJy
ZWFrLCBjb21iaW5lUmVuZGVyZXIpKSB7CisgICAgICAgICAgICBBU1NFUlQoaXRlcmF0b3JJc0Jl
eW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQobV9yZXNvbHZlci5wb3NpdGlvbigpLCBjb21iaW5l
UmVuZGVyZXIpKTsKKyAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOworICAgICAg
ICAgICAgbV9yZXNvbHZlci5pbmNyZW1lbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNv
bnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IGxpbmVTdHlsZSgqcmVuZGVyVGV4dC0+cGFyZW50KCks
IG1fbGluZUluZm8pOworICAgIGNvbnN0IEZvbnQmIGZvbnQgPSBzdHlsZS5mb250KCk7CisgICAg
Ym9vbCBpc0ZpeGVkUGl0Y2ggPSBmb250LmlzRml4ZWRQaXRjaCgpOworICAgIGJvb2wgY2FuSHlw
aGVuYXRlID0gc3R5bGUuaHlwaGVucygpID09IEh5cGhlbnNBdXRvICYmIFdlYkNvcmU6OmNhbkh5
cGhlbmF0ZShzdHlsZS5sb2NhbGUoKSk7CisKKyAgICB1bnNpZ25lZCBsYXN0U3BhY2UgPSBtX2N1
cnJlbnQubV9wb3M7CisgICAgZmxvYXQgd29yZFNwYWNpbmcgPSBtX2N1cnJlbnRTdHlsZS0+d29y
ZFNwYWNpbmcoKTsKKyAgICBmbG9hdCBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IDA7CisgICAgZmxv
YXQgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAwOworCisgICAgZmxvYXQgd3JhcFcg
PSBtX3dpZHRoLnVuY29tbWl0dGVkV2lkdGgoKSArIGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJl
bnQubV9vYmosICFtX2FwcGxpZWRTdGFydFdpZHRoLCB0cnVlKTsKKyAgICBmbG9hdCBjaGFyV2lk
dGggPSAwOworICAgIGJvb2wgYnJlYWtOQlNQID0gbV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRTdHls
ZS0+bmJzcE1vZGUoKSA9PSBTUEFDRTsKKyAgICAvLyBBdXRvLXdyYXBwaW5nIHRleHQgc2hvdWxk
IHdyYXAgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgb25seSBpZiBpdCBjb3VsZCBub3Qgd3JhcCBi
ZWZvcmUgdGhlIHdvcmQsCisgICAgLy8gd2hpY2ggaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgd29y
ZCBpcyB0aGUgZmlyc3QgdGhpbmcgb24gdGhlIGxpbmUsIHRoYXQgaXMsIGlmIHx3fCBpcyB6ZXJv
LgorICAgIGJvb2wgYnJlYWtXb3JkcyA9IG1fY3VycmVudFN0eWxlLT5icmVha1dvcmRzKCkgJiYg
KChtX2F1dG9XcmFwICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHx8IG1fY3VycldTID09
IFBSRSk7CisgICAgYm9vbCBtaWRXb3JkQnJlYWsgPSBmYWxzZTsKKyAgICBib29sIGJyZWFrQWxs
ID0gbV9jdXJyZW50U3R5bGUtPndvcmRCcmVhaygpID09IEJyZWFrQWxsV29yZEJyZWFrICYmIG1f
YXV0b1dyYXA7CisgICAgZmxvYXQgaHlwaGVuV2lkdGggPSAwOworI2lmIEVOQUJMRShTVkcpCisg
ICAgaWYgKGlzU1ZHVGV4dCkgeworICAgICAgICBicmVha1dvcmRzID0gZmFsc2U7CisgICAgICAg
IGJyZWFrQWxsID0gZmFsc2U7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAobV9yZW5kZXJUZXh0
SW5mby5tX3RleHQgIT0gcmVuZGVyVGV4dCkgeworICAgICAgICB1cGRhdGVDb3VudGVySWZOZWVk
ZWQoKnJlbmRlclRleHQpOworICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fdGV4dCA9IHJlbmRl
clRleHQ7CisgICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9mb250ID0gJmZvbnQ7CisgICAgICAg
IG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgPSBmb250LmNyZWF0ZUxheW91dChyZW5kZXJUZXh0
LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSk7CisgICAgICAg
IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNldFN0cmluZ0FuZFJlbGVh
c2VJdGVyYXRvcihyZW5kZXJUZXh0LT50ZXh0KCksIHN0eWxlLmxvY2FsZSgpKTsKKyAgICB9IGVs
c2UgaWYgKG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgJiYgbV9yZW5kZXJUZXh0SW5mby5tX2Zv
bnQgIT0gJmZvbnQpIHsKKyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2ZvbnQgPSAmZm9udDsK
KyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xheW91dCA9IGZvbnQuY3JlYXRlTGF5b3V0KHJl
bmRlclRleHQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIG1fY29sbGFwc2VXaGl0ZVNwYWNlKTsK
KyAgICB9CisKKyAgICBUZXh0TGF5b3V0KiB0ZXh0TGF5b3V0ID0gbV9yZW5kZXJUZXh0SW5mby5t
X2xheW91dC5nZXQoKTsKKworICAgIC8vIE5vbi16ZXJvIG9ubHkgd2hlbiBrZXJuaW5nIGlzIGVu
YWJsZWQgYW5kIFRleHRMYXlvdXQgaXNuJ3QgdXNlZCwgaW4gd2hpY2ggY2FzZSB3ZSBtZWFzdXJl
CisgICAgLy8gd29yZHMgd2l0aCB0aGVpciB0cmFpbGluZyBzcGFjZSwgdGhlbiBzdWJ0cmFjdCBp
dHMgd2lkdGguCisgICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+IGZhbGxiYWNrRm9u
dHM7CisgICAgZmxvYXQgd29yZFRyYWlsaW5nU3BhY2VXaWR0aCA9IChmb250LnR5cGVzZXR0aW5n
RmVhdHVyZXMoKSAmIEtlcm5pbmcpICYmICF0ZXh0TGF5b3V0ID8gZm9udC53aWR0aChSZW5kZXJC
bG9jazo6Y29uc3RydWN0VGV4dFJ1bihyZW5kZXJUZXh0LCBmb250LCAmc3BhY2UsIDEsIHN0eWxl
KSwgJmZhbGxiYWNrRm9udHMpICsgd29yZFNwYWNpbmcgOiAwOworCisgICAgVUNoYXIgbGFzdENo
YXJhY3RlciA9IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5sYXN0Q2hhcmFj
dGVyKCk7CisgICAgVUNoYXIgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gbV9yZW5kZXJUZXh0SW5m
by5tX2xpbmVCcmVha0l0ZXJhdG9yLnNlY29uZFRvTGFzdENoYXJhY3RlcigpOworICAgIGZvciAo
OyBtX2N1cnJlbnQubV9wb3MgPCByZW5kZXJUZXh0LT50ZXh0TGVuZ3RoKCk7IG1fY3VycmVudC5m
YXN0SW5jcmVtZW50SW5UZXh0Tm9kZSgpKSB7CisgICAgICAgIGJvb2wgcHJldmlvdXNDaGFyYWN0
ZXJJc1NwYWNlID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKKyAgICAgICAgYm9vbCBwcmV2
aW91c0NoYXJhY3RlcklzV1MgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTOworICAgICAgICBVQ2hh
ciBjID0gbV9jdXJyZW50LmN1cnJlbnQoKTsKKyAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNT
cGFjZSA9IGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCAoIW1fcHJlc2VydmVzTmV3bGluZSAmJiAo
YyA9PSAnXG4nKSk7CisKKyAgICAgICAgaWYgKCFtX2NvbGxhcHNlV2hpdGVTcGFjZSB8fCAhbV9j
dXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKKyAgICAgICAgICAgIG1fbGluZUluZm8uc2V0RW1wdHko
ZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7CisKKyAgICAgICAgaWYgKGMgPT0gc29mdEh5cGhl
biAmJiBtX2F1dG9XcmFwICYmICFoeXBoZW5XaWR0aCAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlw
aGVuc05vbmUpIHsKKyAgICAgICAgICAgIGh5cGhlbldpZHRoID0gbWVhc3VyZUh5cGhlbldpZHRo
KHJlbmRlclRleHQsIGZvbnQsICZmYWxsYmFja0ZvbnRzKTsKKyAgICAgICAgICAgIG1fd2lkdGgu
YWRkVW5jb21taXR0ZWRXaWR0aChoeXBoZW5XaWR0aCk7CisgICAgICAgIH0KKworICAgICAgICBi
b29sIGFwcGx5V29yZFNwYWNpbmcgPSBmYWxzZTsKKworICAgICAgICBtX2N1cnJlbnRDaGFyYWN0
ZXJJc1dTID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSB8fCAoYnJlYWtOQlNQICYmIGMgPT0g
bm9CcmVha1NwYWNlKTsKKworICAgICAgICBpZiAoKGJyZWFrQWxsIHx8IGJyZWFrV29yZHMpICYm
ICFtaWRXb3JkQnJlYWsgJiYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlIHx8IHN0eWxlLndo
aXRlU3BhY2UoKSAhPSBQUkVfV1JBUCkpIHsKKyAgICAgICAgICAgIHdyYXBXICs9IGNoYXJXaWR0
aDsKKyAgICAgICAgICAgIGJvb2wgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID0g
VTE2X0lTX0xFQUQoYykgJiYgbV9jdXJyZW50Lm1fcG9zICsgMSA8IHJlbmRlclRleHQtPnRleHRM
ZW5ndGgoKSAmJiBVMTZfSVNfVFJBSUwoKCpyZW5kZXJUZXh0KVttX2N1cnJlbnQubV9wb3MgKyAx
XSk7CisgICAgICAgICAgICBjaGFyV2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbV9jdXJy
ZW50Lm1fcG9zLCBtaWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPyAyIDogMSwgZm9u
dCwgbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcsIGlzRml4ZWRQaXRjaCwgbV9jb2xs
YXBzZVdoaXRlU3BhY2UsIGZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOworICAgICAgICAgICAg
bWlkV29yZEJyZWFrID0gbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcgKyBjaGFyV2lk
dGggPiBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCk7CisgICAgICAgIH0KKworICAgICAgICBib29s
IGJldHdlZW5Xb3JkcyA9IGMgPT0gJ1xuJyB8fCAobV9jdXJyV1MgIT0gUFJFICYmICFtX2F0U3Rh
cnQgJiYgaXNCcmVha2FibGUobV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLCBt
X2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2FibGVQb3NpdGlvbiwgYnJlYWtO
QlNQKQorICAgICAgICAgICAgJiYgKHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSB8fCAo
bV9jdXJyZW50LnByZXZpb3VzSW5TYW1lTm9kZSgpICE9IHNvZnRIeXBoZW4pKSk7CisKKyAgICAg
ICAgaWYgKGJldHdlZW5Xb3JkcyB8fCBtaWRXb3JkQnJlYWspIHsKKyAgICAgICAgICAgIGJvb2wg
c3RvcHBlZElnbm9yaW5nU3BhY2VzID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobV9pZ25vcmlu
Z1NwYWNlcykgeworICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gMDsKKyAg
ICAgICAgICAgICAgICBpZiAoIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpIHsKKyAgICAgICAg
ICAgICAgICAgICAgLy8gU3RvcCBpZ25vcmluZyBzcGFjZXMgYW5kIGJlZ2luIGF0IHRoaXMKKyAg
ICAgICAgICAgICAgICAgICAgLy8gbmV3IHBvaW50LgorICAgICAgICAgICAgICAgICAgICBtX2ln
bm9yaW5nU3BhY2VzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHdvcmRTcGFjaW5nRm9y
V29yZE1lYXN1cmVtZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFNwYWNlID0gbV9j
dXJyZW50Lm1fcG9zOyAvLyBlLmcuLCAiRm9vICAgIGdvbyIsIGRvbid0IGFkZCBpbiBhbnkgb2Yg
dGhlIGlnbm9yZWQgc3BhY2VzLgorICAgICAgICAgICAgICAgICAgICBzdG9wSWdub3JpbmdTcGFj
ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50Lm1fb2Jq
LCBtX2N1cnJlbnQubV9wb3MpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcHBlZElnbm9yaW5n
U3BhY2VzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAg
ICAgICAvLyBKdXN0IGtlZXAgaWdub3JpbmcgdGhlc2Ugc3BhY2VzLgorICAgICAgICAgICAgICAg
ICAgICBuZXh0Q2hhcmFjdGVyKGMsIGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rl
cik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50cy5ncm93KHdvcmRNZWFz
dXJlbWVudHMuc2l6ZSgpICsgMSk7CisgICAgICAgICAgICBXb3JkTWVhc3VyZW1lbnQmIHdvcmRN
ZWFzdXJlbWVudCA9IHdvcmRNZWFzdXJlbWVudHMubGFzdCgpOworCisgICAgICAgICAgICB3b3Jk
TWVhc3VyZW1lbnQucmVuZGVyZXIgPSByZW5kZXJUZXh0OworICAgICAgICAgICAgd29yZE1lYXN1
cmVtZW50LmVuZE9mZnNldCA9IG1fY3VycmVudC5tX3BvczsKKyAgICAgICAgICAgIHdvcmRNZWFz
dXJlbWVudC5zdGFydE9mZnNldCA9IGxhc3RTcGFjZTsKKworICAgICAgICAgICAgZmxvYXQgYWRk
aXRpb25hbFRlbXBXaWR0aDsKKyAgICAgICAgICAgIGlmICh3b3JkVHJhaWxpbmdTcGFjZVdpZHRo
ICYmIGMgPT0gJyAnKQorICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggPSB0ZXh0
V2lkdGgocmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MgKyAxIC0gbGFzdFNw
YWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFw
c2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91dCkg
LSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbGFzdFNwYWNl
LCBtX2N1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVudFdpZHRo
KCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVudC5m
YWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKKworICAgICAgICAgICAgaWYgKHdvcmRNZWFzdXJl
bWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSAmJiAhZmFsbGJhY2tGb250cy5pc0VtcHR5KCkp
CisgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuc3dhcChmYWxs
YmFja0ZvbnRzKTsKKyAgICAgICAgICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKKworICAgICAg
ICAgICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0gYWRkaXRpb25hbFRlbXBXaWR0aCArIHdvcmRT
cGFjaW5nRm9yV29yZE1lYXN1cmVtZW50OworICAgICAgICAgICAgYWRkaXRpb25hbFRlbXBXaWR0
aCArPSBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKyAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21t
aXR0ZWRXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoKTsKKworICAgICAgICAgICAgaWYgKG1fY29s
bGFwc2VXaGl0ZVNwYWNlICYmIHByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSAmJiBtX2N1cnJlbnRD
aGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0aW9uYWxUZW1wV2lkdGgpCisgICAgICAgICAgICAgICAg
bV93aWR0aC5zZXRUcmFpbGluZ1doaXRlc3BhY2VXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoKTsK
KworICAgICAgICAgICAgaWYgKCFtX2FwcGxpZWRTdGFydFdpZHRoKSB7CisgICAgICAgICAgICAg
ICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJl
bnQubV9vYmosIHRydWUsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgbV9hcHBsaWVkU3RhcnRX
aWR0aCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyNpZiBFTkFCTEUoQ1NTX1NIQVBFUykKKyAg
ICAgICAgICAgIGlmIChtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpCisgICAgICAgICAgICAg
ICAgdXBkYXRlU2VnbWVudHNGb3JTaGFwZXMobV9ibG9jaywgbV9sYXN0RmxvYXRGcm9tUHJldmlv
dXNMaW5lLCB3b3JkTWVhc3VyZW1lbnRzLCBtX3dpZHRoLCBtX2xpbmVJbmZvLmlzRmlyc3RMaW5l
KCkpOworI2VuZGlmCisgICAgICAgICAgICBhcHBseVdvcmRTcGFjaW5nID0gd29yZFNwYWNpbmcg
JiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKKworICAgICAgICAgICAgaWYgKCFtX3dpZHRo
LmNvbW1pdHRlZFdpZHRoKCkgJiYgbV9hdXRvV3JhcCAmJiAhbV93aWR0aC5maXRzT25MaW5lKCkp
CisgICAgICAgICAgICAgICAgbV93aWR0aC5maXRCZWxvd0Zsb2F0cygpOworCisgICAgICAgICAg
ICBpZiAobV9hdXRvV3JhcCB8fCBicmVha1dvcmRzKSB7CisgICAgICAgICAgICAgICAgLy8gSWYg
d2UgYnJlYWsgb25seSBhZnRlciB3aGl0ZS1zcGFjZSwgY29uc2lkZXIgdGhlIGN1cnJlbnQgY2hh
cmFjdGVyCisgICAgICAgICAgICAgICAgLy8gYXMgY2FuZGlkYXRlIHdpZHRoIGZvciB0aGlzIGxp
bmUuCisgICAgICAgICAgICAgICAgYm9vbCBsaW5lV2FzVG9vV2lkZSA9IGZhbHNlOworICAgICAg
ICAgICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoKSAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlICYmIG1fY3VycmVudFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRlU3BhY2UoKSAmJiAh
bWlkV29yZEJyZWFrKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNoYXJXaWR0aCA9IHRl
eHRXaWR0aChyZW5kZXJUZXh0LCBtX2N1cnJlbnQubV9wb3MsIDEsIGZvbnQsIG1fd2lkdGguY3Vy
cmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFz
dXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSArIChhcHBseVdvcmRTcGFjaW5nID8g
d29yZFNwYWNpbmcgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGluZSBp
cyB0b28gYmlnIGV2ZW4gd2l0aG91dCB0aGUgZXh0cmEgc3BhY2UKKyAgICAgICAgICAgICAgICAg
ICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gSWYgaXQgaXMgbm90LCBkbyBub3RoaW5nLgor
ICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBuZWVkcyB0aGUgZXh0cmEgd2hpdGVz
cGFjZSB0byBiZSB0b28gbG9uZywKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBtb3ZlIHRo
ZSBsaW5lIGJyZWFrIHRvIHRoZSBzcGFjZSBhbmQgc2tpcCBhbGwKKyAgICAgICAgICAgICAgICAg
ICAgLy8gYWRkaXRpb25hbCB3aGl0ZXNwYWNlLgorICAgICAgICAgICAgICAgICAgICBpZiAoIW1f
d2lkdGguZml0c09uTGluZUluY2x1ZGluZ0V4dHJhV2lkdGgoY2hhcldpZHRoKSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgbGluZVdhc1Rvb1dpZGUgPSB0cnVlOworICAgICAgICAgICAgICAg
ICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1f
cG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOworICAgICAgICAgICAgICAg
ICAgICAgICAgbV9saW5lQnJlYWtlci5za2lwVHJhaWxpbmdXaGl0ZXNwYWNlKG1fbGluZUJyZWFr
LCBtX2xpbmVJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBpZiAobGluZVdhc1Rvb1dpZGUgfHwgIW1fd2lkdGguZml0c09uTGlu
ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYW5IeXBoZW5hdGUgJiYgIW1fd2lkdGgu
Zml0c09uTGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnlIeXBoZW5hdGluZyhy
ZW5kZXJUZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGlu
ZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMoKSwgc3R5bGUuaHlwaGVuYXRp
b25MaW1pdEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QWZ0ZXIoKSwgbGFzdFNwYWNl
LCBtX2N1cnJlbnQubV9wb3MsIG1fd2lkdGguY3VycmVudFdpZHRoKCkgLSBhZGRpdGlvbmFsVGVt
cFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBz
ZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBtX2xpbmVCcmVhaywgbV9jdXJyZW50
Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBtX2xpbmVCcmVha2VyLm1faHlwaGVuYXRlZCk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fbGluZUJy
ZWFrLmF0VGV4dFBhcmFncmFwaFNlcGFyYXRvcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQubV9wb3MgPiAwKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGlu
ZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2xp
bmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUluZm8u
c2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOworICAgICAgICAgICAgICAgICAgICAg
ICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm1fcG9zOworICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVhay5tX29i
aiAmJiBtX2xpbmVCcmVhay5tX3BvcyAmJiBtX2xpbmVCcmVhay5tX29iai0+aXNUZXh0KCkgJiYg
dG9SZW5kZXJUZXh0KG1fbGluZUJyZWFrLm1fb2JqKS0+dGV4dExlbmd0aCgpICYmIHRvUmVuZGVy
VGV4dChtX2xpbmVCcmVhay5tX29iaiktPmNoYXJhY3RlckF0KG1fbGluZUJyZWFrLm1fcG9zIC0g
MSkgPT0gc29mdEh5cGhlbiAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUpCisgICAg
ICAgICAgICAgICAgICAgICAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKG1fbGluZUJyZWFrLm1fcG9zICYmIG1fbGluZUJyZWFrLm1fcG9zICE9ICh1bnNpZ25l
ZCl3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ICYmICF3b3JkTWVhc3VyZW1lbnQud2lkdGgpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyV2lkdGgpIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9saW5lQnJlYWsubV9w
b3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0g
Y2hhcldpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgIC8vIERpZG4ndCBmaXQuIEp1bXAgdG8gdGhlIGVuZCB1
bmxlc3MgdGhlcmUncyBzdGlsbCBhbiBvcHBvcnR1bml0eSB0byBjb2xsYXBzZSB3aGl0ZXNwYWNl
LgorICAgICAgICAgICAgICAgICAgICBpZiAobV9pZ25vcmluZ1NwYWNlcyB8fCAhbV9jb2xsYXBz
ZVdoaXRlU3BhY2UgfHwgIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgfHwgIXByZXZpb3VzQ2hh
cmFjdGVySXNTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7
CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAo
IWJldHdlZW5Xb3JkcyB8fCAobWlkV29yZEJyZWFrICYmICFtX2F1dG9XcmFwKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aCgtYWRkaXRpb25hbFRl
bXBXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoeXBoZW5XaWR0aCkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gU3VidHJhY3QgdGhlIHdpZHRoIG9mIHRoZSBzb2Z0IGh5cGhl
biBvdXQgc2luY2Ugd2UgZml0IG9uIGEgbGluZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1f
d2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aCgtaHlwaGVuV2lkdGgpOworICAgICAgICAgICAgICAg
ICAgICAgICAgaHlwaGVuV2lkdGggPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYyA9PSAnXG4nICYm
IG1fcHJlc2VydmVzTmV3bGluZSkgeworICAgICAgICAgICAgICAgIGlmICghc3RvcHBlZElnbm9y
aW5nU3BhY2VzICYmIG1fY3VycmVudC5tX3BvcyA+IDApCisgICAgICAgICAgICAgICAgICAgIGVu
c3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7
CisgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9j
dXJyZW50Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOworICAgICAg
ICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOworICAgICAgICAgICAgICAgIG1fbGlu
ZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOworICAgICAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobV9hdXRvV3Jh
cCAmJiBiZXR3ZWVuV29yZHMpIHsKKyAgICAgICAgICAgICAgICBtX3dpZHRoLmNvbW1pdCgpOwor
ICAgICAgICAgICAgICAgIHdyYXBXID0gMDsKKyAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5t
b3ZlVG8obV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRC
cmVha2FibGVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgLy8gQXV0by13cmFwcGluZyB0ZXh0
IHNob3VsZCBub3Qgd3JhcCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBvbmNlIGl0IGhhcyBoYWQg
YW4KKyAgICAgICAgICAgICAgICAvLyBvcHBvcnR1bml0eSB0byBicmVhayBhZnRlciBhIHdvcmQu
CisgICAgICAgICAgICAgICAgYnJlYWtXb3JkcyA9IGZhbHNlOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBpZiAobWlkV29yZEJyZWFrICYmICFVMTZfSVNfVFJBSUwoYykgJiYgIShVX0dF
VF9HQ19NQVNLKGMpICYgVV9HQ19NX01BU0spKSB7CisgICAgICAgICAgICAgICAgLy8gUmVtZW1i
ZXIgdGhpcyBhcyBhIGJyZWFrYWJsZSBwb3NpdGlvbiBpbiBjYXNlCisgICAgICAgICAgICAgICAg
Ly8gYWRkaW5nIHRoZSBlbmQgd2lkdGggZm9yY2VzIGEgYnJlYWsuCisgICAgICAgICAgICAgICAg
bV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1fcG9zLCBtX2N1
cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOworICAgICAgICAgICAgICAgIG1pZFdvcmRC
cmVhayAmPSAoYnJlYWtXb3JkcyB8fCBicmVha0FsbCk7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGlmIChiZXR3ZWVuV29yZHMpIHsKKyAgICAgICAgICAgICAgICBsYXN0U3BhY2VXb3Jk
U3BhY2luZyA9IGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7CisgICAgICAgICAg
ICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAoYXBwbHlXb3JkU3BhY2luZyAm
JiB3b3JkTWVhc3VyZW1lbnQud2lkdGgpID8gd29yZFNwYWNpbmcgOiAwOworICAgICAgICAgICAg
ICAgIGxhc3RTcGFjZSA9IG1fY3VycmVudC5tX3BvczsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgaWYgKCFtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jb2xsYXBzZVdo
aXRlU3BhY2UoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGVuY291bnRlciBhIG5ld2xp
bmUsIG9yIGlmIHdlIGVuY291bnRlciBhCisgICAgICAgICAgICAgICAgLy8gc2Vjb25kIHNwYWNl
LCB3ZSBuZWVkIHRvIGdvIGFoZWFkIGFuZCBicmVhayB1cCB0aGlzCisgICAgICAgICAgICAgICAg
Ly8gcnVuIGFuZCBlbnRlciBhIG1vZGUgd2hlcmUgd2Ugc3RhcnQgY29sbGFwc2luZyBzcGFjZXMu
CisgICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgcHJldmlv
dXNDaGFyYWN0ZXJJc1NwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIG1faWdub3JpbmdTcGFj
ZXMgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGp1c3QgZW50ZXJlZCBhIG1v
ZGUgd2hlcmUgd2UgYXJlIGlnbm9yaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHNwYWNlcy4g
Q3JlYXRlIGEgbWlkcG9pbnQgdG8gdGVybWluYXRlIHRoZSBydW4KKyAgICAgICAgICAgICAgICAg
ICAgLy8gYmVmb3JlIHRoZSBzZWNvbmQgc3BhY2UuCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0
SWdub3JpbmdTcGFjZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9zdGFydE9mSWdub3JlZFNwYWNl
cyk7CisgICAgICAgICAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLnVwZGF0ZU1pZHBvaW50
c0ZvclRyYWlsaW5nQm94ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoKSwg
VHJhaWxpbmdPYmplY3RzOjpEb05vdENvbGxhcHNlRmlyc3RTcGFjZSk7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1faWdub3JpbmdTcGFjZXMp
IHsKKyAgICAgICAgICAgIC8vIFN0b3AgaWdub3Jpbmcgc3BhY2VzIGFuZCBiZWdpbiBhdCB0aGlz
CisgICAgICAgICAgICAvLyBuZXcgcG9pbnQuCisgICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2Vz
ID0gZmFsc2U7CisgICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IGFwcGx5V29yZFNw
YWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7CisgICAgICAgICAgICB3b3JkU3BhY2luZ0ZvcldvcmRN
ZWFzdXJlbWVudCA9IChhcHBseVdvcmRTcGFjaW5nICYmIHdvcmRNZWFzdXJlbWVudHMubGFzdCgp
LndpZHRoKSA/IHdvcmRTcGFjaW5nIDogMDsKKyAgICAgICAgICAgIGxhc3RTcGFjZSA9IG1fY3Vy
cmVudC5tX3BvczsgLy8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQgaW4gYW55IG9mIHRo
ZSBpZ25vcmVkIHNwYWNlcy4KKyAgICAgICAgICAgIHN0b3BJZ25vcmluZ1NwYWNlcyhtX2xpbmVN
aWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJlbnQubV9vYmosIG1fY3VycmVu
dC5tX3BvcykpOworICAgICAgICB9CisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgaWYgKGlzU1ZH
VGV4dCAmJiBtX2N1cnJlbnQubV9wb3MgPiAwKSB7CisgICAgICAgICAgICAvLyBGb3JjZSBjcmVh
dGlvbiBvZiBuZXcgSW5saW5lQm94ZXMgZm9yIGVhY2ggYWJzb2x1dGUgcG9zaXRpb25lZCBjaGFy
YWN0ZXIgKHRob3NlIHRoYXQgc3RhcnQgbmV3IHRleHQgY2h1bmtzKS4KKyAgICAgICAgICAgIGlm
ICh0b1JlbmRlclNWR0lubGluZVRleHQocmVuZGVyVGV4dCktPmNoYXJhY3RlclN0YXJ0c05ld1Rl
eHRDaHVuayhtX2N1cnJlbnQubV9wb3MpKQorICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3Rl
ckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7CisgICAgICAgIH0K
KyNlbmRpZgorCisgICAgICAgIGlmIChtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFwcmV2
aW91c0NoYXJhY3RlcklzU3BhY2UpIHsKKyAgICAgICAgICAgIG1fc3RhcnRPZklnbm9yZWRTcGFj
ZXMubV9vYmogPSBtX2N1cnJlbnQubV9vYmo7CisgICAgICAgICAgICBtX3N0YXJ0T2ZJZ25vcmVk
U3BhY2VzLm1fcG9zID0gbV9jdXJyZW50Lm1fcG9zOworICAgICAgICAgICAgLy8gU3BhY2VzIGFm
dGVyIHJpZ2h0LWFsaWduZWQgdGV4dCBhbmQgYmVmb3JlIGEgbGluZS1icmVhayBnZXQgY29sbGFw
c2VkIGF3YXkgY29tcGxldGVseSBzbyB0aGF0IHRoZSB0cmFpbGluZworICAgICAgICAgICAgLy8g
c3BhY2UgZG9lc24ndCBzZWVtIHRvIHB1c2ggdGhlIHRleHQgb3V0IGZyb20gdGhlIHJpZ2h0LWhh
bmQgZWRnZS4KKyAgICAgICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhl
IGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2VsaW5pbmcgYSBsb3Qg
b2YgdGVzdCByZXN1bHRzLgorICAgICAgICAgICAgaWYgKG1fbmV4dE9iamVjdCAmJiBtX25leHRP
YmplY3QtPmlzQlIoKSAmJiAobV9ibG9ja1N0eWxlLnRleHRBbGlnbigpID09IFJJR0hUIHx8IG1f
YmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfUklHSFQpKSB7CisgICAgICAgICAgICAg
ICAgbV9zdGFydE9mSWdub3JlZFNwYWNlcy5tX3Bvcy0tOworICAgICAgICAgICAgICAgIC8vIElm
IHRoZXJlJ3MganVzdCBhIHNpbmdsZSB0cmFpbGluZyBzcGFjZSBzdGFydCBpZ25vcmluZyBpdCBu
b3cgc28gaXQgY29sbGFwc2VzIGF3YXkuCisgICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudC5t
X3BvcyA9PSByZW5kZXJUZXh0LT50ZXh0TGVuZ3RoKCkgLSAxKQorICAgICAgICAgICAgICAgICAg
ICBzdGFydElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fc3RhcnRPZklnbm9y
ZWRTcGFjZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtX2N1
cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIHByZXZpb3VzQ2hhcmFjdGVySXNXUykgeworICAgICAg
ICAgICAgaWYgKG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUtPmJyZWFrT25seUFmdGVyV2hp
dGVTcGFjZSgpKQorICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQu
bV9vYmosIG1fY3VycmVudC5tX3BvcywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9u
KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX2NvbGxhcHNlV2hpdGVTcGFjZSAmJiBtX2N1
cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFtX2lnbm9yaW5nU3BhY2VzKQorICAgICAgICAgICAg
bV90cmFpbGluZ09iamVjdHMuc2V0VHJhaWxpbmdXaGl0ZXNwYWNlKHRvUmVuZGVyVGV4dChtX2N1
cnJlbnQubV9vYmopKTsKKyAgICAgICAgZWxzZSBpZiAoIW1fY3VycmVudFN0eWxlLT5jb2xsYXBz
ZVdoaXRlU3BhY2UoKSB8fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKKyAgICAgICAgICAg
IG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7CisKKyAgICAgICAgbV9hdFN0YXJ0ID0gZmFsc2U7
CisgICAgICAgIG5leHRDaGFyYWN0ZXIoYywgbGFzdENoYXJhY3Rlciwgc2Vjb25kVG9MYXN0Q2hh
cmFjdGVyKTsKKyAgICB9CisKKyAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0
b3Iuc2V0UHJpb3JDb250ZXh0KGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rlcik7
CisKKyAgICB3b3JkTWVhc3VyZW1lbnRzLmdyb3cod29yZE1lYXN1cmVtZW50cy5zaXplKCkgKyAx
KTsKKyAgICBXb3JkTWVhc3VyZW1lbnQmIHdvcmRNZWFzdXJlbWVudCA9IHdvcmRNZWFzdXJlbWVu
dHMubGFzdCgpOworICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9IHJlbmRlclRleHQ7CisK
KyAgICAvLyBJTVBPUlRBTlQ6IGN1cnJlbnQubV9wb3MgaXMgPiBsZW5ndGggaGVyZSEKKyAgICBm
bG9hdCBhZGRpdGlvbmFsVGVtcFdpZHRoID0gbV9pZ25vcmluZ1NwYWNlcyA/IDAgOiB0ZXh0V2lk
dGgocmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGZv
bnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRl
U3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKKyAgICB3
b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQgPSBsYXN0U3BhY2U7CisgICAgd29yZE1lYXN1cmVt
ZW50LmVuZE9mZnNldCA9IG1fY3VycmVudC5tX3BvczsKKyAgICB3b3JkTWVhc3VyZW1lbnQud2lk
dGggPSBtX2lnbm9yaW5nU3BhY2VzID8gMCA6IGFkZGl0aW9uYWxUZW1wV2lkdGggKyB3b3JkU3Bh
Y2luZ0ZvcldvcmRNZWFzdXJlbWVudDsKKyAgICBhZGRpdGlvbmFsVGVtcFdpZHRoICs9IGxhc3RT
cGFjZVdvcmRTcGFjaW5nOworCisgICAgZmxvYXQgaW5saW5lTG9naWNhbFRlbXBXaWR0aCA9IGlu
bGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQubV9vYmosICFtX2FwcGxpZWRTdGFydFdpZHRoLCBt
X2luY2x1ZGVFbmRXaWR0aCk7CisgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0
aW9uYWxUZW1wV2lkdGggKyBpbmxpbmVMb2dpY2FsVGVtcFdpZHRoKTsKKworICAgIGlmICh3b3Jk
TWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5pc0VtcHR5KCkgJiYgIWZhbGxiYWNrRm9udHMuaXNF
bXB0eSgpKQorICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5zd2FwKGZhbGxi
YWNrRm9udHMpOworICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKKworICAgIGlmIChtX2NvbGxh
cHNlV2hpdGVTcGFjZSAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0aW9uYWxU
ZW1wV2lkdGgpCisgICAgICAgIG1fd2lkdGguc2V0VHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoYWRk
aXRpb25hbFRlbXBXaWR0aCwgaW5saW5lTG9naWNhbFRlbXBXaWR0aCk7CisKKyAgICBtX2luY2x1
ZGVFbmRXaWR0aCA9IGZhbHNlOworCisgICAgaWYgKCFtX3dpZHRoLmZpdHNPbkxpbmUoKSkgewor
ICAgICAgICBpZiAoY2FuSHlwaGVuYXRlKQorICAgICAgICAgICAgdHJ5SHlwaGVuYXRpbmcocmVu
ZGVyVGV4dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVz
LCBtX2Jsb2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCksIHN0eWxlLmh5cGhlbmF0aW9u
TGltaXRCZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCksIGxhc3RTcGFjZSwg
bV9jdXJyZW50Lm1fcG9zLCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpIC0gYWRkaXRpb25hbFRlbXBX
aWR0aCwgbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VX
aGl0ZVNwYWNlLCBsYXN0U3BhY2VXb3JkU3BhY2luZywgbV9saW5lQnJlYWssIG1fY3VycmVudC5t
X25leHRCcmVha2FibGVQb3NpdGlvbiwgbV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQpOworCisg
ICAgICAgIGlmICghaHlwaGVuYXRlZCAmJiBtX2xpbmVCcmVhay5wcmV2aW91c0luU2FtZU5vZGUo
KSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkgeworICAg
ICAgICAgICAgaHlwaGVuYXRlZCA9IHRydWU7CisgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsK
KyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIHRl
eHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRpb24oUmVuZGVyT2JqZWN0KiBuZXh0KQoreworICAg
IEFTU0VSVChuZXh0LT5pc1RleHQoKSk7CisgICAgUmVuZGVyVGV4dCogbmV4dFRleHQgPSB0b1Jl
bmRlclRleHQobmV4dCk7CisgICAgaWYgKCFuZXh0VGV4dC0+dGV4dExlbmd0aCgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgVUNoYXIgYyA9IG5leHRUZXh0LT5jaGFyYWN0ZXJBdCgwKTsK
KyAgICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IChjID09ICdcbicgJiYgIW5leHRU
ZXh0LT5wcmVzZXJ2ZXNOZXdsaW5lKCkpOworfQorCitpbmxpbmUgYm9vbCBCcmVha2luZ0NvbnRl
eHQ6OmNhbkJyZWFrQXRUaGlzUG9zaXRpb24oKQoreworICAgIC8vIElmIHdlIGFyZSBuby13cmFw
IGFuZCBoYXZlIGZvdW5kIGEgbGluZS1icmVha2luZyBvcHBvcnR1bml0eSBhbHJlYWR5IHRoZW4g
d2Ugc2hvdWxkIHRha2UgaXQuCisgICAgaWYgKG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiAh
bV93aWR0aC5maXRzT25MaW5lKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpICYmIG1fY3VycldT
ID09IE5PV1JBUCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBBdm9pZCBicmVha2lu
ZyBiZWZvcmUgZW1wdHkgaW5saW5lcy4KKyAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1fbmV4dE9i
amVjdC0+aXNSZW5kZXJJbmxpbmUoKSAmJiBpc0VtcHR5SW5saW5lKHRvUmVuZGVySW5saW5lKCpt
X25leHRPYmplY3QpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gUmV0dXJuIGVh
cmx5IGlmIHdlIGF1dG93cmFwIGFuZCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYSBzcGFjZSBh
cyB3ZSB3aWxsIGFsd2F5cyB3YW50IHRvIGJyZWFrIGF0IHN1Y2ggYSBwb3NpdGlvbi4KKyAgICBp
ZiAobV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5pc0xpbmVC
cmVha09wcG9ydHVuaXR5KCkpCisgICAgICAgIHJldHVybiBtX2F1dG9XcmFwOworCisgICAgYm9v
bCBuZXh0SXNBdXRvV3JhcHBpbmdUZXh0ID0gKG1fbmV4dE9iamVjdCAmJiBtX25leHRPYmplY3Qt
PmlzVGV4dCgpICYmIChtX2F1dG9XcmFwIHx8IG1fbmV4dE9iamVjdC0+c3R5bGUoKS5hdXRvV3Jh
cCgpKSk7CisgICAgaWYgKCFuZXh0SXNBdXRvV3JhcHBpbmdUZXh0KQorICAgICAgICByZXR1cm4g
bV9hdXRvV3JhcDsKKyAgICBib29sIGN1cnJlbnRJc1RleHRPckVtcHR5SW5saW5lID0gbV9jdXJy
ZW50Lm1fb2JqLT5pc1RleHQoKSB8fCAobV9jdXJyZW50Lm1fb2JqLT5pc1JlbmRlcklubGluZSgp
ICYmIGlzRW1wdHlJbmxpbmUodG9SZW5kZXJJbmxpbmUoKm1fY3VycmVudC5tX29iaikpKTsKKyAg
ICBpZiAoIWN1cnJlbnRJc1RleHRPckVtcHR5SW5saW5lKQorICAgICAgICByZXR1cm4gbV9hdXRv
V3JhcDsKKworICAgIGJvb2wgY2FuQnJlYWtIZXJlID0gIW1fY3VycmVudENoYXJhY3RlcklzU3Bh
Y2UgJiYgdGV4dEJlZ2luc1dpdGhCcmVha2FibGVQb3NpdGlvbihtX25leHRPYmplY3QpOworCisg
ICAgLy8gU2VlIGlmIGF0dGVtcHRpbmcgdG8gZml0IGJlbG93IGZsb2F0cyBjcmVhdGVzIG1vcmUg
YXZhaWxhYmxlIHdpZHRoIG9uIHRoZSBsaW5lLgorICAgIGlmICghbV93aWR0aC5maXRzT25MaW5l
KCkgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSkKKyAgICAgICAgbV93aWR0aC5maXRCZWxv
d0Zsb2F0cygpOworCisgICAgYm9vbCBjYW5QbGFjZU9uTGluZSA9IG1fd2lkdGguZml0c09uTGlu
ZSgpIHx8ICFtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmU7CisKKyAgICBpZiAoY2FuUGxhY2VP
bkxpbmUgJiYgY2FuQnJlYWtIZXJlKQorICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRX
aWR0aChtX25leHRPYmplY3QpOworCisgICAgcmV0dXJuIGNhbkJyZWFrSGVyZTsKK30KKworaW5s
aW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojpjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJZk5lZWRl
ZCgpCit7CisgICAgYm9vbCBjaGVja0ZvckJyZWFrID0gY2FuQnJlYWtBdFRoaXNQb3NpdGlvbigp
OworCisgICAgaWYgKGNoZWNrRm9yQnJlYWsgJiYgIW1fd2lkdGguZml0c09uTGluZShtX2lnbm9y
aW5nU3BhY2VzKSkgeworICAgICAgICAvLyBpZiB3ZSBoYXZlIGZsb2F0cywgdHJ5IHRvIGdldCBi
ZWxvdyB0aGVtLgorICAgICAgICBpZiAobV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhbV9p
Z25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VXaGl0ZVNwYWNlKCkpCisg
ICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOworCisgICAgICAgIGlmIChtX3dp
ZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsKKyAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbV93aWR0aC5maXRCZWxvd0Zs
b2F0cygpOworCisgICAgICAgIC8vIHx3aWR0aHwgbWF5IGhhdmUgYmVlbiBhZGp1c3RlZCBiZWNh
dXNlIHdlIGdvdCBzaG92ZWQgZG93biBwYXN0IGEgZmxvYXQgKHRodXMKKyAgICAgICAgLy8gZ2l2
aW5nIHVzIG1vcmUgcm9vbSksIHNvIHdlIG5lZWQgdG8gcmV0ZXN0LCBhbmQgb25seSBqdW1wIHRv
CisgICAgICAgIC8vIHRoZSBlbmQgbGFiZWwgaWYgd2Ugc3RpbGwgZG9uJ3QgZml0IG9uIHRoZSBs
aW5lLiAtZHdoCisgICAgICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lKG1faWdub3JpbmdTcGFj
ZXMpKSB7CisgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobV9ibG9ja1N0eWxlLmF1dG9XcmFwKCkgJiYgIW1f
d2lkdGguZml0c09uTGluZSgpICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsKKyAgICAg
ICAgLy8gSWYgdGhlIGNvbnRhaW5lciBhdXRvd3JhcHMgYnV0IHRoZSBjdXJyZW50IGNoaWxkIGRv
ZXMgbm90IHRoZW4gd2Ugc3RpbGwgbmVlZCB0byBlbnN1cmUgdGhhdCBpdAorICAgICAgICAvLyB3
cmFwcyBhbmQgbW92ZXMgYmVsb3cgYW55IGZsb2F0cy4KKyAgICAgICAgbV93aWR0aC5maXRCZWxv
d0Zsb2F0cygpOworICAgIH0KKworICAgIGlmICghbV9jdXJyZW50Lm1fb2JqLT5pc0Zsb2F0aW5n
T3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgbV9sYXN0T2JqZWN0ID0gbV9jdXJy
ZW50Lm1fb2JqOworICAgICAgICBpZiAobV9sYXN0T2JqZWN0LT5pc1JlcGxhY2VkKCkgJiYgbV9h
dXRvV3JhcCAmJiAoIW1fbGFzdE9iamVjdC0+aXNJbWFnZSgpIHx8IG1fYWxsb3dJbWFnZXNUb0Jy
ZWFrKSAmJiAoIW1fbGFzdE9iamVjdC0+aXNMaXN0TWFya2VyKCkgfHwgdG9SZW5kZXJMaXN0TWFy
a2VyKCptX2xhc3RPYmplY3QpLmlzSW5zaWRlKCkpKSB7CisgICAgICAgICAgICBtX3dpZHRoLmNv
bW1pdCgpOworICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvU3RhcnRPZihtX25leHRPYmpl
Y3QpOworICAgICAgICB9CisgICAgfQorfQorCitpbmxpbmUgdm9pZCBjaGVja01pZHBvaW50cyhM
aW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yJiBsQnJl
YWspCit7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIG91ciBsYXN0IG1pZHBvaW50IGlzIGEgc3Rh
cnQgcG9pbnQgYmV5b25kIHRoZSBsaW5lIGJyZWFrLiBJZiBzbywKKyAgICAvLyBzaGF2ZSBpdCBv
ZmYgdGhlIGxpc3QsIGFuZCBzaGF2ZSBvZmYgYSB0cmFpbGluZyBzcGFjZSBpZiB0aGUgcHJldmlv
dXMgZW5kIHBvaW50IGRvZXNuJ3QKKyAgICAvLyBwcmVzZXJ2ZSB3aGl0ZXNwYWNlLgorICAgIGlm
IChsQnJlYWsubV9vYmogJiYgbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzICYmICEobGlu
ZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzICUgMikpIHsKKyAgICAgICAgSW5saW5lSXRlcmF0
b3IqIG1pZHBvaW50cyA9IGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50cy5kYXRhKCk7CisgICAg
ICAgIElubGluZUl0ZXJhdG9yJiBlbmRwb2ludCA9IG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0
ZS5udW1NaWRwb2ludHMgLSAyXTsKKyAgICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3ImIHN0YXJ0
cG9pbnQgPSBtaWRwb2ludHNbbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzIC0gMV07Cisg
ICAgICAgIElubGluZUl0ZXJhdG9yIGN1cnJwb2ludCA9IGVuZHBvaW50OworICAgICAgICB3aGls
ZSAoIWN1cnJwb2ludC5hdEVuZCgpICYmIGN1cnJwb2ludCAhPSBzdGFydHBvaW50ICYmIGN1cnJw
b2ludCAhPSBsQnJlYWspCisgICAgICAgICAgICBjdXJycG9pbnQuaW5jcmVtZW50KCk7CisgICAg
ICAgIGlmIChjdXJycG9pbnQgPT0gbEJyZWFrKSB7CisgICAgICAgICAgICAvLyBXZSBoaXQgdGhl
IGxpbmUgYnJlYWsgYmVmb3JlIHRoZSBzdGFydCBwb2ludC4gU2hhdmUgb2ZmIHRoZSBzdGFydCBw
b2ludC4KKyAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cy0tOworICAg
ICAgICAgICAgaWYgKGVuZHBvaW50Lm1fb2JqLT5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgp
ICYmIGVuZHBvaW50Lm1fb2JqLT5pc1RleHQoKSkKKyAgICAgICAgICAgICAgICBlbmRwb2ludC5t
X3Bvcy0tOworICAgICAgICB9CisgICAgfQorfQorCitJbmxpbmVJdGVyYXRvciBCcmVha2luZ0Nv
bnRleHQ6OmhhbmRsZUVuZE9mTGluZSgpCit7CisjaWYgRU5BQkxFKENTU19TSEFQRVMpCisgICAg
U2hhcGVJbnNpZGVJbmZvKiBzaGFwZUluZm8gPSBtX2Jsb2NrLmxheW91dFNoYXBlSW5zaWRlSW5m
bygpOworICAgIGJvb2wgc2VnbWVudEFsbG93c092ZXJmbG93ID0gIXNoYXBlSW5mbyB8fCAhc2hh
cGVJbmZvLT5oYXNTZWdtZW50cygpOworI2Vsc2UKKyAgICBib29sIHNlZ21lbnRBbGxvd3NPdmVy
ZmxvdyA9IHRydWU7CisjZW5kaWYKKyAgICBpZiAoc2VnbWVudEFsbG93c092ZXJmbG93KSB7Cisg
ICAgICAgIGlmIChtX2xpbmVCcmVhayA9PSBtX3Jlc29sdmVyLnBvc2l0aW9uKCkpIHsKKyAgICAg
ICAgICAgIGlmICghbV9saW5lQnJlYWsubV9vYmogfHwgIW1fbGluZUJyZWFrLm1fb2JqLT5pc0JS
KCkpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGFkZCBhcyBtdWNoIGFzIHBvc3NpYmxl
CisgICAgICAgICAgICAgICAgaWYgKG1fYmxvY2tTdHlsZS53aGl0ZVNwYWNlKCkgPT0gUFJFICYm
ICFtX2N1cnJlbnQubV9wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92
ZVRvKG1fbGFzdE9iamVjdCwgbV9sYXN0T2JqZWN0LT5pc1RleHQoKSA/IG1fbGFzdE9iamVjdC0+
bGVuZ3RoKCkgOiAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fbGluZUJyZWFrLm1f
b2JqKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGV2ZXIgYnJlYWsgaW4gdGhlIG1p
ZGRsZSBvZiBhIHdvcmQgaWYgd2UgY2FuIGhlbHAgaXQuCisgICAgICAgICAgICAgICAgICAgIC8v
IFRoZXJlJ3Mgbm8gcm9vbSBhdCBhbGwuIFdlIGp1c3QgaGF2ZSB0byBiZSBvbiB0aGlzIGxpbmUs
CisgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gdGhvdWdoIHdlJ2xsIHNwaWxsIG91dC4KKyAg
ICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9j
dXJyZW50Lm1fcG9zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICAvLyBtYWtlIHN1cmUgd2UgY29uc3VtZSBhdCBsZWFzdCBvbmUgY2hhci9vYmplY3QuCisg
ICAgICAgICAgICBpZiAobV9saW5lQnJlYWsgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigpKQorICAg
ICAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOworICAgICAgICB9IGVsc2UgaWYg
KCFtX2N1cnJlbnQubV9wb3MgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiBtX3dpZHRo
LnVuY29tbWl0dGVkV2lkdGgoKSAmJiAhbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVu
dCkgeworICAgICAgICAgICAgLy8gRG8gbm90IHB1c2ggdGhlIGN1cnJlbnQgb2JqZWN0IHRvIHRo
ZSBuZXh0IGxpbmUsIHdoZW4gdGhpcyBsaW5lIGhhcyBzb21lIGNvbnRlbnQsIGJ1dCBpdCBpcyBz
dGlsbCBjb25zaWRlcmVkIGVtcHR5LgorICAgICAgICAgICAgLy8gRW1wdHkgaW5saW5lIGVsZW1l
bnRzIGxpa2UgPHNwYW4+PC9zcGFuPiBjYW4gcHJvZHVjZSBzdWNoIGxpbmVzIGFuZCBub3cgd2Ug
anVzdCBpZ25vcmUgdGhlc2UgYnJlYWsgb3Bwb3J0dW5pdGllcworICAgICAgICAgICAgLy8gYXQg
dGhlIHN0YXJ0IG9mIGEgbGluZSwgaWYgbm8gd2lkdGggaGFzIGJlZW4gY29tbWl0dGVkIHlldC4K
KyAgICAgICAgICAgIC8vIEJlaGF2ZSBhcyBpZiBpdCB3YXMgYWN0dWFsbHkgZW1wdHkgYW5kIGNv
bnN1bWUgYXQgbGVhc3Qgb25lIG9iamVjdC4KKyAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3Jl
bWVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2FuaXR5IGNoZWNrIG91ciBtaWRw
b2ludHMuCisgICAgY2hlY2tNaWRwb2ludHMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5lQnJl
YWspOworCisgICAgbV90cmFpbGluZ09iamVjdHMudXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxpbmdC
b3hlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2xpbmVCcmVhaywgVHJhaWxpbmdPYmplY3RzOjpD
b2xsYXBzZUZpcnN0U3BhY2UpOworCisgICAgLy8gV2UgbWlnaHQgaGF2ZSBtYWRlIGxpbmVCcmVh
ayBhbiBpdGVyYXRvciB0aGF0IHBvaW50cyBwYXN0IHRoZSBlbmQKKyAgICAvLyBvZiB0aGUgb2Jq
ZWN0LiBEbyB0aGlzIGFkanVzdG1lbnQgdG8gbWFrZSBpdCBwb2ludCB0byB0aGUgc3RhcnQKKyAg
ICAvLyBvZiB0aGUgbmV4dCBvYmplY3QgaW5zdGVhZCB0byBhdm9pZCBjb25mdXNpbmcgdGhlIHJl
c3Qgb2YgdGhlCisgICAgLy8gY29kZS4KKyAgICBpZiAobV9saW5lQnJlYWsubV9wb3MgPiAwKSB7
CisgICAgICAgIG1fbGluZUJyZWFrLm1fcG9zLS07CisgICAgICAgIG1fbGluZUJyZWFrLmluY3Jl
bWVudCgpOworICAgIH0KKworICAgIHJldHVybiBtX2xpbmVCcmVhazsKK30KKworfQorCisjZW5k
aWYgLy8gQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVyc19oCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uY2I5M2JiYwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9saW5lL0xpbmVCcmVha2VyLmNwcApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDAwIExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5j
LiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2gg
PHNoaXZhbWlkb3dAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3Rl
bXMgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgor
ICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3Rvbiwg
TUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiTGluZUJyZWFrZXIuaCIKKworI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0LmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBMaW5lQnJlYWtlcjo6cmVzZXQoKQoreworICAg
IG1fcG9zaXRpb25lZE9iamVjdHMuY2xlYXIoKTsKKyAgICBtX2h5cGhlbmF0ZWQgPSBmYWxzZTsK
KyAgICBtX2NsZWFyID0gQ05PTkU7Cit9CisKKy8vIEZJWE1FOiBUaGUgZW50aXJlIGNvbmNlcHQg
b2YgdGhlIHNraXBUcmFpbGluZ1doaXRlc3BhY2UgZnVuY3Rpb24gaXMgZmxhd2VkLCBzaW5jZSB3
ZSByZWFsbHkgbmVlZCB0byBiZSBidWlsZGluZworLy8gbGluZSBib3hlcyBldmVuIGZvciBjb250
YWluZXJzIHRoYXQgbWF5IHVsdGltYXRlbHkgY29sbGFwc2UgYXdheS4gT3RoZXJ3aXNlIHdlJ2xs
IG5ldmVyIGdldCBwb3NpdGlvbmVkCisvLyBlbGVtZW50cyBxdWl0ZSByaWdodC4gSW4gb3RoZXIg
d29yZHMsIHdlIG5lZWQgdG8gYnVpbGQgdGhpcyBmdW5jdGlvbidzIHdvcmsgaW50byB0aGUgbm9y
bWFsIGxpbmUKKy8vIG9iamVjdCBpdGVyYXRpb24gcHJvY2Vzcy4KKy8vIE5CLiB0aGlzIGZ1bmN0
aW9uIHdpbGwgaW5zZXJ0IGFueSBmbG9hdGluZyBlbGVtZW50cyB0aGF0IHdvdWxkIG90aGVyd2lz
ZQorLy8gYmUgc2tpcHBlZCBidXQgaXQgd2lsbCBub3QgcG9zaXRpb24gdGhlbS4KK3ZvaWQgTGlu
ZUJyZWFrZXI6OnNraXBUcmFpbGluZ1doaXRlc3BhY2UoSW5saW5lSXRlcmF0b3ImIGl0ZXJhdG9y
LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCit7CisgICAgd2hpbGUgKCFpdGVyYXRvci5hdEVu
ZCgpICYmICFyZXF1aXJlc0xpbmVCb3goaXRlcmF0b3IsIGxpbmVJbmZvLCBUcmFpbGluZ1doaXRl
c3BhY2UpKSB7CisgICAgICAgIFJlbmRlck9iamVjdCYgb2JqZWN0ID0gKml0ZXJhdG9yLm1fb2Jq
OworICAgICAgICBpZiAob2JqZWN0LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQorICAgICAgICAg
ICAgc2V0U3RhdGljUG9zaXRpb25zKG1fYmxvY2ssIHRvUmVuZGVyQm94KG9iamVjdCkpOworICAg
ICAgICBlbHNlIGlmIChvYmplY3QuaXNGbG9hdGluZygpKQorICAgICAgICAgICAgbV9ibG9jay5p
bnNlcnRGbG9hdGluZ09iamVjdCh0b1JlbmRlckJveChvYmplY3QpKTsKKyAgICAgICAgaXRlcmF0
b3IuaW5jcmVtZW50KCk7CisgICAgfQorfQorCit2b2lkIExpbmVCcmVha2VyOjpza2lwTGVhZGlu
Z1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgTGluZUluZm8mIGxpbmVJ
bmZvLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgTGluZVdpZHRo
JiB3aWR0aCkKK3sKKyAgICB3aGlsZSAoIXJlc29sdmVyLnBvc2l0aW9uKCkuYXRFbmQoKSAmJiAh
cmVxdWlyZXNMaW5lQm94KHJlc29sdmVyLnBvc2l0aW9uKCksIGxpbmVJbmZvLCBMZWFkaW5nV2hp
dGVzcGFjZSkpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0JiBvYmplY3QgPSAqcmVzb2x2ZXIucG9z
aXRpb24oKS5tX29iajsKKyAgICAgICAgaWYgKG9iamVjdC5pc091dE9mRmxvd1Bvc2l0aW9uZWQo
KSkgeworICAgICAgICAgICAgc2V0U3RhdGljUG9zaXRpb25zKG1fYmxvY2ssIHRvUmVuZGVyQm94
KG9iamVjdCkpOworICAgICAgICAgICAgaWYgKG9iamVjdC5zdHlsZSgpLmlzT3JpZ2luYWxEaXNw
bGF5SW5saW5lVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgcmVzb2x2ZXIucnVucygpLmFkZFJ1
bihuZXcgQmlkaVJ1bigwLCAxLCBvYmplY3QsIHJlc29sdmVyLmNvbnRleHQoKSwgcmVzb2x2ZXIu
ZGlyKCkpKTsKKyAgICAgICAgICAgICAgICBsaW5lSW5mby5pbmNyZW1lbnRSdW5zRnJvbUxlYWRp
bmdXaGl0ZXNwYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0
LmlzRmxvYXRpbmcoKSkgeworICAgICAgICAgICAgLy8gVGhlIHRvcCBtYXJnaW4gZWRnZSBvZiBh
IHNlbGYtY29sbGFwc2luZyBibG9jayB0aGF0IGNsZWFycyBhIGZsb2F0IGludHJ1ZGVzIHVwIGlu
dG8gaXQgYnkgdGhlIGhlaWdodCBvZiB0aGUgbWFyZ2luLAorICAgICAgICAgICAgLy8gc28gaW4g
b3JkZXIgdG8gcGxhY2UgdGhpcyBmaXJzdCBjaGlsZCBmbG9hdCBhdCB0aGUgdG9wIGNvbnRlbnQg
ZWRnZSBvZiB0aGUgc2VsZi1jb2xsYXBzaW5nIGJsb2NrIGFkZCB0aGUgbWFyZ2luIGJhY2sgaW4g
YmVmb3JlIHBsYWNlbWVudC4KKyAgICAgICAgICAgIExheW91dFVuaXQgbWFyZ2luT2Zmc2V0ID0g
KCFvYmplY3QucHJldmlvdXNTaWJsaW5nKCkgJiYgbV9ibG9jay5pc1NlbGZDb2xsYXBzaW5nQmxv
Y2soKSAmJiBtX2Jsb2NrLnN0eWxlKCkuY2xlYXIoKSAmJiBtX2Jsb2NrLmdldENsZWFyRGVsdGEo
bV9ibG9jaywgTGF5b3V0VW5pdCgpKSkgPyBtX2Jsb2NrLmNvbGxhcHNlZE1hcmdpbkJlZm9yZUZv
ckNoaWxkKG1fYmxvY2spIDogTGF5b3V0VW5pdCgpOworICAgICAgICAgICAgTGF5b3V0VW5pdCBv
bGRMb2dpY2FsSGVpZ2h0ID0gbV9ibG9jay5sb2dpY2FsSGVpZ2h0KCk7CisgICAgICAgICAgICBt
X2Jsb2NrLnNldExvZ2ljYWxIZWlnaHQob2xkTG9naWNhbEhlaWdodCArIG1hcmdpbk9mZnNldCk7
CisgICAgICAgICAgICBtX2Jsb2NrLnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUobV9ibG9jay5pbnNl
cnRGbG9hdGluZ09iamVjdCh0b1JlbmRlckJveChvYmplY3QpKSwgbGFzdEZsb2F0RnJvbVByZXZp
b3VzTGluZSwgbGluZUluZm8sIHdpZHRoKTsKKyAgICAgICAgICAgIG1fYmxvY2suc2V0TG9naWNh
bEhlaWdodChvbGRMb2dpY2FsSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QuaXNU
ZXh0KCkgJiYgb2JqZWN0LnN0eWxlKCkuaGFzVGV4dENvbWJpbmUoKSAmJiBvYmplY3QuaXNDb21i
aW5lVGV4dCgpICYmICF0b1JlbmRlckNvbWJpbmVUZXh0KG9iamVjdCkuaXNDb21iaW5lZCgpKSB7
CisgICAgICAgICAgICB0b1JlbmRlckNvbWJpbmVUZXh0KG9iamVjdCkuY29tYmluZVRleHQoKTsK
KyAgICAgICAgICAgIGlmICh0b1JlbmRlckNvbWJpbmVUZXh0KG9iamVjdCkuaXNDb21iaW5lZCgp
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHJlc29sdmVy
LmluY3JlbWVudCgpOworICAgIH0KKyAgICByZXNvbHZlci5jb21taXRFeHBsaWNpdEVtYmVkZGlu
ZygpOworfQorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9M
aW5lQnJlYWtlci5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWVjZmJlCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIuaApAQCAt
MCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIExhcnMgS25vbGwgKGtub2xs
QGtkZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgs
IDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21haWwuY29tPgorICogQ29w
eXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwor
ICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLwor
CisjaWZuZGVmIExpbmVCcmVha2VyX2gKKyNkZWZpbmUgTGluZUJyZWFrZXJfaAorCisjaW5jbHVk
ZSAiSW5saW5lSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJMaW5lSW5mby5oIgorI2luY2x1ZGUgIkxp
bmVJbmxpbmVIZWFkZXJzLmgiCisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK2NsYXNzIFJlbmRlclRleHQ7CisKK3N0cnVjdCBSZW5kZXJUZXh0SW5mbyB7
CisgICAgLy8gRGVzdHJ1Y3Rpb24gb2YgbV9sYXlvdXQgcmVxdWlyZXMgVGV4dExheW91dCB0byBi
ZSBhIGNvbXBsZXRlIHR5cGUsIHNvIHRoZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBhcmUg
bWFkZSBub24taW5saW5lIHRvIGF2b2lkIGNvbXBpbGF0aW9uIGVycm9ycy4KKyAgICBSZW5kZXJU
ZXh0SW5mbygpOworICAgIH5SZW5kZXJUZXh0SW5mbygpOworCisgICAgUmVuZGVyVGV4dCogbV90
ZXh0OworICAgIE93blB0cjxUZXh0TGF5b3V0PiBtX2xheW91dDsKKyAgICBMYXp5TGluZUJyZWFr
SXRlcmF0b3IgbV9saW5lQnJlYWtJdGVyYXRvcjsKKyAgICBjb25zdCBGb250KiBtX2ZvbnQ7Cit9
OworCitjbGFzcyBMaW5lQnJlYWtlciB7CitwdWJsaWM6CisgICAgZnJpZW5kIGNsYXNzIEJyZWFr
aW5nQ29udGV4dDsKKyAgICBMaW5lQnJlYWtlcihSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrKQorICAg
ICAgICA6IG1fYmxvY2soYmxvY2spCisgICAgeworICAgICAgICByZXNldCgpOworICAgIH0KKwor
ICAgIElubGluZUl0ZXJhdG9yIG5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgTGlu
ZUluZm8mLCBSZW5kZXJUZXh0SW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJl
dmlvdXNMaW5lLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgV29yZE1lYXN1
cmVtZW50cyYpOworCisgICAgYm9vbCBsaW5lV2FzSHlwaGVuYXRlZCgpIHsgcmV0dXJuIG1faHlw
aGVuYXRlZDsgfQorICAgIGNvbnN0IFZlY3RvcjxSZW5kZXJCb3gqPiYgcG9zaXRpb25lZE9iamVj
dHMoKSB7IHJldHVybiBtX3Bvc2l0aW9uZWRPYmplY3RzOyB9CisgICAgRUNsZWFyIGNsZWFyKCkg
eyByZXR1cm4gbV9jbGVhcjsgfQorCitwcml2YXRlOgorICAgIHZvaWQgcmVzZXQoKTsKKworICAg
IElubGluZUl0ZXJhdG9yIG5leHRTZWdtZW50QnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgTGlu
ZUluZm8mLCBSZW5kZXJUZXh0SW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJl
dmlvdXNMaW5lLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgV29yZE1lYXN1
cmVtZW50cyYpOworICAgIHZvaWQgc2tpcFRyYWlsaW5nV2hpdGVzcGFjZShJbmxpbmVJdGVyYXRv
ciYsIGNvbnN0IExpbmVJbmZvJik7CisgICAgdm9pZCBza2lwTGVhZGluZ1doaXRlc3BhY2UoSW5s
aW5lQmlkaVJlc29sdmVyJiwgTGluZUluZm8mLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJv
bVByZXZpb3VzTGluZSwgTGluZVdpZHRoJik7CisKKyAgICBSZW5kZXJCbG9ja0Zsb3cmIG1fYmxv
Y2s7CisgICAgYm9vbCBtX2h5cGhlbmF0ZWQ7CisgICAgRUNsZWFyIG1fY2xlYXI7CisgICAgVmVj
dG9yPFJlbmRlckJveCo+IG1fcG9zaXRpb25lZE9iamVjdHM7Cit9OworCit9CisKKyNlbmRpZiAv
LyBMaW5lQnJlYWtlcl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGlu
ZS9MaW5lSW5mby5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lSW5mby5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3MThhZAotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmZvLmNwcApAQCAt
MCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5j
b3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcKKyAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscworICogICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE
RVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUK
KyAqIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTGluZUlu
Zm8uaCIKKworI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
Kwordm9pZCBMaW5lSW5mbzo6c2V0RW1wdHkoYm9vbCBlbXB0eSwgUmVuZGVyQmxvY2sqIGJsb2Nr
LCBMaW5lV2lkdGgqIGxpbmVXaWR0aCkKK3sKKyAgICBpZiAobV9pc0VtcHR5ID09IGVtcHR5KQor
ICAgICAgICByZXR1cm47CisgICAgbV9pc0VtcHR5ID0gZW1wdHk7CisgICAgaWYgKCFlbXB0eSAm
JiBibG9jayAmJiBmbG9hdFBhZ2luYXRpb25TdHJ1dCgpKSB7CisgICAgICAgIGJsb2NrLT5zZXRM
b2dpY2FsSGVpZ2h0KGJsb2NrLT5sb2dpY2FsSGVpZ2h0KCkgKyBmbG9hdFBhZ2luYXRpb25TdHJ1
dCgpKTsKKyAgICAgICAgc2V0RmxvYXRQYWdpbmF0aW9uU3RydXQoMCk7CisgICAgICAgIGxpbmVX
aWR0aC0+dXBkYXRlQXZhaWxhYmxlV2lkdGgoKTsKKyAgICB9Cit9CisKK30KZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmZvLmggYi9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvbGluZS9MaW5lSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLjY2MzY2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvbGluZS9MaW5lSW5mby5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAg
Y29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcKKyAqICAgIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgZGlzY2xhaW1lciBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IK
KyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICog
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgTGluZUlu
Zm9faAorI2RlZmluZSBMaW5lSW5mb19oCisKKyNpbmNsdWRlICJMaW5lV2lkdGguaCIKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSZW5kZXJCbG9jazsKKworY2xhc3MgTGluZUluZm8g
eworcHVibGljOgorICAgIExpbmVJbmZvKCkKKyAgICAgICAgOiBtX2lzRmlyc3RMaW5lKHRydWUp
CisgICAgICAgICwgbV9pc0xhc3RMaW5lKGZhbHNlKQorICAgICAgICAsIG1faXNFbXB0eSh0cnVl
KQorICAgICAgICAsIG1fcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpCisgICAgICAgICwg
bV9mbG9hdFBhZ2luYXRpb25TdHJ1dCgwKQorICAgICAgICAsIG1fcnVuc0Zyb21MZWFkaW5nV2hp
dGVzcGFjZSgwKQorICAgIHsgfQorCisgICAgYm9vbCBpc0ZpcnN0TGluZSgpIGNvbnN0IHsgcmV0
dXJuIG1faXNGaXJzdExpbmU7IH0KKyAgICBib29sIGlzTGFzdExpbmUoKSBjb25zdCB7IHJldHVy
biBtX2lzTGFzdExpbmU7IH0KKyAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2lz
RW1wdHk7IH0KKyAgICBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpIGNvbnN0IHsgcmV0
dXJuIG1fcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5OyB9CisgICAgTGF5b3V0VW5pdCBmbG9hdFBh
Z2luYXRpb25TdHJ1dCgpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRQYWdpbmF0aW9uU3RydXQ7IH0K
KyAgICB1bnNpZ25lZCBydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4g
bV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlOyB9CisgICAgdm9pZCByZXNldFJ1bnNGcm9tTGVh
ZGluZ1doaXRlc3BhY2UoKSB7IG1fcnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSA9IDA7IH0KKyAg
ICB2b2lkIGluY3JlbWVudFJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UoKSB7IG1fcnVuc0Zyb21M
ZWFkaW5nV2hpdGVzcGFjZSsrOyB9CisKKyAgICB2b2lkIHNldEZpcnN0TGluZShib29sIGZpcnN0
TGluZSkgeyBtX2lzRmlyc3RMaW5lID0gZmlyc3RMaW5lOyB9CisgICAgdm9pZCBzZXRMYXN0TGlu
ZShib29sIGxhc3RMaW5lKSB7IG1faXNMYXN0TGluZSA9IGxhc3RMaW5lOyB9CisgICAgdm9pZCBz
ZXRFbXB0eShib29sIGVtcHR5LCBSZW5kZXJCbG9jayogYmxvY2sgPSAwLCBMaW5lV2lkdGgqIGxp
bmVXaWR0aCA9IDApOworICAgIHZvaWQgc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KGJvb2wg
cHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KSB7IG1fcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ID0g
cHJldmlvdXNMaW5lQnJva2VDbGVhbmx5OyB9CisgICAgdm9pZCBzZXRGbG9hdFBhZ2luYXRpb25T
dHJ1dChMYXlvdXRVbml0IHN0cnV0KSB7IG1fZmxvYXRQYWdpbmF0aW9uU3RydXQgPSBzdHJ1dDsg
fQorCitwcml2YXRlOgorICAgIGJvb2wgbV9pc0ZpcnN0TGluZTsKKyAgICBib29sIG1faXNMYXN0
TGluZTsKKyAgICBib29sIG1faXNFbXB0eTsKKyAgICBib29sIG1fcHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5OworICAgIExheW91dFVuaXQgbV9mbG9hdFBhZ2luYXRpb25TdHJ1dDsKKyAgICB1bnNp
Z25lZCBtX3J1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2U7Cit9OworCit9CisKKyNlbmRpZiAvLyBM
aW5lSW5mb19oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5l
SW5saW5lSGVhZGVycy5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUlubGlu
ZUhlYWRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWExYmVlCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUlubGlu
ZUhlYWRlcnMuaApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBM
YXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAy
MDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0IHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hhbmdTZW9rIE9oIDxzaGl2YW1pZG93QGdt
YWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluYy4gQWxsIHJp
Z2h0IHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBMaW5lSW5saW5lSGVhZGVyc19oCisjZGVmaW5lIExp
bmVJbmxpbmVIZWFkZXJzX2gKKworI2luY2x1ZGUgIlJlbmRlckxheWVyLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworZW51bSBXaGl0ZXNwYWNlUG9zaXRpb24geyBMZWFkaW5nV2hpdGVzcGFj
ZSwgVHJhaWxpbmdXaGl0ZXNwYWNlIH07CisKK2lubGluZSBib29sIGhhc0lubGluZURpcmVjdGlv
bkJvcmRlcnNQYWRkaW5nT3JNYXJnaW4oY29uc3QgUmVuZGVySW5saW5lJiBmbG93KQoreworICAg
IC8vIFdoZXJlIGFuIGVtcHR5IGlubGluZSBpcyBzcGxpdCBhY3Jvc3MgYW5vbnltb3VzIGJsb2Nr
cyB3ZSBzaG91bGQgb25seSBnaXZlIGxpbmVib3hlcyB0byB0aGUgJ3NpZGVzJyBvZiB0aGUKKyAg
ICAvLyBpbmxpbmUgdGhhdCBoYXZlIGJvcmRlcnMsIHBhZGRpbmcgb3IgbWFyZ2luLgorICAgIGJv
b2wgc2hvdWxkQXBwbHlTdGFydEJvcmRlclBhZGRpbmdPck1hcmdpbiA9ICFmbG93LnBhcmVudCgp
LT5pc0Fub255bW91c0Jsb2NrKCkgfHwgIWZsb3cuaXNJbmxpbmVFbGVtZW50Q29udGludWF0aW9u
KCk7CisgICAgaWYgKHNob3VsZEFwcGx5U3RhcnRCb3JkZXJQYWRkaW5nT3JNYXJnaW4gJiYgKGZs
b3cuYm9yZGVyU3RhcnQoKSB8fCBmbG93Lm1hcmdpblN0YXJ0KCkgfHwgZmxvdy5wYWRkaW5nU3Rh
cnQoKSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgYm9vbCBzaG91bGRBcHBseUVuZEJv
cmRlclBhZGRpbmdPck1hcmdpbiA9ICFmbG93LnBhcmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkg
fHwgZmxvdy5pc0lubGluZUVsZW1lbnRDb250aW51YXRpb24oKSB8fCAhZmxvdy5pbmxpbmVFbGVt
ZW50Q29udGludWF0aW9uKCk7CisgICAgcmV0dXJuIHNob3VsZEFwcGx5RW5kQm9yZGVyUGFkZGlu
Z09yTWFyZ2luICYmIChmbG93LmJvcmRlckVuZCgpIHx8IGZsb3cubWFyZ2luRW5kKCkgfHwgZmxv
dy5wYWRkaW5nRW5kKCkpOworfQorCitpbmxpbmUgY29uc3QgUmVuZGVyU3R5bGUmIGxpbmVTdHls
ZShjb25zdCBSZW5kZXJFbGVtZW50JiByZW5kZXJlciwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZv
KQoreworICAgIHJldHVybiBsaW5lSW5mby5pc0ZpcnN0TGluZSgpID8gcmVuZGVyZXIuZmlyc3RM
aW5lU3R5bGUoKSA6IHJlbmRlcmVyLnN0eWxlKCk7Cit9CisKK2lubGluZSBib29sIHJlcXVpcmVz
TGluZUJveEZvckNvbnRlbnQoY29uc3QgUmVuZGVySW5saW5lJiBmbG93LCBjb25zdCBMaW5lSW5m
byYgbGluZUluZm8pCit7CisgICAgUmVuZGVyRWxlbWVudCogcGFyZW50ID0gZmxvdy5wYXJlbnQo
KTsKKyAgICBpZiAoZmxvdy5kb2N1bWVudCgpLmluTm9RdWlya3NNb2RlKCkpIHsKKyAgICAgICAg
Y29uc3QgUmVuZGVyU3R5bGUmIGZsb3dTdHlsZSA9IGxpbmVTdHlsZShmbG93LCBsaW5lSW5mbyk7
CisgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlJiBwYXJlbnRTdHlsZSA9IGxpbmVTdHlsZSgqcGFy
ZW50LCBsaW5lSW5mbyk7CisgICAgICAgIGlmIChmbG93U3R5bGUubGluZUhlaWdodCgpICE9IHBh
cmVudFN0eWxlLmxpbmVIZWlnaHQoKQorICAgICAgICAgICAgfHwgZmxvd1N0eWxlLnZlcnRpY2Fs
QWxpZ24oKSAhPSBwYXJlbnRTdHlsZS52ZXJ0aWNhbEFsaWduKCkKKyAgICAgICAgICAgIHx8ICFw
YXJlbnRTdHlsZS5mb250KCkuZm9udE1ldHJpY3MoKS5oYXNJZGVudGljYWxBc2NlbnREZXNjZW50
QW5kTGluZUdhcChmbG93U3R5bGUuZm9udCgpLmZvbnRNZXRyaWNzKCkpKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBzaG91
bGRDb2xsYXBzZVdoaXRlU3BhY2UoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBMaW5l
SW5mbyYgbGluZUluZm8sIFdoaXRlc3BhY2VQb3NpdGlvbiB3aGl0ZXNwYWNlUG9zaXRpb24pCit7
CisgICAgLy8gQ1NTMiAxNi42LjEKKyAgICAvLyBJZiBhIHNwYWNlIChVKzAwMjApIGF0IHRoZSBi
ZWdpbm5pbmcgb2YgYSBsaW5lIGhhcyAnd2hpdGUtc3BhY2UnIHNldCB0byAnbm9ybWFsJywgJ25v
d3JhcCcsIG9yICdwcmUtbGluZScsIGl0IGlzIHJlbW92ZWQuCisgICAgLy8gSWYgYSBzcGFjZSAo
VSswMDIwKSBhdCB0aGUgZW5kIG9mIGEgbGluZSBoYXMgJ3doaXRlLXNwYWNlJyBzZXQgdG8gJ25v
cm1hbCcsICdub3dyYXAnLCBvciAncHJlLWxpbmUnLCBpdCBpcyBhbHNvIHJlbW92ZWQuCisgICAg
Ly8gSWYgc3BhY2VzIChVKzAwMjApIG9yIHRhYnMgKFUrMDAwOSkgYXQgdGhlIGVuZCBvZiBhIGxp
bmUgaGF2ZSAnd2hpdGUtc3BhY2UnIHNldCB0byAncHJlLXdyYXAnLCBVQXMgbWF5IHZpc3VhbGx5
IGNvbGxhcHNlIHRoZW0uCisgICAgcmV0dXJuIHN0eWxlLT5jb2xsYXBzZVdoaXRlU3BhY2UoKQor
ICAgICAgICB8fCAod2hpdGVzcGFjZVBvc2l0aW9uID09IFRyYWlsaW5nV2hpdGVzcGFjZSAmJiBz
dHlsZS0+d2hpdGVTcGFjZSgpID09IFBSRV9XUkFQICYmICghbGluZUluZm8uaXNFbXB0eSgpIHx8
ICFsaW5lSW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSkpOworfQorCitpbmxpbmUgYm9v
bCBza2lwTm9uQnJlYWtpbmdTcGFjZShjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQsIGNvbnN0IExp
bmVJbmZvJiBsaW5lSW5mbykKK3sKKyAgICBpZiAoaXQubV9vYmotPnN0eWxlKCkubmJzcE1vZGUo
KSAhPSBTUEFDRSB8fCBpdC5jdXJyZW50KCkgIT0gbm9CcmVha1NwYWNlKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBiYWQuIEl0IG1ha2VzIG5ic3AgaW5j
b25zaXN0ZW50IHdpdGggc3BhY2UgYW5kIHdvbid0IHdvcmsgY29ycmVjdGx5CisgICAgLy8gd2l0
aCBtX21pbldpZHRoL21fbWF4V2lkdGguCisgICAgLy8gRG8gbm90IHNraXAgYSBub24tYnJlYWtp
bmcgc3BhY2UgaWYgaXQgaXMgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgIC8vIG9uIGEgbGluZSBh
ZnRlciBhIGNsZWFuIGxpbmUgYnJlYWsgKG9yIG9uIHRoZSBmaXJzdCBsaW5lLCBzaW5jZSBwcmV2
aW91c0xpbmVCcm9rZUNsZWFubHkgc3RhcnRzIG9mZgorICAgIC8vIHx0cnVlfCkuCisgICAgaWYg
KGxpbmVJbmZvLmlzRW1wdHkoKSAmJiBsaW5lSW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHko
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGlu
ZSBib29sIGFsd2F5c1JlcXVpcmVzTGluZUJveChjb25zdCBSZW5kZXJJbmxpbmUmIGZsb3cpCit7
CisgICAgLy8gRklYTUU6IFJpZ2h0IG5vdywgd2Ugb25seSBhbGxvdyBsaW5lIGJveGVzIGZvciBp
bmxpbmVzIHRoYXQgYXJlIHRydWx5IGVtcHR5LgorICAgIC8vIFdlIG5lZWQgdG8gZml4IHRoaXMs
IHRob3VnaCwgYmVjYXVzZSBhdCB0aGUgdmVyeSBsZWFzdCwgaW5saW5lcyBjb250YWluaW5nIG9u
bHkKKyAgICAvLyBpZ25vcmFibGUgd2hpdGVzcGFjZSBzaG91bGQgc2hvdWxkIGFsc28gaGF2ZSBs
aW5lIGJveGVzLgorICAgIHJldHVybiBpc0VtcHR5SW5saW5lKGZsb3cpICYmIGhhc0lubGluZURp
cmVjdGlvbkJvcmRlcnNQYWRkaW5nT3JNYXJnaW4oZmxvdyk7Cit9CisKK2lubGluZSBib29sIHJl
cXVpcmVzTGluZUJveChjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQsIGNvbnN0IExpbmVJbmZvJiBs
aW5lSW5mbyA9IExpbmVJbmZvKCksIFdoaXRlc3BhY2VQb3NpdGlvbiB3aGl0ZXNwYWNlUG9zaXRp
b24gPSBMZWFkaW5nV2hpdGVzcGFjZSkKK3sKKyAgICBpZiAoaXQubV9vYmotPmlzRmxvYXRpbmdP
ck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYg
KGl0Lm1fb2JqLT5pc0JSKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgYm9vbCByZW5k
ZXJlcklzRW1wdHlJbmxpbmUgPSBmYWxzZTsKKyAgICBpZiAoaXQubV9vYmotPmlzUmVuZGVySW5s
aW5lKCkpIHsKKyAgICAgICAgY29uc3QgUmVuZGVySW5saW5lJiBpbmxpbmVSZW5kZXJlciA9IHRv
UmVuZGVySW5saW5lKCppdC5tX29iaik7CisgICAgICAgIGlmICghYWx3YXlzUmVxdWlyZXNMaW5l
Qm94KGlubGluZVJlbmRlcmVyKSAmJiAhcmVxdWlyZXNMaW5lQm94Rm9yQ29udGVudChpbmxpbmVS
ZW5kZXJlciwgbGluZUluZm8pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBy
ZW5kZXJlcklzRW1wdHlJbmxpbmUgPSBpc0VtcHR5SW5saW5lKGlubGluZVJlbmRlcmVyKTsKKyAg
ICB9CisKKyAgICBpZiAoIXNob3VsZENvbGxhcHNlV2hpdGVTcGFjZSgmaXQubV9vYmotPnN0eWxl
KCksIGxpbmVJbmZvLCB3aGl0ZXNwYWNlUG9zaXRpb24pKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIFVDaGFyIGN1cnJlbnQgPSBpdC5jdXJyZW50KCk7CisgICAgYm9vbCBub3RKdXN0V2hp
dGVzcGFjZSA9IGN1cnJlbnQgIT0gJyAnICYmIGN1cnJlbnQgIT0gJ1x0JyAmJiBjdXJyZW50ICE9
IHNvZnRIeXBoZW4gJiYgKGN1cnJlbnQgIT0gJ1xuJyB8fCBpdC5tX29iai0+cHJlc2VydmVzTmV3
bGluZSgpKSAmJiAhc2tpcE5vbkJyZWFraW5nU3BhY2UoaXQsIGxpbmVJbmZvKTsKKyAgICByZXR1
cm4gbm90SnVzdFdoaXRlc3BhY2UgfHwgcmVuZGVyZXJJc0VtcHR5SW5saW5lOworfQorCitpbmxp
bmUgdm9pZCBzZXRTdGF0aWNQb3NpdGlvbnMoUmVuZGVyQmxvY2tGbG93JiBibG9jaywgUmVuZGVy
Qm94JiBjaGlsZCkKK3sKKyAgICAvLyBGSVhNRTogVGhlIG1hdGggaGVyZSBpcyBhY3R1YWxseSBu
b3QgcmVhbGx5IHJpZ2h0LiBJdCdzIGEgYmVzdC1ndWVzcyBhcHByb3hpbWF0aW9uIHRoYXQKKyAg
ICAvLyB3aWxsIHdvcmsgZm9yIHRoZSBjb21tb24gY2FzZXMKKyAgICBSZW5kZXJFbGVtZW50KiBj
b250YWluZXJCbG9jayA9IGNoaWxkLmNvbnRhaW5lcigpOworICAgIExheW91dFVuaXQgYmxvY2tI
ZWlnaHQgPSBibG9jay5sb2dpY2FsSGVpZ2h0KCk7CisgICAgaWYgKGNvbnRhaW5lckJsb2NrLT5p
c1JlbmRlcklubGluZSgpKSB7CisgICAgICAgIC8vIEEgcmVsYXRpdmUgcG9zaXRpb25lZCBpbmxp
bmUgZW5jbG9zZXMgdXMuIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBoYXZlIHRvIGRldGVybWluZSBv
dXIKKyAgICAgICAgLy8gcG9zaXRpb24gYXMgdGhvdWdoIHdlIHdlcmUgYW4gaW5saW5lLiBTZXQg
fHN0YXRpY0lubGluZVBvc2l0aW9ufCBhbmQgfHN0YXRpY0Jsb2NrUG9zaXRpb258IG9uIHRoZSBy
ZWxhdGl2ZSBwb3NpdGlvbmVkCisgICAgICAgIC8vIGlubGluZSBzbyB0aGF0IHdlIGNhbiBvYnRh
aW4gdGhlIHZhbHVlIGxhdGVyLgorICAgICAgICB0b1JlbmRlcklubGluZShjb250YWluZXJCbG9j
ayktPmxheWVyKCktPnNldFN0YXRpY0lubGluZVBvc2l0aW9uKGJsb2NrLnN0YXJ0QWxpZ25lZE9m
ZnNldEZvckxpbmUoYmxvY2tIZWlnaHQsIGZhbHNlKSk7CisgICAgICAgIHRvUmVuZGVySW5saW5l
KGNvbnRhaW5lckJsb2NrKS0+bGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlvbihibG9ja0hl
aWdodCk7CisgICAgfQorICAgIGJsb2NrLnVwZGF0ZVN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hp
bGQoY2hpbGQsIGJsb2NrSGVpZ2h0KTsKKyAgICBjaGlsZC5sYXllcigpLT5zZXRTdGF0aWNCbG9j
a1Bvc2l0aW9uKGJsb2NrSGVpZ2h0KTsKK30KKworfQorCisjZW5kaWYK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>216999</attachid>
            <date>2013-11-14 16:46:14 -0800</date>
            <delta_ts>2013-11-15 13:38:46 -0800</delta_ts>
            <desc>EWS bullet5 for windows - style won&apos;t make it (expected)</desc>
            <filename>refactorLB.patch</filename>
            <type>text/plain</type>
            <size>181530</size>
            <attacher name="Zoltan Horvath">zoltan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNv
cmUvQ01ha2VMaXN0cy50eHQKaW5kZXggNzRlMzhmNC4uZTE1ZDhlZiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0
cy50eHQKQEAgLTc2LDYgKzc2LDcgQEAgc2V0KFdlYkNvcmVfSU5DTFVERV9ESVJFQ1RPUklFUwog
ICAgICIke1dFQkNPUkVfRElSfS9wbGF0Zm9ybS90ZXh0IgogICAgICIke1dFQkNPUkVfRElSfS9w
bHVnaW5zIgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmciCisgICAgIiR7V0VCQ09SRV9E
SVJ9L3JlbmRlcmluZy9saW5lIgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmcvbWF0aG1s
IgogICAgICIke1dFQkNPUkVfRElSfS9yZW5kZXJpbmcvc2hhcGVzIgogICAgICIke1dFQkNPUkVf
RElSfS9yZW5kZXJpbmcvc3R5bGUiCkBAIC0yMjA5LDYgKzIyMTAsOSBAQCBzZXQoV2ViQ29yZV9T
T1VSQ0VTCiAgICAgcmVuZGVyaW5nL1RleHRQYWludGVyLmNwcAogICAgIHJlbmRlcmluZy9icmVh
a19saW5lcy5jcHAKIAorICAgIHJlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcAorICAgIHJl
bmRlcmluZy9saW5lL0xpbmVJbmZvLmNwcAorCiAgICAgcmVuZGVyaW5nL21hdGhtbC9SZW5kZXJN
YXRoTUxCbG9jay5jcHAKICAgICByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTEZlbmNlZC5j
cHAKICAgICByZW5kZXJpbmcvbWF0aG1sL1JlbmRlck1hdGhNTEZyYWN0aW9uLmNwcApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9n
CmluZGV4IDYyNDc3MDguLjg2N2EwZTIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZworKysgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMDkgQEAKKzIw
MTMtMTEtMTQgIFpvbHRhbiBIb3J2YXRoICA8em9sdGFuQHdlYmtpdC5vcmc+CisKKyAgICAgICAg
TW92ZSBCcmVha2luZ0NvbnRleHQgYW5kIExpbmVCcmVha2VyIGludG8gdGhlaXIgb3duIGZpbGVz
CisgICAgICAgIDxodHRwczovL3dlYmtpdC5vcmcvYi8xMjQzMzY+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW4gdGhpcyBjaGFuZ2UgSSBpbnRyb2R1
Y2VkICdsaW5lJyBzdWJkaXJlY3RvcnkgaW5zaWRlICdyZW5kZXJpbmcnLCB0aGlzIGRpcmVjdG9y
eSB3aWxsIGNvbnRhaW4gYWxsIHRoZSBjbGFzc2VzCisgICAgICAgIHdoaWNoIGhhdmUgYmVlbiBy
ZWZhY3RvcmVkIGZyb20gUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcC4gVGhpcyBjaGFuZ2UgY29u
dGFpbnMgdGhlIHNlcGFyYXRpb24gb2YgQnJlYWtpbmdDb250ZXh0LAorICAgICAgICBhbmQgdGhl
IHNlcGFyYXRpb24gb2YgTGluZUJyZWFrZXIgY2xhc3Nlcy4gU2luY2UgSSB3YW50ZWQgdG8ga2Vl
cCB0aGUgaGVscGVyIGZ1bmN0aW9ucyBvcmdhbml6ZWQsIEkgYWxzbyBhZGRlZCBhCisgICAgICAg
IG5ldyBmaWxlIGNhbGxlZCBMaW5lSW5saW5lSGVhZGVycy5oLCB3aGljaCBjb250YWlucyB0aGUg
ZnVuY3Rpb25zIHdoaWNoIHVzZWQgaW4gTGluZUJyZWFrZXIuaCBhbmQgQnJlYWtpbmdDb250ZXh0
LmguCisgICAgICAgIEkgbW92ZWQgTGluZUluZm8gY2xhc3MgaW50byBsaW5lIGRpcmVjdG9yeS4g
SXQgd2FzIG5lY2Vzc2FyeSB0aGlzIHRpbWUsIHNpbmNlIEkgYWRkZWQgYSBjcHAgZm9yIGl0LiBJ
J2xsIG1vdmUgdGhlCisgICAgICAgIHJlc3Qgb2YgdGhlIGxpbmUgbGF5b3V0IHJlbGF0ZWQgaGVs
cGVyIGNsYXNzZXMgbGF0ZXIuIChJIHdhbnRlZCB0byBtaW5pbWl6ZSBtZXJnZSBjb25mbGljdHMu
KQorCisgICAgICAgIE5vIG5ldyB0ZXN0cywgbm8gYmVoYXZpb3IgY2hhbmdlLgorCisgICAgICAg
ICogQ01ha2VMaXN0cy50eHQ6CisgICAgICAgICogR05VbWFrZWZpbGUuYW06CisgICAgICAgICog
R05VbWFrZWZpbGUubGlzdC5hbToKKyAgICAgICAgKiBXZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52
Y3hwcm9qOgorICAgICAgICAqIFdlYkNvcmUudmN4cHJvai9XZWJDb3JlQ29tbW9uLnByb3BzOgor
ICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBy
ZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNy
ZWF0ZVJ1bik6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5l
SGVhZGVycy5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OldvcmRNZWFzdXJlbWVudDo6V29y
ZE1lYXN1cmVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6VHJhaWxp
bmdPYmplY3RzKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6c2V0VHJhaWxp
bmdXaGl0ZXNwYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OlRyYWlsaW5nT2JqZWN0czo6Y2xlYXIp
OgorICAgICAgICAoV2ViQ29yZTo6VHJhaWxpbmdPYmplY3RzOjphcHBlbmRCb3hJZk5lZWRlZCk6
CisgICAgICAgIChXZWJDb3JlOjpkZXByZWNhdGVkQWRkTWlkcG9pbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6c3RhcnRJZ25vcmluZ1NwYWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpzdG9wSWdub3Jp
bmdTcGFjZXMpOgorICAgICAgICAoV2ViQ29yZTo6ZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRT
cGFjZXMpOgorICAgICAgICAoV2ViQ29yZTo6VHJhaWxpbmdPYmplY3RzOjp1cGRhdGVNaWRwb2lu
dHNGb3JUcmFpbGluZ0JveGVzKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6
QnJlYWtpbmdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6Y3Vy
cmVudE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVCcmVh
ayk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVCcmVha1JlZik6Cisg
ICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmxpbmVXaWR0aCk6CisgICAgICAgIChX
ZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmF0RW5kKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFr
aW5nQ29udGV4dDo6Y2xlYXJMaW5lQnJlYWtJZkZpdHNPbkxpbmUpOgorICAgICAgICAoV2ViQ29y
ZTo6QnJlYWtpbmdDb250ZXh0Ojpjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aCk6CisgICAg
ICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmluaXRpYWxpemVGb3JDdXJyZW50T2JqZWN0
KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aGFuZGxlQlIpOgorICAgICAgICAoV2ViQ29y
ZTo6Ym9yZGVyUGFkZGluZ01hcmdpblN0YXJ0KToKKyAgICAgICAgKFdlYkNvcmU6OmJvcmRlclBh
ZGRpbmdNYXJnaW5FbmQpOgorICAgICAgICAoV2ViQ29yZTo6c2hvdWxkQWRkQm9yZGVyUGFkZGlu
Z01hcmdpbik6CisgICAgICAgIChXZWJDb3JlOjpwcmV2aW91c0luRmxvd1NpYmxpbmcpOgorICAg
ICAgICAoV2ViQ29yZTo6aW5saW5lTG9naWNhbFdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkJy
ZWFraW5nQ29udGV4dDo6aGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZCk6CisgICAgICAgIChXZWJD
b3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUZsb2F0KToKKyAgICAgICAgKFdlYkNvcmU6OnNo
b3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpC
cmVha2luZ0NvbnRleHQ6OmhhbmRsZUVtcHR5SW5saW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkJy
ZWFraW5nQ29udGV4dDo6aGFuZGxlUmVwbGFjZWQpOgorICAgICAgICAoV2ViQ29yZTo6Zmlyc3RQ
b3NpdGl2ZVdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OnVwZGF0ZVNlZ21lbnRzRm9yU2hhcGVz
KToKKyAgICAgICAgKFdlYkNvcmU6Oml0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVU
ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6Om5leHRDaGFyYWN0ZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6dXBkYXRlQ291bnRlcklmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6Om1lYXN1cmVIeXBo
ZW5XaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0V2lkdGgpOgorICAgICAgICAoV2ViQ29y
ZTo6ZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gpOgorICAgICAgICAoV2ViQ29yZTo6dHJ5SHlw
aGVuYXRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0
KToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpjYW5CcmVha0F0VGhpc1Bvc2l0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6Y29tbWl0QW5kVXBkYXRlTGlu
ZUJyZWFrSWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tNaWRwb2ludHMpOgorICAg
ICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbmRPZkxpbmUpOgorICAgICAg
ICAqIHJlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpMaW5lQnJlYWtlcjo6cmVzZXQpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJyZWFrZXI6
OnNraXBUcmFpbGluZ1doaXRlc3BhY2UpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJyZWFrZXI6
OnNraXBMZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvTGluZUJy
ZWFrZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6TGluZUJyZWFr
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUJyZWFrZXI6OmxpbmVXYXNIeXBoZW5hdGVkKToK
KyAgICAgICAgKFdlYkNvcmU6OkxpbmVCcmVha2VyOjpwb3NpdGlvbmVkT2JqZWN0cyk6CisgICAg
ICAgIChXZWJDb3JlOjpMaW5lQnJlYWtlcjo6Y2xlYXIpOgorICAgICAgICAqIHJlbmRlcmluZy9s
aW5lL0xpbmVJbmZvLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6c2V0
RW1wdHkpOgorICAgICAgICAqIHJlbmRlcmluZy9saW5lL0xpbmVJbmZvLmg6IFJlbmFtZWQgZnJv
bSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvTGluZUluZm8uaC4KKyAgICAgICAgKFdlYkNvcmU6
OkxpbmVJbmZvOjpMaW5lSW5mbyk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6aXNGaXJz
dExpbmUpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OmlzTGFzdExpbmUpOgorICAgICAg
ICAoV2ViQ29yZTo6TGluZUluZm86OmlzRW1wdHkpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUlu
Zm86OnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5m
bzo6ZmxvYXRQYWdpbmF0aW9uU3RydXQpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OnJ1
bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UpOgorICAgICAgICAoV2ViQ29yZTo6TGluZUluZm86OnJl
c2V0UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5m
bzo6aW5jcmVtZW50UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSk6CisgICAgICAgIChXZWJDb3Jl
OjpMaW5lSW5mbzo6c2V0Rmlyc3RMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVJbmZvOjpz
ZXRMYXN0TGluZSk6CisgICAgICAgIChXZWJDb3JlOjpMaW5lSW5mbzo6c2V0UHJldmlvdXNMaW5l
QnJva2VDbGVhbmx5KToKKyAgICAgICAgKFdlYkNvcmU6OkxpbmVJbmZvOjpzZXRGbG9hdFBhZ2lu
YXRpb25TdHJ1dCk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvTGluZUlubGluZUhlYWRlcnMu
aDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpoYXNJbmxpbmVEaXJlY3Rpb25Cb3JkZXJzUGFk
ZGluZ09yTWFyZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OmxpbmVTdHlsZSk6CisgICAgICAgIChX
ZWJDb3JlOjpyZXF1aXJlc0xpbmVCb3hGb3JDb250ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OnNo
b3VsZENvbGxhcHNlV2hpdGVTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjpza2lwTm9uQnJlYWtp
bmdTcGFjZSk6CisgICAgICAgIChXZWJDb3JlOjphbHdheXNSZXF1aXJlc0xpbmVCb3gpOgorICAg
ICAgICAoV2ViQ29yZTo6cmVxdWlyZXNMaW5lQm94KToKKyAgICAgICAgKFdlYkNvcmU6OnNldFN0
YXRpY1Bvc2l0aW9ucyk6CisKIDIwMTMtMTEtMTQgIEpvc2VwaCBQZWNvcmFybyAgPHBlY29yYXJv
QGFwcGxlLmNvbT4KIAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBDbGVhbmVyIEJhY2tlbmQgTWV0
aG9kIENhbGxpbmcgQ29kZSBHZW5lcmF0aW9uCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9H
TlVtYWtlZmlsZS5hbSBiL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCmluZGV4IGQ0N2Q2
YjcuLmJlMmFiMGEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCisr
KyBiL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCkBAIC05MCw2ICs5MCw3IEBAIHdlYmNv
cmVfY3BwZmxhZ3MgKz0gXAogCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsdWdpbnMgXAog
CS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3BsdWdpbnMvd2luIFwKIAktSSQoc3JjZGlyKS9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcgXAorCS1JJChzcmNkaXIpL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9saW5lIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbWF0
aG1sIFwKIAktSSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc2hhcGVzIFwKIAkt
SSQoc3JjZGlyKS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3R5bGUgXApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbSBiL1NvdXJjZS9XZWJDb3JlL0dOVW1h
a2VmaWxlLmxpc3QuYW0KaW5kZXggOTFiOTNkMi4uYjk2MTUwNyAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQorKysgYi9Tb3VyY2UvV2ViQ29yZS9HTlVtYWtl
ZmlsZS5saXN0LmFtCkBAIC00Mjk4LDcgKzQyOTgsNiBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAog
CVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9Mb2dpY2FsU2VsZWN0aW9uT2Zmc2V0Q2FjaGVzLmgg
XAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MYXlvdXRSZXBhaW50ZXIuaCBcCiAJU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL0xheW91dFJlcGFpbnRlci5jcHAgXAotCVNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9MaW5lSW5mby5oIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvTGluZUxh
eW91dFN0YXRlLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lV2lkdGguaCBcCiAJ
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xpbmVXaWR0aC5jcHAgXApAQCAtNDUwMyw2ICs0NTAy
LDEyIEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Rl
eHRQYWludGVyLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0UGFpbnRTdHlsZS5o
IFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVmVydGljYWxQb3NpdGlvbkNhY2hlLmggXAor
CVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0JyZWFraW5nQ29udGV4dElubGluZUhlYWRl
cnMuaCBcCisJU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUluZm8uaCBcCisJU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUluZm8uY3BwIFwKKwlTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5oIFwKKwlTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvbGluZS9MaW5lQnJlYWtlci5jcHAgXAorCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5l
L0xpbmVJbmxpbmVIZWFkZXJzLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9tYXRobWwv
UmVuZGVyTWF0aE1MQmxvY2suY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbWF0aG1s
L1JlbmRlck1hdGhNTEJsb2NrLmggXAogCVNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9tYXRobWwv
UmVuZGVyTWF0aE1MRmVuY2VkLmNwcCBcCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hw
cm9qL1dlYkNvcmUudmN4cHJvagppbmRleCAxNzU0N2M5Li4zOGUyNDgyIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2oKQEAgLTExMDUwLDYgKzEx
MDUwLDggQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xTaW1wbGVMaW5l
TGF5b3V0LmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xTaW1w
bGVMaW5lTGF5b3V0RnVuY3Rpb25zLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4u
XHJlbmRlcmluZ1xUZXh0UGFpbnRTdHlsZS5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJbmNsdWRl
PSIuLlxyZW5kZXJpbmdcbGluZVxMaW5lQnJlYWtlci5jcHAiIC8+CisgICAgPENsQ29tcGlsZSBJ
bmNsdWRlPSIuLlxyZW5kZXJpbmdcbGluZVxMaW5lSW5mby5jcHAiIC8+CiAgICAgPENsQ29tcGls
ZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcc2hhcGVzXFBvbHlnb25TaGFwZS5jcHAiIC8+CiAgICAg
PENsQ29tcGlsZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcc2hhcGVzXFJhc3RlclNoYXBlLmNwcCIg
Lz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xzaGFwZXNcUmVjdGFuZ2xl
U2hhcGUuY3BwIiAvPgpAQCAtMTk3NjUsNyArMTk3NjcsNiBAQAogICAgIDxDbEluY2x1ZGUgSW5j
bHVkZT0iLi5ccmVuZGVyaW5nXElubGluZVRleHRCb3guaCIgLz4KICAgICA8Q2xJbmNsdWRlIElu
Y2x1ZGU9Ii4uXHJlbmRlcmluZ1xMYXlvdXRSZXBhaW50ZXIuaCIgLz4KICAgICA8Q2xJbmNsdWRl
IEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xMYXlvdXRTdGF0ZS5oIiAvPgotICAgIDxDbEluY2x1ZGUg
SW5jbHVkZT0iLi5ccmVuZGVyaW5nXExpbmVJbmZvLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNs
dWRlPSIuLlxyZW5kZXJpbmdcTGluZUxheW91dFN0YXRlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJ
bmNsdWRlPSIuLlxyZW5kZXJpbmdcTGluZVdpZHRoLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNs
dWRlPSIuLlxyZW5kZXJpbmdcT3JkZXJJdGVyYXRvci5oIiAvPgpAQCAtMTk4NDAsNiArMTk4NDEs
MTAgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xSZW5kZXJTZWxlY3Rp
b25JbmZvLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcUmVuZGVy
U2xpZGVyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcUmVuZGVy
U25hcHNob3R0ZWRQbHVnSW4uaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRl
cmluZ1xsaW5lXEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCIgLz4KKyAgICA8Q2xJbmNs
dWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xsaW5lXExpbmVCcmVha2VyLmgiIC8+CisgICAgPENs
SW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcbGluZVxMaW5lSW5mby5oIiAvPgorICAgIDxD
bEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXGxpbmVcTGluZUlubGluZUhlYWRlcnMuaCIg
Lz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xzaGFwZXNcUG9seWdvblNo
YXBlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcc2hhcGVzXFJh
c3RlclNoYXBlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcc2hh
cGVzXFJlY3RhbmdsZVNoYXBlLmgiIC8+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLnZjeHByb2ovV2ViQ29yZUNvbW1vbi5wcm9wcyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
dmN4cHJvai9XZWJDb3JlQ29tbW9uLnByb3BzCmluZGV4IDk0ZjVlMTguLmYxZDg5MGQgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlQ29tbW9uLnByb3Bz
CisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlQ29tbW9uLnByb3Bz
CkBAIC03LDExICs3LDExIEBACiAgIDwvUHJvcGVydHlHcm91cD4NCiAgIDxJdGVtRGVmaW5pdGlv
bkdyb3VwPg0KICAgICA8Q2xDb21waWxlPg0KLSAgICAgIDxBZGRpdGlvbmFsSW5jbHVkZURpcmVj
dG9yaWVzPiQoUHJvamVjdERpcikuLjskKFByb2plY3REaXIpLi5cTW9kdWxlc1xtZWRpYWNvbnRy
b2xzOyQoUHJvamVjdERpcikuLlxNb2R1bGVzXG1lZGlhc3RyZWFtOyQoUHJvamVjdERpcikuLlxN
b2R1bGVzXGZpbGVzeXN0ZW07JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNcZ2VvbG9jYXRpb247JChQ
cm9qZWN0RGlyKS4uXE1vZHVsZXNcaW5kZXhlZGRiOyQoUHJvamVjdERpcikuLlxNb2R1bGVzXG1l
ZGlhc291cmNlOyQoUHJvamVjdERpcikuLlxNb2R1bGVzXG5hdmlnYXRvcmNvbnRlbnR1dGlsczsk
KFByb2plY3REaXIpLi5cTW9kdWxlc1xzcGVlY2g7JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNccHJv
eGltaXR5OyQoUHJvamVjdERpcikuLlxNb2R1bGVzXHF1b3RhOyQoUHJvamVjdERpcikuLlxNb2R1
bGVzXG5vdGlmaWNhdGlvbnM7JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNcd2ViZGF0YWJhc2U7JChQ
cm9qZWN0RGlyKS4uXE1vZHVsZXNcd2Vic29ja2V0czskKFByb2plY3REaXIpLi5cYWNjZXNzaWJp
bGl0eTskKFByb2plY3REaXIpLi5cYWNjZXNzaWJpbGl0eVx3aW47JChQcm9qZWN0RGlyKS4uXGJy
aWRnZTskKFByb2plY3REaXIpLi5cYnJpZGdlXGM7JChQcm9qZWN0RGlyKS4uXGJyaWRnZVxqc2M7
JChQcm9qZWN0RGlyKS4uXGNzczskKFByb2plY3REaXIpLi5cZWRpdGluZzskKFByb2plY3REaXIp
Li5cZmlsZWFwaTskKFByb2plY3REaXIpLi5ccmVuZGVyaW5nOyQoUHJvamVjdERpcikuLlxyZW5k
ZXJpbmdcbWF0aG1sOyQoUHJvamVjdERpcikuLlxyZW5kZXJpbmdcc2hhcGVzOyQoUHJvamVjdERp
cikuLlxyZW5kZXJpbmdcc3R5bGU7JChQcm9qZWN0RGlyKS4uXHJlbmRlcmluZ1xzdmc7JChQcm9q
ZWN0RGlyKS4uXGJpbmRpbmdzOyQoUHJvamVjdERpcikuLlxiaW5kaW5nc1xnZW5lcmljOyQoUHJv
amVjdERpcikuLlxiaW5kaW5nc1xqczskKFByb2plY3REaXIpLi5cYmluZGluZ3NcanNcc3BlY2lh
bGl6YXRpb247JChQcm9qZWN0RGlyKS4uXGRvbTskKFByb2plY3REaXIpLi5cZG9tXGRlZmF1bHQ7
JChQcm9qZWN0RGlyKS4uXGhpc3Rvcnk7JChQcm9qZWN0RGlyKS4uXGh0bWw7JChQcm9qZWN0RGly
KS4uXGh0bWxcY2FudmFzOyQoUHJvamVjdERpcikuLlxodG1sXGZvcm1zOyQoUHJvamVjdERpciku
LlxodG1sXHBhcnNlcjskKFByb2plY3REaXIpLi5caHRtbFxzaGFkb3c7JChQcm9qZWN0RGlyKS4u
XGh0bWxcdHJhY2s7JChQcm9qZWN0RGlyKS4uXGluc3BlY3RvcjskKFByb2plY3REaXIpLi5cbG9h
ZGVyOyQoUHJvamVjdERpcikuLlxsb2FkZXJcYXBwY2FjaGU7JChQcm9qZWN0RGlyKS4uXGxvYWRl
clxhcmNoaXZlOyQoUHJvamVjdERpcikuLlxsb2FkZXJcYXJjaGl2ZVxjZjskKFByb2plY3REaXIp
Li5cbG9hZGVyXGNhY2hlOyQoUHJvamVjdERpcikuLlxsb2FkZXJcaWNvbjskKFByb2plY3REaXIp
Li5cbWF0aG1sOyQoUHJvamVjdERpcikuLlxwYWdlOyQoUHJvamVjdERpcikuLlxwYWdlXGFuaW1h
dGlvbjskKFByb2plY3REaXIpLi5ccGFnZVxzY3JvbGxpbmc7JChQcm9qZWN0RGlyKS4uXHBhZ2Vc
d2luOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybTskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cYW5p
bWF0aW9uOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxtb2NrOyQoUHJvamVjdERpcikuLlxwbGF0
Zm9ybVxzcWw7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXHdpbjskKFByb2plY3REaXIpLi5ccGxh
dGZvcm1cbmV0d29yazskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cbmV0d29ya1x3aW47JChQcm9q
ZWN0RGlyKS4uXHBsYXRmb3JtXGNmOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxncmFwaGljczsk
KFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3NcY2E7JChQcm9qZWN0RGlyKS4uXHBsYXRm
b3JtXGdyYXBoaWNzXGNwdVxhcm1cZmlsdGVyczskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3Jh
cGhpY3NcZmlsdGVyczskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3NcZmlsdGVyc1xh
cm07JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXG9wZW50eXBlOyQoUHJvamVjdERp
cikuLlxwbGF0Zm9ybVxncmFwaGljc1x0cmFuc2Zvcm1zOyQoUHJvamVjdERpcikuLlxwbGF0Zm9y
bVx0ZXh0OyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVx0ZXh0XHRyYW5zY29kZXI7JChQcm9qZWN0
RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXHdpbjskKFByb2plY3REaXIpLi5ceG1sOyQoUHJvamVj
dERpcikuLlx4bWxccGFyc2VyOyQoQ29uZmlndXJhdGlvbkJ1aWxkRGlyKVxvYmokKFBsYXRmb3Jt
QXJjaGl0ZWN0dXJlKVxXZWJDb3JlXERlcml2ZWRTb3VyY2VzOyQoUHJvamVjdERpcikuLlxwbHVn
aW5zOyQoUHJvamVjdERpcikuLlxwbHVnaW5zXHdpbjskKFByb2plY3REaXIpLi5cc3ZnXGFuaW1h
dGlvbjskKFByb2plY3REaXIpLi5cc3ZnXGdyYXBoaWNzOyQoUHJvamVjdERpcikuLlxzdmdccHJv
cGVydGllczskKFByb2plY3REaXIpLi5cc3ZnXGdyYXBoaWNzXGZpbHRlcnM7JChQcm9qZWN0RGly
KS4uXHN2ZzskKFByb2plY3REaXIpLi5cdGVzdGluZzskKFByb2plY3REaXIpLi5cY3J5cHRvOyQo
UHJvamVjdERpcikuLlx3bWw7JChQcm9qZWN0RGlyKS4uXHN0b3JhZ2U7JChQcm9qZWN0RGlyKS4u
XHN0eWxlOyQoUHJvamVjdERpcikuLlx3ZWJzb2NrZXRzOyQoUHJvamVjdERpcikuLlx3b3JrZXJz
OyQoQ29uZmlndXJhdGlvbkJ1aWxkRGlyKVxpbmNsdWRlOyQoQ29uZmlndXJhdGlvbkJ1aWxkRGly
KVxpbmNsdWRlXHByaXZhdGU7JChDb25maWd1cmF0aW9uQnVpbGREaXIpXGluY2x1ZGVcSmF2YVNj
cmlwdENvcmU7JChDb25maWd1cmF0aW9uQnVpbGREaXIpXGluY2x1ZGVccHJpdmF0ZVxKYXZhU2Ny
aXB0Q29yZTskKFByb2plY3REaXIpLi5cRm9yd2FyZGluZ0hlYWRlcnM7JChQcm9qZWN0RGlyKS4u
XHBsYXRmb3JtXGdyYXBoaWNzXGdwdTskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3Nc
ZWdsOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxncmFwaGljc1xzdXJmYWNlczskKFByb2plY3RE
aXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncc3VyZmFjZXNcZWdsOyQoUHJvamVjdERpcikuLlxwbGF0
Zm9ybVxncmFwaGljc1xvcGVuZ2w7JChXZWJLaXRfTGlicmFyaWVzKVxpbmNsdWRlOyQoV2ViS2l0
X0xpYnJhcmllcylcaW5jbHVkZVxwcml2YXRlOyQoV2ViS2l0X0xpYnJhcmllcylcaW5jbHVkZVxw
cml2YXRlXEphdmFTY3JpcHRDb3JlOyQoV2ViS2l0X0xpYnJhcmllcylcaW5jbHVkZVxzcWxpdGU7
JChXZWJLaXRfTGlicmFyaWVzKVxpbmNsdWRlXEphdmFTY3JpcHRDb3JlOyQoV2ViS2l0X0xpYnJh
cmllcylcaW5jbHVkZVx6bGliOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0
aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0
b3JpZXM+JChQcm9qZWN0RGlyKS4uOyQoUHJvamVjdERpcikuLlxNb2R1bGVzXG1lZGlhY29udHJv
bHM7JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNcbWVkaWFzdHJlYW07JChQcm9qZWN0RGlyKS4uXE1v
ZHVsZXNcZmlsZXN5c3RlbTskKFByb2plY3REaXIpLi5cTW9kdWxlc1xnZW9sb2NhdGlvbjskKFBy
b2plY3REaXIpLi5cTW9kdWxlc1xpbmRleGVkZGI7JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNcbWVk
aWFzb3VyY2U7JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNcbmF2aWdhdG9yY29udGVudHV0aWxzOyQo
UHJvamVjdERpcikuLlxNb2R1bGVzXHNwZWVjaDskKFByb2plY3REaXIpLi5cTW9kdWxlc1xwcm94
aW1pdHk7JChQcm9qZWN0RGlyKS4uXE1vZHVsZXNccXVvdGE7JChQcm9qZWN0RGlyKS4uXE1vZHVs
ZXNcbm90aWZpY2F0aW9uczskKFByb2plY3REaXIpLi5cTW9kdWxlc1x3ZWJkYXRhYmFzZTskKFBy
b2plY3REaXIpLi5cTW9kdWxlc1x3ZWJzb2NrZXRzOyQoUHJvamVjdERpcikuLlxhY2Nlc3NpYmls
aXR5OyQoUHJvamVjdERpcikuLlxhY2Nlc3NpYmlsaXR5XHdpbjskKFByb2plY3REaXIpLi5cYnJp
ZGdlOyQoUHJvamVjdERpcikuLlxicmlkZ2VcYzskKFByb2plY3REaXIpLi5cYnJpZGdlXGpzYzsk
KFByb2plY3REaXIpLi5cY3NzOyQoUHJvamVjdERpcikuLlxlZGl0aW5nOyQoUHJvamVjdERpciku
LlxmaWxlYXBpOyQoUHJvamVjdERpcikuLlxyZW5kZXJpbmc7JChQcm9qZWN0RGlyKS4uXHJlbmRl
cmluZ1xsaW5lOyQoUHJvamVjdERpcikuLlxyZW5kZXJpbmdcbWF0aG1sOyQoUHJvamVjdERpciku
LlxyZW5kZXJpbmdcc2hhcGVzOyQoUHJvamVjdERpcikuLlxyZW5kZXJpbmdcc3R5bGU7JChQcm9q
ZWN0RGlyKS4uXHJlbmRlcmluZ1xzdmc7JChQcm9qZWN0RGlyKS4uXGJpbmRpbmdzOyQoUHJvamVj
dERpcikuLlxiaW5kaW5nc1xnZW5lcmljOyQoUHJvamVjdERpcikuLlxiaW5kaW5nc1xqczskKFBy
b2plY3REaXIpLi5cYmluZGluZ3NcanNcc3BlY2lhbGl6YXRpb247JChQcm9qZWN0RGlyKS4uXGRv
bTskKFByb2plY3REaXIpLi5cZG9tXGRlZmF1bHQ7JChQcm9qZWN0RGlyKS4uXGhpc3Rvcnk7JChQ
cm9qZWN0RGlyKS4uXGh0bWw7JChQcm9qZWN0RGlyKS4uXGh0bWxcY2FudmFzOyQoUHJvamVjdERp
cikuLlxodG1sXGZvcm1zOyQoUHJvamVjdERpcikuLlxodG1sXHBhcnNlcjskKFByb2plY3REaXIp
Li5caHRtbFxzaGFkb3c7JChQcm9qZWN0RGlyKS4uXGh0bWxcdHJhY2s7JChQcm9qZWN0RGlyKS4u
XGluc3BlY3RvcjskKFByb2plY3REaXIpLi5cbG9hZGVyOyQoUHJvamVjdERpcikuLlxsb2FkZXJc
YXBwY2FjaGU7JChQcm9qZWN0RGlyKS4uXGxvYWRlclxhcmNoaXZlOyQoUHJvamVjdERpcikuLlxs
b2FkZXJcYXJjaGl2ZVxjZjskKFByb2plY3REaXIpLi5cbG9hZGVyXGNhY2hlOyQoUHJvamVjdERp
cikuLlxsb2FkZXJcaWNvbjskKFByb2plY3REaXIpLi5cbWF0aG1sOyQoUHJvamVjdERpcikuLlxw
YWdlOyQoUHJvamVjdERpcikuLlxwYWdlXGFuaW1hdGlvbjskKFByb2plY3REaXIpLi5ccGFnZVxz
Y3JvbGxpbmc7JChQcm9qZWN0RGlyKS4uXHBhZ2Vcd2luOyQoUHJvamVjdERpcikuLlxwbGF0Zm9y
bTskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cYW5pbWF0aW9uOyQoUHJvamVjdERpcikuLlxwbGF0
Zm9ybVxtb2NrOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxzcWw7JChQcm9qZWN0RGlyKS4uXHBs
YXRmb3JtXHdpbjskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cbmV0d29yazskKFByb2plY3REaXIp
Li5ccGxhdGZvcm1cbmV0d29ya1x3aW47JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGNmOyQoUHJv
amVjdERpcikuLlxwbGF0Zm9ybVxncmFwaGljczskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3Jh
cGhpY3NcY2E7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXGNwdVxhcm1cZmlsdGVy
czskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3NcZmlsdGVyczskKFByb2plY3REaXIp
Li5ccGxhdGZvcm1cZ3JhcGhpY3NcZmlsdGVyc1xhcm07JChQcm9qZWN0RGlyKS4uXHBsYXRmb3Jt
XGdyYXBoaWNzXG9wZW50eXBlOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxncmFwaGljc1x0cmFu
c2Zvcm1zOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVx0ZXh0OyQoUHJvamVjdERpcikuLlxwbGF0
Zm9ybVx0ZXh0XHRyYW5zY29kZXI7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXHdp
bjskKFByb2plY3REaXIpLi5ceG1sOyQoUHJvamVjdERpcikuLlx4bWxccGFyc2VyOyQoQ29uZmln
dXJhdGlvbkJ1aWxkRGlyKVxvYmokKFBsYXRmb3JtQXJjaGl0ZWN0dXJlKVxXZWJDb3JlXERlcml2
ZWRTb3VyY2VzOyQoUHJvamVjdERpcikuLlxwbHVnaW5zOyQoUHJvamVjdERpcikuLlxwbHVnaW5z
XHdpbjskKFByb2plY3REaXIpLi5cc3ZnXGFuaW1hdGlvbjskKFByb2plY3REaXIpLi5cc3ZnXGdy
YXBoaWNzOyQoUHJvamVjdERpcikuLlxzdmdccHJvcGVydGllczskKFByb2plY3REaXIpLi5cc3Zn
XGdyYXBoaWNzXGZpbHRlcnM7JChQcm9qZWN0RGlyKS4uXHN2ZzskKFByb2plY3REaXIpLi5cdGVz
dGluZzskKFByb2plY3REaXIpLi5cY3J5cHRvOyQoUHJvamVjdERpcikuLlx3bWw7JChQcm9qZWN0
RGlyKS4uXHN0b3JhZ2U7JChQcm9qZWN0RGlyKS4uXHN0eWxlOyQoUHJvamVjdERpcikuLlx3ZWJz
b2NrZXRzOyQoUHJvamVjdERpcikuLlx3b3JrZXJzOyQoQ29uZmlndXJhdGlvbkJ1aWxkRGlyKVxp
bmNsdWRlOyQoQ29uZmlndXJhdGlvbkJ1aWxkRGlyKVxpbmNsdWRlXHByaXZhdGU7JChDb25maWd1
cmF0aW9uQnVpbGREaXIpXGluY2x1ZGVcSmF2YVNjcmlwdENvcmU7JChDb25maWd1cmF0aW9uQnVp
bGREaXIpXGluY2x1ZGVccHJpdmF0ZVxKYXZhU2NyaXB0Q29yZTskKFByb2plY3REaXIpLi5cRm9y
d2FyZGluZ0hlYWRlcnM7JChQcm9qZWN0RGlyKS4uXHBsYXRmb3JtXGdyYXBoaWNzXGdwdTskKFBy
b2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3NcZWdsOyQoUHJvamVjdERpcikuLlxwbGF0Zm9y
bVxncmFwaGljc1xzdXJmYWNlczskKFByb2plY3REaXIpLi5ccGxhdGZvcm1cZ3JhcGhpY3Ncc3Vy
ZmFjZXNcZWdsOyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxncmFwaGljc1xvcGVuZ2w7JChXZWJL
aXRfTGlicmFyaWVzKVxpbmNsdWRlOyQoV2ViS2l0X0xpYnJhcmllcylcaW5jbHVkZVxwcml2YXRl
OyQoV2ViS2l0X0xpYnJhcmllcylcaW5jbHVkZVxwcml2YXRlXEphdmFTY3JpcHRDb3JlOyQoV2Vi
S2l0X0xpYnJhcmllcylcaW5jbHVkZVxzcWxpdGU7JChXZWJLaXRfTGlicmFyaWVzKVxpbmNsdWRl
XEphdmFTY3JpcHRDb3JlOyQoV2ViS2l0X0xpYnJhcmllcylcaW5jbHVkZVx6bGliOyUoQWRkaXRp
b25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQog
ICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPkRJU0FCTEVfM0RfUkVOREVSSU5HO1dFQkNP
UkVfQ09OVEVYVF9NRU5VUzslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29y
RGVmaW5pdGlvbnM+DQogICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPlVzZTwvUHJlY29tcGlsZWRI
ZWFkZXI+DQogICAgICAgPFByZWNvbXBpbGVkSGVhZGVyRmlsZT5XZWJDb3JlUHJlZml4Lmg8L1By
ZWNvbXBpbGVkSGVhZGVyRmlsZT4NCiAgICAgICA8Rm9yY2VkSW5jbHVkZUZpbGVzPldlYkNvcmVQ
cmVmaXguaDtJQ1VWZXJzaW9uLmg7JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRl
RmlsZXM+DQogICAgIDwvQ2xDb21waWxlPg0KICAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KLTwv
UHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+DQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIv
U291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IDEz
MzBiZDguLjMxOTkzNGIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oKQEAgLTM0MzYsNyArMzQzNiw2IEBACiAJCTlGQTM3RUZEMTE3MkZE
QTYwMEM0Q0Q1NSAvKiBKU1NjcmlwdFByb2ZpbGVOb2RlLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5RkEzN0VGOTExNzJGRDkzMDBDNENENTUgLyogSlNT
Y3JpcHRQcm9maWxlTm9kZS5oICovOyB9OwogCQlBMDI0NTc1MTE2Q0VBQTI3MDAwRTU2NzEgLyog
RVhURHJhd0J1ZmZlcnMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gQTAyNDU3NEUxNkNFQUEyNzAwMEU1NjcxIC8qIEVYVERyYXdCdWZmZXJzLmNwcCAq
LzsgfTsKIAkJQTAyNDU3NTIxNkNFQUEyNzAwMEU1NjcxIC8qIEVYVERyYXdCdWZmZXJzLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBMDI0NTc0RjE2Q0VB
QTI3MDAwRTU2NzEgLyogRVhURHJhd0J1ZmZlcnMuaCAqLzsgfTsKLQkJQTA2QkZFMkUxN0RGQjQz
RjAwODMwMkJCIC8qIExpbmVJbmZvLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBBMDZCRkUyQzE3REZCNDMzMDA4MzAyQkIgLyogTGluZUluZm8uaCAqLzsg
fTsKIAkJQTA3RDMzNTUxNTJCNjMwRTAwMUI2MzkzIC8qIEpTV2ViR0xTaGFkZXJQcmVjaXNpb25G
b3JtYXQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QTA3RDMzNTMxNTJCNjMwRTAwMUI2MzkzIC8qIEpTV2ViR0xTaGFkZXJQcmVjaXNpb25Gb3JtYXQu
Y3BwICovOyB9OwogCQlBMDdEMzM1NjE1MkI2MzBFMDAxQjYzOTMgLyogSlNXZWJHTFNoYWRlclBy
ZWNpc2lvbkZvcm1hdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gQTA3RDMzNTQxNTJCNjMwRTAwMUI2MzkzIC8qIEpTV2ViR0xTaGFkZXJQcmVjaXNpb25G
b3JtYXQuaCAqLzsgfTsKIAkJQTA3RDMzNTgxNTJCNjMyRDAwMUI2MzkzIC8qIFdlYkdMU2hhZGVy
UHJlY2lzaW9uRm9ybWF0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBBMDdEMzM1NzE1MkI2MzJEMDAxQjYzOTMgLyogV2ViR0xTaGFkZXJQcmVjaXNpb25G
b3JtYXQuaCAqLzsgfTsKQEAgLTYzMDEsNiArNjMwMCw4IEBACiAJCUZFRTE4MTE0MTZDMzE5RTgw
MDA4NDg0OSAvKiBTUUxUcmFuc2FjdGlvbkJhY2tlbmQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZFRTE4MTEyMTZDMzE5RTgwMDA4NDg0OSAvKiBTUUxU
cmFuc2FjdGlvbkJhY2tlbmQuaCAqLzsgfTsKIAkJRkY5NDVFQ0IxNjFGN0YzNjAwOTcxQkM4IC8q
IFBzZXVkb0VsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gRkY5NDVFQzkxNjFGN0YzNjAwOTcxQkM4IC8qIFBzZXVkb0VsZW1lbnQuY3BwICov
OyB9OwogCQlGRjk0NUVDQzE2MUY3RjM2MDA5NzFCQzggLyogUHNldWRvRWxlbWVudC5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkY5NDVFQ0ExNjFGN0Yz
NjAwOTcxQkM4IC8qIFBzZXVkb0VsZW1lbnQuaCAqLzsgfTsKKwkJRkZCNjk4Q0MxODMzRUUwRDAw
MTU4QTMxIC8qIExpbmVCcmVha2VyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEZGQjY5OENBMTgzM0VDMzgwMDE1OEEzMSAvKiBMaW5lQnJlYWtlci5j
cHAgKi87IH07CisJCUZGQjY5OENGMTgzNDAyQkIwMDE1OEEzMSAvKiBMaW5lSW5mby5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRkI2OThDRDE4MzNG
MTc2MDAxNThBMzEgLyogTGluZUluZm8uY3BwICovOyB9OwogCQlGRkQ1Qjk3QTEzNUNDOTc4MDBE
NUU5MkEgLyogUGFnZVZpc2liaWxpdHlTdGF0ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRkQ1Qjk3NzEzNUNDOTc4MDBENUU5MkEgLyogUGFnZVZp
c2liaWxpdHlTdGF0ZS5jcHAgKi87IH07CiAJCUZGRDVCOTdCMTM1Q0M5NzgwMEQ1RTkyQSAvKiBQ
YWdlVmlzaWJpbGl0eVN0YXRlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBGRkQ1Qjk3ODEzNUNDOTc4MDBENUU5MkEgLyogUGFnZVZpc2liaWxpdHlTdGF0
ZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAvKiBF
bmQgUEJYQnVpbGRGaWxlIHNlY3Rpb24gKi8KQEAgLTEwMjA3LDcgKzEwMjA4LDYgQEAKIAkJQTAy
NDU3NEUxNkNFQUEyNzAwMEU1NjcxIC8qIEVYVERyYXdCdWZmZXJzLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IEVYVERyYXdCdWZmZXJzLmNwcDsgcGF0aCA9IGNhbnZh
cy9FWFREcmF3QnVmZmVycy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUEwMjQ1
NzRGMTZDRUFBMjcwMDBFNTY3MSAvKiBFWFREcmF3QnVmZmVycy5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IG5hbWUgPSBFWFREcmF3QnVmZmVycy5oOyBwYXRoID0gY2FudmFzL0VYVERyYXdC
dWZmZXJzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUEwMjQ1NzUwMTZDRUFBMjcw
MDBFNTY3MSAvKiBFWFREcmF3QnVmZmVycy5pZGwgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBuYW1lID0gRVhU
RHJhd0J1ZmZlcnMuaWRsOyBwYXRoID0gY2FudmFzL0VYVERyYXdCdWZmZXJzLmlkbDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJQTA2QkZFMkMxN0RGQjQzMzAwODMwMkJCIC8qIExpbmVJ
bmZvLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IExpbmVJbmZvLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUEwNzE4QkU4MTdFMjZGMTYwMEY2QkY0NCAvKiBMaW5l
TGF5b3V0U3RhdGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTGluZUxheW91
dFN0YXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUEwN0QzMzUzMTUyQjYzMEUw
MDFCNjM5MyAvKiBKU1dlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0LmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTV2ViR0xTaGFkZXJQcmVjaXNpb25Gb3JtYXQuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBMDdEMzM1NDE1MkI2MzBFMDAxQjYzOTMg
LyogSlNXZWJHTFNoYWRlclByZWNpc2lvbkZvcm1hdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBKU1dlYkdMU2hhZGVyUHJlY2lzaW9uRm9ybWF0Lmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CkBAIC0xMzQ3Niw2ICsxMzQ3NiwxMSBAQAogCQlGRUUxODExMjE2QzMxOUU4
MDAwODQ4NDkgLyogU1FMVHJhbnNhY3Rpb25CYWNrZW5kLmggKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMuaDsgcGF0aCA9IFNRTFRyYW5zYWN0aW9uQmFja2VuZC5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQlGRjk0NUVDOTE2MUY3RjM2MDA5NzFCQzggLyogUHNldWRvRWxlbWVudC5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBQc2V1ZG9FbGVtZW50LmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkY5NDVFQ0ExNjFGN0YzNjAwOTcxQkM4IC8q
IFBzZXVkb0VsZW1lbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUHNldWRv
RWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGRkI2OThDOTE4MzJGMTBC
MDAxNThBMzEgLyogQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZGQjY5OENBMTgzM0VDMzgwMDE1OEEzMSAvKiBMaW5l
QnJlYWtlci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBMaW5lQnJl
YWtlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZGQjY5OENCMTgzM0VDMzgw
MDE1OEEzMSAvKiBMaW5lQnJlYWtlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBMaW5lQnJlYWtlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGRkI2OThDRDE4
MzNGMTc2MDAxNThBMzEgLyogTGluZUluZm8uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gTGluZUluZm8uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlG
RkI2OThDRTE4MzNGMTc2MDAxNThBMzEgLyogTGluZUluZm8uaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gTGluZUluZm8uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
RkZENUI5NzcxMzVDQzk3ODAwRDVFOTJBIC8qIFBhZ2VWaXNpYmlsaXR5U3RhdGUuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUGFnZVZpc2liaWxpdHlTdGF0ZS5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZGRDVCOTc4MTM1Q0M5NzgwMEQ1RTkyQSAv
KiBQYWdlVmlzaWJpbGl0eVN0YXRlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IFBhZ2VWaXNpYmlsaXR5U3RhdGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIC8qIEVu
ZCBQQlhGaWxlUmVmZXJlbmNlIHNlY3Rpb24gKi8KQEAgLTIwOTA3LDYgKzIwOTEyLDcgQEAKIAkJ
RjUyM0QyRjMwMkRFNDQzQjAxODYzNUNBIC8qIHJlbmRlcmluZyAqLyA9IHsKIAkJCWlzYSA9IFBC
WEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCisJCQkJRkZCNjk4QzgxODMyRjEwQjAwMTU4QTMxIC8q
IGxpbmUgKi8sCiAJCQkJQ0RFN0ZDNDIxODE5MDRCMTAwMkJCQjc3IC8qIE9yZGVySXRlcmF0b3Iu
Y3BwICovLAogCQkJCUNERTdGQzQzMTgxOTA0QjEwMDJCQkI3NyAvKiBPcmRlckl0ZXJhdG9yLmgg
Ki8sCiAJCQkJNDM5MDQ2QzIxMkRBMjVDRTAwQUY4MEEyIC8qIG1hdGhtbCAqLywKQEAgLTIwOTU1
LDcgKzIwOTYxLDYgQEAKIAkJCQlBMTIwQUNBMDEzRjk5ODM3MDBGRTRBQzcgLyogTGF5b3V0UmVw
YWludGVyLmggKi8sCiAJCQkJMkQ5MDY2MDQwQkUxNDFENDAwOTU2OTk4IC8qIExheW91dFN0YXRl
LmNwcCAqLywKIAkJCQkyRDkwNjYwNTBCRTE0MUQ0MDA5NTY5OTggLyogTGF5b3V0U3RhdGUuaCAq
LywKLQkJCQlBMDZCRkUyQzE3REZCNDMzMDA4MzAyQkIgLyogTGluZUluZm8uaCAqLywKIAkJCQlB
MDcxOEJFODE3RTI2RjE2MDBGNkJGNDQgLyogTGluZUxheW91dFN0YXRlLmggKi8sCiAJCQkJQTBD
QjAwMjMxN0RGODFBQzAwMTc4OTZCIC8qIExpbmVXaWR0aC5jcHAgKi8sCiAJCQkJQTBDQjAwMjEx
N0RFOUNEMDAwMTc4OTZCIC8qIExpbmVXaWR0aC5oICovLApAQCAtMjE4OTUsNiArMjE5MDAsMTgg
QEAKIAkJCW5hbWUgPSBXZWJBdWRpbzsKIAkJCXNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7CiAJCX07
CisJCUZGQjY5OEM4MTgzMkYxMEIwMDE1OEEzMSAvKiBsaW5lICovID0geworCQkJaXNhID0gUEJY
R3JvdXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQlGRkI2OThDRDE4MzNGMTc2MDAxNThBMzEgLyog
TGluZUluZm8uY3BwICovLAorCQkJCUZGQjY5OENFMTgzM0YxNzYwMDE1OEEzMSAvKiBMaW5lSW5m
by5oICovLAorCQkJCUZGQjY5OENBMTgzM0VDMzgwMDE1OEEzMSAvKiBMaW5lQnJlYWtlci5jcHAg
Ki8sCisJCQkJRkZCNjk4Q0IxODMzRUMzODAwMTU4QTMxIC8qIExpbmVCcmVha2VyLmggKi8sCisJ
CQkJRkZCNjk4QzkxODMyRjEwQjAwMTU4QTMxIC8qIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRl
cnMuaCAqLywKKwkJCSk7CisJCQlwYXRoID0gbGluZTsKKwkJCXNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7CisJCX07CiAvKiBFbmQgUEJYR3JvdXAgc2VjdGlvbiAqLwogCiAvKiBCZWdpbiBQQlhIZWFk
ZXJzQnVpbGRQaGFzZSBzZWN0aW9uICovCkBAIC0yNTE4Nyw3ICsyNTIwNCw2IEBACiAJCQkJQkUx
NkM1OTUxN0NGRTE3MjAwODUyQzA0IC8qIEluYmFuZFdlYlZUVFRleHRUcmFjay5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJQkMxMEQ3NjgxN0Q4RUU3MTAwNUUyNjI2IC8qIFJlbmRlckJsb2NrRmxvdy5o
IGluIEhlYWRlcnMgKi8sCiAJCQkJQTBDQjAwMjUxN0RGODI2QzAwMTc4OTZCIC8qIExpbmVXaWR0
aC5oIGluIEhlYWRlcnMgKi8sCi0JCQkJQTA2QkZFMkUxN0RGQjQzRjAwODMwMkJCIC8qIExpbmVJ
bmZvLmggaW4gSGVhZGVycyAqLywKIAkJCQlDRDNFMjUxQzE4MDQ2QjA2MDBFMjdGNTYgLyogR3Jp
ZENvb3JkaW5hdGUuaCBpbiBIZWFkZXJzICovLAogCQkJCUNEM0UyNTI0MTgwNDZCQ0QwMEUyN0Y1
NiAvKiBDU1NHcmlkVGVtcGxhdGVWYWx1ZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQ0RFRjRGRDcx
N0U4NUM4RjAwQUVFMjRCIC8qIEdyaWRMZW5ndGguaCBpbiBIZWFkZXJzICovLApAQCAtMjU3NzMs
NiArMjU3ODksNyBAQAogCQkJCTk3N0IzODYyMTIyODgzRTkwMEI4MUZGOCAvKiBDU1NQcmVsb2Fk
U2Nhbm5lci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODBFNkQwNTBBMTk4OUNBMDA3RkI4QzUg
LyogQ1NTUHJpbWl0aXZlVmFsdWUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTgwRTZDRjcwQTE5
ODlDQTAwN0ZCOEM1IC8qIENTU1Byb3BlcnR5LmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUZGQjY5
OENDMTgzM0VFMEQwMDE1OEEzMSAvKiBMaW5lQnJlYWtlci5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CQk3OEQwMkJDNTE1NEExOERGMDBCNjJEMDUgLyogQ1NTUHJvcGVydHlBbmltYXRpb24uY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJMUFCQTc2Q0ExMUQyMEU1MDAwNEMyMDFDIC8qIENTU1Byb3BlcnR5
TmFtZXMuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMDdDNTlCNTYxN0Y0QUMxNTAwMEZCQ0JCIC8q
IFZpZGVvU3RyZWFtVHJhY2suY3BwIGluIFNvdXJjZXMgKi8sCkBAIC0yNjU3OSw2ICsyNjU5Niw3
IEBACiAJCQkJMDcwMzYzRTUxODFBMUNEQzAwQzA3NEE1IC8qIEFWTWVkaWFDYXB0dXJlU291cmNl
Lm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJOTM5MjI2MkYxMDMyMTA4NDAwNkU3RDVEIC8qIEpTQ1NT
UnVsZUxpc3RDdXN0b20uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMTQyMDExQjYwQTAwMzEzMzAw
ODMwM0Y5IC8qIEpTQ1NTU3R5bGVEZWNsYXJhdGlvbi5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlG
RkI2OThDRjE4MzQwMkJCMDAxNThBMzEgLyogTGluZUluZm8uY3BwIGluIFNvdXJjZXMgKi8sCiAJ
CQkJQkM1ODI1RjMwQzBCODkzODAwNTNGMUI1IC8qIEpTQ1NTU3R5bGVEZWNsYXJhdGlvbkN1c3Rv
bS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQzQ2QzIwNjBDMEREQ0ExMDAyMENGQzMgLyogSlND
U1NTdHlsZVJ1bGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNDNUJFMDAwQzBFOTMxMTAwMTFD
MkRCIC8qIEpTQ1NTU3R5bGVTaGVldC5jcHAgaW4gU291cmNlcyAqLywKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9MaW5lSW5mby5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL0xpbmVJbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1M2FlNjYuLjAw
MDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL0xpbmVJbmZvLmgKKysrIC9kZXYv
bnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5
c3RlbXMgSW5jb3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKLSAqICAgIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCi0gKiAgICBkaXNj
bGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZQotICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscwotICogICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwot
ICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUKLSAqIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwKLSAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0gKiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikK
LSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKLSAqIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIExpbmVJbmZvX2gKLSNkZWZpbmUg
TGluZUluZm9faAotCi0jaW5jbHVkZSAiTGluZVdpZHRoLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3Jl
IHsKLQotY2xhc3MgTGluZUluZm8gewotcHVibGljOgotICAgIExpbmVJbmZvKCkKLSAgICAgICAg
OiBtX2lzRmlyc3RMaW5lKHRydWUpCi0gICAgICAgICwgbV9pc0xhc3RMaW5lKGZhbHNlKQotICAg
ICAgICAsIG1faXNFbXB0eSh0cnVlKQotICAgICAgICAsIG1fcHJldmlvdXNMaW5lQnJva2VDbGVh
bmx5KHRydWUpCi0gICAgICAgICwgbV9mbG9hdFBhZ2luYXRpb25TdHJ1dCgwKQotICAgICAgICAs
IG1fcnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgwKQotICAgIHsgfQotCi0gICAgYm9vbCBpc0Zp
cnN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNGaXJzdExpbmU7IH0KLSAgICBib29sIGlzTGFz
dExpbmUoKSBjb25zdCB7IHJldHVybiBtX2lzTGFzdExpbmU7IH0KLSAgICBib29sIGlzRW1wdHko
KSBjb25zdCB7IHJldHVybiBtX2lzRW1wdHk7IH0KLSAgICBib29sIHByZXZpb3VzTGluZUJyb2tl
Q2xlYW5seSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5OyB9Ci0g
ICAgTGF5b3V0VW5pdCBmbG9hdFBhZ2luYXRpb25TdHJ1dCgpIGNvbnN0IHsgcmV0dXJuIG1fZmxv
YXRQYWdpbmF0aW9uU3RydXQ7IH0KLSAgICB1bnNpZ25lZCBydW5zRnJvbUxlYWRpbmdXaGl0ZXNw
YWNlKCkgY29uc3QgeyByZXR1cm4gbV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlOyB9Ci0gICAg
dm9pZCByZXNldFJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UoKSB7IG1fcnVuc0Zyb21MZWFkaW5n
V2hpdGVzcGFjZSA9IDA7IH0KLSAgICB2b2lkIGluY3JlbWVudFJ1bnNGcm9tTGVhZGluZ1doaXRl
c3BhY2UoKSB7IG1fcnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSsrOyB9Ci0KLSAgICB2b2lkIHNl
dEZpcnN0TGluZShib29sIGZpcnN0TGluZSkgeyBtX2lzRmlyc3RMaW5lID0gZmlyc3RMaW5lOyB9
Ci0gICAgdm9pZCBzZXRMYXN0TGluZShib29sIGxhc3RMaW5lKSB7IG1faXNMYXN0TGluZSA9IGxh
c3RMaW5lOyB9Ci0gICAgdm9pZCBzZXRFbXB0eShib29sIGVtcHR5LCBSZW5kZXJCbG9jayogYmxv
Y2sgPSAwLCBMaW5lV2lkdGgqIGxpbmVXaWR0aCA9IDApCi0gICAgewotICAgICAgICBpZiAobV9p
c0VtcHR5ID09IGVtcHR5KQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX2lzRW1wdHkg
PSBlbXB0eTsKLSAgICAgICAgaWYgKCFlbXB0eSAmJiBibG9jayAmJiBmbG9hdFBhZ2luYXRpb25T
dHJ1dCgpKSB7Ci0gICAgICAgICAgICBibG9jay0+c2V0TG9naWNhbEhlaWdodChibG9jay0+bG9n
aWNhbEhlaWdodCgpICsgZmxvYXRQYWdpbmF0aW9uU3RydXQoKSk7Ci0gICAgICAgICAgICBzZXRG
bG9hdFBhZ2luYXRpb25TdHJ1dCgwKTsKLSAgICAgICAgICAgIGxpbmVXaWR0aC0+dXBkYXRlQXZh
aWxhYmxlV2lkdGgoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0UHJldmlvdXNM
aW5lQnJva2VDbGVhbmx5KGJvb2wgcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KSB7IG1fcHJldmlv
dXNMaW5lQnJva2VDbGVhbmx5ID0gcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5OyB9Ci0gICAgdm9p
ZCBzZXRGbG9hdFBhZ2luYXRpb25TdHJ1dChMYXlvdXRVbml0IHN0cnV0KSB7IG1fZmxvYXRQYWdp
bmF0aW9uU3RydXQgPSBzdHJ1dDsgfQotCi1wcml2YXRlOgotICAgIGJvb2wgbV9pc0ZpcnN0TGlu
ZTsKLSAgICBib29sIG1faXNMYXN0TGluZTsKLSAgICBib29sIG1faXNFbXB0eTsKLSAgICBib29s
IG1fcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5OwotICAgIExheW91dFVuaXQgbV9mbG9hdFBhZ2lu
YXRpb25TdHJ1dDsKLSAgICB1bnNpZ25lZCBtX3J1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2U7Ci19
OwotCi19Ci0KLSNlbmRpZiAvLyBMaW5lSW5mb19oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Jl
bmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCmluZGV4IGU1N2JjODUuLjIxNTY2NTMg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlv
dXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlv
dXQuY3BwCkBAIC0zLDYgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAyMDA2
LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0IHJlc2Vy
dmVkLgogICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hhbmdTZW9rIE9oIDxzaGl2YW1pZG93QGdtYWls
LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluYy4gQWxsIHJpZ2h0
IHJlc2VydmVkLgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCkBAIC0yNSwxMzggKzI2LDMxIEBACiAKICNp
bmNsdWRlICJBWE9iamVjdENhY2hlLmgiCiAjaW5jbHVkZSAiQmlkaVJlc29sdmVyLmgiCisjaW5j
bHVkZSAiQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oIgogI2luY2x1ZGUgIkZsb2F0aW5n
T2JqZWN0cy5oIgotI2luY2x1ZGUgIkh5cGhlbmF0aW9uLmgiCiAjaW5jbHVkZSAiSW5saW5lRWxl
bWVudEJveC5oIgogI2luY2x1ZGUgIklubGluZUl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiSW5saW5l
VGV4dEJveC5oIgotI2luY2x1ZGUgIkxpbmVJbmZvLmgiCiAjaW5jbHVkZSAiTGluZUxheW91dFN0
YXRlLmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIlJlbmRlckJsb2NrRmxvdy5o
IgotI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0LmgiCi0jaW5jbHVkZSAiUmVuZGVyQ291bnRl
ci5oIgogI2luY2x1ZGUgIlJlbmRlckZsb3dUaHJlYWQuaCIKLSNpbmNsdWRlICJSZW5kZXJJbmxp
bmUuaCIKLSNpbmNsdWRlICJSZW5kZXJMYXllci5oIgogI2luY2x1ZGUgIlJlbmRlckxpbmVCcmVh
ay5oIgotI2luY2x1ZGUgIlJlbmRlckxpc3RNYXJrZXIuaCIKICNpbmNsdWRlICJSZW5kZXJSZWdp
b24uaCIKLSNpbmNsdWRlICJSZW5kZXJSdWJ5UnVuLmgiCiAjaW5jbHVkZSAiUmVuZGVyVmlldy5o
IgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAjaW5jbHVkZSAiU2ltcGxlTGluZUxheW91dEZ1bmN0
aW9ucy5oIgogI2luY2x1ZGUgIlRyYWlsaW5nRmxvYXRzUm9vdElubGluZUJveC5oIgogI2luY2x1
ZGUgIlZlcnRpY2FsUG9zaXRpb25DYWNoZS5oIgotI2luY2x1ZGUgImJyZWFrX2xpbmVzLmgiCiAj
aW5jbHVkZSA8d3RmL1JlZkNvdW50ZWRMZWFrQ291bnRlci5oPgogI2luY2x1ZGUgPHd0Zi9TdGRM
aWJFeHRyYXMuaD4KLSNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8d3RmL3VuaWNv
ZGUvQ2hhcmFjdGVyTmFtZXMuaD4KLQotI2lmIEVOQUJMRShDU1NfU0hBUEVTKQotI2luY2x1ZGUg
IlNoYXBlSW5zaWRlSW5mby5oIgotI2VuZGlmCiAKICNpZiBFTkFCTEUoU1ZHKQotI2luY2x1ZGUg
IlJlbmRlclNWR0lubGluZVRleHQuaCIKICNpbmNsdWRlICJTVkdSb290SW5saW5lQm94LmgiCiAj
ZW5kaWYKIAotdXNpbmcgbmFtZXNwYWNlIFdURjsKLXVzaW5nIG5hbWVzcGFjZSBVbmljb2RlOwot
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLS8vIFdlIGRvbid0IGxldCBvdXIgbGluZSBib3ggdHJl
ZSBmb3IgYSBzaW5nbGUgbGluZSBnZXQgYW55IGRlZXBlciB0aGFuIHRoaXMuCi1jb25zdCB1bnNp
Z25lZCBjTWF4TGluZURlcHRoID0gMjAwOwotCi1zdHJ1Y3QgUmVuZGVyVGV4dEluZm8gewotICAg
IC8vIERlc3RydWN0aW9uIG9mIG1fbGF5b3V0IHJlcXVpcmVzIFRleHRMYXlvdXQgdG8gYmUgYSBj
b21wbGV0ZSB0eXBlLCBzbyB0aGUgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgYXJlIG1hZGUg
bm9uLWlubGluZSB0byBhdm9pZCBjb21waWxhdGlvbiBlcnJvcnMuCi0gICAgUmVuZGVyVGV4dElu
Zm8oKTsKLSAgICB+UmVuZGVyVGV4dEluZm8oKTsKLQotICAgIFJlbmRlclRleHQqIG1fdGV4dDsK
LSAgICBPd25QdHI8VGV4dExheW91dD4gbV9sYXlvdXQ7Ci0gICAgTGF6eUxpbmVCcmVha0l0ZXJh
dG9yIG1fbGluZUJyZWFrSXRlcmF0b3I7Ci0gICAgY29uc3QgRm9udCogbV9mb250OwotfTsKLQot
Y2xhc3MgTGluZUJyZWFrZXIgewotcHVibGljOgotICAgIGZyaWVuZCBjbGFzcyBCcmVha2luZ0Nv
bnRleHQ7Ci0gICAgTGluZUJyZWFrZXIoUmVuZGVyQmxvY2tGbG93JiBibG9jaykKLSAgICAgICAg
OiBtX2Jsb2NrKGJsb2NrKQotICAgIHsKLSAgICAgICAgcmVzZXQoKTsKLSAgICB9Ci0KLSAgICBJ
bmxpbmVJdGVyYXRvciBuZXh0TGluZUJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIExpbmVJbmZv
JiwgUmVuZGVyVGV4dEluZm8mLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3Vz
TGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIFdvcmRNZWFzdXJlbWVu
dHMmKTsKLQotICAgIGJvb2wgbGluZVdhc0h5cGhlbmF0ZWQoKSB7IHJldHVybiBtX2h5cGhlbmF0
ZWQ7IH0KLSAgICBjb25zdCBWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmplY3RzKCkg
eyByZXR1cm4gbV9wb3NpdGlvbmVkT2JqZWN0czsgfQotICAgIEVDbGVhciBjbGVhcigpIHsgcmV0
dXJuIG1fY2xlYXI7IH0KLQotcHJpdmF0ZToKLSAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICBJbmxp
bmVJdGVyYXRvciBuZXh0U2VnbWVudEJyZWFrKElubGluZUJpZGlSZXNvbHZlciYsIExpbmVJbmZv
JiwgUmVuZGVyVGV4dEluZm8mLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3Vz
TGluZSwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIFdvcmRNZWFzdXJlbWVu
dHMmKTsKLSAgICB2b2lkIHNraXBUcmFpbGluZ1doaXRlc3BhY2UoSW5saW5lSXRlcmF0b3ImLCBj
b25zdCBMaW5lSW5mbyYpOwotICAgIHZvaWQgc2tpcExlYWRpbmdXaGl0ZXNwYWNlKElubGluZUJp
ZGlSZXNvbHZlciYsIExpbmVJbmZvJiwgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2
aW91c0xpbmUsIExpbmVXaWR0aCYpOwotCi0gICAgUmVuZGVyQmxvY2tGbG93JiBtX2Jsb2NrOwot
ICAgIGJvb2wgbV9oeXBoZW5hdGVkOwotICAgIEVDbGVhciBtX2NsZWFyOwotICAgIFZlY3RvcjxS
ZW5kZXJCb3gqPiBtX3Bvc2l0aW9uZWRPYmplY3RzOwotfTsKLQotc3RhdGljIGlubGluZSBMYXlv
dXRVbml0IGJvcmRlclBhZGRpbmdNYXJnaW5TdGFydChjb25zdCBSZW5kZXJJbmxpbmUmIGNoaWxk
KQotewotICAgIHJldHVybiBjaGlsZC5tYXJnaW5TdGFydCgpICsgY2hpbGQucGFkZGluZ1N0YXJ0
KCkgKyBjaGlsZC5ib3JkZXJTdGFydCgpOwotfQotCi1zdGF0aWMgaW5saW5lIExheW91dFVuaXQg
Ym9yZGVyUGFkZGluZ01hcmdpbkVuZChjb25zdCBSZW5kZXJJbmxpbmUmIGNoaWxkKQotewotICAg
IHJldHVybiBjaGlsZC5tYXJnaW5FbmQoKSArIGNoaWxkLnBhZGRpbmdFbmQoKSArIGNoaWxkLmJv
cmRlckVuZCgpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkQWRkQm9yZGVyUGFkZGlu
Z01hcmdpbihSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIC8vIFdoZW4gZGVjaWRpbmcgd2hl
dGhlciB3ZSdyZSBhdCB0aGUgZWRnZSBvZiBhbiBpbmxpbmUsIGFkamFjZW50IGNvbGxhcHNlZCB3
aGl0ZXNwYWNlIGlzIHRoZSBzYW1lIGFzIG5vIHNpYmxpbmcgYXQgYWxsLgotICAgIHJldHVybiAh
Y2hpbGQgfHwgKGNoaWxkLT5pc1RleHQoKSAmJiAhdG9SZW5kZXJUZXh0KGNoaWxkKS0+dGV4dExl
bmd0aCgpKTsKLX0KLQotc3RhdGljIFJlbmRlck9iamVjdCogcHJldmlvdXNJbkZsb3dTaWJsaW5n
KFJlbmRlck9iamVjdCogY2hpbGQpCi17Ci0gICAgY2hpbGQgPSBjaGlsZC0+cHJldmlvdXNTaWJs
aW5nKCk7Ci0gICAgd2hpbGUgKGNoaWxkICYmIGNoaWxkLT5pc091dE9mRmxvd1Bvc2l0aW9uZWQo
KSkKLSAgICAgICAgY2hpbGQgPSBjaGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgcmV0dXJu
IGNoaWxkOwotfQotCi1zdGF0aWMgTGF5b3V0VW5pdCBpbmxpbmVMb2dpY2FsV2lkdGgoUmVuZGVy
T2JqZWN0KiBjaGlsZCwgYm9vbCBjaGVja1N0YXJ0RWRnZSA9IHRydWUsIGJvb2wgY2hlY2tFbmRF
ZGdlID0gdHJ1ZSkKLXsKLSAgICB1bnNpZ25lZCBsaW5lRGVwdGggPSAxOwotICAgIExheW91dFVu
aXQgZXh0cmFXaWR0aCA9IDA7Ci0gICAgUmVuZGVyRWxlbWVudCogcGFyZW50ID0gY2hpbGQtPnBh
cmVudCgpOwotICAgIHdoaWxlIChwYXJlbnQtPmlzUmVuZGVySW5saW5lKCkgJiYgbGluZURlcHRo
KysgPCBjTWF4TGluZURlcHRoKSB7Ci0gICAgICAgIGNvbnN0IFJlbmRlcklubGluZSYgcGFyZW50
QXNSZW5kZXJJbmxpbmUgPSB0b1JlbmRlcklubGluZSgqcGFyZW50KTsKLSAgICAgICAgaWYgKCFp
c0VtcHR5SW5saW5lKHBhcmVudEFzUmVuZGVySW5saW5lKSkgewotICAgICAgICAgICAgY2hlY2tT
dGFydEVkZ2UgPSBjaGVja1N0YXJ0RWRnZSAmJiBzaG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2lu
KHByZXZpb3VzSW5GbG93U2libGluZyhjaGlsZCkpOwotICAgICAgICAgICAgaWYgKGNoZWNrU3Rh
cnRFZGdlKQotICAgICAgICAgICAgICAgIGV4dHJhV2lkdGggKz0gYm9yZGVyUGFkZGluZ01hcmdp
blN0YXJ0KHBhcmVudEFzUmVuZGVySW5saW5lKTsKLSAgICAgICAgICAgIGNoZWNrRW5kRWRnZSA9
IGNoZWNrRW5kRWRnZSAmJiBzaG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2luKGNoaWxkLT5uZXh0
U2libGluZygpKTsKLSAgICAgICAgICAgIGlmIChjaGVja0VuZEVkZ2UpCi0gICAgICAgICAgICAg
ICAgZXh0cmFXaWR0aCArPSBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKHBhcmVudEFzUmVuZGVySW5s
aW5lKTsKLSAgICAgICAgICAgIGlmICghY2hlY2tTdGFydEVkZ2UgJiYgIWNoZWNrRW5kRWRnZSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFXaWR0aDsKLSAgICAgICAgfQotICAgICAgICBj
aGlsZCA9IHBhcmVudDsKLSAgICAgICAgcGFyZW50ID0gY2hpbGQtPnBhcmVudCgpOwotICAgIH0K
LSAgICByZXR1cm4gZXh0cmFXaWR0aDsKLX0KLQogc3RhdGljIHZvaWQgZGV0ZXJtaW5lRGlyZWN0
aW9uYWxpdHkoVGV4dERpcmVjdGlvbiYgZGlyLCBJbmxpbmVJdGVyYXRvciBpdGVyKQogewogICAg
IHdoaWxlICghaXRlci5hdEVuZCgpKSB7CkBAIC0xNzcsNjcgKzcxLDcgQEAgc3RhdGljIHZvaWQg
ZGV0ZXJtaW5lRGlyZWN0aW9uYWxpdHkoVGV4dERpcmVjdGlvbiYgZGlyLCBJbmxpbmVJdGVyYXRv
ciBpdGVyKQogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2hlY2tNaWRwb2ludHMoTGluZU1pZHBv
aW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvciYgbEJyZWFrKQotewot
ICAgIC8vIENoZWNrIHRvIHNlZSBpZiBvdXIgbGFzdCBtaWRwb2ludCBpcyBhIHN0YXJ0IHBvaW50
IGJleW9uZCB0aGUgbGluZSBicmVhay4gIElmIHNvLAotICAgIC8vIHNoYXZlIGl0IG9mZiB0aGUg
bGlzdCwgYW5kIHNoYXZlIG9mZiBhIHRyYWlsaW5nIHNwYWNlIGlmIHRoZSBwcmV2aW91cyBlbmQg
cG9pbnQgZG9lc24ndAotICAgIC8vIHByZXNlcnZlIHdoaXRlc3BhY2UuCi0gICAgaWYgKGxCcmVh
ay5tX29iaiAmJiBsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgJiYgIShsaW5lTWlkcG9p
bnRTdGF0ZS5udW1NaWRwb2ludHMgJSAyKSkgewotICAgICAgICBJbmxpbmVJdGVyYXRvciogbWlk
cG9pbnRzID0gbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmRhdGEoKTsKLSAgICAgICAgSW5s
aW5lSXRlcmF0b3ImIGVuZHBvaW50ID0gbWlkcG9pbnRzW2xpbmVNaWRwb2ludFN0YXRlLm51bU1p
ZHBvaW50cyAtIDJdOwotICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgc3RhcnRwb2ludCA9
IG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxXTsKLSAgICAgICAg
SW5saW5lSXRlcmF0b3IgY3VycnBvaW50ID0gZW5kcG9pbnQ7Ci0gICAgICAgIHdoaWxlICghY3Vy
cnBvaW50LmF0RW5kKCkgJiYgY3VycnBvaW50ICE9IHN0YXJ0cG9pbnQgJiYgY3VycnBvaW50ICE9
IGxCcmVhaykKLSAgICAgICAgICAgIGN1cnJwb2ludC5pbmNyZW1lbnQoKTsKLSAgICAgICAgaWYg
KGN1cnJwb2ludCA9PSBsQnJlYWspIHsKLSAgICAgICAgICAgIC8vIFdlIGhpdCB0aGUgbGluZSBi
cmVhayBiZWZvcmUgdGhlIHN0YXJ0IHBvaW50LiAgU2hhdmUgb2ZmIHRoZSBzdGFydCBwb2ludC4K
LSAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cy0tOwotICAgICAgICAg
ICAgaWYgKGVuZHBvaW50Lm1fb2JqLT5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIGVu
ZHBvaW50Lm1fb2JqLT5pc1RleHQoKSkKLSAgICAgICAgICAgICAgICBlbmRwb2ludC5tX3Bvcy0t
OwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBEb24ndCBjYWxsIHRoaXMgZGlyZWN0bHkuIFVz
ZSBvbmUgb2YgdGhlIGRlc2NyaXB0aXZlIGhlbHBlciBmdW5jdGlvbnMgYmVsb3cuCi1zdGF0aWMg
dm9pZCBkZXByZWNhdGVkQWRkTWlkcG9pbnQoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2lu
dFN0YXRlLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbWlkcG9pbnQpCi17Ci0gICAgaWYgKGxpbmVN
aWRwb2ludFN0YXRlLm1pZHBvaW50cy5zaXplKCkgPD0gbGluZU1pZHBvaW50U3RhdGUubnVtTWlk
cG9pbnRzKQotICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5taWRwb2ludHMuZ3JvdyhsaW5lTWlk
cG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgKyAxMCk7Ci0KLSAgICBJbmxpbmVJdGVyYXRvciogbWlk
cG9pbnRzID0gbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmRhdGEoKTsKLSAgICBtaWRwb2lu
dHNbbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKytdID0gbWlkcG9pbnQ7Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgdm9pZCBzdGFydElnbm9yaW5nU3BhY2VzKExpbmVNaWRwb2ludFN0YXRlJiBs
aW5lTWlkcG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQotewotICAg
IEFTU0VSVCghKGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAlIDIpKTsKLSAgICBkZXBy
ZWNhdGVkQWRkTWlkcG9pbnQobGluZU1pZHBvaW50U3RhdGUsIG1pZHBvaW50KTsKLX0KLQotc3Rh
dGljIGlubGluZSB2b2lkIHN0b3BJZ25vcmluZ1NwYWNlcyhMaW5lTWlkcG9pbnRTdGF0ZSYgbGlu
ZU1pZHBvaW50U3RhdGUsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBtaWRwb2ludCkKLXsKLSAgICBB
U1NFUlQobGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzICUgMik7Ci0gICAgZGVwcmVjYXRl
ZEFkZE1pZHBvaW50KGxpbmVNaWRwb2ludFN0YXRlLCBtaWRwb2ludCk7Ci19Ci0KLS8vIFdoZW4g
aWdub3Jpbmcgc3BhY2VzLCB0aGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBmb3Igb2JqZWN0cyB0aGF0
IG5lZWQgbGluZSBib3hlcyBzdWNoIGFzIFJlbmRlcklubGluZXMgb3IKLS8vIGhhcmQgbGluZSBi
cmVha3MgdG8gZW5zdXJlIHRoYXQgdGhleSdyZSBub3QgaWdub3JlZC4KLXN0YXRpYyBpbmxpbmUg
dm9pZCBlbnN1cmVMaW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcyhMaW5lTWlkcG9pbnRTdGF0ZSYg
bGluZU1pZHBvaW50U3RhdGUsIFJlbmRlck9iamVjdCogcmVuZGVyZXIpCi17Ci0gICAgSW5saW5l
SXRlcmF0b3IgbWlkcG9pbnQoMCwgcmVuZGVyZXIsIDApOwotICAgIHN0b3BJZ25vcmluZ1NwYWNl
cyhsaW5lTWlkcG9pbnRTdGF0ZSwgbWlkcG9pbnQpOwotICAgIHN0YXJ0SWdub3JpbmdTcGFjZXMo
bGluZU1pZHBvaW50U3RhdGUsIG1pZHBvaW50KTsKLX0KLQotLy8gQWRkaW5nIGEgcGFpciBvZiBt
aWRwb2ludHMgYmVmb3JlIGEgY2hhcmFjdGVyIHdpbGwgc3BsaXQgaXQgb3V0IGludG8gYSBuZXcg
bGluZSBib3guCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3go
TGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvciYgdGV4
dFBhcmFncmFwaFNlcGFyYXRvcikKLXsKLSAgICBJbmxpbmVJdGVyYXRvciBtaWRwb2ludCgwLCB0
ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fb2JqLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fcG9z
KTsKLSAgICBzdGFydElnbm9yaW5nU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVy
YXRvcigwLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm1fb2JqLCB0ZXh0UGFyYWdyYXBoU2VwYXJh
dG9yLm1fcG9zIC0gMSkpOwotICAgIHN0b3BJZ25vcmluZ1NwYWNlcyhsaW5lTWlkcG9pbnRTdGF0
ZSwgSW5saW5lSXRlcmF0b3IoMCwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX29iaiwgdGV4dFBh
cmFncmFwaFNlcGFyYXRvci5tX3BvcykpOwotfQotCi1zdGF0aWMgaW5saW5lIEJpZGlSdW4qIGNy
ZWF0ZVJ1bihpbnQgc3RhcnQsIGludCBlbmQsIFJlbmRlck9iamVjdCogb2JqLCBJbmxpbmVCaWRp
UmVzb2x2ZXImIHJlc29sdmVyKQoraW5saW5lIEJpZGlSdW4qIGNyZWF0ZVJ1bihpbnQgc3RhcnQs
IGludCBlbmQsIFJlbmRlck9iamVjdCogb2JqLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJlc29sdmVy
KQogewogICAgIEFTU0VSVChvYmopOwogICAgIHJldHVybiBuZXcgQmlkaVJ1bihzdGFydCwgZW5k
LCAqb2JqLCByZXNvbHZlci5jb250ZXh0KCksIHJlc29sdmVyLmRpcigpKTsKQEAgLTMwMyw3ICsx
MzcsNiBAQCBSb290SW5saW5lQm94KiBSZW5kZXJCbG9ja0Zsb3c6OmNyZWF0ZUFuZEFwcGVuZFJv
b3RJbmxpbmVCb3goKQogICAgIHJldHVybiByb290Qm94OwogfQogCi0KIHN0YXRpYyBpbmxpbmUg
SW5saW5lQm94KiBjcmVhdGVJbmxpbmVCb3hGb3JSZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwg
Ym9vbCBpc1Jvb3RMaW5lQm94LCBib29sIGlzT25seVJ1biA9IGZhbHNlKQogewogICAgIGlmIChp
c1Jvb3RMaW5lQm94KQpAQCAtMzI5LDE1ICsxNjIsNiBAQCBzdGF0aWMgaW5saW5lIElubGluZUJv
eCogY3JlYXRlSW5saW5lQm94Rm9yUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGJvb2wgaXNS
bwogICAgIHJldHVybiB0b1JlbmRlcklubGluZShvYmopLT5jcmVhdGVBbmRBcHBlbmRJbmxpbmVG
bG93Qm94KCk7CiB9CiAKLS8vIEZJWE1FOiBEb24ndCBsZXQgY291bnRlcnMgbWFyayB0aGVtc2Vs
dmVzIGFzIG5lZWRpbmcgcHJlZiB3aWR0aCByZWNhbGNzIGR1cmluZyBsYXlvdXQKLS8vIHNvIHdl
IGRvbid0IG5lZWQgdGhpcyBoYWNrLgotc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZUNvdW50ZXJJ
Zk5lZWRlZChSZW5kZXJUZXh0JiByZW5kZXJUZXh0KQotewotICAgIGlmICghcmVuZGVyVGV4dC5w
cmVmZXJyZWRMb2dpY2FsV2lkdGhzRGlydHkoKSB8fCAhcmVuZGVyVGV4dC5pc0NvdW50ZXIoKSkK
LSAgICAgICAgcmV0dXJuOwotICAgIHRvUmVuZGVyQ291bnRlcihyZW5kZXJUZXh0KS51cGRhdGVD
b3VudGVyKCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkaXJ0eUxpbmVCb3hlc0ZvclJlbmRl
cmVyKFJlbmRlck9iamVjdCYgcmVuZGVyZXIsIGJvb2wgZnVsbExheW91dCkKIHsKICAgICBpZiAo
cmVuZGVyZXIuaXNUZXh0KCkpIHsKQEAgLTYwNSwzNCArNDI5LDYgQEAgdm9pZCBSZW5kZXJCbG9j
a0Zsb3c6OnNldE1hcmdpbnNGb3JSdWJ5UnVuKEJpZGlSdW4qIHJ1biwgUmVuZGVyUnVieVJ1biYg
cmVuZGVyZXIKICAgICBzZXRNYXJnaW5FbmRGb3JDaGlsZChyZW5kZXJlciwgLWVuZE92ZXJoYW5n
KTsKIH0KIAotc3RhdGljIGlubGluZSBmbG9hdCBtZWFzdXJlSHlwaGVuV2lkdGgoUmVuZGVyVGV4
dCogcmVuZGVyZXIsIGNvbnN0IEZvbnQmIGZvbnQsIEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERh
dGEqPiogZmFsbGJhY2tGb250cyA9IDApCi17Ci0gICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxl
ID0gcmVuZGVyZXItPnN0eWxlKCk7Ci0gICAgcmV0dXJuIGZvbnQud2lkdGgoUmVuZGVyQmxvY2s6
OmNvbnN0cnVjdFRleHRSdW4ocmVuZGVyZXIsIGZvbnQsIHN0eWxlLmh5cGhlblN0cmluZygpLnN0
cmluZygpLCBzdHlsZSksIGZhbGxiYWNrRm9udHMpOwotfQotCi1jbGFzcyBXb3JkTWVhc3VyZW1l
bnQgewotcHVibGljOgotICAgIFdvcmRNZWFzdXJlbWVudCgpCi0gICAgICAgIDogcmVuZGVyZXIo
MCkKLSAgICAgICAgLCB3aWR0aCgwKQotICAgICAgICAsIHN0YXJ0T2Zmc2V0KDApCi0gICAgICAg
ICwgZW5kT2Zmc2V0KDApCi0gICAgewotICAgIH0KLSAgICAKLSAgICBSZW5kZXJUZXh0KiByZW5k
ZXJlcjsKLSAgICBmbG9hdCB3aWR0aDsKLSAgICBpbnQgc3RhcnRPZmZzZXQ7Ci0gICAgaW50IGVu
ZE9mZnNldDsKLSAgICBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4gZmFsbGJhY2tGb250
czsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgY29uc3QgUmVuZGVyU3R5bGUmIGxpbmVTdHlsZShjb25z
dCBSZW5kZXJFbGVtZW50JiByZW5kZXJlciwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQotewot
ICAgIHJldHVybiBsaW5lSW5mby5pc0ZpcnN0TGluZSgpID8gcmVuZGVyZXIuZmlyc3RMaW5lU3R5
bGUoKSA6IHJlbmRlcmVyLnN0eWxlKCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRMb2dp
Y2FsV2lkdGhGb3JUZXh0UnVuKFJvb3RJbmxpbmVCb3gqIGxpbmVCb3gsIEJpZGlSdW4qIHJ1biwg
UmVuZGVyVGV4dCogcmVuZGVyZXIsIGZsb2F0IHhQb3MsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5m
bywKICAgICBHbHlwaE92ZXJmbG93QW5kRmFsbGJhY2tGb250c01hcCYgdGV4dEJveERhdGFNYXAs
IFZlcnRpY2FsUG9zaXRpb25DYWNoZSYgdmVydGljYWxQb3NpdGlvbkNhY2hlLCBXb3JkTWVhc3Vy
ZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQogewpAQCAtOTk3LDI0ICs3OTMsNiBAQCBzdGF0aWMg
aW5saW5lIGJvb2wgaXNDb2xsYXBzaWJsZVNwYWNlKFVDaGFyIGNoYXJhY3RlciwgY29uc3QgUmVu
ZGVyVGV4dCYgcmVuZGVyZQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotCi1zdGF0aWMgdm9pZCBz
ZXRTdGF0aWNQb3NpdGlvbnMoUmVuZGVyQmxvY2tGbG93JiBibG9jaywgUmVuZGVyQm94JiBjaGls
ZCkKLXsKLSAgICAvLyBGSVhNRTogVGhlIG1hdGggaGVyZSBpcyBhY3R1YWxseSBub3QgcmVhbGx5
IHJpZ2h0LiBJdCdzIGEgYmVzdC1ndWVzcyBhcHByb3hpbWF0aW9uIHRoYXQKLSAgICAvLyB3aWxs
IHdvcmsgZm9yIHRoZSBjb21tb24gY2FzZXMKLSAgICBSZW5kZXJFbGVtZW50KiBjb250YWluZXJC
bG9jayA9IGNoaWxkLmNvbnRhaW5lcigpOwotICAgIExheW91dFVuaXQgYmxvY2tIZWlnaHQgPSBi
bG9jay5sb2dpY2FsSGVpZ2h0KCk7Ci0gICAgaWYgKGNvbnRhaW5lckJsb2NrLT5pc1JlbmRlcklu
bGluZSgpKSB7Ci0gICAgICAgIC8vIEEgcmVsYXRpdmUgcG9zaXRpb25lZCBpbmxpbmUgZW5jbG9z
ZXMgdXMuIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBoYXZlIHRvIGRldGVybWluZSBvdXIKLSAgICAg
ICAgLy8gcG9zaXRpb24gYXMgdGhvdWdoIHdlIHdlcmUgYW4gaW5saW5lLiBTZXQgfHN0YXRpY0lu
bGluZVBvc2l0aW9ufCBhbmQgfHN0YXRpY0Jsb2NrUG9zaXRpb258IG9uIHRoZSByZWxhdGl2ZSBw
b3NpdGlvbmVkCi0gICAgICAgIC8vIGlubGluZSBzbyB0aGF0IHdlIGNhbiBvYnRhaW4gdGhlIHZh
bHVlIGxhdGVyLgotICAgICAgICB0b1JlbmRlcklubGluZShjb250YWluZXJCbG9jayktPmxheWVy
KCktPnNldFN0YXRpY0lubGluZVBvc2l0aW9uKGJsb2NrLnN0YXJ0QWxpZ25lZE9mZnNldEZvckxp
bmUoYmxvY2tIZWlnaHQsIGZhbHNlKSk7Ci0gICAgICAgIHRvUmVuZGVySW5saW5lKGNvbnRhaW5l
ckJsb2NrKS0+bGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlvbihibG9ja0hlaWdodCk7Ci0g
ICAgfQotICAgIGJsb2NrLnVwZGF0ZVN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hpbGQoY2hpbGQs
IGJsb2NrSGVpZ2h0KTsKLSAgICBjaGlsZC5sYXllcigpLT5zZXRTdGF0aWNCbG9ja1Bvc2l0aW9u
KGJsb2NrSGVpZ2h0KTsKLX0KLQogdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJhY3RlclR5cGU+CiBz
dGF0aWMgaW5saW5lIGludCBmaW5kRmlyc3RUcmFpbGluZ1NwYWNlKGNvbnN0IFJlbmRlclRleHQm
IGxhc3RUZXh0LCBjb25zdCBDaGFyYWN0ZXJUeXBlKiBjaGFyYWN0ZXJzLCBpbnQgc3RhcnQsIGlu
dCBzdG9wKQogewpAQCAtMTQ2NiwxNSArMTI0NCw2IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93Ojp1
cGRhdGVTaGFwZUFuZFNlZ21lbnRzRm9yQ3VycmVudExpbmVJbkZsb3dUaHJlYWQoU2hhcGVJbnNp
CiAgICAgICAgIHB1c2hTaGFwZUNvbnRlbnRPdmVyZmxvd0JlbG93VGhlQ29udGVudEJveCh0aGlz
LCBzaGFwZUluc2lkZUluZm8sIGxpbmVUb3AsIGxpbmVIZWlnaHQpOwogfQogCi1zdGF0aWMgaW5s
aW5lIGZsb2F0IGZpcnN0UG9zaXRpdmVXaWR0aChjb25zdCBXb3JkTWVhc3VyZW1lbnRzJiB3b3Jk
TWVhc3VyZW1lbnRzKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd29yZE1lYXN1cmVt
ZW50cy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAod29yZE1lYXN1cmVtZW50c1tpXS53aWR0
aCA+IDApCi0gICAgICAgICAgICByZXR1cm4gd29yZE1lYXN1cmVtZW50c1tpXS53aWR0aDsKLSAg
ICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgTGF5b3V0VW5pdCBhZGp1c3RM
b2dpY2FsTGluZVRvcChTaGFwZUluc2lkZUluZm8qIHNoYXBlSW5zaWRlSW5mbywgSW5saW5lSXRl
cmF0b3Igc3RhcnQsIElubGluZUl0ZXJhdG9yIGVuZCwgY29uc3QgV29yZE1lYXN1cmVtZW50cyYg
d29yZE1lYXN1cmVtZW50cykKIHsKICAgICBpZiAoIXNoYXBlSW5zaWRlSW5mbyB8fCBlbmQgIT0g
c3RhcnQpCkBAIC0yMjI1LDkxICsxOTk0LDYgQEAgYm9vbCBSZW5kZXJCbG9ja0Zsb3c6Om1hdGNo
ZWRFbmRMaW5lKExpbmVMYXlvdXRTdGF0ZSYgbGF5b3V0U3RhdGUsIGNvbnN0IElubGluZUIKICAg
ICByZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBza2lwTm9uQnJlYWtpbmdT
cGFjZShjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQsIGNvbnN0IExpbmVJbmZvJiBsaW5lSW5mbykK
LXsKLSAgICBpZiAoaXQubV9vYmotPnN0eWxlKCkubmJzcE1vZGUoKSAhPSBTUEFDRSB8fCBpdC5j
dXJyZW50KCkgIT0gbm9CcmVha1NwYWNlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAv
LyBGSVhNRTogVGhpcyBpcyBiYWQuICBJdCBtYWtlcyBuYnNwIGluY29uc2lzdGVudCB3aXRoIHNw
YWNlIGFuZCB3b24ndCB3b3JrIGNvcnJlY3RseQotICAgIC8vIHdpdGggbV9taW5XaWR0aC9tX21h
eFdpZHRoLgotICAgIC8vIERvIG5vdCBza2lwIGEgbm9uLWJyZWFraW5nIHNwYWNlIGlmIGl0IGlz
IHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICAvLyBvbiBhIGxpbmUgYWZ0ZXIgYSBjbGVhbiBsaW5l
IGJyZWFrIChvciBvbiB0aGUgZmlyc3QgbGluZSwgc2luY2UgcHJldmlvdXNMaW5lQnJva2VDbGVh
bmx5IHN0YXJ0cyBvZmYKLSAgICAvLyB8dHJ1ZXwpLgotICAgIGlmIChsaW5lSW5mby5pc0VtcHR5
KCkgJiYgbGluZUluZm8ucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1lbnVtIFdoaXRlc3BhY2VQb3NpdGlv
biB7IExlYWRpbmdXaGl0ZXNwYWNlLCBUcmFpbGluZ1doaXRlc3BhY2UgfTsKLXN0YXRpYyBpbmxp
bmUgYm9vbCBzaG91bGRDb2xsYXBzZVdoaXRlU3BhY2UoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxl
LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8sIFdoaXRlc3BhY2VQb3NpdGlvbiB3aGl0ZXNwYWNl
UG9zaXRpb24pCi17Ci0gICAgLy8gQ1NTMiAxNi42LjEKLSAgICAvLyBJZiBhIHNwYWNlIChVKzAw
MjApIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIGhhcyAnd2hpdGUtc3BhY2UnIHNldCB0byAn
bm9ybWFsJywgJ25vd3JhcCcsIG9yICdwcmUtbGluZScsIGl0IGlzIHJlbW92ZWQuCi0gICAgLy8g
SWYgYSBzcGFjZSAoVSswMDIwKSBhdCB0aGUgZW5kIG9mIGEgbGluZSBoYXMgJ3doaXRlLXNwYWNl
JyBzZXQgdG8gJ25vcm1hbCcsICdub3dyYXAnLCBvciAncHJlLWxpbmUnLCBpdCBpcyBhbHNvIHJl
bW92ZWQuCi0gICAgLy8gSWYgc3BhY2VzIChVKzAwMjApIG9yIHRhYnMgKFUrMDAwOSkgYXQgdGhl
IGVuZCBvZiBhIGxpbmUgaGF2ZSAnd2hpdGUtc3BhY2UnIHNldCB0byAncHJlLXdyYXAnLCBVQXMg
bWF5IHZpc3VhbGx5IGNvbGxhcHNlIHRoZW0uCi0gICAgcmV0dXJuIHN0eWxlLT5jb2xsYXBzZVdo
aXRlU3BhY2UoKQotICAgICAgICB8fCAod2hpdGVzcGFjZVBvc2l0aW9uID09IFRyYWlsaW5nV2hp
dGVzcGFjZSAmJiBzdHlsZS0+d2hpdGVTcGFjZSgpID09IFBSRV9XUkFQICYmICghbGluZUluZm8u
aXNFbXB0eSgpIHx8ICFsaW5lSW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSkpOwotfQot
Ci1zdGF0aWMgYm9vbCByZXF1aXJlc0xpbmVCb3hGb3JDb250ZW50KGNvbnN0IFJlbmRlcklubGlu
ZSYgZmxvdywgY29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQotewotICAgIFJlbmRlckVsZW1lbnQq
IHBhcmVudCA9IGZsb3cucGFyZW50KCk7Ci0gICAgaWYgKGZsb3cuZG9jdW1lbnQoKS5pbk5vUXVp
cmtzTW9kZSgpKSB7Ci0gICAgICAgIGNvbnN0IFJlbmRlclN0eWxlJiBmbG93U3R5bGUgPSBsaW5l
U3R5bGUoZmxvdywgbGluZUluZm8pOwotICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSYgcGFyZW50
U3R5bGUgPSBsaW5lU3R5bGUoKnBhcmVudCwgbGluZUluZm8pOwotICAgICAgICBpZiAoZmxvd1N0
eWxlLmxpbmVIZWlnaHQoKSAhPSBwYXJlbnRTdHlsZS5saW5lSGVpZ2h0KCkKLSAgICAgICAgICAg
IHx8IGZsb3dTdHlsZS52ZXJ0aWNhbEFsaWduKCkgIT0gcGFyZW50U3R5bGUudmVydGljYWxBbGln
bigpCi0gICAgICAgICAgICB8fCAhcGFyZW50U3R5bGUuZm9udCgpLmZvbnRNZXRyaWNzKCkuaGFz
SWRlbnRpY2FsQXNjZW50RGVzY2VudEFuZExpbmVHYXAoZmxvd1N0eWxlLmZvbnQoKS5mb250TWV0
cmljcygpKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsK
LX0KLQotc3RhdGljIGJvb2wgaGFzSW5saW5lRGlyZWN0aW9uQm9yZGVyc1BhZGRpbmdPck1hcmdp
bihjb25zdCBSZW5kZXJJbmxpbmUmIGZsb3cpCi17Ci0gICAgLy8gV2hlcmUgYW4gZW1wdHkgaW5s
aW5lIGlzIHNwbGl0IGFjcm9zcyBhbm9ueW1vdXMgYmxvY2tzIHdlIHNob3VsZCBvbmx5IGdpdmUg
bGluZWJveGVzIHRvIHRoZSAnc2lkZXMnIG9mIHRoZQotICAgIC8vIGlubGluZSB0aGF0IGhhdmUg
Ym9yZGVycywgcGFkZGluZyBvciBtYXJnaW4uCi0gICAgYm9vbCBzaG91bGRBcHBseVN0YXJ0Qm9y
ZGVyUGFkZGluZ09yTWFyZ2luID0gIWZsb3cucGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSB8
fCAhZmxvdy5pc0lubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsKLSAgICBpZiAoc2hvdWxkQXBw
bHlTdGFydEJvcmRlclBhZGRpbmdPck1hcmdpbiAmJiAoZmxvdy5ib3JkZXJTdGFydCgpIHx8IGZs
b3cubWFyZ2luU3RhcnQoKSB8fCBmbG93LnBhZGRpbmdTdGFydCgpKSkKLSAgICAgICAgcmV0dXJu
IHRydWU7Ci0KLSAgICBib29sIHNob3VsZEFwcGx5RW5kQm9yZGVyUGFkZGluZ09yTWFyZ2luID0g
IWZsb3cucGFyZW50KCktPmlzQW5vbnltb3VzQmxvY2soKSB8fCBmbG93LmlzSW5saW5lRWxlbWVu
dENvbnRpbnVhdGlvbigpIHx8ICFmbG93LmlubGluZUVsZW1lbnRDb250aW51YXRpb24oKTsKLSAg
ICByZXR1cm4gc2hvdWxkQXBwbHlFbmRCb3JkZXJQYWRkaW5nT3JNYXJnaW4gJiYgKGZsb3cuYm9y
ZGVyRW5kKCkgfHwgZmxvdy5tYXJnaW5FbmQoKSB8fCBmbG93LnBhZGRpbmdFbmQoKSk7Ci19Ci0K
LXN0YXRpYyBib29sIGFsd2F5c1JlcXVpcmVzTGluZUJveChjb25zdCBSZW5kZXJJbmxpbmUmIGZs
b3cpCi17Ci0gICAgLy8gRklYTUU6IFJpZ2h0IG5vdywgd2Ugb25seSBhbGxvdyBsaW5lIGJveGVz
IGZvciBpbmxpbmVzIHRoYXQgYXJlIHRydWx5IGVtcHR5LgotICAgIC8vIFdlIG5lZWQgdG8gZml4
IHRoaXMsIHRob3VnaCwgYmVjYXVzZSBhdCB0aGUgdmVyeSBsZWFzdCwgaW5saW5lcyBjb250YWlu
aW5nIG9ubHkKLSAgICAvLyBpZ25vcmFibGUgd2hpdGVzcGFjZSBzaG91bGQgc2hvdWxkIGFsc28g
aGF2ZSBsaW5lIGJveGVzLgotICAgIHJldHVybiBpc0VtcHR5SW5saW5lKGZsb3cpICYmIGhhc0lu
bGluZURpcmVjdGlvbkJvcmRlcnNQYWRkaW5nT3JNYXJnaW4oZmxvdyk7Ci19Ci0KLXN0YXRpYyBi
b29sIHJlcXVpcmVzTGluZUJveChjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQsIGNvbnN0IExpbmVJ
bmZvJiBsaW5lSW5mbyA9IExpbmVJbmZvKCksIFdoaXRlc3BhY2VQb3NpdGlvbiB3aGl0ZXNwYWNl
UG9zaXRpb24gPSBMZWFkaW5nV2hpdGVzcGFjZSkKLXsKLSAgICBpZiAoaXQubV9vYmotPmlzRmxv
YXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgaWYgKGl0Lm1fb2JqLT5pc0JSKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgYm9v
bCByZW5kZXJlcklzRW1wdHlJbmxpbmUgPSBmYWxzZTsKLSAgICBpZiAoaXQubV9vYmotPmlzUmVu
ZGVySW5saW5lKCkpIHsKLSAgICAgICAgY29uc3QgUmVuZGVySW5saW5lJiBpbmxpbmVSZW5kZXJl
ciA9IHRvUmVuZGVySW5saW5lKCppdC5tX29iaik7Ci0gICAgICAgIGlmICghYWx3YXlzUmVxdWly
ZXNMaW5lQm94KGlubGluZVJlbmRlcmVyKSAmJiAhcmVxdWlyZXNMaW5lQm94Rm9yQ29udGVudChp
bmxpbmVSZW5kZXJlciwgbGluZUluZm8pKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICByZW5kZXJlcklzRW1wdHlJbmxpbmUgPSBpc0VtcHR5SW5saW5lKGlubGluZVJlbmRlcmVy
KTsKLSAgICB9Ci0KLSAgICBpZiAoIXNob3VsZENvbGxhcHNlV2hpdGVTcGFjZSgmaXQubV9vYmot
PnN0eWxlKCksIGxpbmVJbmZvLCB3aGl0ZXNwYWNlUG9zaXRpb24pKQotICAgICAgICByZXR1cm4g
dHJ1ZTsKLQotICAgIFVDaGFyIGN1cnJlbnQgPSBpdC5jdXJyZW50KCk7Ci0gICAgYm9vbCBub3RK
dXN0V2hpdGVzcGFjZSA9IGN1cnJlbnQgIT0gJyAnICYmIGN1cnJlbnQgIT0gJ1x0JyAmJiBjdXJy
ZW50ICE9IHNvZnRIeXBoZW4gJiYgKGN1cnJlbnQgIT0gJ1xuJyB8fCBpdC5tX29iai0+cHJlc2Vy
dmVzTmV3bGluZSgpKSAmJiAhc2tpcE5vbkJyZWFraW5nU3BhY2UoaXQsIGxpbmVJbmZvKTsKLSAg
ICByZXR1cm4gbm90SnVzdFdoaXRlc3BhY2UgfHwgcmVuZGVyZXJJc0VtcHR5SW5saW5lOwotfQot
CiBib29sIFJlbmRlckJsb2NrOjpnZW5lcmF0ZXNMaW5lQm94ZXNGb3JJbmxpbmVDaGlsZChSZW5k
ZXJPYmplY3QqIGlubGluZU9iaikKIHsKICAgICBBU1NFUlQoaW5saW5lT2JqLT5wYXJlbnQoKSA9
PSB0aGlzKTsKQEAgLTIzMjIsMjQ5ICsyMDA2LDYgQEAgYm9vbCBSZW5kZXJCbG9jazo6Z2VuZXJh
dGVzTGluZUJveGVzRm9ySW5saW5lQ2hpbGQoUmVuZGVyT2JqZWN0KiBpbmxpbmVPYmopCiAgICAg
cmV0dXJuICFpdC5hdEVuZCgpOwogfQogCi0vLyBGSVhNRTogVGhlIGVudGlyZSBjb25jZXB0IG9m
IHRoZSBza2lwVHJhaWxpbmdXaGl0ZXNwYWNlIGZ1bmN0aW9uIGlzIGZsYXdlZCwgc2luY2Ugd2Ug
cmVhbGx5IG5lZWQgdG8gYmUgYnVpbGRpbmcKLS8vIGxpbmUgYm94ZXMgZXZlbiBmb3IgY29udGFp
bmVycyB0aGF0IG1heSB1bHRpbWF0ZWx5IGNvbGxhcHNlIGF3YXkuIE90aGVyd2lzZSB3ZSdsbCBu
ZXZlciBnZXQgcG9zaXRpb25lZAotLy8gZWxlbWVudHMgcXVpdGUgcmlnaHQuIEluIG90aGVyIHdv
cmRzLCB3ZSBuZWVkIHRvIGJ1aWxkIHRoaXMgZnVuY3Rpb24ncyB3b3JrIGludG8gdGhlIG5vcm1h
bCBsaW5lCi0vLyBvYmplY3QgaXRlcmF0aW9uIHByb2Nlc3MuCi0vLyBOQi4gdGhpcyBmdW5jdGlv
biB3aWxsIGluc2VydCBhbnkgZmxvYXRpbmcgZWxlbWVudHMgdGhhdCB3b3VsZCBvdGhlcndpc2UK
LS8vIGJlIHNraXBwZWQgYnV0IGl0IHdpbGwgbm90IHBvc2l0aW9uIHRoZW0uCi12b2lkIExpbmVC
cmVha2VyOjpza2lwVHJhaWxpbmdXaGl0ZXNwYWNlKElubGluZUl0ZXJhdG9yJiBpdGVyYXRvciwg
Y29uc3QgTGluZUluZm8mIGxpbmVJbmZvKQotewotICAgIHdoaWxlICghaXRlcmF0b3IuYXRFbmQo
KSAmJiAhcmVxdWlyZXNMaW5lQm94KGl0ZXJhdG9yLCBsaW5lSW5mbywgVHJhaWxpbmdXaGl0ZXNw
YWNlKSkgewotICAgICAgICBSZW5kZXJPYmplY3QmIG9iamVjdCA9ICppdGVyYXRvci5tX29iajsK
LSAgICAgICAgaWYgKG9iamVjdC5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAg
IHNldFN0YXRpY1Bvc2l0aW9ucyhtX2Jsb2NrLCB0b1JlbmRlckJveChvYmplY3QpKTsKLSAgICAg
ICAgZWxzZSBpZiAob2JqZWN0LmlzRmxvYXRpbmcoKSkKLSAgICAgICAgICAgIG1fYmxvY2suaW5z
ZXJ0RmxvYXRpbmdPYmplY3QodG9SZW5kZXJCb3gob2JqZWN0KSk7Ci0gICAgICAgIGl0ZXJhdG9y
LmluY3JlbWVudCgpOwotICAgIH0KLX0KLQotdm9pZCBMaW5lQnJlYWtlcjo6c2tpcExlYWRpbmdX
aGl0ZXNwYWNlKElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJbmZvJiBsaW5lSW5m
bywgRmxvYXRpbmdPYmplY3QqIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIExpbmVXaWR0aCYg
d2lkdGgpCi17Ci0gICAgd2hpbGUgKCFyZXNvbHZlci5wb3NpdGlvbigpLmF0RW5kKCkgJiYgIXJl
cXVpcmVzTGluZUJveChyZXNvbHZlci5wb3NpdGlvbigpLCBsaW5lSW5mbywgTGVhZGluZ1doaXRl
c3BhY2UpKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCYgb2JqZWN0ID0gKnJlc29sdmVyLnBvc2l0
aW9uKCkubV9vYmo7Ci0gICAgICAgIGlmIChvYmplY3QuaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkp
IHsKLSAgICAgICAgICAgIHNldFN0YXRpY1Bvc2l0aW9ucyhtX2Jsb2NrLCB0b1JlbmRlckJveChv
YmplY3QpKTsKLSAgICAgICAgICAgIGlmIChvYmplY3Quc3R5bGUoKS5pc09yaWdpbmFsRGlzcGxh
eUlubGluZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIHJlc29sdmVyLnJ1bnMoKS5hZGRSdW4o
Y3JlYXRlUnVuKDAsIDEsICZvYmplY3QsIHJlc29sdmVyKSk7Ci0gICAgICAgICAgICAgICAgbGlu
ZUluZm8uaW5jcmVtZW50UnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSgpOwotICAgICAgICAgICAg
fQotICAgICAgICB9IGVsc2UgaWYgKG9iamVjdC5pc0Zsb2F0aW5nKCkpIHsKLSAgICAgICAgICAg
IC8vIFRoZSB0b3AgbWFyZ2luIGVkZ2Ugb2YgYSBzZWxmLWNvbGxhcHNpbmcgYmxvY2sgdGhhdCBj
bGVhcnMgYSBmbG9hdCBpbnRydWRlcyB1cCBpbnRvIGl0IGJ5IHRoZSBoZWlnaHQgb2YgdGhlIG1h
cmdpbiwKLSAgICAgICAgICAgIC8vIHNvIGluIG9yZGVyIHRvIHBsYWNlIHRoaXMgZmlyc3QgY2hp
bGQgZmxvYXQgYXQgdGhlIHRvcCBjb250ZW50IGVkZ2Ugb2YgdGhlIHNlbGYtY29sbGFwc2luZyBi
bG9jayBhZGQgdGhlIG1hcmdpbiBiYWNrIGluIGJlZm9yZSBwbGFjZW1lbnQuCi0gICAgICAgICAg
ICBMYXlvdXRVbml0IG1hcmdpbk9mZnNldCA9ICghb2JqZWN0LnByZXZpb3VzU2libGluZygpICYm
IG1fYmxvY2suaXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkgJiYgbV9ibG9jay5zdHlsZSgpLmNsZWFy
KCkgJiYgbV9ibG9jay5nZXRDbGVhckRlbHRhKG1fYmxvY2ssIExheW91dFVuaXQoKSkpID8gbV9i
bG9jay5jb2xsYXBzZWRNYXJnaW5CZWZvcmVGb3JDaGlsZChtX2Jsb2NrKSA6IExheW91dFVuaXQo
KTsKLSAgICAgICAgICAgIExheW91dFVuaXQgb2xkTG9naWNhbEhlaWdodCA9IG1fYmxvY2subG9n
aWNhbEhlaWdodCgpOwotICAgICAgICAgICAgbV9ibG9jay5zZXRMb2dpY2FsSGVpZ2h0KG9sZExv
Z2ljYWxIZWlnaHQgKyBtYXJnaW5PZmZzZXQpOwotICAgICAgICAgICAgbV9ibG9jay5wb3NpdGlv
bk5ld0Zsb2F0T25MaW5lKG1fYmxvY2suaW5zZXJ0RmxvYXRpbmdPYmplY3QodG9SZW5kZXJCb3go
b2JqZWN0KSksIGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGxpbmVJbmZvLCB3aWR0aCk7Ci0g
ICAgICAgICAgICBtX2Jsb2NrLnNldExvZ2ljYWxIZWlnaHQob2xkTG9naWNhbEhlaWdodCk7Ci0g
ICAgICAgIH0gZWxzZSBpZiAob2JqZWN0LmlzVGV4dCgpICYmIG9iamVjdC5zdHlsZSgpLmhhc1Rl
eHRDb21iaW5lKCkgJiYgb2JqZWN0LmlzQ29tYmluZVRleHQoKSAmJiAhdG9SZW5kZXJDb21iaW5l
VGV4dChvYmplY3QpLmlzQ29tYmluZWQoKSkgewotICAgICAgICAgICAgdG9SZW5kZXJDb21iaW5l
VGV4dChvYmplY3QpLmNvbWJpbmVUZXh0KCk7Ci0gICAgICAgICAgICBpZiAodG9SZW5kZXJDb21i
aW5lVGV4dChvYmplY3QpLmlzQ29tYmluZWQoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgfQotICAgICAgICByZXNvbHZlci5pbmNyZW1lbnQoKTsKLSAgICB9Ci0gICAgcmVz
b2x2ZXIuY29tbWl0RXhwbGljaXRFbWJlZGRpbmcoKTsKLX0KLQotLy8gVGhpcyBpcyBjdXJyZW50
bHkganVzdCB1c2VkIGZvciBsaXN0IG1hcmtlcnMgYW5kIGlubGluZSBmbG93cyB0aGF0IGhhdmUg
bGluZSBib3hlcy4gTmVpdGhlciBzaG91bGQKLS8vIGhhdmUgYW4gZWZmZWN0IG9uIHdoaXRlc3Bh
Y2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgotc3RhdGljIGJvb2wgc2hvdWxkU2tpcFdoaXRl
c3BhY2VBZnRlclN0YXJ0T2JqZWN0KFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIFJlbmRlck9iamVj
dCogbywgTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlKQotewotICAgIFJlbmRl
ck9iamVjdCogbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ssIG8pOwot
ICAgIHdoaWxlIChuZXh0ICYmIG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQo
KSkKLSAgICAgICAgbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ssIG5l
eHQpOwotCi0gICAgaWYgKG5leHQgJiYgbmV4dC0+aXNUZXh0KCkgJiYgdG9SZW5kZXJUZXh0KG5l
eHQpLT50ZXh0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIFJlbmRlclRleHQqIG5leHRUZXh0ID0g
dG9SZW5kZXJUZXh0KG5leHQpOwotICAgICAgICBVQ2hhciBuZXh0Q2hhciA9IG5leHRUZXh0LT5j
aGFyYWN0ZXJBdCgwKTsKLSAgICAgICAgaWYgKG5leHRUZXh0LT5zdHlsZSgpLmlzQ29sbGFwc2li
bGVXaGl0ZVNwYWNlKG5leHRDaGFyKSkgewotICAgICAgICAgICAgc3RhcnRJZ25vcmluZ1NwYWNl
cyhsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgMCkpOwotICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLXN0YXRpYyBBTFdBWVNfSU5MSU5FIGZsb2F0IHRleHRXaWR0aChSZW5kZXJUZXh0KiB0ZXh0
LCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBsZW4sIGNvbnN0IEZvbnQmIGZvbnQsIGZsb2F0IHhQ
b3MsIGJvb2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgSGFzaFNldDxj
b25zdCBTaW1wbGVGb250RGF0YSo+JiBmYWxsYmFja0ZvbnRzLCBUZXh0TGF5b3V0KiBsYXlvdXQg
PSAwKQotewotICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IHRleHQtPnN0eWxlKCk7Ci0K
LSAgICBHbHlwaE92ZXJmbG93IGdseXBoT3ZlcmZsb3c7Ci0gICAgaWYgKGlzRml4ZWRQaXRjaCB8
fCAoIWZyb20gJiYgbGVuID09IHRleHQtPnRleHRMZW5ndGgoKSkgfHwgc3R5bGUuaGFzVGV4dENv
bWJpbmUoKSkKLSAgICAgICAgcmV0dXJuIHRleHQtPndpZHRoKGZyb20sIGxlbiwgZm9udCwgeFBv
cywgJmZhbGxiYWNrRm9udHMsICZnbHlwaE92ZXJmbG93KTsKLQotICAgIGlmIChsYXlvdXQpCi0g
ICAgICAgIHJldHVybiBGb250Ojp3aWR0aCgqbGF5b3V0LCBmcm9tLCBsZW4sICZmYWxsYmFja0Zv
bnRzKTsKLQotICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4o
dGV4dCwgZm9udCwgdGV4dCwgZnJvbSwgbGVuLCBzdHlsZSk7Ci0gICAgcnVuLnNldENoYXJhY3Rl
cnNMZW5ndGgodGV4dC0+dGV4dExlbmd0aCgpIC0gZnJvbSk7Ci0gICAgQVNTRVJUKHJ1bi5jaGFy
YWN0ZXJzTGVuZ3RoKCkgPj0gcnVuLmxlbmd0aCgpKTsKLQotICAgIHJ1bi5zZXRDaGFyYWN0ZXJT
Y2FuRm9yQ29kZVBhdGgoIXRleHQtPmNhblVzZVNpbXBsZUZvbnRDb2RlUGF0aCgpKTsKLSAgICBy
dW4uc2V0VGFiU2l6ZSghY29sbGFwc2VXaGl0ZVNwYWNlLCBzdHlsZS50YWJTaXplKCkpOwotICAg
IHJ1bi5zZXRYUG9zKHhQb3MpOwotICAgIHJldHVybiBmb250LndpZHRoKHJ1biwgJmZhbGxiYWNr
Rm9udHMsICZnbHlwaE92ZXJmbG93KTsKLX0KLQotc3RhdGljIHZvaWQgdHJ5SHlwaGVuYXRpbmco
UmVuZGVyVGV4dCogdGV4dCwgY29uc3QgRm9udCYgZm9udCwgY29uc3QgQXRvbWljU3RyaW5nJiBs
b2NhbGVJZGVudGlmaWVyLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgaW50
IGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzTGltaXQsIGludCBtaW5pbXVtUHJlZml4TGltaXQs
IGludCBtaW5pbXVtU3VmZml4TGltaXQsIHVuc2lnbmVkIGxhc3RTcGFjZSwgdW5zaWduZWQgcG9z
LCBmbG9hdCB4UG9zLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGJvb2wgaXNGaXhlZFBpdGNoLCBib29s
IGNvbGxhcHNlV2hpdGVTcGFjZSwgaW50IGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBJbmxpbmVJdGVy
YXRvciYgbGluZUJyZWFrLCBpbnQgbmV4dEJyZWFrYWJsZSwgYm9vbCYgaHlwaGVuYXRlZCkKLXsK
LSAgICAvLyBNYXAgJ2h5cGhlbmF0ZS1saW1pdC17YmVmb3JlLGFmdGVyfTogYXV0bzsnIHRvIDIu
Ci0gICAgdW5zaWduZWQgbWluaW11bVByZWZpeExlbmd0aDsKLSAgICB1bnNpZ25lZCBtaW5pbXVt
U3VmZml4TGVuZ3RoOwotCi0gICAgaWYgKG1pbmltdW1QcmVmaXhMaW1pdCA8IDApCi0gICAgICAg
IG1pbmltdW1QcmVmaXhMZW5ndGggPSAyOwotICAgIGVsc2UKLSAgICAgICAgbWluaW11bVByZWZp
eExlbmd0aCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihtaW5pbXVtUHJlZml4TGltaXQpOwotCi0g
ICAgaWYgKG1pbmltdW1TdWZmaXhMaW1pdCA8IDApCi0gICAgICAgIG1pbmltdW1TdWZmaXhMZW5n
dGggPSAyOwotICAgIGVsc2UKLSAgICAgICAgbWluaW11bVN1ZmZpeExlbmd0aCA9IHN0YXRpY19j
YXN0PHVuc2lnbmVkPihtaW5pbXVtU3VmZml4TGltaXQpOwotCi0gICAgaWYgKHBvcyAtIGxhc3RT
cGFjZSA8PSBtaW5pbXVtU3VmZml4TGVuZ3RoKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAo
Y29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXNMaW1pdCA+PSAwICYmIGNvbnNlY3V0aXZlSHlwaGVu
YXRlZExpbmVzID49IHN0YXRpY19jYXN0PHVuc2lnbmVkPihjb25zZWN1dGl2ZUh5cGhlbmF0ZWRM
aW5lc0xpbWl0KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW50IGh5cGhlbldpZHRoID0gbWVh
c3VyZUh5cGhlbldpZHRoKHRleHQsIGZvbnQpOwotCi0gICAgZmxvYXQgbWF4UHJlZml4V2lkdGgg
PSBhdmFpbGFibGVXaWR0aCAtIHhQb3MgLSBoeXBoZW5XaWR0aCAtIGxhc3RTcGFjZVdvcmRTcGFj
aW5nOwotICAgIC8vIElmIHRoZSBtYXhpbXVtIHdpZHRoIGF2YWlsYWJsZSBmb3IgdGhlIHByZWZp
eCBiZWZvcmUgdGhlIGh5cGhlbiBpcyBzbWFsbCwgdGhlbiBpdCBpcyB2ZXJ5IHVubGlrZWx5Ci0g
ICAgLy8gdGhhdCBhbiBoeXBoZW5hdGlvbiBvcHBvcnR1bml0eSBleGlzdHMsIHNvIGRvIG5vdCBi
b3RoZXIgdG8gbG9vayBmb3IgaXQuCi0gICAgaWYgKG1heFByZWZpeFdpZHRoIDw9IGZvbnQucGl4
ZWxTaXplKCkgKiA1IC8gNCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgUmVuZGVyU3R5
bGUmIHN0eWxlID0gdGV4dC0+c3R5bGUoKTsKLSAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2Nr
Ojpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHRleHQsIGxhc3RTcGFjZSwgcG9zIC0gbGFz
dFNwYWNlLCBzdHlsZSk7Ci0gICAgcnVuLnNldENoYXJhY3RlcnNMZW5ndGgodGV4dC0+dGV4dExl
bmd0aCgpIC0gbGFzdFNwYWNlKTsKLSAgICBBU1NFUlQocnVuLmNoYXJhY3RlcnNMZW5ndGgoKSA+
PSBydW4ubGVuZ3RoKCkpOwotCi0gICAgcnVuLnNldFRhYlNpemUoIWNvbGxhcHNlV2hpdGVTcGFj
ZSwgc3R5bGUudGFiU2l6ZSgpKTsKLSAgICBydW4uc2V0WFBvcyh4UG9zICsgbGFzdFNwYWNlV29y
ZFNwYWNpbmcpOwotCi0gICAgdW5zaWduZWQgcHJlZml4TGVuZ3RoID0gZm9udC5vZmZzZXRGb3JQ
b3NpdGlvbihydW4sIG1heFByZWZpeFdpZHRoLCBmYWxzZSk7Ci0gICAgaWYgKHByZWZpeExlbmd0
aCA8IG1pbmltdW1QcmVmaXhMZW5ndGgpCi0gICAgICAgIHJldHVybjsKLQotICAgIHByZWZpeExl
bmd0aCA9IGxhc3RIeXBoZW5Mb2NhdGlvbih0ZXh0LT5jaGFyYWN0ZXJzKCkgKyBsYXN0U3BhY2Us
IHBvcyAtIGxhc3RTcGFjZSwgc3RkOjptaW4ocHJlZml4TGVuZ3RoLCBwb3MgLSBsYXN0U3BhY2Ug
LSBtaW5pbXVtU3VmZml4TGVuZ3RoKSArIDEsIGxvY2FsZUlkZW50aWZpZXIpOwotICAgIGlmICgh
cHJlZml4TGVuZ3RoIHx8IHByZWZpeExlbmd0aCA8IG1pbmltdW1QcmVmaXhMZW5ndGgpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIC8vIFdoZW4gbGFzdFNhcGNlIGlzIGEgc3BhY2UsIHdoaWNoIGl0
IGFsd2F5cyBpcyBleGNlcHQgc29tZXRpbWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIG9y
IGFmdGVyIGNvbGxhcHNlZAotICAgIC8vIHNwYWNlLCBpdCBzaG91bGQgbm90IGNvdW50IHRvd2Fy
ZHMgaHlwaGVuYXRlLWxpbWl0LWJlZm9yZS4KLSAgICBpZiAocHJlZml4TGVuZ3RoID09IG1pbmlt
dW1QcmVmaXhMZW5ndGgpIHsKLSAgICAgICAgVUNoYXIgY2hhcmFjdGVyQXRMYXN0U3BhY2UgPSB0
ZXh0LT5jaGFyYWN0ZXJBdChsYXN0U3BhY2UpOwotICAgICAgICBpZiAoY2hhcmFjdGVyQXRMYXN0
U3BhY2UgPT0gJyAnIHx8IGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICdcbicgfHwgY2hhcmFjdGVy
QXRMYXN0U3BhY2UgPT0gJ1x0JyB8fCBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSBub0JyZWFrU3Bh
Y2UpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQVNTRVJUKHBvcyAtIGxhc3RT
cGFjZSAtIHByZWZpeExlbmd0aCA+PSBtaW5pbXVtU3VmZml4TGVuZ3RoKTsKLQotI2lmICFBU1NF
UlRfRElTQUJMRUQKLSAgICBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4gZmFsbGJhY2tG
b250czsKLSAgICBmbG9hdCBwcmVmaXhXaWR0aCA9IGh5cGhlbldpZHRoICsgdGV4dFdpZHRoKHRl
eHQsIGxhc3RTcGFjZSwgcHJlZml4TGVuZ3RoLCBmb250LCB4UG9zLCBpc0ZpeGVkUGl0Y2gsIGNv
bGxhcHNlV2hpdGVTcGFjZSwgZmFsbGJhY2tGb250cykgKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsK
LSAgICBBU1NFUlQoeFBvcyArIHByZWZpeFdpZHRoIDw9IGF2YWlsYWJsZVdpZHRoKTsKLSNlbHNl
Ci0gICAgVU5VU0VEX1BBUkFNKGlzRml4ZWRQaXRjaCk7Ci0jZW5kaWYKLQotICAgIGxpbmVCcmVh
ay5tb3ZlVG8odGV4dCwgbGFzdFNwYWNlICsgcHJlZml4TGVuZ3RoLCBuZXh0QnJlYWthYmxlKTsK
LSAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKLX0KLQotY2xhc3MgVHJhaWxpbmdPYmplY3RzIHsKLXB1
YmxpYzoKLSAgICBUcmFpbGluZ09iamVjdHMoKTsKLSAgICB2b2lkIHNldFRyYWlsaW5nV2hpdGVz
cGFjZShSZW5kZXJUZXh0Kik7Ci0gICAgdm9pZCBjbGVhcigpOwotICAgIHZvaWQgYXBwZW5kQm94
SWZOZWVkZWQoUmVuZGVyQm94TW9kZWxPYmplY3QqKTsKLQotICAgIGVudW0gQ29sbGFwc2VGaXJz
dFNwYWNlT3JOb3QgeyBEb05vdENvbGxhcHNlRmlyc3RTcGFjZSwgQ29sbGFwc2VGaXJzdFNwYWNl
IH07Ci0KLSAgICB2b2lkIHVwZGF0ZU1pZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMoTGluZU1pZHBv
aW50U3RhdGUmLCBjb25zdCBJbmxpbmVJdGVyYXRvciYgbEJyZWFrLCBDb2xsYXBzZUZpcnN0U3Bh
Y2VPck5vdCk7Ci0KLXByaXZhdGU6Ci0gICAgUmVuZGVyVGV4dCogbV93aGl0ZXNwYWNlOwotICAg
IFZlY3RvcjxSZW5kZXJCb3hNb2RlbE9iamVjdCosIDQ+IG1fYm94ZXM7Ci19OwotCi1UcmFpbGlu
Z09iamVjdHM6OlRyYWlsaW5nT2JqZWN0cygpCi0gICAgOiBtX3doaXRlc3BhY2UoMCkKLXsKLX0K
LQotaW5saW5lIHZvaWQgVHJhaWxpbmdPYmplY3RzOjpzZXRUcmFpbGluZ1doaXRlc3BhY2UoUmVu
ZGVyVGV4dCogd2hpdGVzcGFjZSkKLXsKLSAgICBBU1NFUlQod2hpdGVzcGFjZSk7Ci0gICAgbV93
aGl0ZXNwYWNlID0gd2hpdGVzcGFjZTsKLX0KLQotaW5saW5lIHZvaWQgVHJhaWxpbmdPYmplY3Rz
OjpjbGVhcigpCi17Ci0gICAgbV93aGl0ZXNwYWNlID0gMDsKLSAgICBtX2JveGVzLnNocmluaygw
KTsgLy8gVXNlIHNocmluaygwKSBpbnN0ZWFkIG9mIGNsZWFyKCkgdG8gcmV0YWluIG91ciBjYXBh
Y2l0eS4KLX0KLQotaW5saW5lIHZvaWQgVHJhaWxpbmdPYmplY3RzOjphcHBlbmRCb3hJZk5lZWRl
ZChSZW5kZXJCb3hNb2RlbE9iamVjdCogYm94KQotewotICAgIGlmIChtX3doaXRlc3BhY2UpCi0g
ICAgICAgIG1fYm94ZXMuYXBwZW5kKGJveCk7Ci19Ci0KLXZvaWQgVHJhaWxpbmdPYmplY3RzOjp1
cGRhdGVNaWRwb2ludHNGb3JUcmFpbGluZ0JveGVzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlk
cG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGxCcmVhaywgQ29sbGFwc2VGaXJzdFNw
YWNlT3JOb3QgY29sbGFwc2VGaXJzdFNwYWNlKQotewotICAgIGlmICghbV93aGl0ZXNwYWNlKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBUaGlzIG9iamVjdCBpcyBlaXRoZXIgZ29pbmcgdG8g
YmUgcGFydCBvZiB0aGUgbGFzdCBtaWRwb2ludCwgb3IgaXQgaXMgZ29pbmcgdG8gYmUgdGhlIGFj
dHVhbCBlbmRwb2ludC4KLSAgICAvLyBJbiBib3RoIGNhc2VzIHdlIGp1c3QgZGVjcmVhc2Ugb3Vy
IHBvcyBieSAxIGxldmVsIHRvIGV4Y2x1ZGUgdGhlIHNwYWNlLCBhbGxvd2luZyBpdCB0byAtIGlu
IGVmZmVjdCAtIGNvbGxhcHNlIGludG8gdGhlIG5ld2xpbmUuCi0gICAgaWYgKGxpbmVNaWRwb2lu
dFN0YXRlLm51bU1pZHBvaW50cyAlIDIpIHsKLSAgICAgICAgLy8gRmluZCB0aGUgdHJhaWxpbmcg
c3BhY2Ugb2JqZWN0J3MgbWlkcG9pbnQuCi0gICAgICAgIGludCB0cmFpbGluZ1NwYWNlTWlkcG9p
bnQgPSBsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMgLSAxOwotICAgICAgICBmb3IgKCA7
IHRyYWlsaW5nU3BhY2VNaWRwb2ludCA+IDAgJiYgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRz
W3RyYWlsaW5nU3BhY2VNaWRwb2ludF0ubV9vYmogIT0gbV93aGl0ZXNwYWNlOyAtLXRyYWlsaW5n
U3BhY2VNaWRwb2ludCkgeyB9Ci0gICAgICAgIEFTU0VSVCh0cmFpbGluZ1NwYWNlTWlkcG9pbnQg
Pj0gMCk7Ci0gICAgICAgIGlmIChjb2xsYXBzZUZpcnN0U3BhY2UgPT0gQ29sbGFwc2VGaXJzdFNw
YWNlKQotICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzW3RyYWlsaW5nU3Bh
Y2VNaWRwb2ludF0ubV9wb3MtLTsKLQotICAgICAgICAvLyBOb3cgbWFrZSBzdXJlIGV2ZXJ5IHNp
bmdsZSB0cmFpbGluZ1Bvc2l0aW9uZWRCb3ggZm9sbG93aW5nIHRoZSB0cmFpbGluZ1NwYWNlTWlk
cG9pbnQgcHJvcGVybHkgc3RvcHMgYW5kIHN0YXJ0cwotICAgICAgICAvLyBpZ25vcmluZyBzcGFj
ZXMuCi0gICAgICAgIHNpemVfdCBjdXJyZW50TWlkcG9pbnQgPSB0cmFpbGluZ1NwYWNlTWlkcG9p
bnQgKyAxOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fYm94ZXMuc2l6ZSgpOyAr
K2kpIHsKLSAgICAgICAgICAgIGlmIChjdXJyZW50TWlkcG9pbnQgPj0gbGluZU1pZHBvaW50U3Rh
dGUubnVtTWlkcG9pbnRzKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIG1p
ZHBvaW50IGZvciB0aGlzIGJveCB5ZXQuCi0gICAgICAgICAgICAgICAgZW5zdXJlTGluZUJveElu
c2lkZUlnbm9yZWRTcGFjZXMobGluZU1pZHBvaW50U3RhdGUsIG1fYm94ZXNbaV0pOwotICAgICAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQobGluZU1pZHBvaW50U3RhdGUu
bWlkcG9pbnRzW2N1cnJlbnRNaWRwb2ludF0ubV9vYmogPT0gbV9ib3hlc1tpXSk7Ci0gICAgICAg
ICAgICAgICAgQVNTRVJUKGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50c1tjdXJyZW50TWlkcG9p
bnQgKyAxXS5tX29iaiA9PSBtX2JveGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGN1cnJlbnRNaWRwb2ludCArPSAyOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghbEJyZWFr
Lm1fb2JqKSB7Ci0gICAgICAgIEFTU0VSVChtX3doaXRlc3BhY2UtPmlzVGV4dCgpKTsKLSAgICAg
ICAgQVNTRVJUKGNvbGxhcHNlRmlyc3RTcGFjZSA9PSBDb2xsYXBzZUZpcnN0U3BhY2UpOwotICAg
ICAgICAvLyBBZGQgYSBuZXcgZW5kIG1pZHBvaW50IHRoYXQgc3RvcHMgcmlnaHQgYXQgdGhlIHZl
cnkgZW5kLgotICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBtX3doaXRlc3BhY2UtPnRleHRMZW5n
dGgoKTsKLSAgICAgICAgdW5zaWduZWQgcG9zID0gbGVuZ3RoID49IDIgPyBsZW5ndGggLSAyIDog
VUlOVF9NQVg7Ci0gICAgICAgIElubGluZUl0ZXJhdG9yIGVuZE1pZCgwLCBtX3doaXRlc3BhY2Us
IHBvcyk7Ci0gICAgICAgIHN0YXJ0SWdub3JpbmdTcGFjZXMobGluZU1pZHBvaW50U3RhdGUsIGVu
ZE1pZCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9ib3hlcy5zaXplKCk7ICsr
aSkgewotICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobGluZU1p
ZHBvaW50U3RhdGUsIG1fYm94ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIExp
bmVCcmVha2VyOjpyZXNldCgpCi17Ci0gICAgbV9wb3NpdGlvbmVkT2JqZWN0cy5jbGVhcigpOwot
ICAgIG1faHlwaGVuYXRlZCA9IGZhbHNlOwotICAgIG1fY2xlYXIgPSBDTk9ORTsKLX0KLQogSW5s
aW5lSXRlcmF0b3IgTGluZUJyZWFrZXI6Om5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlciwgTGluZUluZm8mIGxpbmVJbmZvLCBSZW5kZXJUZXh0SW5mbyYgcmVuZGVyVGV4
dEluZm8sIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25l
ZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1
cmVtZW50cykKIHsKICNpZiAhRU5BQkxFKENTU19TSEFQRVMpCkBAIC0yNjE5LDg2MyArMjA2MCw2
IEBAIElubGluZUl0ZXJhdG9yIExpbmVCcmVha2VyOjpuZXh0TGluZUJyZWFrKElubGluZUJpZGlS
ZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJbmZvCiAjZW5kaWYKIH0KIAotc3RhdGljIGlubGluZSBi
b29sIGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KGNvbnN0IElubGluZUl0
ZXJhdG9yJiBpdGVyLCBSZW5kZXJDb21iaW5lVGV4dCYgcmVuZGVyZXIpCi17Ci0gICAgcmV0dXJu
IGl0ZXIubV9vYmogPT0gJnJlbmRlcmVyICYmIGl0ZXIubV9wb3MgPj0gcmVuZGVyZXIudGV4dExl
bmd0aCgpOwotfQotCi0jaWYgRU5BQkxFKENTU19TSEFQRVMpCi1zdGF0aWMgdm9pZCB1cGRhdGVT
ZWdtZW50c0ZvclNoYXBlcyhSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBjb25zdCBGbG9hdGluZ09i
amVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgY29uc3QgV29yZE1lYXN1cmVtZW50cyYg
d29yZE1lYXN1cmVtZW50cywgTGluZVdpZHRoJiB3aWR0aCwgYm9vbCBpc0ZpcnN0TGluZSkKLXsK
LSAgICBBU1NFUlQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7Ci0KLSAgICBTaGFwZUluc2lk
ZUluZm8qIHNoYXBlSW5zaWRlSW5mbyA9IGJsb2NrLmxheW91dFNoYXBlSW5zaWRlSW5mbygpOwot
ICAgIGlmICghbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZS0+aXNQbGFjZWQoKSB8fCAhc2hhcGVJ
bnNpZGVJbmZvKQotICAgICAgICByZXR1cm47Ci0KLSAgICBib29sIGlzSG9yaXpvbnRhbFdyaXRp
bmdNb2RlID0gYmxvY2suaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKTsKLSAgICBMYXlvdXRVbml0
IGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWluZXIgPSBibG9jay5sb2dpY2FsT2Zmc2V0RnJv
bVNoYXBlQW5jZXN0b3JDb250YWluZXIoc2hhcGVJbnNpZGVJbmZvLT5vd25lcigpKS5oZWlnaHQo
KTsKLQotICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxUb3AgPSBibG9jay5sb2dpY2FsSGVpZ2h0
KCkgKyBsb2dpY2FsT2Zmc2V0RnJvbVNoYXBlQ29udGFpbmVyOwotICAgIExheW91dFVuaXQgbGlu
ZUxvZ2ljYWxIZWlnaHQgPSBibG9jay5saW5lSGVpZ2h0KGlzRmlyc3RMaW5lLCBpc0hvcml6b250
YWxXcml0aW5nTW9kZSA/IEhvcml6b250YWxMaW5lIDogVmVydGljYWxMaW5lLCBQb3NpdGlvbk9m
SW50ZXJpb3JMaW5lQm94ZXMpOwotICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxCb3R0b20gPSBs
aW5lTG9naWNhbFRvcCArIGxpbmVMb2dpY2FsSGVpZ2h0OwotCi0gICAgTGF5b3V0VW5pdCBmbG9h
dExvZ2ljYWxUb3AgPSBibG9jay5sb2dpY2FsVG9wRm9yRmxvYXQobGFzdEZsb2F0RnJvbVByZXZp
b3VzTGluZSk7Ci0gICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxCb3R0b20gPSBibG9jay5sb2dp
Y2FsQm90dG9tRm9yRmxvYXQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7Ci0KLSAgICBib29s
IGxpbmVPdmVybGFwc1dpdGhGbG9hdCA9IChmbG9hdExvZ2ljYWxUb3AgPCBsaW5lTG9naWNhbEJv
dHRvbSkgJiYgKGxpbmVMb2dpY2FsVG9wIDwgZmxvYXRMb2dpY2FsQm90dG9tKTsKLSAgICBpZiAo
IWxpbmVPdmVybGFwc1dpdGhGbG9hdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZmxvYXQgbWlu
U2VnbWVudFdpZHRoID0gZmlyc3RQb3NpdGl2ZVdpZHRoKHdvcmRNZWFzdXJlbWVudHMpOwotCi0g
ICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxXaWR0aCA9IGJsb2NrLmxvZ2ljYWxXaWR0aEZvckZs
b2F0KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpOwotICAgIExheW91dFVuaXQgYXZhaWxhYmxl
TG9naWNhbFdpZHRoID0gYmxvY2subG9naWNhbFdpZHRoKCkgLSBibG9jay5sb2dpY2FsUmlnaHRG
b3JGbG9hdChsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKTsKLSAgICBpZiAoYXZhaWxhYmxlTG9n
aWNhbFdpZHRoIDwgbWluU2VnbWVudFdpZHRoKQotICAgICAgICBibG9jay5zZXRMb2dpY2FsSGVp
Z2h0KGZsb2F0TG9naWNhbEJvdHRvbSk7Ci0KLSAgICBpZiAoYmxvY2subG9naWNhbEhlaWdodCgp
IDwgZmxvYXRMb2dpY2FsVG9wKSB7Ci0gICAgICAgIHNoYXBlSW5zaWRlSW5mby0+YWRqdXN0TG9n
aWNhbExpbmVUb3AobWluU2VnbWVudFdpZHRoICsgZmxvYXRMb2dpY2FsV2lkdGgpOwotICAgICAg
ICBibG9jay5zZXRMb2dpY2FsSGVpZ2h0KHNoYXBlSW5zaWRlSW5mby0+bG9naWNhbExpbmVUb3Ao
KSAtIGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWluZXIpOwotICAgIH0KLQotICAgIGxpbmVM
b2dpY2FsVG9wID0gYmxvY2subG9naWNhbEhlaWdodCgpICsgbG9naWNhbE9mZnNldEZyb21TaGFw
ZUNvbnRhaW5lcjsKLQotICAgIHNoYXBlSW5zaWRlSW5mby0+dXBkYXRlU2VnbWVudHNGb3JMaW5l
KGxpbmVMb2dpY2FsVG9wLCBsaW5lTG9naWNhbEhlaWdodCk7Ci0gICAgd2lkdGgudXBkYXRlQ3Vy
cmVudFNoYXBlU2VnbWVudCgpOwotICAgIHdpZHRoLnVwZGF0ZUF2YWlsYWJsZVdpZHRoKCk7Ci19
Ci0jZW5kaWYKLQotY2xhc3MgQnJlYWtpbmdDb250ZXh0IHsKLXB1YmxpYzoKLSAgICBCcmVha2lu
Z0NvbnRleHQoTGluZUJyZWFrZXImIGxpbmVCcmVha2VyLCBJbmxpbmVCaWRpUmVzb2x2ZXImIHJl
c29sdmVyLCBMaW5lSW5mbyYgaW5MaW5lSW5mbywgTGluZVdpZHRoJiBsaW5lV2lkdGgsIFJlbmRl
clRleHRJbmZvJiBpblJlbmRlclRleHRJbmZvLCBGbG9hdGluZ09iamVjdCogaW5MYXN0RmxvYXRG
cm9tUHJldmlvdXNMaW5lLCBib29sIGFwcGxpZWRTdGFydFdpZHRoLCBSZW5kZXJCbG9ja0Zsb3cm
IGJsb2NrKQotICAgICAgICA6IG1fbGluZUJyZWFrZXIobGluZUJyZWFrZXIpCi0gICAgICAgICwg
bV9yZXNvbHZlcihyZXNvbHZlcikKLSAgICAgICAgLCBtX2N1cnJlbnQocmVzb2x2ZXIucG9zaXRp
b24oKSkKLSAgICAgICAgLCBtX2xpbmVCcmVhayhyZXNvbHZlci5wb3NpdGlvbigpKQotICAgICAg
ICAsIG1fYmxvY2soYmxvY2spCi0gICAgICAgICwgbV9sYXN0T2JqZWN0KG1fY3VycmVudC5tX29i
aikKLSAgICAgICAgLCBtX25leHRPYmplY3QoMCkKLSAgICAgICAgLCBtX2N1cnJlbnRTdHlsZSgw
KQotICAgICAgICAsIG1fYmxvY2tTdHlsZShibG9jay5zdHlsZSgpKQotICAgICAgICAsIG1fbGlu
ZUluZm8oaW5MaW5lSW5mbykKLSAgICAgICAgLCBtX3JlbmRlclRleHRJbmZvKGluUmVuZGVyVGV4
dEluZm8pCi0gICAgICAgICwgbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKGluTGFzdEZsb2F0
RnJvbVByZXZpb3VzTGluZSkKLSAgICAgICAgLCBtX3dpZHRoKGxpbmVXaWR0aCkKLSAgICAgICAg
LCBtX2N1cnJXUyhOT1JNQUwpCi0gICAgICAgICwgbV9sYXN0V1MoTk9STUFMKQotICAgICAgICAs
IG1fcHJlc2VydmVzTmV3bGluZShmYWxzZSkKLSAgICAgICAgLCBtX2F0U3RhcnQodHJ1ZSkKLSAg
ICAgICAgLCBtX2lnbm9yaW5nU3BhY2VzKGZhbHNlKQotICAgICAgICAsIG1fY3VycmVudENoYXJh
Y3RlcklzU3BhY2UoZmFsc2UpCi0gICAgICAgICwgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyhmYWxz
ZSkKLSAgICAgICAgLCBtX2FwcGxpZWRTdGFydFdpZHRoKGFwcGxpZWRTdGFydFdpZHRoKQotICAg
ICAgICAsIG1faW5jbHVkZUVuZFdpZHRoKHRydWUpCi0gICAgICAgICwgbV9hdXRvV3JhcChmYWxz
ZSkKLSAgICAgICAgLCBtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUoZmFsc2UpCi0gICAgICAg
ICwgbV9mbG9hdHNGaXRPbkxpbmUodHJ1ZSkKLSAgICAgICAgLCBtX2NvbGxhcHNlV2hpdGVTcGFj
ZShmYWxzZSkKLSAgICAgICAgLCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoKG1fbGluZUluZm8ucHJl
dmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpCi0gICAgICAgICwgbV9hbGxvd0ltYWdlc1RvQnJlYWso
IWJsb2NrLmRvY3VtZW50KCkuaW5RdWlya3NNb2RlKCkgfHwgIWJsb2NrLmlzVGFibGVDZWxsKCkg
fHwgIW1fYmxvY2tTdHlsZS5sb2dpY2FsV2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQotICAg
ICAgICAsIG1fYXRFbmQoZmFsc2UpCi0gICAgICAgICwgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVm
b3JlQ3VycmVudChmYWxzZSkKLSAgICAgICAgLCBtX2xpbmVNaWRwb2ludFN0YXRlKHJlc29sdmVy
Lm1pZHBvaW50U3RhdGUoKSkKLSAgICB7Ci0gICAgICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNM
aW5lQnJva2VDbGVhbmx5KGZhbHNlKTsKLSAgICB9Ci0KLSAgICBSZW5kZXJPYmplY3QqIGN1cnJl
bnRPYmplY3QoKSB7IHJldHVybiBtX2N1cnJlbnQubV9vYmo7IH0KLSAgICBJbmxpbmVJdGVyYXRv
ciBsaW5lQnJlYWsoKSB7IHJldHVybiBtX2xpbmVCcmVhazsgfQotICAgIElubGluZUl0ZXJhdG9y
JiBsaW5lQnJlYWtSZWYoKSB7cmV0dXJuIG1fbGluZUJyZWFrOyB9Ci0gICAgTGluZVdpZHRoJiBs
aW5lV2lkdGgoKSB7IHJldHVybiBtX3dpZHRoOyB9Ci0gICAgYm9vbCBhdEVuZCgpIHsgcmV0dXJu
IG1fYXRFbmQ7IH0KLQotICAgIHZvaWQgaW5pdGlhbGl6ZUZvckN1cnJlbnRPYmplY3QoKTsKLQot
ICAgIHZvaWQgaW5jcmVtZW50KCk7Ci0KLSAgICB2b2lkIGhhbmRsZUJSKEVDbGVhciYpOwotICAg
IHZvaWQgaGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZChWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0
aW9uZWRPYmplY3RzKTsKLSAgICB2b2lkIGhhbmRsZUZsb2F0KCk7Ci0gICAgdm9pZCBoYW5kbGVF
bXB0eUlubGluZSgpOwotICAgIHZvaWQgaGFuZGxlUmVwbGFjZWQoKTsKLSAgICBib29sIGhhbmRs
ZVRleHQoV29yZE1lYXN1cmVtZW50cyYsIGJvb2wmIGh5cGhlbmF0ZWQsIHVuc2lnbmVkJiBjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7Ci0gICAgYm9vbCBjYW5CcmVha0F0VGhpc1Bvc2l0aW9u
KCk7Ci0gICAgdm9pZCBjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJZk5lZWRlZCgpOwotICAgIElu
bGluZUl0ZXJhdG9yIGhhbmRsZUVuZE9mTGluZSgpOwotCi0gICAgdm9pZCBjbGVhckxpbmVCcmVh
a0lmRml0c09uTGluZShib29sIGlnbm9yaW5nVHJhaWxpbmdTcGFjZSA9IGZhbHNlKQotICAgIHsK
LSAgICAgICAgaWYgKG1fd2lkdGguZml0c09uTGluZShpZ25vcmluZ1RyYWlsaW5nU3BhY2UpIHx8
IG1fbGFzdFdTID09IE5PV1JBUCkKLSAgICAgICAgICAgIG1fbGluZUJyZWFrLmNsZWFyKCk7Ci0g
ICAgfQotCi0gICAgdm9pZCBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aChSZW5kZXJPYmpl
Y3QqIG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0ID0gMCwgaW50IG5leHRCcmVhayA9IC0xKQotICAg
IHsKLSAgICAgICAgbV93aWR0aC5jb21taXQoKTsKLSAgICAgICAgbV9saW5lQnJlYWsubW92ZVRv
KG9iamVjdCwgb2Zmc2V0LCBuZXh0QnJlYWspOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBMaW5l
QnJlYWtlciYgbV9saW5lQnJlYWtlcjsKLSAgICBJbmxpbmVCaWRpUmVzb2x2ZXImIG1fcmVzb2x2
ZXI7Ci0KLSAgICBJbmxpbmVJdGVyYXRvciBtX2N1cnJlbnQ7Ci0gICAgSW5saW5lSXRlcmF0b3Ig
bV9saW5lQnJlYWs7Ci0gICAgSW5saW5lSXRlcmF0b3IgbV9zdGFydE9mSWdub3JlZFNwYWNlczsK
LQotICAgIFJlbmRlckJsb2NrRmxvdyYgbV9ibG9jazsKLSAgICBSZW5kZXJPYmplY3QqIG1fbGFz
dE9iamVjdDsKLSAgICBSZW5kZXJPYmplY3QqIG1fbmV4dE9iamVjdDsKLQotICAgIFJlbmRlclN0
eWxlKiBtX2N1cnJlbnRTdHlsZTsKLQotICAgIC8vIEZpcmVmb3ggYW5kIE9wZXJhIHdpbGwgYWxs
b3cgYSB0YWJsZSBjZWxsIHRvIGdyb3cgdG8gZml0IGFuIGltYWdlIGluc2lkZSBpdCB1bmRlcgot
ICAgIC8vIHZlcnkgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcyAoaW4gb3JkZXIgdG8gbWF0Y2ggY29t
bW9uIFdpbklFIHJlbmRlcmluZ3MpLgotICAgIC8vIE5vdCBzdXBwb3J0aW5nIHRoZSBxdWlyayBo
YXMgY2F1c2VkIHVzIHRvIG1pcy1yZW5kZXIgc29tZSByZWFsIHNpdGVzLiAoU2VlIEJ1Z3ppbGxh
IDEwNTE3LikKLSAgICBSZW5kZXJTdHlsZSYgbV9ibG9ja1N0eWxlOwotCi0gICAgTGluZUluZm8m
IG1fbGluZUluZm87Ci0KLSAgICBSZW5kZXJUZXh0SW5mbyYgbV9yZW5kZXJUZXh0SW5mbzsKLQot
ICAgIEZsb2F0aW5nT2JqZWN0KiBtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmU7Ci0KLSAgICBM
aW5lV2lkdGggbV93aWR0aDsKLQotICAgIEVXaGl0ZVNwYWNlIG1fY3VycldTOwotICAgIEVXaGl0
ZVNwYWNlIG1fbGFzdFdTOwotCi0gICAgYm9vbCBtX3ByZXNlcnZlc05ld2xpbmU7Ci0gICAgYm9v
bCBtX2F0U3RhcnQ7Ci0KLSAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgb25seSBpZiB3aGl0
ZXNwYWNlIGlzbid0IHNldCB0byBQUkUsIGFuZCBpdCB0ZWxscyB1cyB3aGV0aGVyCi0gICAgLy8g
b3Igbm90IHdlIGFyZSBjdXJyZW50bHkgaWdub3Jpbmcgd2hpdGVzcGFjZS4KLSAgICBib29sIG1f
aWdub3JpbmdTcGFjZXM7Ci0KLSAgICAvLyBUaGlzIHZhcmlhYmxlIHRyYWNrcyB3aGV0aGVyIHRo
ZSB2ZXJ5IGxhc3QgY2hhcmFjdGVyIHdlIHNhdyB3YXMgYSBzcGFjZS4gIFdlIHVzZQotICAgIC8v
IHRoaXMgdG8gZGV0ZWN0IHdoZW4gd2UgZW5jb3VudGVyIGEgc2Vjb25kIHNwYWNlIHNvIHdlIGtu
b3cgd2UgaGF2ZSB0byB0ZXJtaW5hdGUKLSAgICAvLyBhIHJ1bi4KLSAgICBib29sIG1fY3VycmVu
dENoYXJhY3RlcklzU3BhY2U7Ci0gICAgYm9vbCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTOwotICAg
IGJvb2wgbV9hcHBsaWVkU3RhcnRXaWR0aDsKLSAgICBib29sIG1faW5jbHVkZUVuZFdpZHRoOwot
ICAgIGJvb2wgbV9hdXRvV3JhcDsKLSAgICBib29sIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGlu
ZTsKLSAgICBib29sIG1fZmxvYXRzRml0T25MaW5lOwotICAgIGJvb2wgbV9jb2xsYXBzZVdoaXRl
U3BhY2U7Ci0gICAgYm9vbCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoOwotICAgIGJvb2wgbV9hbGxv
d0ltYWdlc1RvQnJlYWs7Ci0gICAgYm9vbCBtX2F0RW5kOwotICAgIGJvb2wgbV9oYWRVbmNvbW1p
dHRlZFdpZHRoQmVmb3JlQ3VycmVudDsKLQotICAgIExpbmVNaWRwb2ludFN0YXRlJiBtX2xpbmVN
aWRwb2ludFN0YXRlOwotCi0gICAgVHJhaWxpbmdPYmplY3RzIG1fdHJhaWxpbmdPYmplY3RzOwot
fTsKLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojppbml0aWFsaXplRm9yQ3VycmVudE9i
amVjdCgpCi17Ci0gICAgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudCA9ICEhbV93
aWR0aC51bmNvbW1pdHRlZFdpZHRoKCk7Ci0KLSAgICBtX2N1cnJlbnRTdHlsZSA9ICZtX2N1cnJl
bnQubV9vYmotPnN0eWxlKCk7Ci0KLSAgICBBU1NFUlQobV9jdXJyZW50U3R5bGUpOwotCi0gICAg
bV9uZXh0T2JqZWN0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhtX2Jsb2NrLCBtX2N1
cnJlbnQubV9vYmopOwotICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5wYXJl
bnQoKSAmJiAhbV9uZXh0T2JqZWN0LT5wYXJlbnQoKS0+aXNEZXNjZW5kYW50T2YobV9jdXJyZW50
Lm1fb2JqLT5wYXJlbnQoKSkpCi0gICAgICAgIG1faW5jbHVkZUVuZFdpZHRoID0gdHJ1ZTsKLQot
ICAgIG1fY3VycldTID0gbV9jdXJyZW50Lm1fb2JqLT5pc1JlcGxhY2VkKCkgPyBtX2N1cnJlbnQu
bV9vYmotPnBhcmVudCgpLT5zdHlsZSgpLndoaXRlU3BhY2UoKSA6IG1fY3VycmVudFN0eWxlLT53
aGl0ZVNwYWNlKCk7Ci0gICAgbV9sYXN0V1MgPSBtX2xhc3RPYmplY3QtPmlzUmVwbGFjZWQoKSA/
IG1fbGFzdE9iamVjdC0+cGFyZW50KCktPnN0eWxlKCkud2hpdGVTcGFjZSgpIDogbV9sYXN0T2Jq
ZWN0LT5zdHlsZSgpLndoaXRlU3BhY2UoKTsKLQotICAgIG1fYXV0b1dyYXAgPSBSZW5kZXJTdHls
ZTo6YXV0b1dyYXAobV9jdXJyV1MpOwotICAgIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9
IG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSB8fCBtX2F1dG9XcmFwOwotCi0jaWYgRU5BQkxF
KFNWRykKLSAgICBtX3ByZXNlcnZlc05ld2xpbmUgPSBtX2N1cnJlbnQubV9vYmotPmlzU1ZHSW5s
aW5lVGV4dCgpID8gZmFsc2UgOiBSZW5kZXJTdHlsZTo6cHJlc2VydmVOZXdsaW5lKG1fY3VycldT
KTsKLSNlbHNlCi0gICAgbV9wcmVzZXJ2ZXNOZXdsaW5lID0gUmVuZGVyU3R5bGU6OnByZXNlcnZl
TmV3bGluZShtX2N1cnJXUyk7Ci0jZW5kaWYKLQotICAgIG1fY29sbGFwc2VXaGl0ZVNwYWNlID0g
UmVuZGVyU3R5bGU6OmNvbGxhcHNlV2hpdGVTcGFjZShtX2N1cnJXUyk7Ci19Ci0KLWlubGluZSB2
b2lkIEJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KCkKLXsKLSAgICAvLyBDbGVhciBvdXQgb3Vy
IGNoYXJhY3RlciBzcGFjZSBib29sLCBzaW5jZSBpbmxpbmUgPHByZT5zIGRvbid0IGNvbGxhcHNl
IHdoaXRlc3BhY2UKLSAgICAvLyB3aXRoIGFkamFjZW50IGlubGluZSBub3JtYWwvbm93cmFwIHNw
YW5zLgotICAgIGlmICghbV9jb2xsYXBzZVdoaXRlU3BhY2UpCi0gICAgICAgIG1fY3VycmVudENo
YXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKLQotICAgIG1fY3VycmVudC5tb3ZlVG9TdGFydE9mKG1f
bmV4dE9iamVjdCk7Ci0gICAgbV9hdFN0YXJ0ID0gZmFsc2U7Ci19Ci0KLWlubGluZSB2b2lkIEJy
ZWFraW5nQ29udGV4dDo6aGFuZGxlQlIoRUNsZWFyJiBjbGVhcikKLXsKLSAgICBpZiAobV93aWR0
aC5maXRzT25MaW5lKCkpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBiciA9IG1fY3VycmVudC5t
X29iajsKLSAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvU3RhcnRPZihicik7Ci0gICAgICAgIG1f
bGluZUJyZWFrLmluY3JlbWVudCgpOwotCi0gICAgICAgIC8vIEEgPGJyPiBhbHdheXMgYnJlYWtz
IGEgbGluZSwgc28gZG9uJ3QgbGV0IHRoZSBsaW5lIGJlIGNvbGxhcHNlZAotICAgICAgICAvLyBh
d2F5LiBBbHNvLCB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aCBhIDxicj4gZG9l
cyBub3QKLSAgICAgICAgLy8gZ2V0IGNvbGxhcHNlZCBhd2F5LiBJdCBvbmx5IGRvZXMgdGhpcyBp
ZiB0aGUgcHJldmlvdXMgbGluZSBicm9rZQotICAgICAgICAvLyBjbGVhbmx5LiBPdGhlcndpc2Ug
dGhlIDxicj4gaGFzIG5vIGVmZmVjdCBvbiB3aGV0aGVyIHRoZSBsaW5lIGlzCi0gICAgICAgIC8v
IGVtcHR5IG9yIG5vdC4KLSAgICAgICAgaWYgKG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGgpCi0gICAg
ICAgICAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAmbV9ibG9jaywgJm1fd2lkdGgpOwot
ICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOwotICAgICAgICBtX2xpbmVJbmZvLnNl
dFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKLQotICAgICAgICAvLyBBIDxicj4gd2l0
aCBjbGVhcmFuY2UgYWx3YXlzIG5lZWRzIGEgbGluZWJveCBpbiBjYXNlIHRoZSBsaW5lcyBiZWxv
dyBpdCBnZXQgZGlydGllZCBsYXRlciBhbmQKLSAgICAgICAgLy8gbmVlZCB0byBjaGVjayBmb3Ig
ZmxvYXRzIHRvIGNsZWFyIC0gc28gaWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCBzdG9wIGlnbm9y
aW5nIHRoZW0gYW5kIGFkZCBhCi0gICAgICAgIC8vIHJ1biBmb3IgdGhpcyBvYmplY3QuCi0gICAg
ICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jbGVhcigpICE9IENO
T05FKQotICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9saW5l
TWlkcG9pbnRTdGF0ZSwgYnIpOwotICAgICAgICAvLyBJZiB3ZSB3ZXJlIHByZWNlZGVkIGJ5IGNv
bGxhcHNpbmcgc3BhY2UgYW5kIGFyZSBpbiBhIHJpZ2h0LWFsaWduZWQgY29udGFpbmVyIHdlIG5l
ZWQgdG8gZW5zdXJlIHRoZSBzcGFjZSBnZXRzCi0gICAgICAgIC8vIGNvbGxhcHNlZCBhd2F5IHNv
IHRoYXQgaXQgZG9lc24ndCBwdXNoIHRoZSB0ZXh0IG91dCBmcm9tIHRoZSBjb250YWluZXIncyBy
aWdodC1oYW5kIGVkZ2UuCi0gICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2FyZGxlc3Mgb2Yg
dGhlIGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2VsaW5pbmcgYSBs
b3Qgb2YgdGVzdCByZXN1bHRzLgotICAgICAgICBlbHNlIGlmIChtX2lnbm9yaW5nU3BhY2VzICYm
IChtX2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gUklHSFQgfHwgbV9ibG9ja1N0eWxlLnRleHRB
bGlnbigpID09IFdFQktJVF9SSUdIVCkpCi0gICAgICAgICAgICBzdG9wSWdub3JpbmdTcGFjZXMo
bV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50Lm1fb2JqLCBt
X2N1cnJlbnQubV9wb3MpKTsKLQotICAgICAgICBpZiAoIW1fbGluZUluZm8uaXNFbXB0eSgpKQot
ICAgICAgICAgICAgY2xlYXIgPSBtX2N1cnJlbnRTdHlsZS0+Y2xlYXIoKTsKLSAgICB9Ci0gICAg
bV9hdEVuZCA9IHRydWU7Ci19Ci0KLWlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxl
T3V0T2ZGbG93UG9zaXRpb25lZChWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmplY3Rz
KQotewotICAgIC8vIElmIG91ciBvcmlnaW5hbCBkaXNwbGF5IHdhc24ndCBhbiBpbmxpbmUgdHlw
ZSwgdGhlbiB3ZSBjYW4KLSAgICAvLyBnbyBhaGVhZCBhbmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMg
aW5saW5lIHBvc2l0aW9uIG5vdy4KLSAgICBSZW5kZXJCb3gqIGJveCA9IHRvUmVuZGVyQm94KG1f
Y3VycmVudC5tX29iaik7Ci0gICAgYm9vbCBpc0lubGluZVR5cGUgPSBib3gtPnN0eWxlKCkuaXNP
cmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCk7Ci0gICAgaWYgKCFpc0lubGluZVR5cGUpCi0gICAg
ICAgIG1fYmxvY2suc2V0U3RhdGljSW5saW5lUG9zaXRpb25Gb3JDaGlsZCgqYm94LCBtX2Jsb2Nr
LmxvZ2ljYWxIZWlnaHQoKSwgbV9ibG9jay5zdGFydE9mZnNldEZvckNvbnRlbnQobV9ibG9jay5s
b2dpY2FsSGVpZ2h0KCkpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgLy8gSWYgb3VyIG9yaWdpbmFs
IGRpc3BsYXkgd2FzIGFuIElOTElORSB0eXBlLCB0aGVuIHdlIGNhbiBnbyBhaGVhZAotICAgICAg
ICAvLyBhbmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMgeSBwb3NpdGlvbiBub3cuCi0gICAgICAgIGJv
eC0+bGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlvbihtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQo
KSk7Ci0gICAgfQotCi0gICAgLy8gSWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCB3ZSBoYXZlIHRv
IHN0b3AgYW5kIGluY2x1ZGUgdGhpcyBvYmplY3QgYW5kCi0gICAgLy8gdGhlbiBzdGFydCBpZ25v
cmluZyBzcGFjZXMgYWdhaW4uCi0gICAgaWYgKGlzSW5saW5lVHlwZSB8fCBib3gtPmNvbnRhaW5l
cigpLT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzKQot
ICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9saW5lTWlkcG9p
bnRTdGF0ZSwgYm94KTsKLSAgICAgICAgbV90cmFpbGluZ09iamVjdHMuYXBwZW5kQm94SWZOZWVk
ZWQoYm94KTsKLSAgICB9IGVsc2UKLSAgICAgICAgcG9zaXRpb25lZE9iamVjdHMuYXBwZW5kKGJv
eCk7Ci0KLSAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoaW5saW5lTG9naWNhbFdpZHRo
KGJveCkpOwotICAgIC8vIFJlc2V0IHByaW9yIGxpbmUgYnJlYWsgY29udGV4dCBjaGFyYWN0ZXJz
LgotICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNldFByaW9yQ29u
dGV4dCgpOwotfQotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUZsb2F0KCkK
LXsKLSAgICBSZW5kZXJCb3gmIGZsb2F0Qm94ID0gdG9SZW5kZXJCb3goKm1fY3VycmVudC5tX29i
aik7Ci0gICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gbV9ibG9jay5pbnNlcnRG
bG9hdGluZ09iamVjdChmbG9hdEJveCk7Ci0gICAgLy8gY2hlY2sgaWYgaXQgZml0cyBpbiB0aGUg
Y3VycmVudCBsaW5lLgotICAgIC8vIElmIGl0IGRvZXMsIHBvc2l0aW9uIGl0IG5vdywgb3RoZXJ3
aXNlLCBwb3NpdGlvbgotICAgIC8vIGl0IGFmdGVyIG1vdmluZyB0byBuZXh0IGxpbmUgKGluIG5l
d0xpbmUoKSBmdW5jKQotICAgIC8vIEZJWE1FOiBCdWcgMTEwMzcyOiBQcm9wZXJseSBwb3NpdGlv
biBtdWx0aXBsZSBzdGFja2VkIGZsb2F0cyB3aXRoIG5vbi1yZWN0YW5ndWxhciBzaGFwZSBvdXRz
aWRlLgotICAgIGlmIChtX2Zsb2F0c0ZpdE9uTGluZSAmJiBtX3dpZHRoLmZpdHNPbkxpbmVFeGNs
dWRpbmdUcmFpbGluZ1doaXRlc3BhY2UobV9ibG9jay5sb2dpY2FsV2lkdGhGb3JGbG9hdChmbG9h
dGluZ09iamVjdCkpKSB7Ci0gICAgICAgIG1fYmxvY2sucG9zaXRpb25OZXdGbG9hdE9uTGluZShm
bG9hdGluZ09iamVjdCwgbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBtX2xpbmVJbmZvLCBt
X3dpZHRoKTsKLSAgICAgICAgaWYgKG1fbGluZUJyZWFrLm1fb2JqID09IG1fY3VycmVudC5tX29i
aikgewotICAgICAgICAgICAgQVNTRVJUKCFtX2xpbmVCcmVhay5tX3Bvcyk7Ci0gICAgICAgICAg
ICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAg
ICBtX2Zsb2F0c0ZpdE9uTGluZSA9IGZhbHNlOwotICAgIC8vIFVwZGF0ZSBwcmlvciBsaW5lIGJy
ZWFrIGNvbnRleHQgY2hhcmFjdGVycywgdXNpbmcgVStGRkZEIChPQkpFQ1QgUkVQTEFDRU1FTlQg
Q0hBUkFDVEVSKSBmb3IgZmxvYXRpbmcgZWxlbWVudC4KLSAgICBtX3JlbmRlclRleHRJbmZvLm1f
bGluZUJyZWFrSXRlcmF0b3IudXBkYXRlUHJpb3JDb250ZXh0KHJlcGxhY2VtZW50Q2hhcmFjdGVy
KTsKLX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbXB0eUlubGluZSgp
Ci17Ci0gICAgUmVuZGVySW5saW5lJiBmbG93Qm94ID0gdG9SZW5kZXJJbmxpbmUoKm1fY3VycmVu
dC5tX29iaik7Ci0KLSAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGVuZCB1cCBiZWluZyBjYWxsZWQg
b24gZW1wdHkgaW5saW5lcwotICAgIEFTU0VSVChpc0VtcHR5SW5saW5lKGZsb3dCb3gpKTsKLQot
ICAgIC8vIE5vdyB0aGF0IHNvbWUgaW5saW5lIGZsb3dzIGhhdmUgbGluZSBib3hlcywgaWYgd2Ug
YXJlIGFscmVhZHkgaWdub3Jpbmcgc3BhY2VzLCB3ZSBuZWVkCi0gICAgLy8gdG8gbWFrZSBzdXJl
IHRoYXQgd2Ugc3RvcCB0byBpbmNsdWRlIHRoaXMgb2JqZWN0IGFuZCB0aGVuIHN0YXJ0IGlnbm9y
aW5nIHNwYWNlcyBhZ2Fpbi4KLSAgICAvLyBJZiB0aGlzIG9iamVjdCBpcyBhdCB0aGUgc3RhcnQg
b2YgdGhlIGxpbmUsIHdlIG5lZWQgdG8gYmVoYXZlIGxpa2UgbGlzdCBtYXJrZXJzIGFuZAotICAg
IC8vIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcy4KLSAgICBib29sIHJlcXVpcmVzTGluZUJveCA9IGFs
d2F5c1JlcXVpcmVzTGluZUJveChmbG93Qm94KTsKLSAgICBpZiAocmVxdWlyZXNMaW5lQm94IHx8
IHJlcXVpcmVzTGluZUJveEZvckNvbnRlbnQoZmxvd0JveCwgbV9saW5lSW5mbykpIHsKLSAgICAg
ICAgLy8gQW4gZW1wdHkgaW5saW5lIHRoYXQgb25seSBoYXMgbGluZS1oZWlnaHQsIHZlcnRpY2Fs
LWFsaWduIG9yIGZvbnQtbWV0cmljcyB3aWxsIG9ubHkgZ2V0IGEKLSAgICAgICAgLy8gbGluZSBi
b3ggdG8gYWZmZWN0IHRoZSBoZWlnaHQgb2YgdGhlIGxpbmUgaWYgdGhlIHJlc3Qgb2YgdGhlIGxp
bmUgaXMgbm90IGVtcHR5LgotICAgICAgICBpZiAocmVxdWlyZXNMaW5lQm94KQotICAgICAgICAg
ICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKLSAgICAg
ICAgaWYgKG1faWdub3JpbmdTcGFjZXMpIHsKLSAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3Rz
LmNsZWFyKCk7Ci0gICAgICAgICAgICBlbnN1cmVMaW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcyht
X2xpbmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQubV9vYmopOwotICAgICAgICB9IGVsc2UgaWYg
KG1fYmxvY2tTdHlsZS5jb2xsYXBzZVdoaXRlU3BhY2UoKSAmJiBtX3Jlc29sdmVyLnBvc2l0aW9u
KCkubV9vYmogPT0gbV9jdXJyZW50Lm1fb2JqCi0gICAgICAgICAgICAmJiBzaG91bGRTa2lwV2hp
dGVzcGFjZUFmdGVyU3RhcnRPYmplY3QobV9ibG9jaywgbV9jdXJyZW50Lm1fb2JqLCBtX2xpbmVN
aWRwb2ludFN0YXRlKSkgewotICAgICAgICAgICAgLy8gTGlrZSB3aXRoIGxpc3QgbWFya2Vycywg
d2Ugc3RhcnQgaWdub3Jpbmcgc3BhY2VzIHRvIG1ha2Ugc3VyZSB0aGF0IGFueQotICAgICAgICAg
ICAgLy8gYWRkaXRpb25hbCBzcGFjZXMgd2Ugc2VlIHdpbGwgYmUgZGlzY2FyZGVkLgotICAgICAg
ICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IHRydWU7Ci0gICAgICAgICAgICBtX2N1
cnJlbnRDaGFyYWN0ZXJJc1dTID0gdHJ1ZTsKLSAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMg
PSB0cnVlOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmFw
cGVuZEJveElmTmVlZGVkKCZmbG93Qm94KTsKLSAgICB9Ci0KLSAgICBtX3dpZHRoLmFkZFVuY29t
bWl0dGVkV2lkdGgoaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5tX29iaikgKyBib3JkZXJQ
YWRkaW5nTWFyZ2luU3RhcnQoZmxvd0JveCkgKyBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKGZsb3dC
b3gpKTsKLX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVSZXBsYWNlZCgp
Ci17Ci0gICAgUmVuZGVyQm94JiByZXBsYWNlZEJveCA9IHRvUmVuZGVyQm94KCptX2N1cnJlbnQu
bV9vYmopOwotCi0gICAgaWYgKG1fYXRTdGFydCkKLSAgICAgICAgbV93aWR0aC51cGRhdGVBdmFp
bGFibGVXaWR0aChyZXBsYWNlZEJveC5sb2dpY2FsSGVpZ2h0KCkpOwotCi0gICAgLy8gQnJlYWsg
b24gcmVwbGFjZWQgZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUtc3BhY2UuCi0g
ICAgaWYgKChtX2F1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChtX2xhc3RXUykpICYm
ICghbV9jdXJyZW50Lm1fb2JqLT5pc0ltYWdlKCkgfHwgbV9hbGxvd0ltYWdlc1RvQnJlYWspKSB7
Ci0gICAgICAgIG1fd2lkdGguY29tbWl0KCk7Ci0gICAgICAgIG1fbGluZUJyZWFrLm1vdmVUb1N0
YXJ0T2YobV9jdXJyZW50Lm1fb2JqKTsKLSAgICB9Ci0KLSAgICBpZiAobV9pZ25vcmluZ1NwYWNl
cykKLSAgICAgICAgc3RvcElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIElubGlu
ZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5tX29iaiwgMCkpOwotCi0gICAgbV9saW5lSW5mby5zZXRF
bXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKLSAgICBtX2lnbm9yaW5nU3BhY2VzID0g
ZmFsc2U7Ci0gICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOwotICAgIG1fY3Vy
cmVudENoYXJhY3RlcklzV1MgPSBmYWxzZTsKLSAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigp
OwotCi0gICAgLy8gT3B0aW1pemUgZm9yIGEgY29tbW9uIGNhc2UuIElmIHdlIGNhbid0IGZpbmQg
d2hpdGVzcGFjZSBhZnRlciB0aGUgbGlzdAotICAgIC8vIGl0ZW0sIHRoZW4gdGhpcyBpcyBhbGwg
bW9vdC4KLSAgICBMYXlvdXRVbml0IHJlcGxhY2VkTG9naWNhbFdpZHRoID0gbV9ibG9jay5sb2dp
Y2FsV2lkdGhGb3JDaGlsZChyZXBsYWNlZEJveCkgKyBtX2Jsb2NrLm1hcmdpblN0YXJ0Rm9yQ2hp
bGQocmVwbGFjZWRCb3gpICsgbV9ibG9jay5tYXJnaW5FbmRGb3JDaGlsZChyZXBsYWNlZEJveCkg
KyBpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50Lm1fb2JqKTsKLSAgICBpZiAobV9jdXJyZW50
Lm1fb2JqLT5pc0xpc3RNYXJrZXIoKSkgewotICAgICAgICBpZiAobV9ibG9ja1N0eWxlLmNvbGxh
cHNlV2hpdGVTcGFjZSgpICYmIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdCht
X2Jsb2NrLCBtX2N1cnJlbnQubV9vYmosIG1fbGluZU1pZHBvaW50U3RhdGUpKSB7Ci0gICAgICAg
ICAgICAvLyBMaWtlIHdpdGggaW5saW5lIGZsb3dzLCB3ZSBzdGFydCBpZ25vcmluZyBzcGFjZXMg
dG8gbWFrZSBzdXJlIHRoYXQgYW55Ci0gICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHNwYWNlcyB3
ZSBzZWUgd2lsbCBiZSBkaXNjYXJkZWQuCi0gICAgICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSBmYWxz
ZTsKLSAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSB0cnVlOwotICAgICAgICB9Ci0gICAg
ICAgIGlmICh0b1JlbmRlckxpc3RNYXJrZXIoKm1fY3VycmVudC5tX29iaikuaXNJbnNpZGUoKSkK
LSAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChyZXBsYWNlZExvZ2ljYWxX
aWR0aCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChy
ZXBsYWNlZExvZ2ljYWxXaWR0aCk7Ci0gICAgaWYgKG1fY3VycmVudC5tX29iai0+aXNSdWJ5UnVu
KCkpCi0gICAgICAgIG1fd2lkdGguYXBwbHlPdmVyaGFuZyh0b1JlbmRlclJ1YnlSdW4obV9jdXJy
ZW50Lm1fb2JqKSwgbV9sYXN0T2JqZWN0LCBtX25leHRPYmplY3QpOwotICAgIC8vIFVwZGF0ZSBw
cmlvciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVycywgdXNpbmcgVStGRkZEIChPQkpFQ1Qg
UkVQTEFDRU1FTlQgQ0hBUkFDVEVSKSBmb3IgcmVwbGFjZWQgZWxlbWVudC4KLSAgICBtX3JlbmRl
clRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IudXBkYXRlUHJpb3JDb250ZXh0KHJlcGxhY2Vt
ZW50Q2hhcmFjdGVyKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbmV4dENoYXJhY3RlcihV
Q2hhciYgY3VycmVudENoYXJhY3RlciwgVUNoYXImIGxhc3RDaGFyYWN0ZXIsIFVDaGFyJiBzZWNv
bmRUb0xhc3RDaGFyYWN0ZXIpCi17Ci0gICAgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gbGFzdENo
YXJhY3RlcjsKLSAgICBsYXN0Q2hhcmFjdGVyID0gY3VycmVudENoYXJhY3RlcjsKLX0KLQotaW5s
aW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdv
cmRNZWFzdXJlbWVudHMsIGJvb2wmIGh5cGhlbmF0ZWQsICB1bnNpZ25lZCYgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXMpCi17Ci0gICAgaWYgKCFtX2N1cnJlbnQubV9wb3MpCi0gICAgICAgIG1f
YXBwbGllZFN0YXJ0V2lkdGggPSBmYWxzZTsKLQotICAgIFJlbmRlclRleHQqIHJlbmRlclRleHQg
PSB0b1JlbmRlclRleHQobV9jdXJyZW50Lm1fb2JqKTsKLQotI2lmIEVOQUJMRShTVkcpCi0gICAg
Ym9vbCBpc1NWR1RleHQgPSByZW5kZXJUZXh0LT5pc1NWR0lubGluZVRleHQoKTsKLSNlbmRpZgot
Ci0gICAgLy8gSWYgd2UgaGF2ZSBsZWZ0IGEgbm8td3JhcCBpbmxpbmUgYW5kIGVudGVyZWQgYW4g
YXV0b3dyYXAgaW5saW5lIHdoaWxlIGlnbm9yaW5nIHNwYWNlcwotICAgIC8vIHRoZW4gd2UgbmVl
ZCB0byBtYXJrIHRoZSBzdGFydCBvZiB0aGUgYXV0b3dyYXAgaW5saW5lIGFzIGEgcG90ZW50aWFs
IGxpbmVicmVhayBub3cuCi0gICAgaWYgKG1fYXV0b1dyYXAgJiYgIVJlbmRlclN0eWxlOjphdXRv
V3JhcChtX2xhc3RXUykgJiYgbV9pZ25vcmluZ1NwYWNlcykKLSAgICAgICAgY29tbWl0TGluZUJy
ZWFrQXRDdXJyZW50V2lkdGgobV9jdXJyZW50Lm1fb2JqKTsKLQotICAgIGlmIChyZW5kZXJUZXh0
LT5zdHlsZSgpLmhhc1RleHRDb21iaW5lKCkgJiYgbV9jdXJyZW50Lm1fb2JqLT5pc0NvbWJpbmVU
ZXh0KCkgJiYgIXRvUmVuZGVyQ29tYmluZVRleHQoKm1fY3VycmVudC5tX29iaikuaXNDb21iaW5l
ZCgpKSB7Ci0gICAgICAgIFJlbmRlckNvbWJpbmVUZXh0JiBjb21iaW5lUmVuZGVyZXIgPSB0b1Jl
bmRlckNvbWJpbmVUZXh0KCptX2N1cnJlbnQubV9vYmopOwotICAgICAgICBjb21iaW5lUmVuZGVy
ZXIuY29tYmluZVRleHQoKTsKLSAgICAgICAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcmVuZGVyZXIn
cyB0ZXh0IG1heSBoYXZlIGNoYW5nZWQuIEluY3JlbWVudCBzdGFsZSBpdGVyYXRvciBwb3NpdGlv
bnMKLSAgICAgICAgaWYgKGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KG1f
bGluZUJyZWFrLCBjb21iaW5lUmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICBBU1NFUlQoaXRlcmF0
b3JJc0JleW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQobV9yZXNvbHZlci5wb3NpdGlvbigpLCBj
b21iaW5lUmVuZGVyZXIpKTsKLSAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOwot
ICAgICAgICAgICAgbV9yZXNvbHZlci5pbmNyZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQot
ICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IGxpbmVTdHlsZSgqcmVuZGVyVGV4dC0+cGFy
ZW50KCksIG1fbGluZUluZm8pOwotICAgIGNvbnN0IEZvbnQmIGZvbnQgPSBzdHlsZS5mb250KCk7
Ci0gICAgYm9vbCBpc0ZpeGVkUGl0Y2ggPSBmb250LmlzRml4ZWRQaXRjaCgpOwotICAgIGJvb2wg
Y2FuSHlwaGVuYXRlID0gc3R5bGUuaHlwaGVucygpID09IEh5cGhlbnNBdXRvICYmIFdlYkNvcmU6
OmNhbkh5cGhlbmF0ZShzdHlsZS5sb2NhbGUoKSk7Ci0KLSAgICB1bnNpZ25lZCBsYXN0U3BhY2Ug
PSBtX2N1cnJlbnQubV9wb3M7Ci0gICAgZmxvYXQgd29yZFNwYWNpbmcgPSBtX2N1cnJlbnRTdHls
ZS0+d29yZFNwYWNpbmcoKTsKLSAgICBmbG9hdCBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IDA7Ci0g
ICAgZmxvYXQgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAwOwotCi0gICAgZmxvYXQg
d3JhcFcgPSBtX3dpZHRoLnVuY29tbWl0dGVkV2lkdGgoKSArIGlubGluZUxvZ2ljYWxXaWR0aCht
X2N1cnJlbnQubV9vYmosICFtX2FwcGxpZWRTdGFydFdpZHRoLCB0cnVlKTsKLSAgICBmbG9hdCBj
aGFyV2lkdGggPSAwOwotICAgIGJvb2wgYnJlYWtOQlNQID0gbV9hdXRvV3JhcCAmJiBtX2N1cnJl
bnRTdHlsZS0+bmJzcE1vZGUoKSA9PSBTUEFDRTsKLSAgICAvLyBBdXRvLXdyYXBwaW5nIHRleHQg
c2hvdWxkIHdyYXAgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgb25seSBpZiBpdCBjb3VsZCBub3Qg
d3JhcCBiZWZvcmUgdGhlIHdvcmQsCi0gICAgLy8gd2hpY2ggaXMgb25seSBwb3NzaWJsZSBpZiB0
aGUgd29yZCBpcyB0aGUgZmlyc3QgdGhpbmcgb24gdGhlIGxpbmUsIHRoYXQgaXMsIGlmIHx3fCBp
cyB6ZXJvLgotICAgIGJvb2wgYnJlYWtXb3JkcyA9IG1fY3VycmVudFN0eWxlLT5icmVha1dvcmRz
KCkgJiYgKChtX2F1dG9XcmFwICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHx8IG1fY3Vy
cldTID09IFBSRSk7Ci0gICAgYm9vbCBtaWRXb3JkQnJlYWsgPSBmYWxzZTsKLSAgICBib29sIGJy
ZWFrQWxsID0gbV9jdXJyZW50U3R5bGUtPndvcmRCcmVhaygpID09IEJyZWFrQWxsV29yZEJyZWFr
ICYmIG1fYXV0b1dyYXA7Ci0gICAgZmxvYXQgaHlwaGVuV2lkdGggPSAwOwotI2lmIEVOQUJMRShT
VkcpCi0gICAgaWYgKGlzU1ZHVGV4dCkgewotICAgICAgICBicmVha1dvcmRzID0gZmFsc2U7Ci0g
ICAgICAgIGJyZWFrQWxsID0gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAobV9yZW5k
ZXJUZXh0SW5mby5tX3RleHQgIT0gcmVuZGVyVGV4dCkgewotICAgICAgICB1cGRhdGVDb3VudGVy
SWZOZWVkZWQoKnJlbmRlclRleHQpOwotICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fdGV4dCA9
IHJlbmRlclRleHQ7Ci0gICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9mb250ID0gJmZvbnQ7Ci0g
ICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgPSBmb250LmNyZWF0ZUxheW91dChyZW5k
ZXJUZXh0LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSk7Ci0g
ICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNldFN0cmluZ0Fu
ZFJlbGVhc2VJdGVyYXRvcihyZW5kZXJUZXh0LT50ZXh0KCksIHN0eWxlLmxvY2FsZSgpKTsKLSAg
ICB9IGVsc2UgaWYgKG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgJiYgbV9yZW5kZXJUZXh0SW5m
by5tX2ZvbnQgIT0gJmZvbnQpIHsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2ZvbnQgPSAm
Zm9udDsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xheW91dCA9IGZvbnQuY3JlYXRlTGF5
b3V0KHJlbmRlclRleHQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIG1fY29sbGFwc2VXaGl0ZVNw
YWNlKTsKLSAgICB9Ci0KLSAgICBUZXh0TGF5b3V0KiB0ZXh0TGF5b3V0ID0gbV9yZW5kZXJUZXh0
SW5mby5tX2xheW91dC5nZXQoKTsKLQotICAgIC8vIE5vbi16ZXJvIG9ubHkgd2hlbiBrZXJuaW5n
IGlzIGVuYWJsZWQgYW5kIFRleHRMYXlvdXQgaXNuJ3QgdXNlZCwgaW4gd2hpY2ggY2FzZSB3ZSBt
ZWFzdXJlCi0gICAgLy8gd29yZHMgd2l0aCB0aGVpciB0cmFpbGluZyBzcGFjZSwgdGhlbiBzdWJ0
cmFjdCBpdHMgd2lkdGguCi0gICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+IGZhbGxi
YWNrRm9udHM7Ci0gICAgZmxvYXQgd29yZFRyYWlsaW5nU3BhY2VXaWR0aCA9IChmb250LnR5cGVz
ZXR0aW5nRmVhdHVyZXMoKSAmIEtlcm5pbmcpICYmICF0ZXh0TGF5b3V0ID8gZm9udC53aWR0aChS
ZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bihyZW5kZXJUZXh0LCBmb250LCAmc3BhY2UsIDEs
IHN0eWxlKSwgJmZhbGxiYWNrRm9udHMpICsgd29yZFNwYWNpbmcgOiAwOwotCi0gICAgVUNoYXIg
bGFzdENoYXJhY3RlciA9IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5sYXN0
Q2hhcmFjdGVyKCk7Ci0gICAgVUNoYXIgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gbV9yZW5kZXJU
ZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLnNlY29uZFRvTGFzdENoYXJhY3RlcigpOwotICAg
IGZvciAoOyBtX2N1cnJlbnQubV9wb3MgPCByZW5kZXJUZXh0LT50ZXh0TGVuZ3RoKCk7IG1fY3Vy
cmVudC5mYXN0SW5jcmVtZW50SW5UZXh0Tm9kZSgpKSB7Ci0gICAgICAgIGJvb2wgcHJldmlvdXND
aGFyYWN0ZXJJc1NwYWNlID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKLSAgICAgICAgYm9v
bCBwcmV2aW91c0NoYXJhY3RlcklzV1MgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTOwotICAgICAg
ICBVQ2hhciBjID0gbV9jdXJyZW50LmN1cnJlbnQoKTsKLSAgICAgICAgbV9jdXJyZW50Q2hhcmFj
dGVySXNTcGFjZSA9IGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCAoIW1fcHJlc2VydmVzTmV3bGlu
ZSAmJiAoYyA9PSAnXG4nKSk7Ci0KLSAgICAgICAgaWYgKCFtX2NvbGxhcHNlV2hpdGVTcGFjZSB8
fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKLSAgICAgICAgICAgIG1fbGluZUluZm8uc2V0
RW1wdHkoZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7Ci0KLSAgICAgICAgaWYgKGMgPT0gc29m
dEh5cGhlbiAmJiBtX2F1dG9XcmFwICYmICFoeXBoZW5XaWR0aCAmJiBzdHlsZS5oeXBoZW5zKCkg
IT0gSHlwaGVuc05vbmUpIHsKLSAgICAgICAgICAgIGh5cGhlbldpZHRoID0gbWVhc3VyZUh5cGhl
bldpZHRoKHJlbmRlclRleHQsIGZvbnQsICZmYWxsYmFja0ZvbnRzKTsKLSAgICAgICAgICAgIG1f
d2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChoeXBoZW5XaWR0aCk7Ci0gICAgICAgIH0KLQotICAg
ICAgICBib29sIGFwcGx5V29yZFNwYWNpbmcgPSBmYWxzZTsKLQotICAgICAgICBtX2N1cnJlbnRD
aGFyYWN0ZXJJc1dTID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSB8fCAoYnJlYWtOQlNQICYm
IGMgPT0gbm9CcmVha1NwYWNlKTsKLQotICAgICAgICBpZiAoKGJyZWFrQWxsIHx8IGJyZWFrV29y
ZHMpICYmICFtaWRXb3JkQnJlYWsgJiYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlIHx8IHN0
eWxlLndoaXRlU3BhY2UoKSAhPSBQUkVfV1JBUCkpIHsKLSAgICAgICAgICAgIHdyYXBXICs9IGNo
YXJXaWR0aDsKLSAgICAgICAgICAgIGJvb2wgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQ
YWlyID0gVTE2X0lTX0xFQUQoYykgJiYgbV9jdXJyZW50Lm1fcG9zICsgMSA8IHJlbmRlclRleHQt
PnRleHRMZW5ndGgoKSAmJiBVMTZfSVNfVFJBSUwoKCpyZW5kZXJUZXh0KVttX2N1cnJlbnQubV9w
b3MgKyAxXSk7Ci0gICAgICAgICAgICBjaGFyV2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwg
bV9jdXJyZW50Lm1fcG9zLCBtaWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPyAyIDog
MSwgZm9udCwgbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcsIGlzRml4ZWRQaXRjaCwg
bV9jb2xsYXBzZVdoaXRlU3BhY2UsIGZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOwotICAgICAg
ICAgICAgbWlkV29yZEJyZWFrID0gbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcgKyBj
aGFyV2lkdGggPiBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCk7Ci0gICAgICAgIH0KLQotICAgICAg
ICBib29sIGJldHdlZW5Xb3JkcyA9IGMgPT0gJ1xuJyB8fCAobV9jdXJyV1MgIT0gUFJFICYmICFt
X2F0U3RhcnQgJiYgaXNCcmVha2FibGUobV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJh
dG9yLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2FibGVQb3NpdGlvbiwg
YnJlYWtOQlNQKQotICAgICAgICAgICAgJiYgKHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9u
ZSB8fCAobV9jdXJyZW50LnByZXZpb3VzSW5TYW1lTm9kZSgpICE9IHNvZnRIeXBoZW4pKSk7Ci0K
LSAgICAgICAgaWYgKGJldHdlZW5Xb3JkcyB8fCBtaWRXb3JkQnJlYWspIHsKLSAgICAgICAgICAg
IGJvb2wgc3RvcHBlZElnbm9yaW5nU3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobV9p
Z25vcmluZ1NwYWNlcykgewotICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0g
MDsKLSAgICAgICAgICAgICAgICBpZiAoIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpIHsKLSAg
ICAgICAgICAgICAgICAgICAgLy8gU3RvcCBpZ25vcmluZyBzcGFjZXMgYW5kIGJlZ2luIGF0IHRo
aXMKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHBvaW50LgotICAgICAgICAgICAgICAgICAg
ICBtX2lnbm9yaW5nU3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmRTcGFj
aW5nRm9yV29yZE1lYXN1cmVtZW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFNwYWNl
ID0gbV9jdXJyZW50Lm1fcG9zOyAvLyBlLmcuLCAiRm9vICAgIGdvbyIsIGRvbid0IGFkZCBpbiBh
bnkgb2YgdGhlIGlnbm9yZWQgc3BhY2VzLgotICAgICAgICAgICAgICAgICAgICBzdG9wSWdub3Jp
bmdTcGFjZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50
Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcHBlZEln
bm9yaW5nU3BhY2VzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgICAgICAgICAvLyBKdXN0IGtlZXAgaWdub3JpbmcgdGhlc2Ugc3BhY2VzLgotICAgICAgICAg
ICAgICAgICAgICBuZXh0Q2hhcmFjdGVyKGMsIGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENo
YXJhY3Rlcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50cy5ncm93KHdv
cmRNZWFzdXJlbWVudHMuc2l6ZSgpICsgMSk7Ci0gICAgICAgICAgICBXb3JkTWVhc3VyZW1lbnQm
IHdvcmRNZWFzdXJlbWVudCA9IHdvcmRNZWFzdXJlbWVudHMubGFzdCgpOwotCi0gICAgICAgICAg
ICB3b3JkTWVhc3VyZW1lbnQucmVuZGVyZXIgPSByZW5kZXJUZXh0OwotICAgICAgICAgICAgd29y
ZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fY3VycmVudC5tX3BvczsKLSAgICAgICAgICAgIHdv
cmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCA9IGxhc3RTcGFjZTsKLQotICAgICAgICAgICAgZmxv
YXQgYWRkaXRpb25hbFRlbXBXaWR0aDsKLSAgICAgICAgICAgIGlmICh3b3JkVHJhaWxpbmdTcGFj
ZVdpZHRoICYmIGMgPT0gJyAnKQotICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGgg
PSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MgKyAxIC0g
bGFzdFNwYWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1f
Y29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExh
eW91dCkgLSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoOwotICAgICAgICAgICAgZWxzZQotICAgICAg
ICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbGFz
dFNwYWNlLCBtX2N1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVu
dFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJl
bWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKLQotICAgICAgICAgICAgaWYgKHdvcmRN
ZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSAmJiAhZmFsbGJhY2tGb250cy5pc0Vt
cHR5KCkpCi0gICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuc3dh
cChmYWxsYmFja0ZvbnRzKTsKLSAgICAgICAgICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKLQot
ICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0gYWRkaXRpb25hbFRlbXBXaWR0aCAr
IHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50OwotICAgICAgICAgICAgYWRkaXRpb25hbFRl
bXBXaWR0aCArPSBsYXN0U3BhY2VXb3JkU3BhY2luZzsKLSAgICAgICAgICAgIG1fd2lkdGguYWRk
VW5jb21taXR0ZWRXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoKTsKLQotICAgICAgICAgICAgaWYg
KG1fY29sbGFwc2VXaGl0ZVNwYWNlICYmIHByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSAmJiBtX2N1
cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0aW9uYWxUZW1wV2lkdGgpCi0gICAgICAgICAg
ICAgICAgbV93aWR0aC5zZXRUcmFpbGluZ1doaXRlc3BhY2VXaWR0aChhZGRpdGlvbmFsVGVtcFdp
ZHRoKTsKLQotICAgICAgICAgICAgaWYgKCFtX2FwcGxpZWRTdGFydFdpZHRoKSB7Ci0gICAgICAg
ICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlubGluZUxvZ2ljYWxXaWR0aCht
X2N1cnJlbnQubV9vYmosIHRydWUsIGZhbHNlKSk7Ci0gICAgICAgICAgICAgICAgbV9hcHBsaWVk
U3RhcnRXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSNpZiBFTkFCTEUoQ1NTX1NIQVBF
UykKLSAgICAgICAgICAgIGlmIChtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpCi0gICAgICAg
ICAgICAgICAgdXBkYXRlU2VnbWVudHNGb3JTaGFwZXMobV9ibG9jaywgbV9sYXN0RmxvYXRGcm9t
UHJldmlvdXNMaW5lLCB3b3JkTWVhc3VyZW1lbnRzLCBtX3dpZHRoLCBtX2xpbmVJbmZvLmlzRmly
c3RMaW5lKCkpOwotI2VuZGlmCi0gICAgICAgICAgICBhcHBseVdvcmRTcGFjaW5nID0gd29yZFNw
YWNpbmcgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKLQotICAgICAgICAgICAgaWYgKCFt
X3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgJiYgbV9hdXRvV3JhcCAmJiAhbV93aWR0aC5maXRzT25M
aW5lKCkpCi0gICAgICAgICAgICAgICAgbV93aWR0aC5maXRCZWxvd0Zsb2F0cygpOwotCi0gICAg
ICAgICAgICBpZiAobV9hdXRvV3JhcCB8fCBicmVha1dvcmRzKSB7Ci0gICAgICAgICAgICAgICAg
Ly8gSWYgd2UgYnJlYWsgb25seSBhZnRlciB3aGl0ZS1zcGFjZSwgY29uc2lkZXIgdGhlIGN1cnJl
bnQgY2hhcmFjdGVyCi0gICAgICAgICAgICAgICAgLy8gYXMgY2FuZGlkYXRlIHdpZHRoIGZvciB0
aGlzIGxpbmUuCi0gICAgICAgICAgICAgICAgYm9vbCBsaW5lV2FzVG9vV2lkZSA9IGZhbHNlOwot
ICAgICAgICAgICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoKSAmJiBtX2N1cnJlbnRDaGFy
YWN0ZXJJc1NwYWNlICYmIG1fY3VycmVudFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRlU3BhY2Uo
KSAmJiAhbWlkV29yZEJyZWFrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsb2F0IGNoYXJXaWR0
aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBtX2N1cnJlbnQubV9wb3MsIDEsIGZvbnQsIG1fd2lk
dGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdv
cmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSArIChhcHBseVdvcmRTcGFj
aW5nID8gd29yZFNwYWNpbmcgOiAwKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYg
bGluZSBpcyB0b28gYmlnIGV2ZW4gd2l0aG91dCB0aGUgZXh0cmEgc3BhY2UKLSAgICAgICAgICAg
ICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gSWYgaXQgaXMgbm90LCBkbyBub3Ro
aW5nLgotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBuZWVkcyB0aGUgZXh0cmEg
d2hpdGVzcGFjZSB0byBiZSB0b28gbG9uZywKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBt
b3ZlIHRoZSBsaW5lIGJyZWFrIHRvIHRoZSBzcGFjZSBhbmQgc2tpcCBhbGwKLSAgICAgICAgICAg
ICAgICAgICAgLy8gYWRkaXRpb25hbCB3aGl0ZXNwYWNlLgotICAgICAgICAgICAgICAgICAgICBp
ZiAoIW1fd2lkdGguZml0c09uTGluZUluY2x1ZGluZ0V4dHJhV2lkdGgoY2hhcldpZHRoKSkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgbGluZVdhc1Rvb1dpZGUgPSB0cnVlOwotICAgICAgICAg
ICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJy
ZW50Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOwotICAgICAgICAg
ICAgICAgICAgICAgICAgbV9saW5lQnJlYWtlci5za2lwVHJhaWxpbmdXaGl0ZXNwYWNlKG1fbGlu
ZUJyZWFrLCBtX2xpbmVJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobGluZVdhc1Rvb1dpZGUgfHwgIW1fd2lkdGguZml0
c09uTGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYW5IeXBoZW5hdGUgJiYgIW1f
d2lkdGguZml0c09uTGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnlIeXBoZW5h
dGluZyhyZW5kZXJUZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwgY29uc2VjdXRpdmVIeXBoZW5h
dGVkTGluZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMoKSwgc3R5bGUuaHlw
aGVuYXRpb25MaW1pdEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QWZ0ZXIoKSwgbGFz
dFNwYWNlLCBtX2N1cnJlbnQubV9wb3MsIG1fd2lkdGguY3VycmVudFdpZHRoKCkgLSBhZGRpdGlv
bmFsVGVtcFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9j
b2xsYXBzZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBtX2xpbmVCcmVhaywgbV9j
dXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBtX2xpbmVCcmVha2VyLm1faHlwaGVuYXRl
ZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWtlci5tX2h5cGhlbmF0
ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1f
bGluZUJyZWFrLmF0VGV4dFBhcmFncmFwaFNlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQubV9wb3MgPiAw
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94
KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fbGlu
ZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm1fcG9zOwot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVh
ay5tX29iaiAmJiBtX2xpbmVCcmVhay5tX3BvcyAmJiBtX2xpbmVCcmVhay5tX29iai0+aXNUZXh0
KCkgJiYgdG9SZW5kZXJUZXh0KG1fbGluZUJyZWFrLm1fb2JqKS0+dGV4dExlbmd0aCgpICYmIHRv
UmVuZGVyVGV4dChtX2xpbmVCcmVhay5tX29iaiktPmNoYXJhY3RlckF0KG1fbGluZUJyZWFrLm1f
cG9zIC0gMSkgPT0gc29mdEh5cGhlbiAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUp
Ci0gICAgICAgICAgICAgICAgICAgICAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKLSAgICAgICAgICAg
ICAgICAgICAgaWYgKG1fbGluZUJyZWFrLm1fcG9zICYmIG1fbGluZUJyZWFrLm1fcG9zICE9ICh1
bnNpZ25lZCl3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ICYmICF3b3JkTWVhc3VyZW1lbnQud2lk
dGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyV2lkdGgpIHsKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9saW5lQnJl
YWsubV9wb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50Lndp
ZHRoID0gY2hhcldpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIERpZG4ndCBmaXQuIEp1bXAgdG8gdGhl
IGVuZCB1bmxlc3MgdGhlcmUncyBzdGlsbCBhbiBvcHBvcnR1bml0eSB0byBjb2xsYXBzZSB3aGl0
ZXNwYWNlLgotICAgICAgICAgICAgICAgICAgICBpZiAobV9pZ25vcmluZ1NwYWNlcyB8fCAhbV9j
b2xsYXBzZVdoaXRlU3BhY2UgfHwgIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgfHwgIXByZXZp
b3VzQ2hhcmFjdGVySXNTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9hdEVuZCA9
IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAg
ICBpZiAoIWJldHdlZW5Xb3JkcyB8fCAobWlkV29yZEJyZWFrICYmICFtX2F1dG9XcmFwKSkKLSAg
ICAgICAgICAgICAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aCgtYWRkaXRp
b25hbFRlbXBXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoeXBoZW5XaWR0aCkgewot
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VidHJhY3QgdGhlIHdpZHRoIG9mIHRoZSBzb2Z0
IGh5cGhlbiBvdXQgc2luY2Ugd2UgZml0IG9uIGEgbGluZS4KLSAgICAgICAgICAgICAgICAgICAg
ICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aCgtaHlwaGVuV2lkdGgpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgaHlwaGVuV2lkdGggPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYyA9PSAn
XG4nICYmIG1fcHJlc2VydmVzTmV3bGluZSkgewotICAgICAgICAgICAgICAgIGlmICghc3RvcHBl
ZElnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudC5tX3BvcyA+IDApCi0gICAgICAgICAgICAgICAg
ICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3Vy
cmVudCk7Ci0gICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29i
aiwgbV9jdXJyZW50Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOwot
ICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOwotICAgICAgICAgICAgICAg
IG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwotICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobV9h
dXRvV3JhcCAmJiBiZXR3ZWVuV29yZHMpIHsKLSAgICAgICAgICAgICAgICBtX3dpZHRoLmNvbW1p
dCgpOwotICAgICAgICAgICAgICAgIHdyYXBXID0gMDsKLSAgICAgICAgICAgICAgICBtX2xpbmVC
cmVhay5tb3ZlVG8obV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5t
X25leHRCcmVha2FibGVQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgLy8gQXV0by13cmFwcGlu
ZyB0ZXh0IHNob3VsZCBub3Qgd3JhcCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBvbmNlIGl0IGhh
cyBoYWQgYW4KLSAgICAgICAgICAgICAgICAvLyBvcHBvcnR1bml0eSB0byBicmVhayBhZnRlciBh
IHdvcmQuCi0gICAgICAgICAgICAgICAgYnJlYWtXb3JkcyA9IGZhbHNlOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICBpZiAobWlkV29yZEJyZWFrICYmICFVMTZfSVNfVFJBSUwoYykgJiYg
IShVX0dFVF9HQ19NQVNLKGMpICYgVV9HQ19NX01BU0spKSB7Ci0gICAgICAgICAgICAgICAgLy8g
UmVtZW1iZXIgdGhpcyBhcyBhIGJyZWFrYWJsZSBwb3NpdGlvbiBpbiBjYXNlCi0gICAgICAgICAg
ICAgICAgLy8gYWRkaW5nIHRoZSBlbmQgd2lkdGggZm9yY2VzIGEgYnJlYWsuCi0gICAgICAgICAg
ICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1fcG9z
LCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIG1p
ZFdvcmRCcmVhayAmPSAoYnJlYWtXb3JkcyB8fCBicmVha0FsbCk7Ci0gICAgICAgICAgICB9Ci0K
LSAgICAgICAgICAgIGlmIChiZXR3ZWVuV29yZHMpIHsKLSAgICAgICAgICAgICAgICBsYXN0U3Bh
Y2VXb3JkU3BhY2luZyA9IGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7Ci0gICAg
ICAgICAgICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAoYXBwbHlXb3JkU3Bh
Y2luZyAmJiB3b3JkTWVhc3VyZW1lbnQud2lkdGgpID8gd29yZFNwYWNpbmcgOiAwOwotICAgICAg
ICAgICAgICAgIGxhc3RTcGFjZSA9IG1fY3VycmVudC5tX3BvczsKLSAgICAgICAgICAgIH0KLQot
ICAgICAgICAgICAgaWYgKCFtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jb2xs
YXBzZVdoaXRlU3BhY2UoKSkgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIGVuY291bnRlciBh
IG5ld2xpbmUsIG9yIGlmIHdlIGVuY291bnRlciBhCi0gICAgICAgICAgICAgICAgLy8gc2Vjb25k
IHNwYWNlLCB3ZSBuZWVkIHRvIGdvIGFoZWFkIGFuZCBicmVhayB1cCB0aGlzCi0gICAgICAgICAg
ICAgICAgLy8gcnVuIGFuZCBlbnRlciBhIG1vZGUgd2hlcmUgd2Ugc3RhcnQgY29sbGFwc2luZyBz
cGFjZXMuCi0gICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYg
cHJldmlvdXNDaGFyYWN0ZXJJc1NwYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1faWdub3Jp
bmdTcGFjZXMgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIFdlIGp1c3QgZW50ZXJl
ZCBhIG1vZGUgd2hlcmUgd2UgYXJlIGlnbm9yaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIHNw
YWNlcy4gQ3JlYXRlIGEgbWlkcG9pbnQgdG8gdGVybWluYXRlIHRoZSBydW4KLSAgICAgICAgICAg
ICAgICAgICAgLy8gYmVmb3JlIHRoZSBzZWNvbmQgc3BhY2UuCi0gICAgICAgICAgICAgICAgICAg
IHN0YXJ0SWdub3JpbmdTcGFjZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9zdGFydE9mSWdub3Jl
ZFNwYWNlcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLnVwZGF0ZU1p
ZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0
b3IoKSwgVHJhaWxpbmdPYmplY3RzOjpEb05vdENvbGxhcHNlRmlyc3RTcGFjZSk7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1faWdub3JpbmdT
cGFjZXMpIHsKLSAgICAgICAgICAgIC8vIFN0b3AgaWdub3Jpbmcgc3BhY2VzIGFuZCBiZWdpbiBh
dCB0aGlzCi0gICAgICAgICAgICAvLyBuZXcgcG9pbnQuCi0gICAgICAgICAgICBtX2lnbm9yaW5n
U3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IGFwcGx5
V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7Ci0gICAgICAgICAgICB3b3JkU3BhY2luZ0Zv
cldvcmRNZWFzdXJlbWVudCA9IChhcHBseVdvcmRTcGFjaW5nICYmIHdvcmRNZWFzdXJlbWVudHMu
bGFzdCgpLndpZHRoKSA/IHdvcmRTcGFjaW5nIDogMDsKLSAgICAgICAgICAgIGxhc3RTcGFjZSA9
IG1fY3VycmVudC5tX3BvczsgLy8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQgaW4gYW55
IG9mIHRoZSBpZ25vcmVkIHNwYWNlcy4KLSAgICAgICAgICAgIHN0b3BJZ25vcmluZ1NwYWNlcyht
X2xpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJlbnQubV9vYmosIG1f
Y3VycmVudC5tX3BvcykpOwotICAgICAgICB9Ci0jaWYgRU5BQkxFKFNWRykKLSAgICAgICAgaWYg
KGlzU1ZHVGV4dCAmJiBtX2N1cnJlbnQubV9wb3MgPiAwKSB7Ci0gICAgICAgICAgICAvLyBGb3Jj
ZSBjcmVhdGlvbiBvZiBuZXcgSW5saW5lQm94ZXMgZm9yIGVhY2ggYWJzb2x1dGUgcG9zaXRpb25l
ZCBjaGFyYWN0ZXIgKHRob3NlIHRoYXQgc3RhcnQgbmV3IHRleHQgY2h1bmtzKS4KLSAgICAgICAg
ICAgIGlmICh0b1JlbmRlclNWR0lubGluZVRleHQocmVuZGVyVGV4dCktPmNoYXJhY3RlclN0YXJ0
c05ld1RleHRDaHVuayhtX2N1cnJlbnQubV9wb3MpKQotICAgICAgICAgICAgICAgIGVuc3VyZUNo
YXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7Ci0gICAg
ICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGlmIChtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYm
ICFwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UpIHsKLSAgICAgICAgICAgIG1fc3RhcnRPZklnbm9y
ZWRTcGFjZXMubV9vYmogPSBtX2N1cnJlbnQubV9vYmo7Ci0gICAgICAgICAgICBtX3N0YXJ0T2ZJ
Z25vcmVkU3BhY2VzLm1fcG9zID0gbV9jdXJyZW50Lm1fcG9zOwotICAgICAgICAgICAgLy8gU3Bh
Y2VzIGFmdGVyIHJpZ2h0LWFsaWduZWQgdGV4dCBhbmQgYmVmb3JlIGEgbGluZS1icmVhayBnZXQg
Y29sbGFwc2VkIGF3YXkgY29tcGxldGVseSBzbyB0aGF0IHRoZSB0cmFpbGluZwotICAgICAgICAg
ICAgLy8gc3BhY2UgZG9lc24ndCBzZWVtIHRvIHB1c2ggdGhlIHRleHQgb3V0IGZyb20gdGhlIHJp
Z2h0LWhhbmQgZWRnZS4KLSAgICAgICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2FyZGxlc3Mg
b2YgdGhlIGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2VsaW5pbmcg
YSBsb3Qgb2YgdGVzdCByZXN1bHRzLgotICAgICAgICAgICAgaWYgKG1fbmV4dE9iamVjdCAmJiBt
X25leHRPYmplY3QtPmlzQlIoKSAmJiAobV9ibG9ja1N0eWxlLnRleHRBbGlnbigpID09IFJJR0hU
IHx8IG1fYmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfUklHSFQpKSB7Ci0gICAgICAg
ICAgICAgICAgbV9zdGFydE9mSWdub3JlZFNwYWNlcy5tX3Bvcy0tOwotICAgICAgICAgICAgICAg
IC8vIElmIHRoZXJlJ3MganVzdCBhIHNpbmdsZSB0cmFpbGluZyBzcGFjZSBzdGFydCBpZ25vcmlu
ZyBpdCBub3cgc28gaXQgY29sbGFwc2VzIGF3YXkuCi0gICAgICAgICAgICAgICAgaWYgKG1fY3Vy
cmVudC5tX3BvcyA9PSByZW5kZXJUZXh0LT50ZXh0TGVuZ3RoKCkgLSAxKQotICAgICAgICAgICAg
ICAgICAgICBzdGFydElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fc3RhcnRP
Zklnbm9yZWRTcGFjZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYg
KCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIHByZXZpb3VzQ2hhcmFjdGVySXNXUykgewot
ICAgICAgICAgICAgaWYgKG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUtPmJyZWFrT25seUFm
dGVyV2hpdGVTcGFjZSgpKQotICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1
cnJlbnQubV9vYmosIG1fY3VycmVudC5tX3BvcywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBv
c2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2NvbGxhcHNlV2hpdGVTcGFjZSAm
JiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFtX2lnbm9yaW5nU3BhY2VzKQotICAgICAg
ICAgICAgbV90cmFpbGluZ09iamVjdHMuc2V0VHJhaWxpbmdXaGl0ZXNwYWNlKHRvUmVuZGVyVGV4
dChtX2N1cnJlbnQubV9vYmopKTsKLSAgICAgICAgZWxzZSBpZiAoIW1fY3VycmVudFN0eWxlLT5j
b2xsYXBzZVdoaXRlU3BhY2UoKSB8fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKLSAgICAg
ICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7Ci0KLSAgICAgICAgbV9hdFN0YXJ0ID0g
ZmFsc2U7Ci0gICAgICAgIG5leHRDaGFyYWN0ZXIoYywgbGFzdENoYXJhY3Rlciwgc2Vjb25kVG9M
YXN0Q2hhcmFjdGVyKTsKLSAgICB9Ci0KLSAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFr
SXRlcmF0b3Iuc2V0UHJpb3JDb250ZXh0KGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJh
Y3Rlcik7Ci0KLSAgICB3b3JkTWVhc3VyZW1lbnRzLmdyb3cod29yZE1lYXN1cmVtZW50cy5zaXpl
KCkgKyAxKTsKLSAgICBXb3JkTWVhc3VyZW1lbnQmIHdvcmRNZWFzdXJlbWVudCA9IHdvcmRNZWFz
dXJlbWVudHMubGFzdCgpOwotICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9IHJlbmRlclRl
eHQ7Ci0KLSAgICAvLyBJTVBPUlRBTlQ6IGN1cnJlbnQubV9wb3MgaXMgPiBsZW5ndGggaGVyZSEK
LSAgICBmbG9hdCBhZGRpdGlvbmFsVGVtcFdpZHRoID0gbV9pZ25vcmluZ1NwYWNlcyA/IDAgOiB0
ZXh0V2lkdGgocmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MgLSBsYXN0U3Bh
Y2UsIGZvbnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBz
ZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsK
LSAgICB3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQgPSBsYXN0U3BhY2U7Ci0gICAgd29yZE1l
YXN1cmVtZW50LmVuZE9mZnNldCA9IG1fY3VycmVudC5tX3BvczsKLSAgICB3b3JkTWVhc3VyZW1l
bnQud2lkdGggPSBtX2lnbm9yaW5nU3BhY2VzID8gMCA6IGFkZGl0aW9uYWxUZW1wV2lkdGggKyB3
b3JkU3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudDsKLSAgICBhZGRpdGlvbmFsVGVtcFdpZHRoICs9
IGxhc3RTcGFjZVdvcmRTcGFjaW5nOwotCi0gICAgZmxvYXQgaW5saW5lTG9naWNhbFRlbXBXaWR0
aCA9IGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQubV9vYmosICFtX2FwcGxpZWRTdGFydFdp
ZHRoLCBtX2luY2x1ZGVFbmRXaWR0aCk7Ci0gICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRo
KGFkZGl0aW9uYWxUZW1wV2lkdGggKyBpbmxpbmVMb2dpY2FsVGVtcFdpZHRoKTsKLQotICAgIGlm
ICh3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5pc0VtcHR5KCkgJiYgIWZhbGxiYWNrRm9u
dHMuaXNFbXB0eSgpKQotICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5zd2Fw
KGZhbGxiYWNrRm9udHMpOwotICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKLQotICAgIGlmICht
X2NvbGxhcHNlV2hpdGVTcGFjZSAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0
aW9uYWxUZW1wV2lkdGgpCi0gICAgICAgIG1fd2lkdGguc2V0VHJhaWxpbmdXaGl0ZXNwYWNlV2lk
dGgoYWRkaXRpb25hbFRlbXBXaWR0aCwgaW5saW5lTG9naWNhbFRlbXBXaWR0aCk7Ci0KLSAgICBt
X2luY2x1ZGVFbmRXaWR0aCA9IGZhbHNlOwotCi0gICAgaWYgKCFtX3dpZHRoLmZpdHNPbkxpbmUo
KSkgewotICAgICAgICBpZiAoY2FuSHlwaGVuYXRlKQotICAgICAgICAgICAgdHJ5SHlwaGVuYXRp
bmcocmVuZGVyVGV4dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNvbnNlY3V0aXZlSHlwaGVuYXRl
ZExpbmVzLCBtX2Jsb2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCksIHN0eWxlLmh5cGhl
bmF0aW9uTGltaXRCZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCksIGxhc3RT
cGFjZSwgbV9jdXJyZW50Lm1fcG9zLCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpIC0gYWRkaXRpb25h
bFRlbXBXaWR0aCwgbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29s
bGFwc2VXaGl0ZVNwYWNlLCBsYXN0U3BhY2VXb3JkU3BhY2luZywgbV9saW5lQnJlYWssIG1fY3Vy
cmVudC5tX25leHRCcmVha2FibGVQb3NpdGlvbiwgbV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQp
OwotCi0gICAgICAgIGlmICghaHlwaGVuYXRlZCAmJiBtX2xpbmVCcmVhay5wcmV2aW91c0luU2Ft
ZU5vZGUoKSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkg
ewotICAgICAgICAgICAgaHlwaGVuYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICBtX2F0RW5kID0g
dHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBi
b29sIHRleHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRpb24oUmVuZGVyT2JqZWN0KiBuZXh0KQot
ewotICAgIEFTU0VSVChuZXh0LT5pc1RleHQoKSk7Ci0gICAgUmVuZGVyVGV4dCogbmV4dFRleHQg
PSB0b1JlbmRlclRleHQobmV4dCk7Ci0gICAgaWYgKCFuZXh0VGV4dC0+dGV4dExlbmd0aCgpKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgVUNoYXIgYyA9IG5leHRUZXh0LT5jaGFyYWN0ZXJB
dCgwKTsKLSAgICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IChjID09ICdcbicgJiYg
IW5leHRUZXh0LT5wcmVzZXJ2ZXNOZXdsaW5lKCkpOwotfQotCi1pbmxpbmUgYm9vbCBCcmVha2lu
Z0NvbnRleHQ6OmNhbkJyZWFrQXRUaGlzUG9zaXRpb24oKQotewotICAgIC8vIElmIHdlIGFyZSBu
by13cmFwIGFuZCBoYXZlIGZvdW5kIGEgbGluZS1icmVha2luZyBvcHBvcnR1bml0eSBhbHJlYWR5
IHRoZW4gd2Ugc2hvdWxkIHRha2UgaXQuCi0gICAgaWYgKG1fd2lkdGguY29tbWl0dGVkV2lkdGgo
KSAmJiAhbV93aWR0aC5maXRzT25MaW5lKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpICYmIG1f
Y3VycldTID09IE5PV1JBUCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBBdm9pZCBi
cmVha2luZyBiZWZvcmUgZW1wdHkgaW5saW5lcy4KLSAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1f
bmV4dE9iamVjdC0+aXNSZW5kZXJJbmxpbmUoKSAmJiBpc0VtcHR5SW5saW5lKHRvUmVuZGVySW5s
aW5lKCptX25leHRPYmplY3QpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gUmV0
dXJuIGVhcmx5IGlmIHdlIGF1dG93cmFwIGFuZCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYSBz
cGFjZSBhcyB3ZSB3aWxsIGFsd2F5cyB3YW50IHRvIGJyZWFrIGF0IHN1Y2ggYSBwb3NpdGlvbi4K
LSAgICBpZiAobV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQotICAgICAg
ICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5p
c0xpbmVCcmVha09wcG9ydHVuaXR5KCkpCi0gICAgICAgIHJldHVybiBtX2F1dG9XcmFwOwotCi0g
ICAgYm9vbCBuZXh0SXNBdXRvV3JhcHBpbmdUZXh0ID0gKG1fbmV4dE9iamVjdCAmJiBtX25leHRP
YmplY3QtPmlzVGV4dCgpICYmIChtX2F1dG9XcmFwIHx8IG1fbmV4dE9iamVjdC0+c3R5bGUoKS5h
dXRvV3JhcCgpKSk7Ci0gICAgaWYgKCFuZXh0SXNBdXRvV3JhcHBpbmdUZXh0KQotICAgICAgICBy
ZXR1cm4gbV9hdXRvV3JhcDsKLSAgICBib29sIGN1cnJlbnRJc1RleHRPckVtcHR5SW5saW5lID0g
bV9jdXJyZW50Lm1fb2JqLT5pc1RleHQoKSB8fCAobV9jdXJyZW50Lm1fb2JqLT5pc1JlbmRlcklu
bGluZSgpICYmIGlzRW1wdHlJbmxpbmUodG9SZW5kZXJJbmxpbmUoKm1fY3VycmVudC5tX29iaikp
KTsKLSAgICBpZiAoIWN1cnJlbnRJc1RleHRPckVtcHR5SW5saW5lKQotICAgICAgICByZXR1cm4g
bV9hdXRvV3JhcDsKLQotICAgIGJvb2wgY2FuQnJlYWtIZXJlID0gIW1fY3VycmVudENoYXJhY3Rl
cklzU3BhY2UgJiYgdGV4dEJlZ2luc1dpdGhCcmVha2FibGVQb3NpdGlvbihtX25leHRPYmplY3Qp
OwotCi0gICAgLy8gU2VlIGlmIGF0dGVtcHRpbmcgdG8gZml0IGJlbG93IGZsb2F0cyBjcmVhdGVz
IG1vcmUgYXZhaWxhYmxlIHdpZHRoIG9uIHRoZSBsaW5lLgotICAgIGlmICghbV93aWR0aC5maXRz
T25MaW5lKCkgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSkKLSAgICAgICAgbV93aWR0aC5m
aXRCZWxvd0Zsb2F0cygpOwotCi0gICAgYm9vbCBjYW5QbGFjZU9uTGluZSA9IG1fd2lkdGguZml0
c09uTGluZSgpIHx8ICFtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmU7Ci0KLSAgICBpZiAoY2Fu
UGxhY2VPbkxpbmUgJiYgY2FuQnJlYWtIZXJlKQotICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1
cnJlbnRXaWR0aChtX25leHRPYmplY3QpOwotCi0gICAgcmV0dXJuIGNhbkJyZWFrSGVyZTsKLX0K
LQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojpjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJ
Zk5lZWRlZCgpCi17Ci0gICAgYm9vbCBjaGVja0ZvckJyZWFrID0gY2FuQnJlYWtBdFRoaXNQb3Np
dGlvbigpOwotCi0gICAgaWYgKGNoZWNrRm9yQnJlYWsgJiYgIW1fd2lkdGguZml0c09uTGluZSht
X2lnbm9yaW5nU3BhY2VzKSkgewotICAgICAgICAvLyBpZiB3ZSBoYXZlIGZsb2F0cywgdHJ5IHRv
IGdldCBiZWxvdyB0aGVtLgotICAgICAgICBpZiAobV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAm
JiAhbV9pZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VXaGl0ZVNwYWNl
KCkpCi0gICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOwotCi0gICAgICAgIGlm
IChtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsKLSAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVl
OwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbV93aWR0aC5maXRC
ZWxvd0Zsb2F0cygpOwotCi0gICAgICAgIC8vIHx3aWR0aHwgbWF5IGhhdmUgYmVlbiBhZGp1c3Rl
ZCBiZWNhdXNlIHdlIGdvdCBzaG92ZWQgZG93biBwYXN0IGEgZmxvYXQgKHRodXMKLSAgICAgICAg
Ly8gZ2l2aW5nIHVzIG1vcmUgcm9vbSksIHNvIHdlIG5lZWQgdG8gcmV0ZXN0LCBhbmQgb25seSBq
dW1wIHRvCi0gICAgICAgIC8vIHRoZSBlbmQgbGFiZWwgaWYgd2Ugc3RpbGwgZG9uJ3QgZml0IG9u
IHRoZSBsaW5lLiAtZHdoCi0gICAgICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lKG1faWdub3Jp
bmdTcGFjZXMpKSB7Ci0gICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9ibG9ja1N0eWxlLmF1dG9XcmFwKCkg
JiYgIW1fd2lkdGguZml0c09uTGluZSgpICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsK
LSAgICAgICAgLy8gSWYgdGhlIGNvbnRhaW5lciBhdXRvd3JhcHMgYnV0IHRoZSBjdXJyZW50IGNo
aWxkIGRvZXMgbm90IHRoZW4gd2Ugc3RpbGwgbmVlZCB0byBlbnN1cmUgdGhhdCBpdAotICAgICAg
ICAvLyB3cmFwcyBhbmQgbW92ZXMgYmVsb3cgYW55IGZsb2F0cy4KLSAgICAgICAgbV93aWR0aC5m
aXRCZWxvd0Zsb2F0cygpOwotICAgIH0KLQotICAgIGlmICghbV9jdXJyZW50Lm1fb2JqLT5pc0Zs
b2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpIHsKLSAgICAgICAgbV9sYXN0T2JqZWN0ID0g
bV9jdXJyZW50Lm1fb2JqOwotICAgICAgICBpZiAobV9sYXN0T2JqZWN0LT5pc1JlcGxhY2VkKCkg
JiYgbV9hdXRvV3JhcCAmJiAoIW1fbGFzdE9iamVjdC0+aXNJbWFnZSgpIHx8IG1fYWxsb3dJbWFn
ZXNUb0JyZWFrKSAmJiAoIW1fbGFzdE9iamVjdC0+aXNMaXN0TWFya2VyKCkgfHwgdG9SZW5kZXJM
aXN0TWFya2VyKCptX2xhc3RPYmplY3QpLmlzSW5zaWRlKCkpKSB7Ci0gICAgICAgICAgICBtX3dp
ZHRoLmNvbW1pdCgpOwotICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvU3RhcnRPZihtX25l
eHRPYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1JbmxpbmVJdGVyYXRvciBCcmVha2lu
Z0NvbnRleHQ6OmhhbmRsZUVuZE9mTGluZSgpCi17Ci0jaWYgRU5BQkxFKENTU19TSEFQRVMpCi0g
ICAgU2hhcGVJbnNpZGVJbmZvKiBzaGFwZUluZm8gPSBtX2Jsb2NrLmxheW91dFNoYXBlSW5zaWRl
SW5mbygpOwotICAgIGJvb2wgc2VnbWVudEFsbG93c092ZXJmbG93ID0gIXNoYXBlSW5mbyB8fCAh
c2hhcGVJbmZvLT5oYXNTZWdtZW50cygpOwotI2Vsc2UKLSAgICBib29sIHNlZ21lbnRBbGxvd3NP
dmVyZmxvdyA9IHRydWU7Ci0jZW5kaWYKLSAgICBpZiAoc2VnbWVudEFsbG93c092ZXJmbG93KSB7
Ci0gICAgICAgIGlmIChtX2xpbmVCcmVhayA9PSBtX3Jlc29sdmVyLnBvc2l0aW9uKCkpIHsKLSAg
ICAgICAgICAgIGlmICghbV9saW5lQnJlYWsubV9vYmogfHwgIW1fbGluZUJyZWFrLm1fb2JqLT5p
c0JSKCkpIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGFkZCBhcyBtdWNoIGFzIHBvc3Np
YmxlCi0gICAgICAgICAgICAgICAgaWYgKG1fYmxvY2tTdHlsZS53aGl0ZVNwYWNlKCkgPT0gUFJF
ICYmICFtX2N1cnJlbnQubV9wb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsu
bW92ZVRvKG1fbGFzdE9iamVjdCwgbV9sYXN0T2JqZWN0LT5pc1RleHQoKSA/IG1fbGFzdE9iamVj
dC0+bGVuZ3RoKCkgOiAwKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fbGluZUJyZWFr
Lm1fb2JqKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGV2ZXIgYnJlYWsgaW4gdGhl
IG1pZGRsZSBvZiBhIHdvcmQgaWYgd2UgY2FuIGhlbHAgaXQuCi0gICAgICAgICAgICAgICAgICAg
IC8vIFRoZXJlJ3Mgbm8gcm9vbSBhdCBhbGwuIFdlIGp1c3QgaGF2ZSB0byBiZSBvbiB0aGlzIGxp
bmUsCi0gICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gdGhvdWdoIHdlJ2xsIHNwaWxsIG91dC4K
LSAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwg
bV9jdXJyZW50Lm1fcG9zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAvLyBtYWtlIHN1cmUgd2UgY29uc3VtZSBhdCBsZWFzdCBvbmUgY2hhci9vYmplY3Qu
Ci0gICAgICAgICAgICBpZiAobV9saW5lQnJlYWsgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigpKQot
ICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOwotICAgICAgICB9IGVsc2Ug
aWYgKCFtX2N1cnJlbnQubV9wb3MgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiBtX3dp
ZHRoLnVuY29tbWl0dGVkV2lkdGgoKSAmJiAhbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3Vy
cmVudCkgewotICAgICAgICAgICAgLy8gRG8gbm90IHB1c2ggdGhlIGN1cnJlbnQgb2JqZWN0IHRv
IHRoZSBuZXh0IGxpbmUsIHdoZW4gdGhpcyBsaW5lIGhhcyBzb21lIGNvbnRlbnQsIGJ1dCBpdCBp
cyBzdGlsbCBjb25zaWRlcmVkIGVtcHR5LgotICAgICAgICAgICAgLy8gRW1wdHkgaW5saW5lIGVs
ZW1lbnRzIGxpa2UgPHNwYW4+PC9zcGFuPiBjYW4gcHJvZHVjZSBzdWNoIGxpbmVzIGFuZCBub3cg
d2UganVzdCBpZ25vcmUgdGhlc2UgYnJlYWsgb3Bwb3J0dW5pdGllcwotICAgICAgICAgICAgLy8g
YXQgdGhlIHN0YXJ0IG9mIGEgbGluZSwgaWYgbm8gd2lkdGggaGFzIGJlZW4gY29tbWl0dGVkIHll
dC4KLSAgICAgICAgICAgIC8vIEJlaGF2ZSBhcyBpZiBpdCB3YXMgYWN0dWFsbHkgZW1wdHkgYW5k
IGNvbnN1bWUgYXQgbGVhc3Qgb25lIG9iamVjdC4KLSAgICAgICAgICAgIG1fbGluZUJyZWFrLmlu
Y3JlbWVudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2FuaXR5IGNoZWNrIG91ciBt
aWRwb2ludHMuCi0gICAgY2hlY2tNaWRwb2ludHMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5l
QnJlYWspOwotCi0gICAgbV90cmFpbGluZ09iamVjdHMudXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxp
bmdCb3hlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2xpbmVCcmVhaywgVHJhaWxpbmdPYmplY3Rz
OjpDb2xsYXBzZUZpcnN0U3BhY2UpOwotCi0gICAgLy8gV2UgbWlnaHQgaGF2ZSBtYWRlIGxpbmVC
cmVhayBhbiBpdGVyYXRvciB0aGF0IHBvaW50cyBwYXN0IHRoZSBlbmQKLSAgICAvLyBvZiB0aGUg
b2JqZWN0LiBEbyB0aGlzIGFkanVzdG1lbnQgdG8gbWFrZSBpdCBwb2ludCB0byB0aGUgc3RhcnQK
LSAgICAvLyBvZiB0aGUgbmV4dCBvYmplY3QgaW5zdGVhZCB0byBhdm9pZCBjb25mdXNpbmcgdGhl
IHJlc3Qgb2YgdGhlCi0gICAgLy8gY29kZS4KLSAgICBpZiAobV9saW5lQnJlYWsubV9wb3MgPiAw
KSB7Ci0gICAgICAgIG1fbGluZUJyZWFrLm1fcG9zLS07Ci0gICAgICAgIG1fbGluZUJyZWFrLmlu
Y3JlbWVudCgpOwotICAgIH0KLQotICAgIHJldHVybiBtX2xpbmVCcmVhazsKLX0KLQogSW5saW5l
SXRlcmF0b3IgTGluZUJyZWFrZXI6Om5leHRTZWdtZW50QnJlYWsoSW5saW5lQmlkaVJlc29sdmVy
JiByZXNvbHZlciwgTGluZUluZm8mIGxpbmVJbmZvLCBSZW5kZXJUZXh0SW5mbyYgcmVuZGVyVGV4
dEluZm8sIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCB1bnNpZ25l
ZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1
cmVtZW50cykKIHsKICAgICByZXNldCgpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oIGIvU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzUzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJz
LmgKQEAgLTAsMCArMSwxMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIExhcnMgS25v
bGwgKGtub2xsQGtkZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIw
MDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21haWwuY29t
PgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmlnaHQgcmVz
ZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICoKKyAqLworCisjaWZuZGVmIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnNfaAorI2RlZmlu
ZSBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzX2gKKworI2luY2x1ZGUgIkh5cGhlbmF0aW9u
LmgiCisjaW5jbHVkZSAiTGluZUJyZWFrZXIuaCIKKyNpbmNsdWRlICJMaW5lSW5mby5oIgorI2lu
Y2x1ZGUgIkxpbmVXaWR0aC5oIgorI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0LmgiCisjaW5j
bHVkZSAiUmVuZGVyQ291bnRlci5oIgorI2luY2x1ZGUgIlJlbmRlcklubGluZS5oIgorI2luY2x1
ZGUgIlJlbmRlckxpc3RNYXJrZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJSdWJ5UnVuLmgiCisjaW5j
bHVkZSAiYnJlYWtfbGluZXMuaCIKKyNpbmNsdWRlIDx3dGYvdW5pY29kZS9DaGFyYWN0ZXJOYW1l
cy5oPgorCisjaWYgRU5BQkxFKFNWRykKKyNpbmNsdWRlICJSZW5kZXJTVkdJbmxpbmVUZXh0Lmgi
CisjZW5kaWYKKworI2lmIEVOQUJMRShDU1NfU0hBUEVTKQorI2luY2x1ZGUgIlNoYXBlSW5zaWRl
SW5mby5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gV2UgZG9uJ3QgbGV0
IG91ciBsaW5lIGJveCB0cmVlIGZvciBhIHNpbmdsZSBsaW5lIGdldCBhbnkgZGVlcGVyIHRoYW4g
dGhpcy4KK2NvbnN0IHVuc2lnbmVkIGNNYXhMaW5lRGVwdGggPSAyMDA7CisKK2NsYXNzIFdvcmRN
ZWFzdXJlbWVudCB7CitwdWJsaWM6CisgICAgV29yZE1lYXN1cmVtZW50KCkKKyAgICAgICAgOiBy
ZW5kZXJlcigwKQorICAgICAgICAsIHdpZHRoKDApCisgICAgICAgICwgc3RhcnRPZmZzZXQoMCkK
KyAgICAgICAgLCBlbmRPZmZzZXQoMCkKKyAgICB7CisgICAgfQorCisgICAgUmVuZGVyVGV4dCog
cmVuZGVyZXI7CisgICAgZmxvYXQgd2lkdGg7CisgICAgaW50IHN0YXJ0T2Zmc2V0OworICAgIGlu
dCBlbmRPZmZzZXQ7CisgICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+IGZhbGxiYWNr
Rm9udHM7Cit9OworCitjbGFzcyBUcmFpbGluZ09iamVjdHMgeworcHVibGljOgorICAgIFRyYWls
aW5nT2JqZWN0cygpOworICAgIHZvaWQgc2V0VHJhaWxpbmdXaGl0ZXNwYWNlKFJlbmRlclRleHQq
KTsKKyAgICB2b2lkIGNsZWFyKCk7CisgICAgdm9pZCBhcHBlbmRCb3hJZk5lZWRlZChSZW5kZXJC
b3hNb2RlbE9iamVjdCopOworCisgICAgZW51bSBDb2xsYXBzZUZpcnN0U3BhY2VPck5vdCB7IERv
Tm90Q29sbGFwc2VGaXJzdFNwYWNlLCBDb2xsYXBzZUZpcnN0U3BhY2UgfTsKKworICAgIHZvaWQg
dXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxpbmdCb3hlcyhMaW5lTWlkcG9pbnRTdGF0ZSYsIGNvbnN0
IElubGluZUl0ZXJhdG9yJiBsQnJlYWssIENvbGxhcHNlRmlyc3RTcGFjZU9yTm90KTsKKworcHJp
dmF0ZToKKyAgICBSZW5kZXJUZXh0KiBtX3doaXRlc3BhY2U7CisgICAgVmVjdG9yPFJlbmRlckJv
eE1vZGVsT2JqZWN0KiwgND4gbV9ib3hlczsKK307CisKK1RyYWlsaW5nT2JqZWN0czo6VHJhaWxp
bmdPYmplY3RzKCkKKyAgICA6IG1fd2hpdGVzcGFjZSgwKQoreworfQorCitpbmxpbmUgdm9pZCBU
cmFpbGluZ09iamVjdHM6OnNldFRyYWlsaW5nV2hpdGVzcGFjZShSZW5kZXJUZXh0KiB3aGl0ZXNw
YWNlKQoreworICAgIEFTU0VSVCh3aGl0ZXNwYWNlKTsKKyAgICBtX3doaXRlc3BhY2UgPSB3aGl0
ZXNwYWNlOworfQorCitpbmxpbmUgdm9pZCBUcmFpbGluZ09iamVjdHM6OmNsZWFyKCkKK3sKKyAg
ICBtX3doaXRlc3BhY2UgPSAwOworICAgIG1fYm94ZXMuc2hyaW5rKDApOyAvLyBVc2Ugc2hyaW5r
KDApIGluc3RlYWQgb2YgY2xlYXIoKSB0byByZXRhaW4gb3VyIGNhcGFjaXR5LgorfQorCitpbmxp
bmUgdm9pZCBUcmFpbGluZ09iamVjdHM6OmFwcGVuZEJveElmTmVlZGVkKFJlbmRlckJveE1vZGVs
T2JqZWN0KiBib3gpCit7CisgICAgaWYgKG1fd2hpdGVzcGFjZSkKKyAgICAgICAgbV9ib3hlcy5h
cHBlbmQoYm94KTsKK30KKworLy8gRG9uJ3QgY2FsbCB0aGlzIGRpcmVjdGx5LiBVc2Ugb25lIG9m
IHRoZSBkZXNjcmlwdGl2ZSBoZWxwZXIgZnVuY3Rpb25zIGJlbG93LgoraW5saW5lIHZvaWQgZGVw
cmVjYXRlZEFkZE1pZHBvaW50KExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwg
Y29uc3QgSW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQoreworICAgIGlmIChsaW5lTWlkcG9pbnRT
dGF0ZS5taWRwb2ludHMuc2l6ZSgpIDw9IGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cykK
KyAgICAgICAgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzLmdyb3cobGluZU1pZHBvaW50U3Rh
dGUubnVtTWlkcG9pbnRzICsgMTApOworCisgICAgSW5saW5lSXRlcmF0b3IqIG1pZHBvaW50cyA9
IGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50cy5kYXRhKCk7CisgICAgbWlkcG9pbnRzW2xpbmVN
aWRwb2ludFN0YXRlLm51bU1pZHBvaW50cysrXSA9IG1pZHBvaW50OworfQorCitpbmxpbmUgdm9p
ZCBzdGFydElnbm9yaW5nU3BhY2VzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0
ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQoreworICAgIEFTU0VSVCghKGxpbmVN
aWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAlIDIpKTsKKyAgICBkZXByZWNhdGVkQWRkTWlkcG9p
bnQobGluZU1pZHBvaW50U3RhdGUsIG1pZHBvaW50KTsKK30KKworaW5saW5lIHZvaWQgc3RvcEln
bm9yaW5nU3BhY2VzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgY29uc3Qg
SW5saW5lSXRlcmF0b3ImIG1pZHBvaW50KQoreworICAgIEFTU0VSVChsaW5lTWlkcG9pbnRTdGF0
ZS5udW1NaWRwb2ludHMgJSAyKTsKKyAgICBkZXByZWNhdGVkQWRkTWlkcG9pbnQobGluZU1pZHBv
aW50U3RhdGUsIG1pZHBvaW50KTsKK30KKworLy8gV2hlbiBpZ25vcmluZyBzcGFjZXMsIHRoaXMg
bmVlZHMgdG8gYmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgbmVlZCBsaW5lIGJveGVzIHN1Y2gg
YXMgUmVuZGVySW5saW5lcyBvcgorLy8gaGFyZCBsaW5lIGJyZWFrcyB0byBlbnN1cmUgdGhhdCB0
aGV5J3JlIG5vdCBpZ25vcmVkLgoraW5saW5lIHZvaWQgZW5zdXJlTGluZUJveEluc2lkZUlnbm9y
ZWRTcGFjZXMoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBSZW5kZXJPYmpl
Y3QqIHJlbmRlcmVyKQoreworICAgIElubGluZUl0ZXJhdG9yIG1pZHBvaW50KDAsIHJlbmRlcmVy
LCAwKTsKKyAgICBzdG9wSWdub3JpbmdTcGFjZXMobGluZU1pZHBvaW50U3RhdGUsIG1pZHBvaW50
KTsKKyAgICBzdGFydElnbm9yaW5nU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBtaWRwb2ludCk7
Cit9CisKK3ZvaWQgVHJhaWxpbmdPYmplY3RzOjp1cGRhdGVNaWRwb2ludHNGb3JUcmFpbGluZ0Jv
eGVzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRl
cmF0b3ImIGxCcmVhaywgQ29sbGFwc2VGaXJzdFNwYWNlT3JOb3QgY29sbGFwc2VGaXJzdFNwYWNl
KQoreworICAgIGlmICghbV93aGl0ZXNwYWNlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBU
aGlzIG9iamVjdCBpcyBlaXRoZXIgZ29pbmcgdG8gYmUgcGFydCBvZiB0aGUgbGFzdCBtaWRwb2lu
dCwgb3IgaXQgaXMgZ29pbmcgdG8gYmUgdGhlIGFjdHVhbCBlbmRwb2ludC4KKyAgICAvLyBJbiBi
b3RoIGNhc2VzIHdlIGp1c3QgZGVjcmVhc2Ugb3VyIHBvcyBieSAxIGxldmVsIHRvIGV4Y2x1ZGUg
dGhlIHNwYWNlLCBhbGxvd2luZyBpdCB0byAtIGluIGVmZmVjdCAtIGNvbGxhcHNlIGludG8gdGhl
IG5ld2xpbmUuCisgICAgaWYgKGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cyAlIDIpIHsK
KyAgICAgICAgLy8gRmluZCB0aGUgdHJhaWxpbmcgc3BhY2Ugb2JqZWN0J3MgbWlkcG9pbnQuCisg
ICAgICAgIGludCB0cmFpbGluZ1NwYWNlTWlkcG9pbnQgPSBsaW5lTWlkcG9pbnRTdGF0ZS5udW1N
aWRwb2ludHMgLSAxOworICAgICAgICBmb3IgKCA7IHRyYWlsaW5nU3BhY2VNaWRwb2ludCA+IDAg
JiYgbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzW3RyYWlsaW5nU3BhY2VNaWRwb2ludF0ubV9v
YmogIT0gbV93aGl0ZXNwYWNlOyAtLXRyYWlsaW5nU3BhY2VNaWRwb2ludCkgeyB9CisgICAgICAg
IEFTU0VSVCh0cmFpbGluZ1NwYWNlTWlkcG9pbnQgPj0gMCk7CisgICAgICAgIGlmIChjb2xsYXBz
ZUZpcnN0U3BhY2UgPT0gQ29sbGFwc2VGaXJzdFNwYWNlKQorICAgICAgICAgICAgbGluZU1pZHBv
aW50U3RhdGUubWlkcG9pbnRzW3RyYWlsaW5nU3BhY2VNaWRwb2ludF0ubV9wb3MtLTsKKworICAg
ICAgICAvLyBOb3cgbWFrZSBzdXJlIGV2ZXJ5IHNpbmdsZSB0cmFpbGluZ1Bvc2l0aW9uZWRCb3gg
Zm9sbG93aW5nIHRoZSB0cmFpbGluZ1NwYWNlTWlkcG9pbnQgcHJvcGVybHkgc3RvcHMgYW5kIHN0
YXJ0cworICAgICAgICAvLyBpZ25vcmluZyBzcGFjZXMuCisgICAgICAgIHNpemVfdCBjdXJyZW50
TWlkcG9pbnQgPSB0cmFpbGluZ1NwYWNlTWlkcG9pbnQgKyAxOworICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IG1fYm94ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChjdXJy
ZW50TWlkcG9pbnQgPj0gbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKSB7CisgICAgICAg
ICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIG1pZHBvaW50IGZvciB0aGlzIGJveCB5ZXQuCisg
ICAgICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobGluZU1pZHBv
aW50U3RhdGUsIG1fYm94ZXNbaV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBBU1NFUlQobGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzW2N1cnJlbnRNaWRwb2ludF0u
bV9vYmogPT0gbV9ib3hlc1tpXSk7CisgICAgICAgICAgICAgICAgQVNTRVJUKGxpbmVNaWRwb2lu
dFN0YXRlLm1pZHBvaW50c1tjdXJyZW50TWlkcG9pbnQgKyAxXS5tX29iaiA9PSBtX2JveGVzW2ld
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnRNaWRwb2ludCArPSAyOworICAg
ICAgICB9CisgICAgfSBlbHNlIGlmICghbEJyZWFrLm1fb2JqKSB7CisgICAgICAgIEFTU0VSVCht
X3doaXRlc3BhY2UtPmlzVGV4dCgpKTsKKyAgICAgICAgQVNTRVJUKGNvbGxhcHNlRmlyc3RTcGFj
ZSA9PSBDb2xsYXBzZUZpcnN0U3BhY2UpOworICAgICAgICAvLyBBZGQgYSBuZXcgZW5kIG1pZHBv
aW50IHRoYXQgc3RvcHMgcmlnaHQgYXQgdGhlIHZlcnkgZW5kLgorICAgICAgICB1bnNpZ25lZCBs
ZW5ndGggPSBtX3doaXRlc3BhY2UtPnRleHRMZW5ndGgoKTsKKyAgICAgICAgdW5zaWduZWQgcG9z
ID0gbGVuZ3RoID49IDIgPyBsZW5ndGggLSAyIDogVUlOVF9NQVg7CisgICAgICAgIElubGluZUl0
ZXJhdG9yIGVuZE1pZCgwLCBtX3doaXRlc3BhY2UsIHBvcyk7CisgICAgICAgIHN0YXJ0SWdub3Jp
bmdTcGFjZXMobGluZU1pZHBvaW50U3RhdGUsIGVuZE1pZCk7CisgICAgICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbV9ib3hlcy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIGVuc3VyZUxpbmVC
b3hJbnNpZGVJZ25vcmVkU3BhY2VzKGxpbmVNaWRwb2ludFN0YXRlLCBtX2JveGVzW2ldKTsKKyAg
ICB9Cit9CisKK2NsYXNzIEJyZWFraW5nQ29udGV4dCB7CitwdWJsaWM6CisgICAgQnJlYWtpbmdD
b250ZXh0KExpbmVCcmVha2VyJiBsaW5lQnJlYWtlciwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNv
bHZlciwgTGluZUluZm8mIGluTGluZUluZm8sIExpbmVXaWR0aCYgbGluZVdpZHRoLCBSZW5kZXJU
ZXh0SW5mbyYgaW5SZW5kZXJUZXh0SW5mbywgRmxvYXRpbmdPYmplY3QqIGluTGFzdEZsb2F0RnJv
bVByZXZpb3VzTGluZSwgYm9vbCBhcHBsaWVkU3RhcnRXaWR0aCwgUmVuZGVyQmxvY2tGbG93JiBi
bG9jaykKKyAgICAgICAgOiBtX2xpbmVCcmVha2VyKGxpbmVCcmVha2VyKQorICAgICAgICAsIG1f
cmVzb2x2ZXIocmVzb2x2ZXIpCisgICAgICAgICwgbV9jdXJyZW50KHJlc29sdmVyLnBvc2l0aW9u
KCkpCisgICAgICAgICwgbV9saW5lQnJlYWsocmVzb2x2ZXIucG9zaXRpb24oKSkKKyAgICAgICAg
LCBtX2Jsb2NrKGJsb2NrKQorICAgICAgICAsIG1fbGFzdE9iamVjdChtX2N1cnJlbnQubV9vYmop
CisgICAgICAgICwgbV9uZXh0T2JqZWN0KDApCisgICAgICAgICwgbV9jdXJyZW50U3R5bGUoMCkK
KyAgICAgICAgLCBtX2Jsb2NrU3R5bGUoYmxvY2suc3R5bGUoKSkKKyAgICAgICAgLCBtX2xpbmVJ
bmZvKGluTGluZUluZm8pCisgICAgICAgICwgbV9yZW5kZXJUZXh0SW5mbyhpblJlbmRlclRleHRJ
bmZvKQorICAgICAgICAsIG1fbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZShpbkxhc3RGbG9hdEZy
b21QcmV2aW91c0xpbmUpCisgICAgICAgICwgbV93aWR0aChsaW5lV2lkdGgpCisgICAgICAgICwg
bV9jdXJyV1MoTk9STUFMKQorICAgICAgICAsIG1fbGFzdFdTKE5PUk1BTCkKKyAgICAgICAgLCBt
X3ByZXNlcnZlc05ld2xpbmUoZmFsc2UpCisgICAgICAgICwgbV9hdFN0YXJ0KHRydWUpCisgICAg
ICAgICwgbV9pZ25vcmluZ1NwYWNlcyhmYWxzZSkKKyAgICAgICAgLCBtX2N1cnJlbnRDaGFyYWN0
ZXJJc1NwYWNlKGZhbHNlKQorICAgICAgICAsIG1fY3VycmVudENoYXJhY3RlcklzV1MoZmFsc2Up
CisgICAgICAgICwgbV9hcHBsaWVkU3RhcnRXaWR0aChhcHBsaWVkU3RhcnRXaWR0aCkKKyAgICAg
ICAgLCBtX2luY2x1ZGVFbmRXaWR0aCh0cnVlKQorICAgICAgICAsIG1fYXV0b1dyYXAoZmFsc2Up
CisgICAgICAgICwgbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lKGZhbHNlKQorICAgICAgICAs
IG1fZmxvYXRzRml0T25MaW5lKHRydWUpCisgICAgICAgICwgbV9jb2xsYXBzZVdoaXRlU3BhY2Uo
ZmFsc2UpCisgICAgICAgICwgbV9zdGFydGluZ05ld1BhcmFncmFwaChtX2xpbmVJbmZvLnByZXZp
b3VzTGluZUJyb2tlQ2xlYW5seSgpKQorICAgICAgICAsIG1fYWxsb3dJbWFnZXNUb0JyZWFrKCFi
bG9jay5kb2N1bWVudCgpLmluUXVpcmtzTW9kZSgpIHx8ICFibG9jay5pc1RhYmxlQ2VsbCgpIHx8
ICFtX2Jsb2NrU3R5bGUubG9naWNhbFdpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKKyAgICAg
ICAgLCBtX2F0RW5kKGZhbHNlKQorICAgICAgICAsIG1faGFkVW5jb21taXR0ZWRXaWR0aEJlZm9y
ZUN1cnJlbnQoZmFsc2UpCisgICAgICAgICwgbV9saW5lTWlkcG9pbnRTdGF0ZShyZXNvbHZlci5t
aWRwb2ludFN0YXRlKCkpCisgICAgeworICAgICAgICBtX2xpbmVJbmZvLnNldFByZXZpb3VzTGlu
ZUJyb2tlQ2xlYW5seShmYWxzZSk7CisgICAgfQorCisgICAgUmVuZGVyT2JqZWN0KiBjdXJyZW50
T2JqZWN0KCkgeyByZXR1cm4gbV9jdXJyZW50Lm1fb2JqOyB9CisgICAgSW5saW5lSXRlcmF0b3Ig
bGluZUJyZWFrKCkgeyByZXR1cm4gbV9saW5lQnJlYWs7IH0KKyAgICBJbmxpbmVJdGVyYXRvciYg
bGluZUJyZWFrUmVmKCkge3JldHVybiBtX2xpbmVCcmVhazsgfQorICAgIExpbmVXaWR0aCYgbGlu
ZVdpZHRoKCkgeyByZXR1cm4gbV93aWR0aDsgfQorICAgIGJvb2wgYXRFbmQoKSB7IHJldHVybiBt
X2F0RW5kOyB9CisKKyAgICB2b2lkIGluaXRpYWxpemVGb3JDdXJyZW50T2JqZWN0KCk7CisKKyAg
ICB2b2lkIGluY3JlbWVudCgpOworCisgICAgdm9pZCBoYW5kbGVCUihFQ2xlYXImKTsKKyAgICB2
b2lkIGhhbmRsZU91dE9mRmxvd1Bvc2l0aW9uZWQoVmVjdG9yPFJlbmRlckJveCo+JiBwb3NpdGlv
bmVkT2JqZWN0cyk7CisgICAgdm9pZCBoYW5kbGVGbG9hdCgpOworICAgIHZvaWQgaGFuZGxlRW1w
dHlJbmxpbmUoKTsKKyAgICB2b2lkIGhhbmRsZVJlcGxhY2VkKCk7CisgICAgYm9vbCBoYW5kbGVU
ZXh0KFdvcmRNZWFzdXJlbWVudHMmLCBib29sJiBoeXBoZW5hdGVkLCB1bnNpZ25lZCYgY29uc2Vj
dXRpdmVIeXBoZW5hdGVkTGluZXMpOworICAgIGJvb2wgY2FuQnJlYWtBdFRoaXNQb3NpdGlvbigp
OworICAgIHZvaWQgY29tbWl0QW5kVXBkYXRlTGluZUJyZWFrSWZOZWVkZWQoKTsKKyAgICBJbmxp
bmVJdGVyYXRvciBoYW5kbGVFbmRPZkxpbmUoKTsKKworICAgIHZvaWQgY2xlYXJMaW5lQnJlYWtJ
ZkZpdHNPbkxpbmUoYm9vbCBpZ25vcmluZ1RyYWlsaW5nU3BhY2UgPSBmYWxzZSkKKyAgICB7Cisg
ICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoaWdub3JpbmdUcmFpbGluZ1NwYWNlKSB8fCBt
X2xhc3RXUyA9PSBOT1dSQVApCisgICAgICAgICAgICBtX2xpbmVCcmVhay5jbGVhcigpOworICAg
IH0KKworICAgIHZvaWQgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoUmVuZGVyT2JqZWN0
KiBvYmplY3QsIHVuc2lnbmVkIG9mZnNldCA9IDAsIGludCBuZXh0QnJlYWsgPSAtMSkKKyAgICB7
CisgICAgICAgIG1fd2lkdGguY29tbWl0KCk7CisgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhv
YmplY3QsIG9mZnNldCwgbmV4dEJyZWFrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgTGluZUJy
ZWFrZXImIG1fbGluZUJyZWFrZXI7CisgICAgSW5saW5lQmlkaVJlc29sdmVyJiBtX3Jlc29sdmVy
OworCisgICAgSW5saW5lSXRlcmF0b3IgbV9jdXJyZW50OworICAgIElubGluZUl0ZXJhdG9yIG1f
bGluZUJyZWFrOworICAgIElubGluZUl0ZXJhdG9yIG1fc3RhcnRPZklnbm9yZWRTcGFjZXM7CisK
KyAgICBSZW5kZXJCbG9ja0Zsb3cmIG1fYmxvY2s7CisgICAgUmVuZGVyT2JqZWN0KiBtX2xhc3RP
YmplY3Q7CisgICAgUmVuZGVyT2JqZWN0KiBtX25leHRPYmplY3Q7CisKKyAgICBSZW5kZXJTdHls
ZSogbV9jdXJyZW50U3R5bGU7CisKKyAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93
IGEgdGFibGUgY2VsbCB0byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKKyAg
ICAvLyB2ZXJ5IHNwZWNpZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1v
biBXaW5JRSByZW5kZXJpbmdzKS4KKyAgICAvLyBOb3Qgc3VwcG9ydGluZyB0aGUgcXVpcmsgaGFz
IGNhdXNlZCB1cyB0byBtaXMtcmVuZGVyIHNvbWUgcmVhbCBzaXRlcy4gKFNlZSBCdWd6aWxsYSAx
MDUxNy4pCisgICAgUmVuZGVyU3R5bGUmIG1fYmxvY2tTdHlsZTsKKworICAgIExpbmVJbmZvJiBt
X2xpbmVJbmZvOworCisgICAgUmVuZGVyVGV4dEluZm8mIG1fcmVuZGVyVGV4dEluZm87CisKKyAg
ICBGbG9hdGluZ09iamVjdCogbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lOworCisgICAgTGlu
ZVdpZHRoIG1fd2lkdGg7CisKKyAgICBFV2hpdGVTcGFjZSBtX2N1cnJXUzsKKyAgICBFV2hpdGVT
cGFjZSBtX2xhc3RXUzsKKworICAgIGJvb2wgbV9wcmVzZXJ2ZXNOZXdsaW5lOworICAgIGJvb2wg
bV9hdFN0YXJ0OworCisgICAgLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIG9ubHkgaWYgd2hpdGVz
cGFjZSBpc24ndCBzZXQgdG8gUFJFLCBhbmQgaXQgdGVsbHMgdXMgd2hldGhlcgorICAgIC8vIG9y
IG5vdCB3ZSBhcmUgY3VycmVudGx5IGlnbm9yaW5nIHdoaXRlc3BhY2UuCisgICAgYm9vbCBtX2ln
bm9yaW5nU3BhY2VzOworCisgICAgLy8gVGhpcyB2YXJpYWJsZSB0cmFja3Mgd2hldGhlciB0aGUg
dmVyeSBsYXN0IGNoYXJhY3RlciB3ZSBzYXcgd2FzIGEgc3BhY2UuIFdlIHVzZQorICAgIC8vIHRo
aXMgdG8gZGV0ZWN0IHdoZW4gd2UgZW5jb3VudGVyIGEgc2Vjb25kIHNwYWNlIHNvIHdlIGtub3cg
d2UgaGF2ZSB0byB0ZXJtaW5hdGUKKyAgICAvLyBhIHJ1bi4KKyAgICBib29sIG1fY3VycmVudENo
YXJhY3RlcklzU3BhY2U7CisgICAgYm9vbCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTOworICAgIGJv
b2wgbV9hcHBsaWVkU3RhcnRXaWR0aDsKKyAgICBib29sIG1faW5jbHVkZUVuZFdpZHRoOworICAg
IGJvb2wgbV9hdXRvV3JhcDsKKyAgICBib29sIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZTsK
KyAgICBib29sIG1fZmxvYXRzRml0T25MaW5lOworICAgIGJvb2wgbV9jb2xsYXBzZVdoaXRlU3Bh
Y2U7CisgICAgYm9vbCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoOworICAgIGJvb2wgbV9hbGxvd0lt
YWdlc1RvQnJlYWs7CisgICAgYm9vbCBtX2F0RW5kOworICAgIGJvb2wgbV9oYWRVbmNvbW1pdHRl
ZFdpZHRoQmVmb3JlQ3VycmVudDsKKworICAgIExpbmVNaWRwb2ludFN0YXRlJiBtX2xpbmVNaWRw
b2ludFN0YXRlOworCisgICAgVHJhaWxpbmdPYmplY3RzIG1fdHJhaWxpbmdPYmplY3RzOworfTsK
KworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojppbml0aWFsaXplRm9yQ3VycmVudE9iamVj
dCgpCit7CisgICAgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudCA9ICEhbV93aWR0
aC51bmNvbW1pdHRlZFdpZHRoKCk7CisKKyAgICBtX2N1cnJlbnRTdHlsZSA9ICZtX2N1cnJlbnQu
bV9vYmotPnN0eWxlKCk7CisKKyAgICBBU1NFUlQobV9jdXJyZW50U3R5bGUpOworCisgICAgbV9u
ZXh0T2JqZWN0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhtX2Jsb2NrLCBtX2N1cnJl
bnQubV9vYmopOworICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5wYXJlbnQo
KSAmJiAhbV9uZXh0T2JqZWN0LT5wYXJlbnQoKS0+aXNEZXNjZW5kYW50T2YobV9jdXJyZW50Lm1f
b2JqLT5wYXJlbnQoKSkpCisgICAgICAgIG1faW5jbHVkZUVuZFdpZHRoID0gdHJ1ZTsKKworICAg
IG1fY3VycldTID0gbV9jdXJyZW50Lm1fb2JqLT5pc1JlcGxhY2VkKCkgPyBtX2N1cnJlbnQubV9v
YmotPnBhcmVudCgpLT5zdHlsZSgpLndoaXRlU3BhY2UoKSA6IG1fY3VycmVudFN0eWxlLT53aGl0
ZVNwYWNlKCk7CisgICAgbV9sYXN0V1MgPSBtX2xhc3RPYmplY3QtPmlzUmVwbGFjZWQoKSA/IG1f
bGFzdE9iamVjdC0+cGFyZW50KCktPnN0eWxlKCkud2hpdGVTcGFjZSgpIDogbV9sYXN0T2JqZWN0
LT5zdHlsZSgpLndoaXRlU3BhY2UoKTsKKworICAgIG1fYXV0b1dyYXAgPSBSZW5kZXJTdHlsZTo6
YXV0b1dyYXAobV9jdXJyV1MpOworICAgIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9IG1f
YXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSB8fCBtX2F1dG9XcmFwOworCisjaWYgRU5BQkxFKFNW
RykKKyAgICBtX3ByZXNlcnZlc05ld2xpbmUgPSBtX2N1cnJlbnQubV9vYmotPmlzU1ZHSW5saW5l
VGV4dCgpID8gZmFsc2UgOiBSZW5kZXJTdHlsZTo6cHJlc2VydmVOZXdsaW5lKG1fY3VycldTKTsK
KyNlbHNlCisgICAgbV9wcmVzZXJ2ZXNOZXdsaW5lID0gUmVuZGVyU3R5bGU6OnByZXNlcnZlTmV3
bGluZShtX2N1cnJXUyk7CisjZW5kaWYKKworICAgIG1fY29sbGFwc2VXaGl0ZVNwYWNlID0gUmVu
ZGVyU3R5bGU6OmNvbGxhcHNlV2hpdGVTcGFjZShtX2N1cnJXUyk7Cit9CisKK2lubGluZSB2b2lk
IEJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KCkKK3sKKyAgICAvLyBDbGVhciBvdXQgb3VyIGNo
YXJhY3RlciBzcGFjZSBib29sLCBzaW5jZSBpbmxpbmUgPHByZT5zIGRvbid0IGNvbGxhcHNlIHdo
aXRlc3BhY2UKKyAgICAvLyB3aXRoIGFkamFjZW50IGlubGluZSBub3JtYWwvbm93cmFwIHNwYW5z
LgorICAgIGlmICghbV9jb2xsYXBzZVdoaXRlU3BhY2UpCisgICAgICAgIG1fY3VycmVudENoYXJh
Y3RlcklzU3BhY2UgPSBmYWxzZTsKKworICAgIG1fY3VycmVudC5tb3ZlVG9TdGFydE9mKG1fbmV4
dE9iamVjdCk7CisgICAgbV9hdFN0YXJ0ID0gZmFsc2U7Cit9CisKK2lubGluZSB2b2lkIEJyZWFr
aW5nQ29udGV4dDo6aGFuZGxlQlIoRUNsZWFyJiBjbGVhcikKK3sKKyAgICBpZiAobV93aWR0aC5m
aXRzT25MaW5lKCkpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiBiciA9IG1fY3VycmVudC5tX29i
ajsKKyAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvU3RhcnRPZihicik7CisgICAgICAgIG1fbGlu
ZUJyZWFrLmluY3JlbWVudCgpOworCisgICAgICAgIC8vIEEgPGJyPiBhbHdheXMgYnJlYWtzIGEg
bGluZSwgc28gZG9uJ3QgbGV0IHRoZSBsaW5lIGJlIGNvbGxhcHNlZAorICAgICAgICAvLyBhd2F5
LiBBbHNvLCB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aCBhIDxicj4gZG9lcyBu
b3QKKyAgICAgICAgLy8gZ2V0IGNvbGxhcHNlZCBhd2F5LiBJdCBvbmx5IGRvZXMgdGhpcyBpZiB0
aGUgcHJldmlvdXMgbGluZSBicm9rZQorICAgICAgICAvLyBjbGVhbmx5LiBPdGhlcndpc2UgdGhl
IDxicj4gaGFzIG5vIGVmZmVjdCBvbiB3aGV0aGVyIHRoZSBsaW5lIGlzCisgICAgICAgIC8vIGVt
cHR5IG9yIG5vdC4KKyAgICAgICAgaWYgKG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGgpCisgICAgICAg
ICAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAmbV9ibG9jaywgJm1fd2lkdGgpOworICAg
ICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOworICAgICAgICBtX2xpbmVJbmZvLnNldFBy
ZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKKworICAgICAgICAvLyBBIDxicj4gd2l0aCBj
bGVhcmFuY2UgYWx3YXlzIG5lZWRzIGEgbGluZWJveCBpbiBjYXNlIHRoZSBsaW5lcyBiZWxvdyBp
dCBnZXQgZGlydGllZCBsYXRlciBhbmQKKyAgICAgICAgLy8gbmVlZCB0byBjaGVjayBmb3IgZmxv
YXRzIHRvIGNsZWFyIC0gc28gaWYgd2UncmUgaWdub3Jpbmcgc3BhY2VzLCBzdG9wIGlnbm9yaW5n
IHRoZW0gYW5kIGFkZCBhCisgICAgICAgIC8vIHJ1biBmb3IgdGhpcyBvYmplY3QuCisgICAgICAg
IGlmIChtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jbGVhcigpICE9IENOT05F
KQorICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9saW5lTWlk
cG9pbnRTdGF0ZSwgYnIpOworICAgICAgICAvLyBJZiB3ZSB3ZXJlIHByZWNlZGVkIGJ5IGNvbGxh
cHNpbmcgc3BhY2UgYW5kIGFyZSBpbiBhIHJpZ2h0LWFsaWduZWQgY29udGFpbmVyIHdlIG5lZWQg
dG8gZW5zdXJlIHRoZSBzcGFjZSBnZXRzCisgICAgICAgIC8vIGNvbGxhcHNlZCBhd2F5IHNvIHRo
YXQgaXQgZG9lc24ndCBwdXNoIHRoZSB0ZXh0IG91dCBmcm9tIHRoZSBjb250YWluZXIncyByaWdo
dC1oYW5kIGVkZ2UuCisgICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhl
IGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2VsaW5pbmcgYSBsb3Qg
b2YgdGVzdCByZXN1bHRzLgorICAgICAgICBlbHNlIGlmIChtX2lnbm9yaW5nU3BhY2VzICYmICht
X2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gUklHSFQgfHwgbV9ibG9ja1N0eWxlLnRleHRBbGln
bigpID09IFdFQktJVF9SSUdIVCkpCisgICAgICAgICAgICBzdG9wSWdub3JpbmdTcGFjZXMobV9s
aW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50Lm1fb2JqLCBtX2N1
cnJlbnQubV9wb3MpKTsKKworICAgICAgICBpZiAoIW1fbGluZUluZm8uaXNFbXB0eSgpKQorICAg
ICAgICAgICAgY2xlYXIgPSBtX2N1cnJlbnRTdHlsZS0+Y2xlYXIoKTsKKyAgICB9CisgICAgbV9h
dEVuZCA9IHRydWU7Cit9CisKK2lubGluZSBMYXlvdXRVbml0IGJvcmRlclBhZGRpbmdNYXJnaW5T
dGFydChjb25zdCBSZW5kZXJJbmxpbmUmIGNoaWxkKQoreworICAgIHJldHVybiBjaGlsZC5tYXJn
aW5TdGFydCgpICsgY2hpbGQucGFkZGluZ1N0YXJ0KCkgKyBjaGlsZC5ib3JkZXJTdGFydCgpOwor
fQorCitpbmxpbmUgTGF5b3V0VW5pdCBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKGNvbnN0IFJlbmRl
cklubGluZSYgY2hpbGQpCit7CisgICAgcmV0dXJuIGNoaWxkLm1hcmdpbkVuZCgpICsgY2hpbGQu
cGFkZGluZ0VuZCgpICsgY2hpbGQuYm9yZGVyRW5kKCk7Cit9CisKK2lubGluZSBib29sIHNob3Vs
ZEFkZEJvcmRlclBhZGRpbmdNYXJnaW4oUmVuZGVyT2JqZWN0KiBjaGlsZCkKK3sKKyAgICAvLyBX
aGVuIGRlY2lkaW5nIHdoZXRoZXIgd2UncmUgYXQgdGhlIGVkZ2Ugb2YgYW4gaW5saW5lLCBhZGph
Y2VudCBjb2xsYXBzZWQgd2hpdGVzcGFjZSBpcyB0aGUgc2FtZSBhcyBubyBzaWJsaW5nIGF0IGFs
bC4KKyAgICByZXR1cm4gIWNoaWxkIHx8IChjaGlsZC0+aXNUZXh0KCkgJiYgIXRvUmVuZGVyVGV4
dChjaGlsZCktPnRleHRMZW5ndGgoKSk7Cit9CisKK2lubGluZSBSZW5kZXJPYmplY3QqIHByZXZp
b3VzSW5GbG93U2libGluZyhSZW5kZXJPYmplY3QqIGNoaWxkKQoreworICAgIGNoaWxkID0gY2hp
bGQtPnByZXZpb3VzU2libGluZygpOworICAgIHdoaWxlIChjaGlsZCAmJiBjaGlsZC0+aXNPdXRP
ZkZsb3dQb3NpdGlvbmVkKCkpCisgICAgICAgIGNoaWxkID0gY2hpbGQtPnByZXZpb3VzU2libGlu
ZygpOworICAgIHJldHVybiBjaGlsZDsKK30KKworaW5saW5lIExheW91dFVuaXQgaW5saW5lTG9n
aWNhbFdpZHRoKFJlbmRlck9iamVjdCogY2hpbGQsIGJvb2wgY2hlY2tTdGFydEVkZ2UgPSB0cnVl
LCBib29sIGNoZWNrRW5kRWRnZSA9IHRydWUpCit7CisgICAgdW5zaWduZWQgbGluZURlcHRoID0g
MTsKKyAgICBMYXlvdXRVbml0IGV4dHJhV2lkdGggPSAwOworICAgIFJlbmRlckVsZW1lbnQqIHBh
cmVudCA9IGNoaWxkLT5wYXJlbnQoKTsKKyAgICB3aGlsZSAocGFyZW50LT5pc1JlbmRlcklubGlu
ZSgpICYmIGxpbmVEZXB0aCsrIDwgY01heExpbmVEZXB0aCkgeworICAgICAgICBjb25zdCBSZW5k
ZXJJbmxpbmUmIHBhcmVudEFzUmVuZGVySW5saW5lID0gdG9SZW5kZXJJbmxpbmUoKnBhcmVudCk7
CisgICAgICAgIGlmICghaXNFbXB0eUlubGluZShwYXJlbnRBc1JlbmRlcklubGluZSkpIHsKKyAg
ICAgICAgICAgIGNoZWNrU3RhcnRFZGdlID0gY2hlY2tTdGFydEVkZ2UgJiYgc2hvdWxkQWRkQm9y
ZGVyUGFkZGluZ01hcmdpbihwcmV2aW91c0luRmxvd1NpYmxpbmcoY2hpbGQpKTsKKyAgICAgICAg
ICAgIGlmIChjaGVja1N0YXJ0RWRnZSkKKyAgICAgICAgICAgICAgICBleHRyYVdpZHRoICs9IGJv
cmRlclBhZGRpbmdNYXJnaW5TdGFydChwYXJlbnRBc1JlbmRlcklubGluZSk7CisgICAgICAgICAg
ICBjaGVja0VuZEVkZ2UgPSBjaGVja0VuZEVkZ2UgJiYgc2hvdWxkQWRkQm9yZGVyUGFkZGluZ01h
cmdpbihjaGlsZC0+bmV4dFNpYmxpbmcoKSk7CisgICAgICAgICAgICBpZiAoY2hlY2tFbmRFZGdl
KQorICAgICAgICAgICAgICAgIGV4dHJhV2lkdGggKz0gYm9yZGVyUGFkZGluZ01hcmdpbkVuZChw
YXJlbnRBc1JlbmRlcklubGluZSk7CisgICAgICAgICAgICBpZiAoIWNoZWNrU3RhcnRFZGdlICYm
ICFjaGVja0VuZEVkZ2UpCisgICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhV2lkdGg7CisgICAg
ICAgIH0KKyAgICAgICAgY2hpbGQgPSBwYXJlbnQ7CisgICAgICAgIHBhcmVudCA9IGNoaWxkLT5w
YXJlbnQoKTsKKyAgICB9CisgICAgcmV0dXJuIGV4dHJhV2lkdGg7Cit9CisKK2lubGluZSB2b2lk
IEJyZWFraW5nQ29udGV4dDo6aGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZChWZWN0b3I8UmVuZGVy
Qm94Kj4mIHBvc2l0aW9uZWRPYmplY3RzKQoreworICAgIC8vIElmIG91ciBvcmlnaW5hbCBkaXNw
bGF5IHdhc24ndCBhbiBpbmxpbmUgdHlwZSwgdGhlbiB3ZSBjYW4KKyAgICAvLyBnbyBhaGVhZCBh
bmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMgaW5saW5lIHBvc2l0aW9uIG5vdy4KKyAgICBSZW5kZXJC
b3gqIGJveCA9IHRvUmVuZGVyQm94KG1fY3VycmVudC5tX29iaik7CisgICAgYm9vbCBpc0lubGlu
ZVR5cGUgPSBib3gtPnN0eWxlKCkuaXNPcmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCk7CisgICAg
aWYgKCFpc0lubGluZVR5cGUpCisgICAgICAgIG1fYmxvY2suc2V0U3RhdGljSW5saW5lUG9zaXRp
b25Gb3JDaGlsZCgqYm94LCBtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQoKSwgbV9ibG9jay5zdGFydE9m
ZnNldEZvckNvbnRlbnQobV9ibG9jay5sb2dpY2FsSGVpZ2h0KCkpKTsKKyAgICBlbHNlIHsKKyAg
ICAgICAgLy8gSWYgb3VyIG9yaWdpbmFsIGRpc3BsYXkgd2FzIGFuIElOTElORSB0eXBlLCB0aGVu
IHdlIGNhbiBnbyBhaGVhZAorICAgICAgICAvLyBhbmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMgeSBw
b3NpdGlvbiBub3cuCisgICAgICAgIGJveC0+bGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlv
bihtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQoKSk7CisgICAgfQorCisgICAgLy8gSWYgd2UncmUgaWdu
b3Jpbmcgc3BhY2VzLCB3ZSBoYXZlIHRvIHN0b3AgYW5kIGluY2x1ZGUgdGhpcyBvYmplY3QgYW5k
CisgICAgLy8gdGhlbiBzdGFydCBpZ25vcmluZyBzcGFjZXMgYWdhaW4uCisgICAgaWYgKGlzSW5s
aW5lVHlwZSB8fCBib3gtPmNvbnRhaW5lcigpLT5pc1JlbmRlcklubGluZSgpKSB7CisgICAgICAg
IGlmIChtX2lnbm9yaW5nU3BhY2VzKQorICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUln
bm9yZWRTcGFjZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgYm94KTsKKyAgICAgICAgbV90cmFpbGlu
Z09iamVjdHMuYXBwZW5kQm94SWZOZWVkZWQoYm94KTsKKyAgICB9IGVsc2UKKyAgICAgICAgcG9z
aXRpb25lZE9iamVjdHMuYXBwZW5kKGJveCk7CisKKyAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVk
V2lkdGgoaW5saW5lTG9naWNhbFdpZHRoKGJveCkpOworICAgIC8vIFJlc2V0IHByaW9yIGxpbmUg
YnJlYWsgY29udGV4dCBjaGFyYWN0ZXJzLgorICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJl
YWtJdGVyYXRvci5yZXNldFByaW9yQ29udGV4dCgpOworfQorCitpbmxpbmUgdm9pZCBCcmVha2lu
Z0NvbnRleHQ6OmhhbmRsZUZsb2F0KCkKK3sKKyAgICBSZW5kZXJCb3gmIGZsb2F0Qm94ID0gdG9S
ZW5kZXJCb3goKm1fY3VycmVudC5tX29iaik7CisgICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5n
T2JqZWN0ID0gbV9ibG9jay5pbnNlcnRGbG9hdGluZ09iamVjdChmbG9hdEJveCk7CisgICAgLy8g
Y2hlY2sgaWYgaXQgZml0cyBpbiB0aGUgY3VycmVudCBsaW5lLgorICAgIC8vIElmIGl0IGRvZXMs
IHBvc2l0aW9uIGl0IG5vdywgb3RoZXJ3aXNlLCBwb3NpdGlvbgorICAgIC8vIGl0IGFmdGVyIG1v
dmluZyB0byBuZXh0IGxpbmUgKGluIG5ld0xpbmUoKSBmdW5jKQorICAgIC8vIEZJWE1FOiBCdWcg
MTEwMzcyOiBQcm9wZXJseSBwb3NpdGlvbiBtdWx0aXBsZSBzdGFja2VkIGZsb2F0cyB3aXRoIG5v
bi1yZWN0YW5ndWxhciBzaGFwZSBvdXRzaWRlLgorICAgIGlmIChtX2Zsb2F0c0ZpdE9uTGluZSAm
JiBtX3dpZHRoLmZpdHNPbkxpbmVFeGNsdWRpbmdUcmFpbGluZ1doaXRlc3BhY2UobV9ibG9jay5s
b2dpY2FsV2lkdGhGb3JGbG9hdChmbG9hdGluZ09iamVjdCkpKSB7CisgICAgICAgIG1fYmxvY2su
cG9zaXRpb25OZXdGbG9hdE9uTGluZShmbG9hdGluZ09iamVjdCwgbV9sYXN0RmxvYXRGcm9tUHJl
dmlvdXNMaW5lLCBtX2xpbmVJbmZvLCBtX3dpZHRoKTsKKyAgICAgICAgaWYgKG1fbGluZUJyZWFr
Lm1fb2JqID09IG1fY3VycmVudC5tX29iaikgeworICAgICAgICAgICAgQVNTRVJUKCFtX2xpbmVC
cmVhay5tX3Bvcyk7CisgICAgICAgICAgICBtX2xpbmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAg
ICAgfQorICAgIH0gZWxzZQorICAgICAgICBtX2Zsb2F0c0ZpdE9uTGluZSA9IGZhbHNlOworICAg
IC8vIFVwZGF0ZSBwcmlvciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVycywgdXNpbmcgVStG
RkZEIChPQkpFQ1QgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSKSBmb3IgZmxvYXRpbmcgZWxlbWVudC4K
KyAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IudXBkYXRlUHJpb3JDb250
ZXh0KHJlcGxhY2VtZW50Q2hhcmFjdGVyKTsKK30KKworLy8gVGhpcyBpcyBjdXJyZW50bHkganVz
dCB1c2VkIGZvciBsaXN0IG1hcmtlcnMgYW5kIGlubGluZSBmbG93cyB0aGF0IGhhdmUgbGluZSBi
b3hlcy4gTmVpdGhlciBzaG91bGQKKy8vIGhhdmUgYW4gZWZmZWN0IG9uIHdoaXRlc3BhY2UgYXQg
dGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgoraW5saW5lIGJvb2wgc2hvdWxkU2tpcFdoaXRlc3BhY2VB
ZnRlclN0YXJ0T2JqZWN0KFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIFJlbmRlck9iamVjdCogbywg
TGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlKQoreworICAgIFJlbmRlck9iamVj
dCogbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ssIG8pOworICAgIHdo
aWxlIChuZXh0ICYmIG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAg
ICAgICAgbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ssIG5leHQpOwor
CisgICAgaWYgKG5leHQgJiYgbmV4dC0+aXNUZXh0KCkgJiYgdG9SZW5kZXJUZXh0KG5leHQpLT50
ZXh0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIFJlbmRlclRleHQqIG5leHRUZXh0ID0gdG9SZW5k
ZXJUZXh0KG5leHQpOworICAgICAgICBVQ2hhciBuZXh0Q2hhciA9IG5leHRUZXh0LT5jaGFyYWN0
ZXJBdCgwKTsKKyAgICAgICAgaWYgKG5leHRUZXh0LT5zdHlsZSgpLmlzQ29sbGFwc2libGVXaGl0
ZVNwYWNlKG5leHRDaGFyKSkgeworICAgICAgICAgICAgc3RhcnRJZ25vcmluZ1NwYWNlcyhsaW5l
TWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbywgMCkpOworICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lu
bGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRW1wdHlJbmxpbmUoKQoreworICAgIFJl
bmRlcklubGluZSYgZmxvd0JveCA9IHRvUmVuZGVySW5saW5lKCptX2N1cnJlbnQubV9vYmopOwor
CisgICAgLy8gVGhpcyBzaG91bGQgb25seSBlbmQgdXAgYmVpbmcgY2FsbGVkIG9uIGVtcHR5IGlu
bGluZXMKKyAgICBBU1NFUlQoaXNFbXB0eUlubGluZShmbG93Qm94KSk7CisKKyAgICAvLyBOb3cg
dGhhdCBzb21lIGlubGluZSBmbG93cyBoYXZlIGxpbmUgYm94ZXMsIGlmIHdlIGFyZSBhbHJlYWR5
IGlnbm9yaW5nIHNwYWNlcywgd2UgbmVlZAorICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHN0
b3AgdG8gaW5jbHVkZSB0aGlzIG9iamVjdCBhbmQgdGhlbiBzdGFydCBpZ25vcmluZyBzcGFjZXMg
YWdhaW4uCisgICAgLy8gSWYgdGhpcyBvYmplY3QgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5l
LCB3ZSBuZWVkIHRvIGJlaGF2ZSBsaWtlIGxpc3QgbWFya2VycyBhbmQKKyAgICAvLyBzdGFydCBp
Z25vcmluZyBzcGFjZXMuCisgICAgYm9vbCByZXF1aXJlc0xpbmVCb3ggPSBhbHdheXNSZXF1aXJl
c0xpbmVCb3goZmxvd0JveCk7CisgICAgaWYgKHJlcXVpcmVzTGluZUJveCB8fCByZXF1aXJlc0xp
bmVCb3hGb3JDb250ZW50KGZsb3dCb3gsIG1fbGluZUluZm8pKSB7CisgICAgICAgIC8vIEFuIGVt
cHR5IGlubGluZSB0aGF0IG9ubHkgaGFzIGxpbmUtaGVpZ2h0LCB2ZXJ0aWNhbC1hbGlnbiBvciBm
b250LW1ldHJpY3Mgd2lsbCBvbmx5IGdldCBhCisgICAgICAgIC8vIGxpbmUgYm94IHRvIGFmZmVj
dCB0aGUgaGVpZ2h0IG9mIHRoZSBsaW5lIGlmIHRoZSByZXN0IG9mIHRoZSBsaW5lIGlzIG5vdCBl
bXB0eS4KKyAgICAgICAgaWYgKHJlcXVpcmVzTGluZUJveCkKKyAgICAgICAgICAgIG1fbGluZUlu
Zm8uc2V0RW1wdHkoZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7CisgICAgICAgIGlmIChtX2ln
bm9yaW5nU3BhY2VzKSB7CisgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOwor
ICAgICAgICAgICAgZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9saW5lTWlkcG9p
bnRTdGF0ZSwgbV9jdXJyZW50Lm1fb2JqKTsKKyAgICAgICAgfSBlbHNlIGlmIChtX2Jsb2NrU3R5
bGUuY29sbGFwc2VXaGl0ZVNwYWNlKCkgJiYgbV9yZXNvbHZlci5wb3NpdGlvbigpLm1fb2JqID09
IG1fY3VycmVudC5tX29iagorICAgICAgICAgICAgJiYgc2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRl
clN0YXJ0T2JqZWN0KG1fYmxvY2ssIG1fY3VycmVudC5tX29iaiwgbV9saW5lTWlkcG9pbnRTdGF0
ZSkpIHsKKyAgICAgICAgICAgIC8vIExpa2Ugd2l0aCBsaXN0IG1hcmtlcnMsIHdlIHN0YXJ0IGln
bm9yaW5nIHNwYWNlcyB0byBtYWtlIHN1cmUgdGhhdCBhbnkKKyAgICAgICAgICAgIC8vIGFkZGl0
aW9uYWwgc3BhY2VzIHdlIHNlZSB3aWxsIGJlIGRpc2NhcmRlZC4KKyAgICAgICAgICAgIG1fY3Vy
cmVudENoYXJhY3RlcklzU3BhY2UgPSB0cnVlOworICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFj
dGVySXNXUyA9IHRydWU7CisgICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKKyAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5hcHBlbmRCb3hJZk5l
ZWRlZCgmZmxvd0JveCk7CisgICAgfQorCisgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRo
KGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQubV9vYmopICsgYm9yZGVyUGFkZGluZ01hcmdp
blN0YXJ0KGZsb3dCb3gpICsgYm9yZGVyUGFkZGluZ01hcmdpbkVuZChmbG93Qm94KSk7Cit9CisK
K2lubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlUmVwbGFjZWQoKQoreworICAgIFJl
bmRlckJveCYgcmVwbGFjZWRCb3ggPSB0b1JlbmRlckJveCgqbV9jdXJyZW50Lm1fb2JqKTsKKwor
ICAgIGlmIChtX2F0U3RhcnQpCisgICAgICAgIG1fd2lkdGgudXBkYXRlQXZhaWxhYmxlV2lkdGgo
cmVwbGFjZWRCb3gubG9naWNhbEhlaWdodCgpKTsKKworICAgIC8vIEJyZWFrIG9uIHJlcGxhY2Vk
IGVsZW1lbnRzIGlmIGVpdGhlciBoYXMgbm9ybWFsIHdoaXRlLXNwYWNlLgorICAgIGlmICgobV9h
dXRvV3JhcCB8fCBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobV9sYXN0V1MpKSAmJiAoIW1fY3VycmVu
dC5tX29iai0+aXNJbWFnZSgpIHx8IG1fYWxsb3dJbWFnZXNUb0JyZWFrKSkgeworICAgICAgICBt
X3dpZHRoLmNvbW1pdCgpOworICAgICAgICBtX2xpbmVCcmVhay5tb3ZlVG9TdGFydE9mKG1fY3Vy
cmVudC5tX29iaik7CisgICAgfQorCisgICAgaWYgKG1faWdub3JpbmdTcGFjZXMpCisgICAgICAg
IHN0b3BJZ25vcmluZ1NwYWNlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigw
LCBtX2N1cnJlbnQubV9vYmosIDApKTsKKworICAgIG1fbGluZUluZm8uc2V0RW1wdHkoZmFsc2Us
ICZtX2Jsb2NrLCAmbV93aWR0aCk7CisgICAgbV9pZ25vcmluZ1NwYWNlcyA9IGZhbHNlOworICAg
IG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKKyAgICBtX2N1cnJlbnRDaGFyYWN0
ZXJJc1dTID0gZmFsc2U7CisgICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKKworICAgIC8v
IE9wdGltaXplIGZvciBhIGNvbW1vbiBjYXNlLiBJZiB3ZSBjYW4ndCBmaW5kIHdoaXRlc3BhY2Ug
YWZ0ZXIgdGhlIGxpc3QKKyAgICAvLyBpdGVtLCB0aGVuIHRoaXMgaXMgYWxsIG1vb3QuCisgICAg
TGF5b3V0VW5pdCByZXBsYWNlZExvZ2ljYWxXaWR0aCA9IG1fYmxvY2subG9naWNhbFdpZHRoRm9y
Q2hpbGQocmVwbGFjZWRCb3gpICsgbV9ibG9jay5tYXJnaW5TdGFydEZvckNoaWxkKHJlcGxhY2Vk
Qm94KSArIG1fYmxvY2subWFyZ2luRW5kRm9yQ2hpbGQocmVwbGFjZWRCb3gpICsgaW5saW5lTG9n
aWNhbFdpZHRoKG1fY3VycmVudC5tX29iaik7CisgICAgaWYgKG1fY3VycmVudC5tX29iai0+aXNM
aXN0TWFya2VyKCkpIHsKKyAgICAgICAgaWYgKG1fYmxvY2tTdHlsZS5jb2xsYXBzZVdoaXRlU3Bh
Y2UoKSAmJiBzaG91bGRTa2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QobV9ibG9jaywgbV9j
dXJyZW50Lm1fb2JqLCBtX2xpbmVNaWRwb2ludFN0YXRlKSkgeworICAgICAgICAgICAgLy8gTGlr
ZSB3aXRoIGlubGluZSBmbG93cywgd2Ugc3RhcnQgaWdub3Jpbmcgc3BhY2VzIHRvIG1ha2Ugc3Vy
ZSB0aGF0IGFueQorICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBzcGFjZXMgd2Ugc2VlIHdpbGwg
YmUgZGlzY2FyZGVkLgorICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IHRy
dWU7CisgICAgICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTID0gZmFsc2U7CisgICAgICAg
ICAgICBtX2lnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9S
ZW5kZXJMaXN0TWFya2VyKCptX2N1cnJlbnQubV9vYmopLmlzSW5zaWRlKCkpCisgICAgICAgICAg
ICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgocmVwbGFjZWRMb2dpY2FsV2lkdGgpOworICAg
IH0gZWxzZQorICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgocmVwbGFjZWRMb2dp
Y2FsV2lkdGgpOworICAgIGlmIChtX2N1cnJlbnQubV9vYmotPmlzUnVieVJ1bigpKQorICAgICAg
ICBtX3dpZHRoLmFwcGx5T3ZlcmhhbmcodG9SZW5kZXJSdWJ5UnVuKG1fY3VycmVudC5tX29iaiks
IG1fbGFzdE9iamVjdCwgbV9uZXh0T2JqZWN0KTsKKyAgICAvLyBVcGRhdGUgcHJpb3IgbGluZSBi
cmVhayBjb250ZXh0IGNoYXJhY3RlcnMsIHVzaW5nIFUrRkZGRCAoT0JKRUNUIFJFUExBQ0VNRU5U
IENIQVJBQ1RFUikgZm9yIHJlcGxhY2VkIGVsZW1lbnQuCisgICAgbV9yZW5kZXJUZXh0SW5mby5t
X2xpbmVCcmVha0l0ZXJhdG9yLnVwZGF0ZVByaW9yQ29udGV4dChyZXBsYWNlbWVudENoYXJhY3Rl
cik7Cit9CisKK2lubGluZSBmbG9hdCBmaXJzdFBvc2l0aXZlV2lkdGgoY29uc3QgV29yZE1lYXN1
cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHdvcmRNZWFzdXJlbWVudHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHdvcmRNZWFzdXJl
bWVudHNbaV0ud2lkdGggPiAwKQorICAgICAgICAgICAgcmV0dXJuIHdvcmRNZWFzdXJlbWVudHNb
aV0ud2lkdGg7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjaWYgRU5BQkxFKENTU19TSEFQ
RVMpCitpbmxpbmUgdm9pZCB1cGRhdGVTZWdtZW50c0ZvclNoYXBlcyhSZW5kZXJCbG9ja0Zsb3cm
IGJsb2NrLCBjb25zdCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwg
Y29uc3QgV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVtZW50cywgTGluZVdpZHRoJiB3aWR0
aCwgYm9vbCBpc0ZpcnN0TGluZSkKK3sKKyAgICBBU1NFUlQobGFzdEZsb2F0RnJvbVByZXZpb3Vz
TGluZSk7CisKKyAgICBTaGFwZUluc2lkZUluZm8qIHNoYXBlSW5zaWRlSW5mbyA9IGJsb2NrLmxh
eW91dFNoYXBlSW5zaWRlSW5mbygpOworICAgIGlmICghbGFzdEZsb2F0RnJvbVByZXZpb3VzTGlu
ZS0+aXNQbGFjZWQoKSB8fCAhc2hhcGVJbnNpZGVJbmZvKQorICAgICAgICByZXR1cm47CisKKyAg
ICBib29sIGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlID0gYmxvY2suaXNIb3Jpem9udGFsV3JpdGlu
Z01vZGUoKTsKKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWluZXIg
PSBibG9jay5sb2dpY2FsT2Zmc2V0RnJvbVNoYXBlQW5jZXN0b3JDb250YWluZXIoc2hhcGVJbnNp
ZGVJbmZvLT5vd25lcigpKS5oZWlnaHQoKTsKKworICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxU
b3AgPSBibG9jay5sb2dpY2FsSGVpZ2h0KCkgKyBsb2dpY2FsT2Zmc2V0RnJvbVNoYXBlQ29udGFp
bmVyOworICAgIExheW91dFVuaXQgbGluZUxvZ2ljYWxIZWlnaHQgPSBibG9jay5saW5lSGVpZ2h0
KGlzRmlyc3RMaW5lLCBpc0hvcml6b250YWxXcml0aW5nTW9kZSA/IEhvcml6b250YWxMaW5lIDog
VmVydGljYWxMaW5lLCBQb3NpdGlvbk9mSW50ZXJpb3JMaW5lQm94ZXMpOworICAgIExheW91dFVu
aXQgbGluZUxvZ2ljYWxCb3R0b20gPSBsaW5lTG9naWNhbFRvcCArIGxpbmVMb2dpY2FsSGVpZ2h0
OworCisgICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxUb3AgPSBibG9jay5sb2dpY2FsVG9wRm9y
RmxvYXQobGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSk7CisgICAgTGF5b3V0VW5pdCBmbG9hdExv
Z2ljYWxCb3R0b20gPSBibG9jay5sb2dpY2FsQm90dG9tRm9yRmxvYXQobGFzdEZsb2F0RnJvbVBy
ZXZpb3VzTGluZSk7CisKKyAgICBib29sIGxpbmVPdmVybGFwc1dpdGhGbG9hdCA9IChmbG9hdExv
Z2ljYWxUb3AgPCBsaW5lTG9naWNhbEJvdHRvbSkgJiYgKGxpbmVMb2dpY2FsVG9wIDwgZmxvYXRM
b2dpY2FsQm90dG9tKTsKKyAgICBpZiAoIWxpbmVPdmVybGFwc1dpdGhGbG9hdCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgZmxvYXQgbWluU2VnbWVudFdpZHRoID0gZmlyc3RQb3NpdGl2ZVdpZHRo
KHdvcmRNZWFzdXJlbWVudHMpOworCisgICAgTGF5b3V0VW5pdCBmbG9hdExvZ2ljYWxXaWR0aCA9
IGJsb2NrLmxvZ2ljYWxXaWR0aEZvckZsb2F0KGxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpOwor
ICAgIExheW91dFVuaXQgYXZhaWxhYmxlTG9naWNhbFdpZHRoID0gYmxvY2subG9naWNhbFdpZHRo
KCkgLSBibG9jay5sb2dpY2FsUmlnaHRGb3JGbG9hdChsYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5l
KTsKKyAgICBpZiAoYXZhaWxhYmxlTG9naWNhbFdpZHRoIDwgbWluU2VnbWVudFdpZHRoKQorICAg
ICAgICBibG9jay5zZXRMb2dpY2FsSGVpZ2h0KGZsb2F0TG9naWNhbEJvdHRvbSk7CisKKyAgICBp
ZiAoYmxvY2subG9naWNhbEhlaWdodCgpIDwgZmxvYXRMb2dpY2FsVG9wKSB7CisgICAgICAgIHNo
YXBlSW5zaWRlSW5mby0+YWRqdXN0TG9naWNhbExpbmVUb3AobWluU2VnbWVudFdpZHRoICsgZmxv
YXRMb2dpY2FsV2lkdGgpOworICAgICAgICBibG9jay5zZXRMb2dpY2FsSGVpZ2h0KHNoYXBlSW5z
aWRlSW5mby0+bG9naWNhbExpbmVUb3AoKSAtIGxvZ2ljYWxPZmZzZXRGcm9tU2hhcGVDb250YWlu
ZXIpOworICAgIH0KKworICAgIGxpbmVMb2dpY2FsVG9wID0gYmxvY2subG9naWNhbEhlaWdodCgp
ICsgbG9naWNhbE9mZnNldEZyb21TaGFwZUNvbnRhaW5lcjsKKworICAgIHNoYXBlSW5zaWRlSW5m
by0+dXBkYXRlU2VnbWVudHNGb3JMaW5lKGxpbmVMb2dpY2FsVG9wLCBsaW5lTG9naWNhbEhlaWdo
dCk7CisgICAgd2lkdGgudXBkYXRlQ3VycmVudFNoYXBlU2VnbWVudCgpOworICAgIHdpZHRoLnVw
ZGF0ZUF2YWlsYWJsZVdpZHRoKCk7Cit9CisjZW5kaWYKKworaW5saW5lIGJvb2wgaXRlcmF0b3JJ
c0JleW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQoY29uc3QgSW5saW5lSXRlcmF0b3ImIGl0ZXIs
IFJlbmRlckNvbWJpbmVUZXh0JiByZW5kZXJlcikKK3sKKyAgICByZXR1cm4gaXRlci5tX29iaiA9
PSAmcmVuZGVyZXIgJiYgaXRlci5tX3BvcyA+PSByZW5kZXJlci50ZXh0TGVuZ3RoKCk7Cit9CisK
K2lubGluZSB2b2lkIG5leHRDaGFyYWN0ZXIoVUNoYXImIGN1cnJlbnRDaGFyYWN0ZXIsIFVDaGFy
JiBsYXN0Q2hhcmFjdGVyLCBVQ2hhciYgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyKQoreworICAgIHNl
Y29uZFRvTGFzdENoYXJhY3RlciA9IGxhc3RDaGFyYWN0ZXI7CisgICAgbGFzdENoYXJhY3RlciA9
IGN1cnJlbnRDaGFyYWN0ZXI7Cit9CisKKy8vIEZJWE1FOiBEb24ndCBsZXQgY291bnRlcnMgbWFy
ayB0aGVtc2VsdmVzIGFzIG5lZWRpbmcgcHJlZiB3aWR0aCByZWNhbGNzIGR1cmluZyBsYXlvdXQK
Ky8vIHNvIHdlIGRvbid0IG5lZWQgdGhpcyBoYWNrLgoraW5saW5lIHZvaWQgdXBkYXRlQ291bnRl
cklmTmVlZGVkKFJlbmRlclRleHQmIHJlbmRlclRleHQpCit7CisgICAgaWYgKCFyZW5kZXJUZXh0
LnByZWZlcnJlZExvZ2ljYWxXaWR0aHNEaXJ0eSgpIHx8ICFyZW5kZXJUZXh0LmlzQ291bnRlcigp
KQorICAgICAgICByZXR1cm47CisgICAgdG9SZW5kZXJDb3VudGVyKHJlbmRlclRleHQpLnVwZGF0
ZUNvdW50ZXIoKTsKK30KKworaW5saW5lIGZsb2F0IG1lYXN1cmVIeXBoZW5XaWR0aChSZW5kZXJU
ZXh0KiByZW5kZXJlciwgY29uc3QgRm9udCYgZm9udCwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250
RGF0YSo+KiBmYWxsYmFja0ZvbnRzID0gMCkKK3sKKyAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5
bGUgPSByZW5kZXJlci0+c3R5bGUoKTsKKyAgICByZXR1cm4gZm9udC53aWR0aChSZW5kZXJCbG9j
azo6Y29uc3RydWN0VGV4dFJ1bihyZW5kZXJlciwgZm9udCwgc3R5bGUuaHlwaGVuU3RyaW5nKCku
c3RyaW5nKCksIHN0eWxlKSwgZmFsbGJhY2tGb250cyk7Cit9CisKK0FMV0FZU19JTkxJTkUgZmxv
YXQgdGV4dFdpZHRoKFJlbmRlclRleHQqIHRleHQsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxl
biwgY29uc3QgRm9udCYgZm9udCwgZmxvYXQgeFBvcywgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wg
Y29sbGFwc2VXaGl0ZVNwYWNlLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4mIGZhbGxi
YWNrRm9udHMsIFRleHRMYXlvdXQqIGxheW91dCA9IDApCit7CisgICAgY29uc3QgUmVuZGVyU3R5
bGUmIHN0eWxlID0gdGV4dC0+c3R5bGUoKTsKKworICAgIEdseXBoT3ZlcmZsb3cgZ2x5cGhPdmVy
ZmxvdzsKKyAgICBpZiAoaXNGaXhlZFBpdGNoIHx8ICghZnJvbSAmJiBsZW4gPT0gdGV4dC0+dGV4
dExlbmd0aCgpKSB8fCBzdHlsZS5oYXNUZXh0Q29tYmluZSgpKQorICAgICAgICByZXR1cm4gdGV4
dC0+d2lkdGgoZnJvbSwgbGVuLCBmb250LCB4UG9zLCAmZmFsbGJhY2tGb250cywgJmdseXBoT3Zl
cmZsb3cpOworCisgICAgaWYgKGxheW91dCkKKyAgICAgICAgcmV0dXJuIEZvbnQ6OndpZHRoKCps
YXlvdXQsIGZyb20sIGxlbiwgJmZhbGxiYWNrRm9udHMpOworCisgICAgVGV4dFJ1biBydW4gPSBS
ZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bih0ZXh0LCBmb250LCB0ZXh0LCBmcm9tLCBsZW4s
IHN0eWxlKTsKKyAgICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LT50ZXh0TGVuZ3RoKCkg
LSBmcm9tKTsKKyAgICBBU1NFUlQocnVuLmNoYXJhY3RlcnNMZW5ndGgoKSA+PSBydW4ubGVuZ3Ro
KCkpOworCisgICAgcnVuLnNldENoYXJhY3RlclNjYW5Gb3JDb2RlUGF0aCghdGV4dC0+Y2FuVXNl
U2ltcGxlRm9udENvZGVQYXRoKCkpOworICAgIHJ1bi5zZXRUYWJTaXplKCFjb2xsYXBzZVdoaXRl
U3BhY2UsIHN0eWxlLnRhYlNpemUoKSk7CisgICAgcnVuLnNldFhQb3MoeFBvcyk7CisgICAgcmV0
dXJuIGZvbnQud2lkdGgocnVuLCAmZmFsbGJhY2tGb250cywgJmdseXBoT3ZlcmZsb3cpOworfQor
CisvLyBBZGRpbmcgYSBwYWlyIG9mIG1pZHBvaW50cyBiZWZvcmUgYSBjaGFyYWN0ZXIgd2lsbCBz
cGxpdCBpdCBvdXQgaW50byBhIG5ldyBsaW5lIGJveC4KK2lubGluZSB2b2lkIGVuc3VyZUNoYXJh
Y3RlckdldHNMaW5lQm94KExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgSW5s
aW5lSXRlcmF0b3ImIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IpCit7CisgICAgSW5saW5lSXRlcmF0
b3IgbWlkcG9pbnQoMCwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX29iaiwgdGV4dFBhcmFncmFw
aFNlcGFyYXRvci5tX3Bvcyk7CisgICAgc3RhcnRJZ25vcmluZ1NwYWNlcyhsaW5lTWlkcG9pbnRT
dGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5tX29iaiwgdGV4
dFBhcmFncmFwaFNlcGFyYXRvci5tX3BvcyAtIDEpKTsKKyAgICBzdG9wSWdub3JpbmdTcGFjZXMo
bGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKDAsIHRleHRQYXJhZ3JhcGhTZXBhcmF0
b3IubV9vYmosIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IubV9wb3MpKTsKK30KKworaW5saW5lIHZv
aWQgdHJ5SHlwaGVuYXRpbmcoUmVuZGVyVGV4dCogdGV4dCwgY29uc3QgRm9udCYgZm9udCwgY29u
c3QgQXRvbWljU3RyaW5nJiBsb2NhbGVJZGVudGlmaWVyLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5
cGhlbmF0ZWRMaW5lcywgaW50IGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzTGltaXQsIGludCBt
aW5pbXVtUHJlZml4TGltaXQsIGludCBtaW5pbXVtU3VmZml4TGltaXQsIHVuc2lnbmVkIGxhc3RT
cGFjZSwgdW5zaWduZWQgcG9zLCBmbG9hdCB4UG9zLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGJvb2wg
aXNGaXhlZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgaW50IGxhc3RTcGFjZVdvcmRT
cGFjaW5nLCBJbmxpbmVJdGVyYXRvciYgbGluZUJyZWFrLCBpbnQgbmV4dEJyZWFrYWJsZSwgYm9v
bCYgaHlwaGVuYXRlZCkKK3sKKyAgICAvLyBNYXAgJ2h5cGhlbmF0ZS1saW1pdC17YmVmb3JlLGFm
dGVyfTogYXV0bzsnIHRvIDIuCisgICAgdW5zaWduZWQgbWluaW11bVByZWZpeExlbmd0aDsKKyAg
ICB1bnNpZ25lZCBtaW5pbXVtU3VmZml4TGVuZ3RoOworCisgICAgaWYgKG1pbmltdW1QcmVmaXhM
aW1pdCA8IDApCisgICAgICAgIG1pbmltdW1QcmVmaXhMZW5ndGggPSAyOworICAgIGVsc2UKKyAg
ICAgICAgbWluaW11bVByZWZpeExlbmd0aCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihtaW5pbXVt
UHJlZml4TGltaXQpOworCisgICAgaWYgKG1pbmltdW1TdWZmaXhMaW1pdCA8IDApCisgICAgICAg
IG1pbmltdW1TdWZmaXhMZW5ndGggPSAyOworICAgIGVsc2UKKyAgICAgICAgbWluaW11bVN1ZmZp
eExlbmd0aCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihtaW5pbXVtU3VmZml4TGltaXQpOworCisg
ICAgaWYgKHBvcyAtIGxhc3RTcGFjZSA8PSBtaW5pbXVtU3VmZml4TGVuZ3RoKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBpZiAoY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXNMaW1pdCA+PSAwICYm
IGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzID49IHN0YXRpY19jYXN0PHVuc2lnbmVkPihjb25z
ZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50
IGh5cGhlbldpZHRoID0gbWVhc3VyZUh5cGhlbldpZHRoKHRleHQsIGZvbnQpOworCisgICAgZmxv
YXQgbWF4UHJlZml4V2lkdGggPSBhdmFpbGFibGVXaWR0aCAtIHhQb3MgLSBoeXBoZW5XaWR0aCAt
IGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAgIC8vIElmIHRoZSBtYXhpbXVtIHdpZHRoIGF2YWls
YWJsZSBmb3IgdGhlIHByZWZpeCBiZWZvcmUgdGhlIGh5cGhlbiBpcyBzbWFsbCwgdGhlbiBpdCBp
cyB2ZXJ5IHVubGlrZWx5CisgICAgLy8gdGhhdCBhbiBoeXBoZW5hdGlvbiBvcHBvcnR1bml0eSBl
eGlzdHMsIHNvIGRvIG5vdCBib3RoZXIgdG8gbG9vayBmb3IgaXQuCisgICAgaWYgKG1heFByZWZp
eFdpZHRoIDw9IGZvbnQucGl4ZWxTaXplKCkgKiA1IC8gNCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gdGV4dC0+c3R5bGUoKTsKKyAgICBUZXh0UnVu
IHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKHRleHQsIGZvbnQsIHRleHQsIGxh
c3RTcGFjZSwgcG9zIC0gbGFzdFNwYWNlLCBzdHlsZSk7CisgICAgcnVuLnNldENoYXJhY3RlcnNM
ZW5ndGgodGV4dC0+dGV4dExlbmd0aCgpIC0gbGFzdFNwYWNlKTsKKyAgICBBU1NFUlQocnVuLmNo
YXJhY3RlcnNMZW5ndGgoKSA+PSBydW4ubGVuZ3RoKCkpOworCisgICAgcnVuLnNldFRhYlNpemUo
IWNvbGxhcHNlV2hpdGVTcGFjZSwgc3R5bGUudGFiU2l6ZSgpKTsKKyAgICBydW4uc2V0WFBvcyh4
UG9zICsgbGFzdFNwYWNlV29yZFNwYWNpbmcpOworCisgICAgdW5zaWduZWQgcHJlZml4TGVuZ3Ro
ID0gZm9udC5vZmZzZXRGb3JQb3NpdGlvbihydW4sIG1heFByZWZpeFdpZHRoLCBmYWxzZSk7Cisg
ICAgaWYgKHByZWZpeExlbmd0aCA8IG1pbmltdW1QcmVmaXhMZW5ndGgpCisgICAgICAgIHJldHVy
bjsKKworICAgIHByZWZpeExlbmd0aCA9IGxhc3RIeXBoZW5Mb2NhdGlvbih0ZXh0LT5jaGFyYWN0
ZXJzKCkgKyBsYXN0U3BhY2UsIHBvcyAtIGxhc3RTcGFjZSwgc3RkOjptaW4ocHJlZml4TGVuZ3Ro
LCBwb3MgLSBsYXN0U3BhY2UgLSBtaW5pbXVtU3VmZml4TGVuZ3RoKSArIDEsIGxvY2FsZUlkZW50
aWZpZXIpOworICAgIGlmICghcHJlZml4TGVuZ3RoIHx8IHByZWZpeExlbmd0aCA8IG1pbmltdW1Q
cmVmaXhMZW5ndGgpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdoZW4gbGFzdFNhcGNlIGlz
IGEgc3BhY2UsIHdoaWNoIGl0IGFsd2F5cyBpcyBleGNlcHQgc29tZXRpbWVzIGF0IHRoZSBiZWdp
bm5pbmcgb2YgYSBsaW5lIG9yIGFmdGVyIGNvbGxhcHNlZAorICAgIC8vIHNwYWNlLCBpdCBzaG91
bGQgbm90IGNvdW50IHRvd2FyZHMgaHlwaGVuYXRlLWxpbWl0LWJlZm9yZS4KKyAgICBpZiAocHJl
Zml4TGVuZ3RoID09IG1pbmltdW1QcmVmaXhMZW5ndGgpIHsKKyAgICAgICAgVUNoYXIgY2hhcmFj
dGVyQXRMYXN0U3BhY2UgPSB0ZXh0LT5jaGFyYWN0ZXJBdChsYXN0U3BhY2UpOworICAgICAgICBp
ZiAoY2hhcmFjdGVyQXRMYXN0U3BhY2UgPT0gJyAnIHx8IGNoYXJhY3RlckF0TGFzdFNwYWNlID09
ICdcbicgfHwgY2hhcmFjdGVyQXRMYXN0U3BhY2UgPT0gJ1x0JyB8fCBjaGFyYWN0ZXJBdExhc3RT
cGFjZSA9PSBub0JyZWFrU3BhY2UpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
QVNTRVJUKHBvcyAtIGxhc3RTcGFjZSAtIHByZWZpeExlbmd0aCA+PSBtaW5pbXVtU3VmZml4TGVu
Z3RoKTsKKworI2lmICFBU1NFUlRfRElTQUJMRUQKKyAgICBIYXNoU2V0PGNvbnN0IFNpbXBsZUZv
bnREYXRhKj4gZmFsbGJhY2tGb250czsKKyAgICBmbG9hdCBwcmVmaXhXaWR0aCA9IGh5cGhlbldp
ZHRoICsgdGV4dFdpZHRoKHRleHQsIGxhc3RTcGFjZSwgcHJlZml4TGVuZ3RoLCBmb250LCB4UG9z
LCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgZmFsbGJhY2tGb250cykgKyBsYXN0
U3BhY2VXb3JkU3BhY2luZzsKKyAgICBBU1NFUlQoeFBvcyArIHByZWZpeFdpZHRoIDw9IGF2YWls
YWJsZVdpZHRoKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGlzRml4ZWRQaXRjaCk7CisjZW5k
aWYKKworICAgIGxpbmVCcmVhay5tb3ZlVG8odGV4dCwgbGFzdFNwYWNlICsgcHJlZml4TGVuZ3Ro
LCBuZXh0QnJlYWthYmxlKTsKKyAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKK30KKworaW5saW5lIGJv
b2wgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFz
dXJlbWVudHMsIGJvb2wmIGh5cGhlbmF0ZWQsICB1bnNpZ25lZCYgY29uc2VjdXRpdmVIeXBoZW5h
dGVkTGluZXMpCit7CisgICAgaWYgKCFtX2N1cnJlbnQubV9wb3MpCisgICAgICAgIG1fYXBwbGll
ZFN0YXJ0V2lkdGggPSBmYWxzZTsKKworICAgIFJlbmRlclRleHQqIHJlbmRlclRleHQgPSB0b1Jl
bmRlclRleHQobV9jdXJyZW50Lm1fb2JqKTsKKworI2lmIEVOQUJMRShTVkcpCisgICAgYm9vbCBp
c1NWR1RleHQgPSByZW5kZXJUZXh0LT5pc1NWR0lubGluZVRleHQoKTsKKyNlbmRpZgorCisgICAg
Ly8gSWYgd2UgaGF2ZSBsZWZ0IGEgbm8td3JhcCBpbmxpbmUgYW5kIGVudGVyZWQgYW4gYXV0b3dy
YXAgaW5saW5lIHdoaWxlIGlnbm9yaW5nIHNwYWNlcworICAgIC8vIHRoZW4gd2UgbmVlZCB0byBt
YXJrIHRoZSBzdGFydCBvZiB0aGUgYXV0b3dyYXAgaW5saW5lIGFzIGEgcG90ZW50aWFsIGxpbmVi
cmVhayBub3cuCisgICAgaWYgKG1fYXV0b1dyYXAgJiYgIVJlbmRlclN0eWxlOjphdXRvV3JhcCht
X2xhc3RXUykgJiYgbV9pZ25vcmluZ1NwYWNlcykKKyAgICAgICAgY29tbWl0TGluZUJyZWFrQXRD
dXJyZW50V2lkdGgobV9jdXJyZW50Lm1fb2JqKTsKKworICAgIGlmIChyZW5kZXJUZXh0LT5zdHls
ZSgpLmhhc1RleHRDb21iaW5lKCkgJiYgbV9jdXJyZW50Lm1fb2JqLT5pc0NvbWJpbmVUZXh0KCkg
JiYgIXRvUmVuZGVyQ29tYmluZVRleHQoKm1fY3VycmVudC5tX29iaikuaXNDb21iaW5lZCgpKSB7
CisgICAgICAgIFJlbmRlckNvbWJpbmVUZXh0JiBjb21iaW5lUmVuZGVyZXIgPSB0b1JlbmRlckNv
bWJpbmVUZXh0KCptX2N1cnJlbnQubV9vYmopOworICAgICAgICBjb21iaW5lUmVuZGVyZXIuY29t
YmluZVRleHQoKTsKKyAgICAgICAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcmVuZGVyZXIncyB0ZXh0
IG1heSBoYXZlIGNoYW5nZWQuIEluY3JlbWVudCBzdGFsZSBpdGVyYXRvciBwb3NpdGlvbnMKKyAg
ICAgICAgaWYgKGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KG1fbGluZUJy
ZWFrLCBjb21iaW5lUmVuZGVyZXIpKSB7CisgICAgICAgICAgICBBU1NFUlQoaXRlcmF0b3JJc0Jl
eW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQobV9yZXNvbHZlci5wb3NpdGlvbigpLCBjb21iaW5l
UmVuZGVyZXIpKTsKKyAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOworICAgICAg
ICAgICAgbV9yZXNvbHZlci5pbmNyZW1lbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNv
bnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IGxpbmVTdHlsZSgqcmVuZGVyVGV4dC0+cGFyZW50KCks
IG1fbGluZUluZm8pOworICAgIGNvbnN0IEZvbnQmIGZvbnQgPSBzdHlsZS5mb250KCk7CisgICAg
Ym9vbCBpc0ZpeGVkUGl0Y2ggPSBmb250LmlzRml4ZWRQaXRjaCgpOworICAgIGJvb2wgY2FuSHlw
aGVuYXRlID0gc3R5bGUuaHlwaGVucygpID09IEh5cGhlbnNBdXRvICYmIFdlYkNvcmU6OmNhbkh5
cGhlbmF0ZShzdHlsZS5sb2NhbGUoKSk7CisKKyAgICB1bnNpZ25lZCBsYXN0U3BhY2UgPSBtX2N1
cnJlbnQubV9wb3M7CisgICAgZmxvYXQgd29yZFNwYWNpbmcgPSBtX2N1cnJlbnRTdHlsZS0+d29y
ZFNwYWNpbmcoKTsKKyAgICBmbG9hdCBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IDA7CisgICAgZmxv
YXQgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAwOworCisgICAgZmxvYXQgd3JhcFcg
PSBtX3dpZHRoLnVuY29tbWl0dGVkV2lkdGgoKSArIGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJl
bnQubV9vYmosICFtX2FwcGxpZWRTdGFydFdpZHRoLCB0cnVlKTsKKyAgICBmbG9hdCBjaGFyV2lk
dGggPSAwOworICAgIGJvb2wgYnJlYWtOQlNQID0gbV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRTdHls
ZS0+bmJzcE1vZGUoKSA9PSBTUEFDRTsKKyAgICAvLyBBdXRvLXdyYXBwaW5nIHRleHQgc2hvdWxk
IHdyYXAgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgb25seSBpZiBpdCBjb3VsZCBub3Qgd3JhcCBi
ZWZvcmUgdGhlIHdvcmQsCisgICAgLy8gd2hpY2ggaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgd29y
ZCBpcyB0aGUgZmlyc3QgdGhpbmcgb24gdGhlIGxpbmUsIHRoYXQgaXMsIGlmIHx3fCBpcyB6ZXJv
LgorICAgIGJvb2wgYnJlYWtXb3JkcyA9IG1fY3VycmVudFN0eWxlLT5icmVha1dvcmRzKCkgJiYg
KChtX2F1dG9XcmFwICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHx8IG1fY3VycldTID09
IFBSRSk7CisgICAgYm9vbCBtaWRXb3JkQnJlYWsgPSBmYWxzZTsKKyAgICBib29sIGJyZWFrQWxs
ID0gbV9jdXJyZW50U3R5bGUtPndvcmRCcmVhaygpID09IEJyZWFrQWxsV29yZEJyZWFrICYmIG1f
YXV0b1dyYXA7CisgICAgZmxvYXQgaHlwaGVuV2lkdGggPSAwOworI2lmIEVOQUJMRShTVkcpCisg
ICAgaWYgKGlzU1ZHVGV4dCkgeworICAgICAgICBicmVha1dvcmRzID0gZmFsc2U7CisgICAgICAg
IGJyZWFrQWxsID0gZmFsc2U7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAobV9yZW5kZXJUZXh0
SW5mby5tX3RleHQgIT0gcmVuZGVyVGV4dCkgeworICAgICAgICB1cGRhdGVDb3VudGVySWZOZWVk
ZWQoKnJlbmRlclRleHQpOworICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fdGV4dCA9IHJlbmRl
clRleHQ7CisgICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9mb250ID0gJmZvbnQ7CisgICAgICAg
IG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgPSBmb250LmNyZWF0ZUxheW91dChyZW5kZXJUZXh0
LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSk7CisgICAgICAg
IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNldFN0cmluZ0FuZFJlbGVh
c2VJdGVyYXRvcihyZW5kZXJUZXh0LT50ZXh0KCksIHN0eWxlLmxvY2FsZSgpKTsKKyAgICB9IGVs
c2UgaWYgKG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgJiYgbV9yZW5kZXJUZXh0SW5mby5tX2Zv
bnQgIT0gJmZvbnQpIHsKKyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2ZvbnQgPSAmZm9udDsK
KyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xheW91dCA9IGZvbnQuY3JlYXRlTGF5b3V0KHJl
bmRlclRleHQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIG1fY29sbGFwc2VXaGl0ZVNwYWNlKTsK
KyAgICB9CisKKyAgICBUZXh0TGF5b3V0KiB0ZXh0TGF5b3V0ID0gbV9yZW5kZXJUZXh0SW5mby5t
X2xheW91dC5nZXQoKTsKKworICAgIC8vIE5vbi16ZXJvIG9ubHkgd2hlbiBrZXJuaW5nIGlzIGVu
YWJsZWQgYW5kIFRleHRMYXlvdXQgaXNuJ3QgdXNlZCwgaW4gd2hpY2ggY2FzZSB3ZSBtZWFzdXJl
CisgICAgLy8gd29yZHMgd2l0aCB0aGVpciB0cmFpbGluZyBzcGFjZSwgdGhlbiBzdWJ0cmFjdCBp
dHMgd2lkdGguCisgICAgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+IGZhbGxiYWNrRm9u
dHM7CisgICAgZmxvYXQgd29yZFRyYWlsaW5nU3BhY2VXaWR0aCA9IChmb250LnR5cGVzZXR0aW5n
RmVhdHVyZXMoKSAmIEtlcm5pbmcpICYmICF0ZXh0TGF5b3V0ID8gZm9udC53aWR0aChSZW5kZXJC
bG9jazo6Y29uc3RydWN0VGV4dFJ1bihyZW5kZXJUZXh0LCBmb250LCAmc3BhY2UsIDEsIHN0eWxl
KSwgJmZhbGxiYWNrRm9udHMpICsgd29yZFNwYWNpbmcgOiAwOworCisgICAgVUNoYXIgbGFzdENo
YXJhY3RlciA9IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5sYXN0Q2hhcmFj
dGVyKCk7CisgICAgVUNoYXIgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gbV9yZW5kZXJUZXh0SW5m
by5tX2xpbmVCcmVha0l0ZXJhdG9yLnNlY29uZFRvTGFzdENoYXJhY3RlcigpOworICAgIGZvciAo
OyBtX2N1cnJlbnQubV9wb3MgPCByZW5kZXJUZXh0LT50ZXh0TGVuZ3RoKCk7IG1fY3VycmVudC5m
YXN0SW5jcmVtZW50SW5UZXh0Tm9kZSgpKSB7CisgICAgICAgIGJvb2wgcHJldmlvdXNDaGFyYWN0
ZXJJc1NwYWNlID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKKyAgICAgICAgYm9vbCBwcmV2
aW91c0NoYXJhY3RlcklzV1MgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTOworICAgICAgICBVQ2hh
ciBjID0gbV9jdXJyZW50LmN1cnJlbnQoKTsKKyAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNT
cGFjZSA9IGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCAoIW1fcHJlc2VydmVzTmV3bGluZSAmJiAo
YyA9PSAnXG4nKSk7CisKKyAgICAgICAgaWYgKCFtX2NvbGxhcHNlV2hpdGVTcGFjZSB8fCAhbV9j
dXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKKyAgICAgICAgICAgIG1fbGluZUluZm8uc2V0RW1wdHko
ZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7CisKKyAgICAgICAgaWYgKGMgPT0gc29mdEh5cGhl
biAmJiBtX2F1dG9XcmFwICYmICFoeXBoZW5XaWR0aCAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlw
aGVuc05vbmUpIHsKKyAgICAgICAgICAgIGh5cGhlbldpZHRoID0gbWVhc3VyZUh5cGhlbldpZHRo
KHJlbmRlclRleHQsIGZvbnQsICZmYWxsYmFja0ZvbnRzKTsKKyAgICAgICAgICAgIG1fd2lkdGgu
YWRkVW5jb21taXR0ZWRXaWR0aChoeXBoZW5XaWR0aCk7CisgICAgICAgIH0KKworICAgICAgICBi
b29sIGFwcGx5V29yZFNwYWNpbmcgPSBmYWxzZTsKKworICAgICAgICBtX2N1cnJlbnRDaGFyYWN0
ZXJJc1dTID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSB8fCAoYnJlYWtOQlNQICYmIGMgPT0g
bm9CcmVha1NwYWNlKTsKKworICAgICAgICBpZiAoKGJyZWFrQWxsIHx8IGJyZWFrV29yZHMpICYm
ICFtaWRXb3JkQnJlYWsgJiYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlIHx8IHN0eWxlLndo
aXRlU3BhY2UoKSAhPSBQUkVfV1JBUCkpIHsKKyAgICAgICAgICAgIHdyYXBXICs9IGNoYXJXaWR0
aDsKKyAgICAgICAgICAgIGJvb2wgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID0g
VTE2X0lTX0xFQUQoYykgJiYgbV9jdXJyZW50Lm1fcG9zICsgMSA8IHJlbmRlclRleHQtPnRleHRM
ZW5ndGgoKSAmJiBVMTZfSVNfVFJBSUwoKCpyZW5kZXJUZXh0KVttX2N1cnJlbnQubV9wb3MgKyAx
XSk7CisgICAgICAgICAgICBjaGFyV2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbV9jdXJy
ZW50Lm1fcG9zLCBtaWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIgPyAyIDogMSwgZm9u
dCwgbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcsIGlzRml4ZWRQaXRjaCwgbV9jb2xs
YXBzZVdoaXRlU3BhY2UsIGZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOworICAgICAgICAgICAg
bWlkV29yZEJyZWFrID0gbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICsgd3JhcFcgKyBjaGFyV2lk
dGggPiBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCk7CisgICAgICAgIH0KKworICAgICAgICBib29s
IGJldHdlZW5Xb3JkcyA9IGMgPT0gJ1xuJyB8fCAobV9jdXJyV1MgIT0gUFJFICYmICFtX2F0U3Rh
cnQgJiYgaXNCcmVha2FibGUobV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLCBt
X2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRCcmVha2FibGVQb3NpdGlvbiwgYnJlYWtO
QlNQKQorICAgICAgICAgICAgJiYgKHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSB8fCAo
bV9jdXJyZW50LnByZXZpb3VzSW5TYW1lTm9kZSgpICE9IHNvZnRIeXBoZW4pKSk7CisKKyAgICAg
ICAgaWYgKGJldHdlZW5Xb3JkcyB8fCBtaWRXb3JkQnJlYWspIHsKKyAgICAgICAgICAgIGJvb2wg
c3RvcHBlZElnbm9yaW5nU3BhY2VzID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobV9pZ25vcmlu
Z1NwYWNlcykgeworICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gMDsKKyAg
ICAgICAgICAgICAgICBpZiAoIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpIHsKKyAgICAgICAg
ICAgICAgICAgICAgLy8gU3RvcCBpZ25vcmluZyBzcGFjZXMgYW5kIGJlZ2luIGF0IHRoaXMKKyAg
ICAgICAgICAgICAgICAgICAgLy8gbmV3IHBvaW50LgorICAgICAgICAgICAgICAgICAgICBtX2ln
bm9yaW5nU3BhY2VzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHdvcmRTcGFjaW5nRm9y
V29yZE1lYXN1cmVtZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFNwYWNlID0gbV9j
dXJyZW50Lm1fcG9zOyAvLyBlLmcuLCAiRm9vICAgIGdvbyIsIGRvbid0IGFkZCBpbiBhbnkgb2Yg
dGhlIGlnbm9yZWQgc3BhY2VzLgorICAgICAgICAgICAgICAgICAgICBzdG9wSWdub3JpbmdTcGFj
ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50Lm1fb2Jq
LCBtX2N1cnJlbnQubV9wb3MpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcHBlZElnbm9yaW5n
U3BhY2VzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAg
ICAgICAvLyBKdXN0IGtlZXAgaWdub3JpbmcgdGhlc2Ugc3BhY2VzLgorICAgICAgICAgICAgICAg
ICAgICBuZXh0Q2hhcmFjdGVyKGMsIGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rl
cik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50cy5ncm93KHdvcmRNZWFz
dXJlbWVudHMuc2l6ZSgpICsgMSk7CisgICAgICAgICAgICBXb3JkTWVhc3VyZW1lbnQmIHdvcmRN
ZWFzdXJlbWVudCA9IHdvcmRNZWFzdXJlbWVudHMubGFzdCgpOworCisgICAgICAgICAgICB3b3Jk
TWVhc3VyZW1lbnQucmVuZGVyZXIgPSByZW5kZXJUZXh0OworICAgICAgICAgICAgd29yZE1lYXN1
cmVtZW50LmVuZE9mZnNldCA9IG1fY3VycmVudC5tX3BvczsKKyAgICAgICAgICAgIHdvcmRNZWFz
dXJlbWVudC5zdGFydE9mZnNldCA9IGxhc3RTcGFjZTsKKworICAgICAgICAgICAgZmxvYXQgYWRk
aXRpb25hbFRlbXBXaWR0aDsKKyAgICAgICAgICAgIGlmICh3b3JkVHJhaWxpbmdTcGFjZVdpZHRo
ICYmIGMgPT0gJyAnKQorICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggPSB0ZXh0
V2lkdGgocmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MgKyAxIC0gbGFzdFNw
YWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFw
c2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91dCkg
LSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAg
ICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbGFzdFNwYWNl
LCBtX2N1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVudFdpZHRo
KCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVudC5m
YWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKKworICAgICAgICAgICAgaWYgKHdvcmRNZWFzdXJl
bWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSAmJiAhZmFsbGJhY2tGb250cy5pc0VtcHR5KCkp
CisgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuc3dhcChmYWxs
YmFja0ZvbnRzKTsKKyAgICAgICAgICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKKworICAgICAg
ICAgICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0gYWRkaXRpb25hbFRlbXBXaWR0aCArIHdvcmRT
cGFjaW5nRm9yV29yZE1lYXN1cmVtZW50OworICAgICAgICAgICAgYWRkaXRpb25hbFRlbXBXaWR0
aCArPSBsYXN0U3BhY2VXb3JkU3BhY2luZzsKKyAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21t
aXR0ZWRXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoKTsKKworICAgICAgICAgICAgaWYgKG1fY29s
bGFwc2VXaGl0ZVNwYWNlICYmIHByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSAmJiBtX2N1cnJlbnRD
aGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0aW9uYWxUZW1wV2lkdGgpCisgICAgICAgICAgICAgICAg
bV93aWR0aC5zZXRUcmFpbGluZ1doaXRlc3BhY2VXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoKTsK
KworICAgICAgICAgICAgaWYgKCFtX2FwcGxpZWRTdGFydFdpZHRoKSB7CisgICAgICAgICAgICAg
ICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJl
bnQubV9vYmosIHRydWUsIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgbV9hcHBsaWVkU3RhcnRX
aWR0aCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyNpZiBFTkFCTEUoQ1NTX1NIQVBFUykKKyAg
ICAgICAgICAgIGlmIChtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpCisgICAgICAgICAgICAg
ICAgdXBkYXRlU2VnbWVudHNGb3JTaGFwZXMobV9ibG9jaywgbV9sYXN0RmxvYXRGcm9tUHJldmlv
dXNMaW5lLCB3b3JkTWVhc3VyZW1lbnRzLCBtX3dpZHRoLCBtX2xpbmVJbmZvLmlzRmlyc3RMaW5l
KCkpOworI2VuZGlmCisgICAgICAgICAgICBhcHBseVdvcmRTcGFjaW5nID0gd29yZFNwYWNpbmcg
JiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKKworICAgICAgICAgICAgaWYgKCFtX3dpZHRo
LmNvbW1pdHRlZFdpZHRoKCkgJiYgbV9hdXRvV3JhcCAmJiAhbV93aWR0aC5maXRzT25MaW5lKCkp
CisgICAgICAgICAgICAgICAgbV93aWR0aC5maXRCZWxvd0Zsb2F0cygpOworCisgICAgICAgICAg
ICBpZiAobV9hdXRvV3JhcCB8fCBicmVha1dvcmRzKSB7CisgICAgICAgICAgICAgICAgLy8gSWYg
d2UgYnJlYWsgb25seSBhZnRlciB3aGl0ZS1zcGFjZSwgY29uc2lkZXIgdGhlIGN1cnJlbnQgY2hh
cmFjdGVyCisgICAgICAgICAgICAgICAgLy8gYXMgY2FuZGlkYXRlIHdpZHRoIGZvciB0aGlzIGxp
bmUuCisgICAgICAgICAgICAgICAgYm9vbCBsaW5lV2FzVG9vV2lkZSA9IGZhbHNlOworICAgICAg
ICAgICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoKSAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlICYmIG1fY3VycmVudFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRlU3BhY2UoKSAmJiAh
bWlkV29yZEJyZWFrKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNoYXJXaWR0aCA9IHRl
eHRXaWR0aChyZW5kZXJUZXh0LCBtX2N1cnJlbnQubV9wb3MsIDEsIGZvbnQsIG1fd2lkdGguY3Vy
cmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFz
dXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSArIChhcHBseVdvcmRTcGFjaW5nID8g
d29yZFNwYWNpbmcgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGluZSBp
cyB0b28gYmlnIGV2ZW4gd2l0aG91dCB0aGUgZXh0cmEgc3BhY2UKKyAgICAgICAgICAgICAgICAg
ICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gSWYgaXQgaXMgbm90LCBkbyBub3RoaW5nLgor
ICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBuZWVkcyB0aGUgZXh0cmEgd2hpdGVz
cGFjZSB0byBiZSB0b28gbG9uZywKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBtb3ZlIHRo
ZSBsaW5lIGJyZWFrIHRvIHRoZSBzcGFjZSBhbmQgc2tpcCBhbGwKKyAgICAgICAgICAgICAgICAg
ICAgLy8gYWRkaXRpb25hbCB3aGl0ZXNwYWNlLgorICAgICAgICAgICAgICAgICAgICBpZiAoIW1f
d2lkdGguZml0c09uTGluZUluY2x1ZGluZ0V4dHJhV2lkdGgoY2hhcldpZHRoKSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgbGluZVdhc1Rvb1dpZGUgPSB0cnVlOworICAgICAgICAgICAgICAg
ICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1f
cG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOworICAgICAgICAgICAgICAg
ICAgICAgICAgbV9saW5lQnJlYWtlci5za2lwVHJhaWxpbmdXaGl0ZXNwYWNlKG1fbGluZUJyZWFr
LCBtX2xpbmVJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBpZiAobGluZVdhc1Rvb1dpZGUgfHwgIW1fd2lkdGguZml0c09uTGlu
ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYW5IeXBoZW5hdGUgJiYgIW1fd2lkdGgu
Zml0c09uTGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnlIeXBoZW5hdGluZyhy
ZW5kZXJUZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGlu
ZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMoKSwgc3R5bGUuaHlwaGVuYXRp
b25MaW1pdEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QWZ0ZXIoKSwgbGFzdFNwYWNl
LCBtX2N1cnJlbnQubV9wb3MsIG1fd2lkdGguY3VycmVudFdpZHRoKCkgLSBhZGRpdGlvbmFsVGVt
cFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBz
ZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBtX2xpbmVCcmVhaywgbV9jdXJyZW50
Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBtX2xpbmVCcmVha2VyLm1faHlwaGVuYXRlZCk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fbGluZUJy
ZWFrLmF0VGV4dFBhcmFncmFwaFNlcGFyYXRvcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQubV9wb3MgPiAwKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGlu
ZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2xp
bmVCcmVhay5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUluZm8u
c2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOworICAgICAgICAgICAgICAgICAgICAg
ICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrLm1fcG9zOworICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVhay5tX29i
aiAmJiBtX2xpbmVCcmVhay5tX3BvcyAmJiBtX2xpbmVCcmVhay5tX29iai0+aXNUZXh0KCkgJiYg
dG9SZW5kZXJUZXh0KG1fbGluZUJyZWFrLm1fb2JqKS0+dGV4dExlbmd0aCgpICYmIHRvUmVuZGVy
VGV4dChtX2xpbmVCcmVhay5tX29iaiktPmNoYXJhY3RlckF0KG1fbGluZUJyZWFrLm1fcG9zIC0g
MSkgPT0gc29mdEh5cGhlbiAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUpCisgICAg
ICAgICAgICAgICAgICAgICAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKG1fbGluZUJyZWFrLm1fcG9zICYmIG1fbGluZUJyZWFrLm1fcG9zICE9ICh1bnNpZ25l
ZCl3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ICYmICF3b3JkTWVhc3VyZW1lbnQud2lkdGgpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFyV2lkdGgpIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9saW5lQnJlYWsubV9w
b3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0g
Y2hhcldpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgIC8vIERpZG4ndCBmaXQuIEp1bXAgdG8gdGhlIGVuZCB1
bmxlc3MgdGhlcmUncyBzdGlsbCBhbiBvcHBvcnR1bml0eSB0byBjb2xsYXBzZSB3aGl0ZXNwYWNl
LgorICAgICAgICAgICAgICAgICAgICBpZiAobV9pZ25vcmluZ1NwYWNlcyB8fCAhbV9jb2xsYXBz
ZVdoaXRlU3BhY2UgfHwgIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgfHwgIXByZXZpb3VzQ2hh
cmFjdGVySXNTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7
CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAo
IWJldHdlZW5Xb3JkcyB8fCAobWlkV29yZEJyZWFrICYmICFtX2F1dG9XcmFwKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aCgtYWRkaXRpb25hbFRl
bXBXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoeXBoZW5XaWR0aCkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gU3VidHJhY3QgdGhlIHdpZHRoIG9mIHRoZSBzb2Z0IGh5cGhl
biBvdXQgc2luY2Ugd2UgZml0IG9uIGEgbGluZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1f
d2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aCgtaHlwaGVuV2lkdGgpOworICAgICAgICAgICAgICAg
ICAgICAgICAgaHlwaGVuV2lkdGggPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYyA9PSAnXG4nICYm
IG1fcHJlc2VydmVzTmV3bGluZSkgeworICAgICAgICAgICAgICAgIGlmICghc3RvcHBlZElnbm9y
aW5nU3BhY2VzICYmIG1fY3VycmVudC5tX3BvcyA+IDApCisgICAgICAgICAgICAgICAgICAgIGVu
c3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7
CisgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9j
dXJyZW50Lm1fcG9zLCBtX2N1cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOworICAgICAg
ICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOworICAgICAgICAgICAgICAgIG1fbGlu
ZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOworICAgICAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobV9hdXRvV3Jh
cCAmJiBiZXR3ZWVuV29yZHMpIHsKKyAgICAgICAgICAgICAgICBtX3dpZHRoLmNvbW1pdCgpOwor
ICAgICAgICAgICAgICAgIHdyYXBXID0gMDsKKyAgICAgICAgICAgICAgICBtX2xpbmVCcmVhay5t
b3ZlVG8obV9jdXJyZW50Lm1fb2JqLCBtX2N1cnJlbnQubV9wb3MsIG1fY3VycmVudC5tX25leHRC
cmVha2FibGVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgLy8gQXV0by13cmFwcGluZyB0ZXh0
IHNob3VsZCBub3Qgd3JhcCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBvbmNlIGl0IGhhcyBoYWQg
YW4KKyAgICAgICAgICAgICAgICAvLyBvcHBvcnR1bml0eSB0byBicmVhayBhZnRlciBhIHdvcmQu
CisgICAgICAgICAgICAgICAgYnJlYWtXb3JkcyA9IGZhbHNlOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBpZiAobWlkV29yZEJyZWFrICYmICFVMTZfSVNfVFJBSUwoYykgJiYgIShVX0dF
VF9HQ19NQVNLKGMpICYgVV9HQ19NX01BU0spKSB7CisgICAgICAgICAgICAgICAgLy8gUmVtZW1i
ZXIgdGhpcyBhcyBhIGJyZWFrYWJsZSBwb3NpdGlvbiBpbiBjYXNlCisgICAgICAgICAgICAgICAg
Ly8gYWRkaW5nIHRoZSBlbmQgd2lkdGggZm9yY2VzIGEgYnJlYWsuCisgICAgICAgICAgICAgICAg
bV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9jdXJyZW50Lm1fcG9zLCBtX2N1
cnJlbnQubV9uZXh0QnJlYWthYmxlUG9zaXRpb24pOworICAgICAgICAgICAgICAgIG1pZFdvcmRC
cmVhayAmPSAoYnJlYWtXb3JkcyB8fCBicmVha0FsbCk7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGlmIChiZXR3ZWVuV29yZHMpIHsKKyAgICAgICAgICAgICAgICBsYXN0U3BhY2VXb3Jk
U3BhY2luZyA9IGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7CisgICAgICAgICAg
ICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAoYXBwbHlXb3JkU3BhY2luZyAm
JiB3b3JkTWVhc3VyZW1lbnQud2lkdGgpID8gd29yZFNwYWNpbmcgOiAwOworICAgICAgICAgICAg
ICAgIGxhc3RTcGFjZSA9IG1fY3VycmVudC5tX3BvczsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgaWYgKCFtX2lnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jb2xsYXBzZVdo
aXRlU3BhY2UoKSkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGVuY291bnRlciBhIG5ld2xp
bmUsIG9yIGlmIHdlIGVuY291bnRlciBhCisgICAgICAgICAgICAgICAgLy8gc2Vjb25kIHNwYWNl
LCB3ZSBuZWVkIHRvIGdvIGFoZWFkIGFuZCBicmVhayB1cCB0aGlzCisgICAgICAgICAgICAgICAg
Ly8gcnVuIGFuZCBlbnRlciBhIG1vZGUgd2hlcmUgd2Ugc3RhcnQgY29sbGFwc2luZyBzcGFjZXMu
CisgICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgcHJldmlv
dXNDaGFyYWN0ZXJJc1NwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgIG1faWdub3JpbmdTcGFj
ZXMgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGp1c3QgZW50ZXJlZCBhIG1v
ZGUgd2hlcmUgd2UgYXJlIGlnbm9yaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHNwYWNlcy4g
Q3JlYXRlIGEgbWlkcG9pbnQgdG8gdGVybWluYXRlIHRoZSBydW4KKyAgICAgICAgICAgICAgICAg
ICAgLy8gYmVmb3JlIHRoZSBzZWNvbmQgc3BhY2UuCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0
SWdub3JpbmdTcGFjZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9zdGFydE9mSWdub3JlZFNwYWNl
cyk7CisgICAgICAgICAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLnVwZGF0ZU1pZHBvaW50
c0ZvclRyYWlsaW5nQm94ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoKSwg
VHJhaWxpbmdPYmplY3RzOjpEb05vdENvbGxhcHNlRmlyc3RTcGFjZSk7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1faWdub3JpbmdTcGFjZXMp
IHsKKyAgICAgICAgICAgIC8vIFN0b3AgaWdub3Jpbmcgc3BhY2VzIGFuZCBiZWdpbiBhdCB0aGlz
CisgICAgICAgICAgICAvLyBuZXcgcG9pbnQuCisgICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2Vz
ID0gZmFsc2U7CisgICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IGFwcGx5V29yZFNw
YWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7CisgICAgICAgICAgICB3b3JkU3BhY2luZ0ZvcldvcmRN
ZWFzdXJlbWVudCA9IChhcHBseVdvcmRTcGFjaW5nICYmIHdvcmRNZWFzdXJlbWVudHMubGFzdCgp
LndpZHRoKSA/IHdvcmRTcGFjaW5nIDogMDsKKyAgICAgICAgICAgIGxhc3RTcGFjZSA9IG1fY3Vy
cmVudC5tX3BvczsgLy8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQgaW4gYW55IG9mIHRo
ZSBpZ25vcmVkIHNwYWNlcy4KKyAgICAgICAgICAgIHN0b3BJZ25vcmluZ1NwYWNlcyhtX2xpbmVN
aWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJlbnQubV9vYmosIG1fY3VycmVu
dC5tX3BvcykpOworICAgICAgICB9CisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgaWYgKGlzU1ZH
VGV4dCAmJiBtX2N1cnJlbnQubV9wb3MgPiAwKSB7CisgICAgICAgICAgICAvLyBGb3JjZSBjcmVh
dGlvbiBvZiBuZXcgSW5saW5lQm94ZXMgZm9yIGVhY2ggYWJzb2x1dGUgcG9zaXRpb25lZCBjaGFy
YWN0ZXIgKHRob3NlIHRoYXQgc3RhcnQgbmV3IHRleHQgY2h1bmtzKS4KKyAgICAgICAgICAgIGlm
ICh0b1JlbmRlclNWR0lubGluZVRleHQocmVuZGVyVGV4dCktPmNoYXJhY3RlclN0YXJ0c05ld1Rl
eHRDaHVuayhtX2N1cnJlbnQubV9wb3MpKQorICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3Rl
ckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7CisgICAgICAgIH0K
KyNlbmRpZgorCisgICAgICAgIGlmIChtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFwcmV2
aW91c0NoYXJhY3RlcklzU3BhY2UpIHsKKyAgICAgICAgICAgIG1fc3RhcnRPZklnbm9yZWRTcGFj
ZXMubV9vYmogPSBtX2N1cnJlbnQubV9vYmo7CisgICAgICAgICAgICBtX3N0YXJ0T2ZJZ25vcmVk
U3BhY2VzLm1fcG9zID0gbV9jdXJyZW50Lm1fcG9zOworICAgICAgICAgICAgLy8gU3BhY2VzIGFm
dGVyIHJpZ2h0LWFsaWduZWQgdGV4dCBhbmQgYmVmb3JlIGEgbGluZS1icmVhayBnZXQgY29sbGFw
c2VkIGF3YXkgY29tcGxldGVseSBzbyB0aGF0IHRoZSB0cmFpbGluZworICAgICAgICAgICAgLy8g
c3BhY2UgZG9lc24ndCBzZWVtIHRvIHB1c2ggdGhlIHRleHQgb3V0IGZyb20gdGhlIHJpZ2h0LWhh
bmQgZWRnZS4KKyAgICAgICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhl
IGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2VsaW5pbmcgYSBsb3Qg
b2YgdGVzdCByZXN1bHRzLgorICAgICAgICAgICAgaWYgKG1fbmV4dE9iamVjdCAmJiBtX25leHRP
YmplY3QtPmlzQlIoKSAmJiAobV9ibG9ja1N0eWxlLnRleHRBbGlnbigpID09IFJJR0hUIHx8IG1f
YmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBXRUJLSVRfUklHSFQpKSB7CisgICAgICAgICAgICAg
ICAgbV9zdGFydE9mSWdub3JlZFNwYWNlcy5tX3Bvcy0tOworICAgICAgICAgICAgICAgIC8vIElm
IHRoZXJlJ3MganVzdCBhIHNpbmdsZSB0cmFpbGluZyBzcGFjZSBzdGFydCBpZ25vcmluZyBpdCBu
b3cgc28gaXQgY29sbGFwc2VzIGF3YXkuCisgICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudC5t
X3BvcyA9PSByZW5kZXJUZXh0LT50ZXh0TGVuZ3RoKCkgLSAxKQorICAgICAgICAgICAgICAgICAg
ICBzdGFydElnbm9yaW5nU3BhY2VzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fc3RhcnRPZklnbm9y
ZWRTcGFjZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtX2N1
cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIHByZXZpb3VzQ2hhcmFjdGVySXNXUykgeworICAgICAg
ICAgICAgaWYgKG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUtPmJyZWFrT25seUFmdGVyV2hp
dGVTcGFjZSgpKQorICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrLm1vdmVUbyhtX2N1cnJlbnQu
bV9vYmosIG1fY3VycmVudC5tX3BvcywgbV9jdXJyZW50Lm1fbmV4dEJyZWFrYWJsZVBvc2l0aW9u
KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX2NvbGxhcHNlV2hpdGVTcGFjZSAmJiBtX2N1
cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFtX2lnbm9yaW5nU3BhY2VzKQorICAgICAgICAgICAg
bV90cmFpbGluZ09iamVjdHMuc2V0VHJhaWxpbmdXaGl0ZXNwYWNlKHRvUmVuZGVyVGV4dChtX2N1
cnJlbnQubV9vYmopKTsKKyAgICAgICAgZWxzZSBpZiAoIW1fY3VycmVudFN0eWxlLT5jb2xsYXBz
ZVdoaXRlU3BhY2UoKSB8fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKKyAgICAgICAgICAg
IG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7CisKKyAgICAgICAgbV9hdFN0YXJ0ID0gZmFsc2U7
CisgICAgICAgIG5leHRDaGFyYWN0ZXIoYywgbGFzdENoYXJhY3Rlciwgc2Vjb25kVG9MYXN0Q2hh
cmFjdGVyKTsKKyAgICB9CisKKyAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0
b3Iuc2V0UHJpb3JDb250ZXh0KGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rlcik7
CisKKyAgICB3b3JkTWVhc3VyZW1lbnRzLmdyb3cod29yZE1lYXN1cmVtZW50cy5zaXplKCkgKyAx
KTsKKyAgICBXb3JkTWVhc3VyZW1lbnQmIHdvcmRNZWFzdXJlbWVudCA9IHdvcmRNZWFzdXJlbWVu
dHMubGFzdCgpOworICAgIHdvcmRNZWFzdXJlbWVudC5yZW5kZXJlciA9IHJlbmRlclRleHQ7CisK
KyAgICAvLyBJTVBPUlRBTlQ6IGN1cnJlbnQubV9wb3MgaXMgPiBsZW5ndGggaGVyZSEKKyAgICBm
bG9hdCBhZGRpdGlvbmFsVGVtcFdpZHRoID0gbV9pZ25vcmluZ1NwYWNlcyA/IDAgOiB0ZXh0V2lk
dGgocmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQubV9wb3MgLSBsYXN0U3BhY2UsIGZv
bnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRl
U3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKKyAgICB3
b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQgPSBsYXN0U3BhY2U7CisgICAgd29yZE1lYXN1cmVt
ZW50LmVuZE9mZnNldCA9IG1fY3VycmVudC5tX3BvczsKKyAgICB3b3JkTWVhc3VyZW1lbnQud2lk
dGggPSBtX2lnbm9yaW5nU3BhY2VzID8gMCA6IGFkZGl0aW9uYWxUZW1wV2lkdGggKyB3b3JkU3Bh
Y2luZ0ZvcldvcmRNZWFzdXJlbWVudDsKKyAgICBhZGRpdGlvbmFsVGVtcFdpZHRoICs9IGxhc3RT
cGFjZVdvcmRTcGFjaW5nOworCisgICAgZmxvYXQgaW5saW5lTG9naWNhbFRlbXBXaWR0aCA9IGlu
bGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQubV9vYmosICFtX2FwcGxpZWRTdGFydFdpZHRoLCBt
X2luY2x1ZGVFbmRXaWR0aCk7CisgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0
aW9uYWxUZW1wV2lkdGggKyBpbmxpbmVMb2dpY2FsVGVtcFdpZHRoKTsKKworICAgIGlmICh3b3Jk
TWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5pc0VtcHR5KCkgJiYgIWZhbGxiYWNrRm9udHMuaXNF
bXB0eSgpKQorICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5zd2FwKGZhbGxi
YWNrRm9udHMpOworICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKKworICAgIGlmIChtX2NvbGxh
cHNlV2hpdGVTcGFjZSAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0aW9uYWxU
ZW1wV2lkdGgpCisgICAgICAgIG1fd2lkdGguc2V0VHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoYWRk
aXRpb25hbFRlbXBXaWR0aCwgaW5saW5lTG9naWNhbFRlbXBXaWR0aCk7CisKKyAgICBtX2luY2x1
ZGVFbmRXaWR0aCA9IGZhbHNlOworCisgICAgaWYgKCFtX3dpZHRoLmZpdHNPbkxpbmUoKSkgewor
ICAgICAgICBpZiAoY2FuSHlwaGVuYXRlKQorICAgICAgICAgICAgdHJ5SHlwaGVuYXRpbmcocmVu
ZGVyVGV4dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVz
LCBtX2Jsb2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCksIHN0eWxlLmh5cGhlbmF0aW9u
TGltaXRCZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCksIGxhc3RTcGFjZSwg
bV9jdXJyZW50Lm1fcG9zLCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpIC0gYWRkaXRpb25hbFRlbXBX
aWR0aCwgbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VX
aGl0ZVNwYWNlLCBsYXN0U3BhY2VXb3JkU3BhY2luZywgbV9saW5lQnJlYWssIG1fY3VycmVudC5t
X25leHRCcmVha2FibGVQb3NpdGlvbiwgbV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQpOworCisg
ICAgICAgIGlmICghaHlwaGVuYXRlZCAmJiBtX2xpbmVCcmVhay5wcmV2aW91c0luU2FtZU5vZGUo
KSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkgeworICAg
ICAgICAgICAgaHlwaGVuYXRlZCA9IHRydWU7CisgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsK
KyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIHRl
eHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRpb24oUmVuZGVyT2JqZWN0KiBuZXh0KQoreworICAg
IEFTU0VSVChuZXh0LT5pc1RleHQoKSk7CisgICAgUmVuZGVyVGV4dCogbmV4dFRleHQgPSB0b1Jl
bmRlclRleHQobmV4dCk7CisgICAgaWYgKCFuZXh0VGV4dC0+dGV4dExlbmd0aCgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgVUNoYXIgYyA9IG5leHRUZXh0LT5jaGFyYWN0ZXJBdCgwKTsK
KyAgICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IChjID09ICdcbicgJiYgIW5leHRU
ZXh0LT5wcmVzZXJ2ZXNOZXdsaW5lKCkpOworfQorCitpbmxpbmUgYm9vbCBCcmVha2luZ0NvbnRl
eHQ6OmNhbkJyZWFrQXRUaGlzUG9zaXRpb24oKQoreworICAgIC8vIElmIHdlIGFyZSBuby13cmFw
IGFuZCBoYXZlIGZvdW5kIGEgbGluZS1icmVha2luZyBvcHBvcnR1bml0eSBhbHJlYWR5IHRoZW4g
d2Ugc2hvdWxkIHRha2UgaXQuCisgICAgaWYgKG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiAh
bV93aWR0aC5maXRzT25MaW5lKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpICYmIG1fY3VycldT
ID09IE5PV1JBUCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBBdm9pZCBicmVha2lu
ZyBiZWZvcmUgZW1wdHkgaW5saW5lcy4KKyAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1fbmV4dE9i
amVjdC0+aXNSZW5kZXJJbmxpbmUoKSAmJiBpc0VtcHR5SW5saW5lKHRvUmVuZGVySW5saW5lKCpt
X25leHRPYmplY3QpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gUmV0dXJuIGVh
cmx5IGlmIHdlIGF1dG93cmFwIGFuZCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYSBzcGFjZSBh
cyB3ZSB3aWxsIGFsd2F5cyB3YW50IHRvIGJyZWFrIGF0IHN1Y2ggYSBwb3NpdGlvbi4KKyAgICBp
ZiAobV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5pc0xpbmVC
cmVha09wcG9ydHVuaXR5KCkpCisgICAgICAgIHJldHVybiBtX2F1dG9XcmFwOworCisgICAgYm9v
bCBuZXh0SXNBdXRvV3JhcHBpbmdUZXh0ID0gKG1fbmV4dE9iamVjdCAmJiBtX25leHRPYmplY3Qt
PmlzVGV4dCgpICYmIChtX2F1dG9XcmFwIHx8IG1fbmV4dE9iamVjdC0+c3R5bGUoKS5hdXRvV3Jh
cCgpKSk7CisgICAgaWYgKCFuZXh0SXNBdXRvV3JhcHBpbmdUZXh0KQorICAgICAgICByZXR1cm4g
bV9hdXRvV3JhcDsKKyAgICBib29sIGN1cnJlbnRJc1RleHRPckVtcHR5SW5saW5lID0gbV9jdXJy
ZW50Lm1fb2JqLT5pc1RleHQoKSB8fCAobV9jdXJyZW50Lm1fb2JqLT5pc1JlbmRlcklubGluZSgp
ICYmIGlzRW1wdHlJbmxpbmUodG9SZW5kZXJJbmxpbmUoKm1fY3VycmVudC5tX29iaikpKTsKKyAg
ICBpZiAoIWN1cnJlbnRJc1RleHRPckVtcHR5SW5saW5lKQorICAgICAgICByZXR1cm4gbV9hdXRv
V3JhcDsKKworICAgIGJvb2wgY2FuQnJlYWtIZXJlID0gIW1fY3VycmVudENoYXJhY3RlcklzU3Bh
Y2UgJiYgdGV4dEJlZ2luc1dpdGhCcmVha2FibGVQb3NpdGlvbihtX25leHRPYmplY3QpOworCisg
ICAgLy8gU2VlIGlmIGF0dGVtcHRpbmcgdG8gZml0IGJlbG93IGZsb2F0cyBjcmVhdGVzIG1vcmUg
YXZhaWxhYmxlIHdpZHRoIG9uIHRoZSBsaW5lLgorICAgIGlmICghbV93aWR0aC5maXRzT25MaW5l
KCkgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSkKKyAgICAgICAgbV93aWR0aC5maXRCZWxv
d0Zsb2F0cygpOworCisgICAgYm9vbCBjYW5QbGFjZU9uTGluZSA9IG1fd2lkdGguZml0c09uTGlu
ZSgpIHx8ICFtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmU7CisKKyAgICBpZiAoY2FuUGxhY2VP
bkxpbmUgJiYgY2FuQnJlYWtIZXJlKQorICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRX
aWR0aChtX25leHRPYmplY3QpOworCisgICAgcmV0dXJuIGNhbkJyZWFrSGVyZTsKK30KKworaW5s
aW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojpjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJZk5lZWRl
ZCgpCit7CisgICAgYm9vbCBjaGVja0ZvckJyZWFrID0gY2FuQnJlYWtBdFRoaXNQb3NpdGlvbigp
OworCisgICAgaWYgKGNoZWNrRm9yQnJlYWsgJiYgIW1fd2lkdGguZml0c09uTGluZShtX2lnbm9y
aW5nU3BhY2VzKSkgeworICAgICAgICAvLyBpZiB3ZSBoYXZlIGZsb2F0cywgdHJ5IHRvIGdldCBi
ZWxvdyB0aGVtLgorICAgICAgICBpZiAobV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhbV9p
Z25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VXaGl0ZVNwYWNlKCkpCisg
ICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOworCisgICAgICAgIGlmIChtX3dp
ZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsKKyAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbV93aWR0aC5maXRCZWxvd0Zs
b2F0cygpOworCisgICAgICAgIC8vIHx3aWR0aHwgbWF5IGhhdmUgYmVlbiBhZGp1c3RlZCBiZWNh
dXNlIHdlIGdvdCBzaG92ZWQgZG93biBwYXN0IGEgZmxvYXQgKHRodXMKKyAgICAgICAgLy8gZ2l2
aW5nIHVzIG1vcmUgcm9vbSksIHNvIHdlIG5lZWQgdG8gcmV0ZXN0LCBhbmQgb25seSBqdW1wIHRv
CisgICAgICAgIC8vIHRoZSBlbmQgbGFiZWwgaWYgd2Ugc3RpbGwgZG9uJ3QgZml0IG9uIHRoZSBs
aW5lLiAtZHdoCisgICAgICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lKG1faWdub3JpbmdTcGFj
ZXMpKSB7CisgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobV9ibG9ja1N0eWxlLmF1dG9XcmFwKCkgJiYgIW1f
d2lkdGguZml0c09uTGluZSgpICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsKKyAgICAg
ICAgLy8gSWYgdGhlIGNvbnRhaW5lciBhdXRvd3JhcHMgYnV0IHRoZSBjdXJyZW50IGNoaWxkIGRv
ZXMgbm90IHRoZW4gd2Ugc3RpbGwgbmVlZCB0byBlbnN1cmUgdGhhdCBpdAorICAgICAgICAvLyB3
cmFwcyBhbmQgbW92ZXMgYmVsb3cgYW55IGZsb2F0cy4KKyAgICAgICAgbV93aWR0aC5maXRCZWxv
d0Zsb2F0cygpOworICAgIH0KKworICAgIGlmICghbV9jdXJyZW50Lm1fb2JqLT5pc0Zsb2F0aW5n
T3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgbV9sYXN0T2JqZWN0ID0gbV9jdXJy
ZW50Lm1fb2JqOworICAgICAgICBpZiAobV9sYXN0T2JqZWN0LT5pc1JlcGxhY2VkKCkgJiYgbV9h
dXRvV3JhcCAmJiAoIW1fbGFzdE9iamVjdC0+aXNJbWFnZSgpIHx8IG1fYWxsb3dJbWFnZXNUb0Jy
ZWFrKSAmJiAoIW1fbGFzdE9iamVjdC0+aXNMaXN0TWFya2VyKCkgfHwgdG9SZW5kZXJMaXN0TWFy
a2VyKCptX2xhc3RPYmplY3QpLmlzSW5zaWRlKCkpKSB7CisgICAgICAgICAgICBtX3dpZHRoLmNv
bW1pdCgpOworICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvU3RhcnRPZihtX25leHRPYmpl
Y3QpOworICAgICAgICB9CisgICAgfQorfQorCitpbmxpbmUgdm9pZCBjaGVja01pZHBvaW50cyhM
aW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yJiBsQnJl
YWspCit7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIG91ciBsYXN0IG1pZHBvaW50IGlzIGEgc3Rh
cnQgcG9pbnQgYmV5b25kIHRoZSBsaW5lIGJyZWFrLiBJZiBzbywKKyAgICAvLyBzaGF2ZSBpdCBv
ZmYgdGhlIGxpc3QsIGFuZCBzaGF2ZSBvZmYgYSB0cmFpbGluZyBzcGFjZSBpZiB0aGUgcHJldmlv
dXMgZW5kIHBvaW50IGRvZXNuJ3QKKyAgICAvLyBwcmVzZXJ2ZSB3aGl0ZXNwYWNlLgorICAgIGlm
IChsQnJlYWsubV9vYmogJiYgbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzICYmICEobGlu
ZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzICUgMikpIHsKKyAgICAgICAgSW5saW5lSXRlcmF0
b3IqIG1pZHBvaW50cyA9IGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50cy5kYXRhKCk7CisgICAg
ICAgIElubGluZUl0ZXJhdG9yJiBlbmRwb2ludCA9IG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0
ZS5udW1NaWRwb2ludHMgLSAyXTsKKyAgICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3ImIHN0YXJ0
cG9pbnQgPSBtaWRwb2ludHNbbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzIC0gMV07Cisg
ICAgICAgIElubGluZUl0ZXJhdG9yIGN1cnJwb2ludCA9IGVuZHBvaW50OworICAgICAgICB3aGls
ZSAoIWN1cnJwb2ludC5hdEVuZCgpICYmIGN1cnJwb2ludCAhPSBzdGFydHBvaW50ICYmIGN1cnJw
b2ludCAhPSBsQnJlYWspCisgICAgICAgICAgICBjdXJycG9pbnQuaW5jcmVtZW50KCk7CisgICAg
ICAgIGlmIChjdXJycG9pbnQgPT0gbEJyZWFrKSB7CisgICAgICAgICAgICAvLyBXZSBoaXQgdGhl
IGxpbmUgYnJlYWsgYmVmb3JlIHRoZSBzdGFydCBwb2ludC4gU2hhdmUgb2ZmIHRoZSBzdGFydCBw
b2ludC4KKyAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cy0tOworICAg
ICAgICAgICAgaWYgKGVuZHBvaW50Lm1fb2JqLT5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgp
ICYmIGVuZHBvaW50Lm1fb2JqLT5pc1RleHQoKSkKKyAgICAgICAgICAgICAgICBlbmRwb2ludC5t
X3Bvcy0tOworICAgICAgICB9CisgICAgfQorfQorCitJbmxpbmVJdGVyYXRvciBCcmVha2luZ0Nv
bnRleHQ6OmhhbmRsZUVuZE9mTGluZSgpCit7CisjaWYgRU5BQkxFKENTU19TSEFQRVMpCisgICAg
U2hhcGVJbnNpZGVJbmZvKiBzaGFwZUluZm8gPSBtX2Jsb2NrLmxheW91dFNoYXBlSW5zaWRlSW5m
bygpOworICAgIGJvb2wgc2VnbWVudEFsbG93c092ZXJmbG93ID0gIXNoYXBlSW5mbyB8fCAhc2hh
cGVJbmZvLT5oYXNTZWdtZW50cygpOworI2Vsc2UKKyAgICBib29sIHNlZ21lbnRBbGxvd3NPdmVy
ZmxvdyA9IHRydWU7CisjZW5kaWYKKyAgICBpZiAoc2VnbWVudEFsbG93c092ZXJmbG93KSB7Cisg
ICAgICAgIGlmIChtX2xpbmVCcmVhayA9PSBtX3Jlc29sdmVyLnBvc2l0aW9uKCkpIHsKKyAgICAg
ICAgICAgIGlmICghbV9saW5lQnJlYWsubV9vYmogfHwgIW1fbGluZUJyZWFrLm1fb2JqLT5pc0JS
KCkpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IGFkZCBhcyBtdWNoIGFzIHBvc3NpYmxl
CisgICAgICAgICAgICAgICAgaWYgKG1fYmxvY2tTdHlsZS53aGl0ZVNwYWNlKCkgPT0gUFJFICYm
ICFtX2N1cnJlbnQubV9wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92
ZVRvKG1fbGFzdE9iamVjdCwgbV9sYXN0T2JqZWN0LT5pc1RleHQoKSA/IG1fbGFzdE9iamVjdC0+
bGVuZ3RoKCkgOiAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fbGluZUJyZWFrLm1f
b2JqKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGV2ZXIgYnJlYWsgaW4gdGhlIG1p
ZGRsZSBvZiBhIHdvcmQgaWYgd2UgY2FuIGhlbHAgaXQuCisgICAgICAgICAgICAgICAgICAgIC8v
IFRoZXJlJ3Mgbm8gcm9vbSBhdCBhbGwuIFdlIGp1c3QgaGF2ZSB0byBiZSBvbiB0aGlzIGxpbmUs
CisgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gdGhvdWdoIHdlJ2xsIHNwaWxsIG91dC4KKyAg
ICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWsubW92ZVRvKG1fY3VycmVudC5tX29iaiwgbV9j
dXJyZW50Lm1fcG9zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICAvLyBtYWtlIHN1cmUgd2UgY29uc3VtZSBhdCBsZWFzdCBvbmUgY2hhci9vYmplY3QuCisg
ICAgICAgICAgICBpZiAobV9saW5lQnJlYWsgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigpKQorICAg
ICAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3JlbWVudCgpOworICAgICAgICB9IGVsc2UgaWYg
KCFtX2N1cnJlbnQubV9wb3MgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiBtX3dpZHRo
LnVuY29tbWl0dGVkV2lkdGgoKSAmJiAhbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVu
dCkgeworICAgICAgICAgICAgLy8gRG8gbm90IHB1c2ggdGhlIGN1cnJlbnQgb2JqZWN0IHRvIHRo
ZSBuZXh0IGxpbmUsIHdoZW4gdGhpcyBsaW5lIGhhcyBzb21lIGNvbnRlbnQsIGJ1dCBpdCBpcyBz
dGlsbCBjb25zaWRlcmVkIGVtcHR5LgorICAgICAgICAgICAgLy8gRW1wdHkgaW5saW5lIGVsZW1l
bnRzIGxpa2UgPHNwYW4+PC9zcGFuPiBjYW4gcHJvZHVjZSBzdWNoIGxpbmVzIGFuZCBub3cgd2Ug
anVzdCBpZ25vcmUgdGhlc2UgYnJlYWsgb3Bwb3J0dW5pdGllcworICAgICAgICAgICAgLy8gYXQg
dGhlIHN0YXJ0IG9mIGEgbGluZSwgaWYgbm8gd2lkdGggaGFzIGJlZW4gY29tbWl0dGVkIHlldC4K
KyAgICAgICAgICAgIC8vIEJlaGF2ZSBhcyBpZiBpdCB3YXMgYWN0dWFsbHkgZW1wdHkgYW5kIGNv
bnN1bWUgYXQgbGVhc3Qgb25lIG9iamVjdC4KKyAgICAgICAgICAgIG1fbGluZUJyZWFrLmluY3Jl
bWVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2FuaXR5IGNoZWNrIG91ciBtaWRw
b2ludHMuCisgICAgY2hlY2tNaWRwb2ludHMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5lQnJl
YWspOworCisgICAgbV90cmFpbGluZ09iamVjdHMudXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxpbmdC
b3hlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2xpbmVCcmVhaywgVHJhaWxpbmdPYmplY3RzOjpD
b2xsYXBzZUZpcnN0U3BhY2UpOworCisgICAgLy8gV2UgbWlnaHQgaGF2ZSBtYWRlIGxpbmVCcmVh
ayBhbiBpdGVyYXRvciB0aGF0IHBvaW50cyBwYXN0IHRoZSBlbmQKKyAgICAvLyBvZiB0aGUgb2Jq
ZWN0LiBEbyB0aGlzIGFkanVzdG1lbnQgdG8gbWFrZSBpdCBwb2ludCB0byB0aGUgc3RhcnQKKyAg
ICAvLyBvZiB0aGUgbmV4dCBvYmplY3QgaW5zdGVhZCB0byBhdm9pZCBjb25mdXNpbmcgdGhlIHJl
c3Qgb2YgdGhlCisgICAgLy8gY29kZS4KKyAgICBpZiAobV9saW5lQnJlYWsubV9wb3MgPiAwKSB7
CisgICAgICAgIG1fbGluZUJyZWFrLm1fcG9zLS07CisgICAgICAgIG1fbGluZUJyZWFrLmluY3Jl
bWVudCgpOworICAgIH0KKworICAgIHJldHVybiBtX2xpbmVCcmVhazsKK30KKworfQorCisjZW5k
aWYgLy8gQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVyc19oCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uY2I5M2JiYwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9saW5lL0xpbmVCcmVha2VyLmNwcApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDAwIExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5j
LiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2gg
PHNoaXZhbWlkb3dAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3Rl
bXMgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgor
ICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3Rvbiwg
TUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiTGluZUJyZWFrZXIuaCIKKworI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0LmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBMaW5lQnJlYWtlcjo6cmVzZXQoKQoreworICAg
IG1fcG9zaXRpb25lZE9iamVjdHMuY2xlYXIoKTsKKyAgICBtX2h5cGhlbmF0ZWQgPSBmYWxzZTsK
KyAgICBtX2NsZWFyID0gQ05PTkU7Cit9CisKKy8vIEZJWE1FOiBUaGUgZW50aXJlIGNvbmNlcHQg
b2YgdGhlIHNraXBUcmFpbGluZ1doaXRlc3BhY2UgZnVuY3Rpb24gaXMgZmxhd2VkLCBzaW5jZSB3
ZSByZWFsbHkgbmVlZCB0byBiZSBidWlsZGluZworLy8gbGluZSBib3hlcyBldmVuIGZvciBjb250
YWluZXJzIHRoYXQgbWF5IHVsdGltYXRlbHkgY29sbGFwc2UgYXdheS4gT3RoZXJ3aXNlIHdlJ2xs
IG5ldmVyIGdldCBwb3NpdGlvbmVkCisvLyBlbGVtZW50cyBxdWl0ZSByaWdodC4gSW4gb3RoZXIg
d29yZHMsIHdlIG5lZWQgdG8gYnVpbGQgdGhpcyBmdW5jdGlvbidzIHdvcmsgaW50byB0aGUgbm9y
bWFsIGxpbmUKKy8vIG9iamVjdCBpdGVyYXRpb24gcHJvY2Vzcy4KKy8vIE5CLiB0aGlzIGZ1bmN0
aW9uIHdpbGwgaW5zZXJ0IGFueSBmbG9hdGluZyBlbGVtZW50cyB0aGF0IHdvdWxkIG90aGVyd2lz
ZQorLy8gYmUgc2tpcHBlZCBidXQgaXQgd2lsbCBub3QgcG9zaXRpb24gdGhlbS4KK3ZvaWQgTGlu
ZUJyZWFrZXI6OnNraXBUcmFpbGluZ1doaXRlc3BhY2UoSW5saW5lSXRlcmF0b3ImIGl0ZXJhdG9y
LCBjb25zdCBMaW5lSW5mbyYgbGluZUluZm8pCit7CisgICAgd2hpbGUgKCFpdGVyYXRvci5hdEVu
ZCgpICYmICFyZXF1aXJlc0xpbmVCb3goaXRlcmF0b3IsIGxpbmVJbmZvLCBUcmFpbGluZ1doaXRl
c3BhY2UpKSB7CisgICAgICAgIFJlbmRlck9iamVjdCYgb2JqZWN0ID0gKml0ZXJhdG9yLm1fb2Jq
OworICAgICAgICBpZiAob2JqZWN0LmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKQorICAgICAgICAg
ICAgc2V0U3RhdGljUG9zaXRpb25zKG1fYmxvY2ssIHRvUmVuZGVyQm94KG9iamVjdCkpOworICAg
ICAgICBlbHNlIGlmIChvYmplY3QuaXNGbG9hdGluZygpKQorICAgICAgICAgICAgbV9ibG9jay5p
bnNlcnRGbG9hdGluZ09iamVjdCh0b1JlbmRlckJveChvYmplY3QpKTsKKyAgICAgICAgaXRlcmF0
b3IuaW5jcmVtZW50KCk7CisgICAgfQorfQorCit2b2lkIExpbmVCcmVha2VyOjpza2lwTGVhZGlu
Z1doaXRlc3BhY2UoSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgTGluZUluZm8mIGxpbmVJ
bmZvLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgTGluZVdpZHRo
JiB3aWR0aCkKK3sKKyAgICB3aGlsZSAoIXJlc29sdmVyLnBvc2l0aW9uKCkuYXRFbmQoKSAmJiAh
cmVxdWlyZXNMaW5lQm94KHJlc29sdmVyLnBvc2l0aW9uKCksIGxpbmVJbmZvLCBMZWFkaW5nV2hp
dGVzcGFjZSkpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0JiBvYmplY3QgPSAqcmVzb2x2ZXIucG9z
aXRpb24oKS5tX29iajsKKyAgICAgICAgaWYgKG9iamVjdC5pc091dE9mRmxvd1Bvc2l0aW9uZWQo
KSkgeworICAgICAgICAgICAgc2V0U3RhdGljUG9zaXRpb25zKG1fYmxvY2ssIHRvUmVuZGVyQm94
KG9iamVjdCkpOworICAgICAgICAgICAgaWYgKG9iamVjdC5zdHlsZSgpLmlzT3JpZ2luYWxEaXNw
bGF5SW5saW5lVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgcmVzb2x2ZXIucnVucygpLmFkZFJ1
bihuZXcgQmlkaVJ1bigwLCAxLCBvYmplY3QsIHJlc29sdmVyLmNvbnRleHQoKSwgcmVzb2x2ZXIu
ZGlyKCkpKTsKKyAgICAgICAgICAgICAgICBsaW5lSW5mby5pbmNyZW1lbnRSdW5zRnJvbUxlYWRp
bmdXaGl0ZXNwYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0
LmlzRmxvYXRpbmcoKSkgeworICAgICAgICAgICAgLy8gVGhlIHRvcCBtYXJnaW4gZWRnZSBvZiBh
IHNlbGYtY29sbGFwc2luZyBibG9jayB0aGF0IGNsZWFycyBhIGZsb2F0IGludHJ1ZGVzIHVwIGlu
dG8gaXQgYnkgdGhlIGhlaWdodCBvZiB0aGUgbWFyZ2luLAorICAgICAgICAgICAgLy8gc28gaW4g
b3JkZXIgdG8gcGxhY2UgdGhpcyBmaXJzdCBjaGlsZCBmbG9hdCBhdCB0aGUgdG9wIGNvbnRlbnQg
ZWRnZSBvZiB0aGUgc2VsZi1jb2xsYXBzaW5nIGJsb2NrIGFkZCB0aGUgbWFyZ2luIGJhY2sgaW4g
YmVmb3JlIHBsYWNlbWVudC4KKyAgICAgICAgICAgIExheW91dFVuaXQgbWFyZ2luT2Zmc2V0ID0g
KCFvYmplY3QucHJldmlvdXNTaWJsaW5nKCkgJiYgbV9ibG9jay5pc1NlbGZDb2xsYXBzaW5nQmxv
Y2soKSAmJiBtX2Jsb2NrLnN0eWxlKCkuY2xlYXIoKSAmJiBtX2Jsb2NrLmdldENsZWFyRGVsdGEo
bV9ibG9jaywgTGF5b3V0VW5pdCgpKSkgPyBtX2Jsb2NrLmNvbGxhcHNlZE1hcmdpbkJlZm9yZUZv
ckNoaWxkKG1fYmxvY2spIDogTGF5b3V0VW5pdCgpOworICAgICAgICAgICAgTGF5b3V0VW5pdCBv
bGRMb2dpY2FsSGVpZ2h0ID0gbV9ibG9jay5sb2dpY2FsSGVpZ2h0KCk7CisgICAgICAgICAgICBt
X2Jsb2NrLnNldExvZ2ljYWxIZWlnaHQob2xkTG9naWNhbEhlaWdodCArIG1hcmdpbk9mZnNldCk7
CisgICAgICAgICAgICBtX2Jsb2NrLnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUobV9ibG9jay5pbnNl
cnRGbG9hdGluZ09iamVjdCh0b1JlbmRlckJveChvYmplY3QpKSwgbGFzdEZsb2F0RnJvbVByZXZp
b3VzTGluZSwgbGluZUluZm8sIHdpZHRoKTsKKyAgICAgICAgICAgIG1fYmxvY2suc2V0TG9naWNh
bEhlaWdodChvbGRMb2dpY2FsSGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIGlmIChvYmplY3QuaXNU
ZXh0KCkgJiYgb2JqZWN0LnN0eWxlKCkuaGFzVGV4dENvbWJpbmUoKSAmJiBvYmplY3QuaXNDb21i
aW5lVGV4dCgpICYmICF0b1JlbmRlckNvbWJpbmVUZXh0KG9iamVjdCkuaXNDb21iaW5lZCgpKSB7
CisgICAgICAgICAgICB0b1JlbmRlckNvbWJpbmVUZXh0KG9iamVjdCkuY29tYmluZVRleHQoKTsK
KyAgICAgICAgICAgIGlmICh0b1JlbmRlckNvbWJpbmVUZXh0KG9iamVjdCkuaXNDb21iaW5lZCgp
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHJlc29sdmVy
LmluY3JlbWVudCgpOworICAgIH0KKyAgICByZXNvbHZlci5jb21taXRFeHBsaWNpdEVtYmVkZGlu
ZygpOworfQorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9M
aW5lQnJlYWtlci5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWVjZmJlCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIuaApAQCAt
MCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIExhcnMgS25vbGwgKGtub2xs
QGtkZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgs
IDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21haWwuY29tPgorICogQ29w
eXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwor
ICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLwor
CisjaWZuZGVmIExpbmVCcmVha2VyX2gKKyNkZWZpbmUgTGluZUJyZWFrZXJfaAorCisjaW5jbHVk
ZSAiSW5saW5lSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJMaW5lSW5mby5oIgorI2luY2x1ZGUgIkxp
bmVJbmxpbmVIZWFkZXJzLmgiCisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK2NsYXNzIFJlbmRlclRleHQ7CisKK3N0cnVjdCBSZW5kZXJUZXh0SW5mbyB7
CisgICAgLy8gRGVzdHJ1Y3Rpb24gb2YgbV9sYXlvdXQgcmVxdWlyZXMgVGV4dExheW91dCB0byBi
ZSBhIGNvbXBsZXRlIHR5cGUsIHNvIHRoZSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBhcmUg
bWFkZSBub24taW5saW5lIHRvIGF2b2lkIGNvbXBpbGF0aW9uIGVycm9ycy4KKyAgICBSZW5kZXJU
ZXh0SW5mbygpOworICAgIH5SZW5kZXJUZXh0SW5mbygpOworCisgICAgUmVuZGVyVGV4dCogbV90
ZXh0OworICAgIE93blB0cjxUZXh0TGF5b3V0PiBtX2xheW91dDsKKyAgICBMYXp5TGluZUJyZWFr
SXRlcmF0b3IgbV9saW5lQnJlYWtJdGVyYXRvcjsKKyAgICBjb25zdCBGb250KiBtX2ZvbnQ7Cit9
OworCitjbGFzcyBMaW5lQnJlYWtlciB7CitwdWJsaWM6CisgICAgZnJpZW5kIGNsYXNzIEJyZWFr
aW5nQ29udGV4dDsKKyAgICBMaW5lQnJlYWtlcihSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrKQorICAg
ICAgICA6IG1fYmxvY2soYmxvY2spCisgICAgeworICAgICAgICByZXNldCgpOworICAgIH0KKwor
ICAgIElubGluZUl0ZXJhdG9yIG5leHRMaW5lQnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgTGlu
ZUluZm8mLCBSZW5kZXJUZXh0SW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJl
dmlvdXNMaW5lLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgV29yZE1lYXN1
cmVtZW50cyYpOworCisgICAgYm9vbCBsaW5lV2FzSHlwaGVuYXRlZCgpIHsgcmV0dXJuIG1faHlw
aGVuYXRlZDsgfQorICAgIGNvbnN0IFZlY3RvcjxSZW5kZXJCb3gqPiYgcG9zaXRpb25lZE9iamVj
dHMoKSB7IHJldHVybiBtX3Bvc2l0aW9uZWRPYmplY3RzOyB9CisgICAgRUNsZWFyIGNsZWFyKCkg
eyByZXR1cm4gbV9jbGVhcjsgfQorCitwcml2YXRlOgorICAgIHZvaWQgcmVzZXQoKTsKKworICAg
IElubGluZUl0ZXJhdG9yIG5leHRTZWdtZW50QnJlYWsoSW5saW5lQmlkaVJlc29sdmVyJiwgTGlu
ZUluZm8mLCBSZW5kZXJUZXh0SW5mbyYsIEZsb2F0aW5nT2JqZWN0KiBsYXN0RmxvYXRGcm9tUHJl
dmlvdXNMaW5lLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgV29yZE1lYXN1
cmVtZW50cyYpOworICAgIHZvaWQgc2tpcFRyYWlsaW5nV2hpdGVzcGFjZShJbmxpbmVJdGVyYXRv
ciYsIGNvbnN0IExpbmVJbmZvJik7CisgICAgdm9pZCBza2lwTGVhZGluZ1doaXRlc3BhY2UoSW5s
aW5lQmlkaVJlc29sdmVyJiwgTGluZUluZm8mLCBGbG9hdGluZ09iamVjdCogbGFzdEZsb2F0RnJv
bVByZXZpb3VzTGluZSwgTGluZVdpZHRoJik7CisKKyAgICBSZW5kZXJCbG9ja0Zsb3cmIG1fYmxv
Y2s7CisgICAgYm9vbCBtX2h5cGhlbmF0ZWQ7CisgICAgRUNsZWFyIG1fY2xlYXI7CisgICAgVmVj
dG9yPFJlbmRlckJveCo+IG1fcG9zaXRpb25lZE9iamVjdHM7Cit9OworCit9CisKKyNlbmRpZiAv
LyBMaW5lQnJlYWtlcl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGlu
ZS9MaW5lSW5mby5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lSW5mby5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3MThhZAotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmZvLmNwcApAQCAt
MCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5j
b3Jwb3JhdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcKKyAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscworICogICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE
RVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUK
KyAqIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTGluZUlu
Zm8uaCIKKworI2luY2x1ZGUgIlJlbmRlckJsb2NrLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
Kwordm9pZCBMaW5lSW5mbzo6c2V0RW1wdHkoYm9vbCBlbXB0eSwgUmVuZGVyQmxvY2sqIGJsb2Nr
LCBMaW5lV2lkdGgqIGxpbmVXaWR0aCkKK3sKKyAgICBpZiAobV9pc0VtcHR5ID09IGVtcHR5KQor
ICAgICAgICByZXR1cm47CisgICAgbV9pc0VtcHR5ID0gZW1wdHk7CisgICAgaWYgKCFlbXB0eSAm
JiBibG9jayAmJiBmbG9hdFBhZ2luYXRpb25TdHJ1dCgpKSB7CisgICAgICAgIGJsb2NrLT5zZXRM
b2dpY2FsSGVpZ2h0KGJsb2NrLT5sb2dpY2FsSGVpZ2h0KCkgKyBmbG9hdFBhZ2luYXRpb25TdHJ1
dCgpKTsKKyAgICAgICAgc2V0RmxvYXRQYWdpbmF0aW9uU3RydXQoMCk7CisgICAgICAgIGxpbmVX
aWR0aC0+dXBkYXRlQXZhaWxhYmxlV2lkdGgoKTsKKyAgICB9Cit9CisKK30KZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVJbmZvLmggYi9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvbGluZS9MaW5lSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLjY2MzY2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvbGluZS9MaW5lSW5mby5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAg
Y29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcKKyAqICAgIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgZGlzY2xhaW1lciBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTCisgKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAorICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IK
KyAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICog
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgTGluZUlu
Zm9faAorI2RlZmluZSBMaW5lSW5mb19oCisKKyNpbmNsdWRlICJMaW5lV2lkdGguaCIKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBSZW5kZXJCbG9jazsKKworY2xhc3MgTGluZUluZm8g
eworcHVibGljOgorICAgIExpbmVJbmZvKCkKKyAgICAgICAgOiBtX2lzRmlyc3RMaW5lKHRydWUp
CisgICAgICAgICwgbV9pc0xhc3RMaW5lKGZhbHNlKQorICAgICAgICAsIG1faXNFbXB0eSh0cnVl
KQorICAgICAgICAsIG1fcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpCisgICAgICAgICwg
bV9mbG9hdFBhZ2luYXRpb25TdHJ1dCgwKQorICAgICAgICAsIG1fcnVuc0Zyb21MZWFkaW5nV2hp
dGVzcGFjZSgwKQorICAgIHsgfQorCisgICAgYm9vbCBpc0ZpcnN0TGluZSgpIGNvbnN0IHsgcmV0
dXJuIG1faXNGaXJzdExpbmU7IH0KKyAgICBib29sIGlzTGFzdExpbmUoKSBjb25zdCB7IHJldHVy
biBtX2lzTGFzdExpbmU7IH0KKyAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2lz
RW1wdHk7IH0KKyAgICBib29sIHByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpIGNvbnN0IHsgcmV0
dXJuIG1fcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5OyB9CisgICAgTGF5b3V0VW5pdCBmbG9hdFBh
Z2luYXRpb25TdHJ1dCgpIGNvbnN0IHsgcmV0dXJuIG1fZmxvYXRQYWdpbmF0aW9uU3RydXQ7IH0K
KyAgICB1bnNpZ25lZCBydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlKCkgY29uc3QgeyByZXR1cm4g
bV9ydW5zRnJvbUxlYWRpbmdXaGl0ZXNwYWNlOyB9CisgICAgdm9pZCByZXNldFJ1bnNGcm9tTGVh
ZGluZ1doaXRlc3BhY2UoKSB7IG1fcnVuc0Zyb21MZWFkaW5nV2hpdGVzcGFjZSA9IDA7IH0KKyAg
ICB2b2lkIGluY3JlbWVudFJ1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2UoKSB7IG1fcnVuc0Zyb21M
ZWFkaW5nV2hpdGVzcGFjZSsrOyB9CisKKyAgICB2b2lkIHNldEZpcnN0TGluZShib29sIGZpcnN0
TGluZSkgeyBtX2lzRmlyc3RMaW5lID0gZmlyc3RMaW5lOyB9CisgICAgdm9pZCBzZXRMYXN0TGlu
ZShib29sIGxhc3RMaW5lKSB7IG1faXNMYXN0TGluZSA9IGxhc3RMaW5lOyB9CisgICAgdm9pZCBz
ZXRFbXB0eShib29sIGVtcHR5LCBSZW5kZXJCbG9jayogYmxvY2sgPSAwLCBMaW5lV2lkdGgqIGxp
bmVXaWR0aCA9IDApOworICAgIHZvaWQgc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KGJvb2wg
cHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KSB7IG1fcHJldmlvdXNMaW5lQnJva2VDbGVhbmx5ID0g
cHJldmlvdXNMaW5lQnJva2VDbGVhbmx5OyB9CisgICAgdm9pZCBzZXRGbG9hdFBhZ2luYXRpb25T
dHJ1dChMYXlvdXRVbml0IHN0cnV0KSB7IG1fZmxvYXRQYWdpbmF0aW9uU3RydXQgPSBzdHJ1dDsg
fQorCitwcml2YXRlOgorICAgIGJvb2wgbV9pc0ZpcnN0TGluZTsKKyAgICBib29sIG1faXNMYXN0
TGluZTsKKyAgICBib29sIG1faXNFbXB0eTsKKyAgICBib29sIG1fcHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5OworICAgIExheW91dFVuaXQgbV9mbG9hdFBhZ2luYXRpb25TdHJ1dDsKKyAgICB1bnNp
Z25lZCBtX3J1bnNGcm9tTGVhZGluZ1doaXRlc3BhY2U7Cit9OworCit9CisKKyNlbmRpZiAvLyBM
aW5lSW5mb19oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5l
SW5saW5lSGVhZGVycy5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUlubGlu
ZUhlYWRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWExYmVlCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvTGluZUlubGlu
ZUhlYWRlcnMuaApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBM
YXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAyMDA0LCAy
MDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0IHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hhbmdTZW9rIE9oIDxzaGl2YW1pZG93QGdt
YWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBBZG9iZSBTeXN0ZW1zIEluYy4gQWxsIHJp
Z2h0IHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBMaW5lSW5saW5lSGVhZGVyc19oCisjZGVmaW5lIExp
bmVJbmxpbmVIZWFkZXJzX2gKKworI2luY2x1ZGUgIlJlbmRlckxheWVyLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworZW51bSBXaGl0ZXNwYWNlUG9zaXRpb24geyBMZWFkaW5nV2hpdGVzcGFj
ZSwgVHJhaWxpbmdXaGl0ZXNwYWNlIH07CisKK2lubGluZSBib29sIGhhc0lubGluZURpcmVjdGlv
bkJvcmRlcnNQYWRkaW5nT3JNYXJnaW4oY29uc3QgUmVuZGVySW5saW5lJiBmbG93KQoreworICAg
IC8vIFdoZXJlIGFuIGVtcHR5IGlubGluZSBpcyBzcGxpdCBhY3Jvc3MgYW5vbnltb3VzIGJsb2Nr
cyB3ZSBzaG91bGQgb25seSBnaXZlIGxpbmVib3hlcyB0byB0aGUgJ3NpZGVzJyBvZiB0aGUKKyAg
ICAvLyBpbmxpbmUgdGhhdCBoYXZlIGJvcmRlcnMsIHBhZGRpbmcgb3IgbWFyZ2luLgorICAgIGJv
b2wgc2hvdWxkQXBwbHlTdGFydEJvcmRlclBhZGRpbmdPck1hcmdpbiA9ICFmbG93LnBhcmVudCgp
LT5pc0Fub255bW91c0Jsb2NrKCkgfHwgIWZsb3cuaXNJbmxpbmVFbGVtZW50Q29udGludWF0aW9u
KCk7CisgICAgaWYgKHNob3VsZEFwcGx5U3RhcnRCb3JkZXJQYWRkaW5nT3JNYXJnaW4gJiYgKGZs
b3cuYm9yZGVyU3RhcnQoKSB8fCBmbG93Lm1hcmdpblN0YXJ0KCkgfHwgZmxvdy5wYWRkaW5nU3Rh
cnQoKSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgYm9vbCBzaG91bGRBcHBseUVuZEJv
cmRlclBhZGRpbmdPck1hcmdpbiA9ICFmbG93LnBhcmVudCgpLT5pc0Fub255bW91c0Jsb2NrKCkg
fHwgZmxvdy5pc0lubGluZUVsZW1lbnRDb250aW51YXRpb24oKSB8fCAhZmxvdy5pbmxpbmVFbGVt
ZW50Q29udGludWF0aW9uKCk7CisgICAgcmV0dXJuIHNob3VsZEFwcGx5RW5kQm9yZGVyUGFkZGlu
Z09yTWFyZ2luICYmIChmbG93LmJvcmRlckVuZCgpIHx8IGZsb3cubWFyZ2luRW5kKCkgfHwgZmxv
dy5wYWRkaW5nRW5kKCkpOworfQorCitpbmxpbmUgY29uc3QgUmVuZGVyU3R5bGUmIGxpbmVTdHls
ZShjb25zdCBSZW5kZXJFbGVtZW50JiByZW5kZXJlciwgY29uc3QgTGluZUluZm8mIGxpbmVJbmZv
KQoreworICAgIHJldHVybiBsaW5lSW5mby5pc0ZpcnN0TGluZSgpID8gcmVuZGVyZXIuZmlyc3RM
aW5lU3R5bGUoKSA6IHJlbmRlcmVyLnN0eWxlKCk7Cit9CisKK2lubGluZSBib29sIHJlcXVpcmVz
TGluZUJveEZvckNvbnRlbnQoY29uc3QgUmVuZGVySW5saW5lJiBmbG93LCBjb25zdCBMaW5lSW5m
byYgbGluZUluZm8pCit7CisgICAgUmVuZGVyRWxlbWVudCogcGFyZW50ID0gZmxvdy5wYXJlbnQo
KTsKKyAgICBpZiAoZmxvdy5kb2N1bWVudCgpLmluTm9RdWlya3NNb2RlKCkpIHsKKyAgICAgICAg
Y29uc3QgUmVuZGVyU3R5bGUmIGZsb3dTdHlsZSA9IGxpbmVTdHlsZShmbG93LCBsaW5lSW5mbyk7
CisgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlJiBwYXJlbnRTdHlsZSA9IGxpbmVTdHlsZSgqcGFy
ZW50LCBsaW5lSW5mbyk7CisgICAgICAgIGlmIChmbG93U3R5bGUubGluZUhlaWdodCgpICE9IHBh
cmVudFN0eWxlLmxpbmVIZWlnaHQoKQorICAgICAgICAgICAgfHwgZmxvd1N0eWxlLnZlcnRpY2Fs
QWxpZ24oKSAhPSBwYXJlbnRTdHlsZS52ZXJ0aWNhbEFsaWduKCkKKyAgICAgICAgICAgIHx8ICFw
YXJlbnRTdHlsZS5mb250KCkuZm9udE1ldHJpY3MoKS5oYXNJZGVudGljYWxBc2NlbnREZXNjZW50
QW5kTGluZUdhcChmbG93U3R5bGUuZm9udCgpLmZvbnRNZXRyaWNzKCkpKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9vbCBzaG91
bGRDb2xsYXBzZVdoaXRlU3BhY2UoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBMaW5l
SW5mbyYgbGluZUluZm8sIFdoaXRlc3BhY2VQb3NpdGlvbiB3aGl0ZXNwYWNlUG9zaXRpb24pCit7
CisgICAgLy8gQ1NTMiAxNi42LjEKKyAgICAvLyBJZiBhIHNwYWNlIChVKzAwMjApIGF0IHRoZSBi
ZWdpbm5pbmcgb2YgYSBsaW5lIGhhcyAnd2hpdGUtc3BhY2UnIHNldCB0byAnbm9ybWFsJywgJ25v
d3JhcCcsIG9yICdwcmUtbGluZScsIGl0IGlzIHJlbW92ZWQuCisgICAgLy8gSWYgYSBzcGFjZSAo
VSswMDIwKSBhdCB0aGUgZW5kIG9mIGEgbGluZSBoYXMgJ3doaXRlLXNwYWNlJyBzZXQgdG8gJ25v
cm1hbCcsICdub3dyYXAnLCBvciAncHJlLWxpbmUnLCBpdCBpcyBhbHNvIHJlbW92ZWQuCisgICAg
Ly8gSWYgc3BhY2VzIChVKzAwMjApIG9yIHRhYnMgKFUrMDAwOSkgYXQgdGhlIGVuZCBvZiBhIGxp
bmUgaGF2ZSAnd2hpdGUtc3BhY2UnIHNldCB0byAncHJlLXdyYXAnLCBVQXMgbWF5IHZpc3VhbGx5
IGNvbGxhcHNlIHRoZW0uCisgICAgcmV0dXJuIHN0eWxlLT5jb2xsYXBzZVdoaXRlU3BhY2UoKQor
ICAgICAgICB8fCAod2hpdGVzcGFjZVBvc2l0aW9uID09IFRyYWlsaW5nV2hpdGVzcGFjZSAmJiBz
dHlsZS0+d2hpdGVTcGFjZSgpID09IFBSRV9XUkFQICYmICghbGluZUluZm8uaXNFbXB0eSgpIHx8
ICFsaW5lSW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHkoKSkpOworfQorCitpbmxpbmUgYm9v
bCBza2lwTm9uQnJlYWtpbmdTcGFjZShjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQsIGNvbnN0IExp
bmVJbmZvJiBsaW5lSW5mbykKK3sKKyAgICBpZiAoaXQubV9vYmotPnN0eWxlKCkubmJzcE1vZGUo
KSAhPSBTUEFDRSB8fCBpdC5jdXJyZW50KCkgIT0gbm9CcmVha1NwYWNlKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBiYWQuIEl0IG1ha2VzIG5ic3AgaW5j
b25zaXN0ZW50IHdpdGggc3BhY2UgYW5kIHdvbid0IHdvcmsgY29ycmVjdGx5CisgICAgLy8gd2l0
aCBtX21pbldpZHRoL21fbWF4V2lkdGguCisgICAgLy8gRG8gbm90IHNraXAgYSBub24tYnJlYWtp
bmcgc3BhY2UgaWYgaXQgaXMgdGhlIGZpcnN0IGNoYXJhY3RlcgorICAgIC8vIG9uIGEgbGluZSBh
ZnRlciBhIGNsZWFuIGxpbmUgYnJlYWsgKG9yIG9uIHRoZSBmaXJzdCBsaW5lLCBzaW5jZSBwcmV2
aW91c0xpbmVCcm9rZUNsZWFubHkgc3RhcnRzIG9mZgorICAgIC8vIHx0cnVlfCkuCisgICAgaWYg
KGxpbmVJbmZvLmlzRW1wdHkoKSAmJiBsaW5lSW5mby5wcmV2aW91c0xpbmVCcm9rZUNsZWFubHko
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGlu
ZSBib29sIGFsd2F5c1JlcXVpcmVzTGluZUJveChjb25zdCBSZW5kZXJJbmxpbmUmIGZsb3cpCit7
CisgICAgLy8gRklYTUU6IFJpZ2h0IG5vdywgd2Ugb25seSBhbGxvdyBsaW5lIGJveGVzIGZvciBp
bmxpbmVzIHRoYXQgYXJlIHRydWx5IGVtcHR5LgorICAgIC8vIFdlIG5lZWQgdG8gZml4IHRoaXMs
IHRob3VnaCwgYmVjYXVzZSBhdCB0aGUgdmVyeSBsZWFzdCwgaW5saW5lcyBjb250YWluaW5nIG9u
bHkKKyAgICAvLyBpZ25vcmFibGUgd2hpdGVzcGFjZSBzaG91bGQgc2hvdWxkIGFsc28gaGF2ZSBs
aW5lIGJveGVzLgorICAgIHJldHVybiBpc0VtcHR5SW5saW5lKGZsb3cpICYmIGhhc0lubGluZURp
cmVjdGlvbkJvcmRlcnNQYWRkaW5nT3JNYXJnaW4oZmxvdyk7Cit9CisKK2lubGluZSBib29sIHJl
cXVpcmVzTGluZUJveChjb25zdCBJbmxpbmVJdGVyYXRvciYgaXQsIGNvbnN0IExpbmVJbmZvJiBs
aW5lSW5mbyA9IExpbmVJbmZvKCksIFdoaXRlc3BhY2VQb3NpdGlvbiB3aGl0ZXNwYWNlUG9zaXRp
b24gPSBMZWFkaW5nV2hpdGVzcGFjZSkKK3sKKyAgICBpZiAoaXQubV9vYmotPmlzRmxvYXRpbmdP
ck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYg
KGl0Lm1fb2JqLT5pc0JSKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgYm9vbCByZW5k
ZXJlcklzRW1wdHlJbmxpbmUgPSBmYWxzZTsKKyAgICBpZiAoaXQubV9vYmotPmlzUmVuZGVySW5s
aW5lKCkpIHsKKyAgICAgICAgY29uc3QgUmVuZGVySW5saW5lJiBpbmxpbmVSZW5kZXJlciA9IHRv
UmVuZGVySW5saW5lKCppdC5tX29iaik7CisgICAgICAgIGlmICghYWx3YXlzUmVxdWlyZXNMaW5l
Qm94KGlubGluZVJlbmRlcmVyKSAmJiAhcmVxdWlyZXNMaW5lQm94Rm9yQ29udGVudChpbmxpbmVS
ZW5kZXJlciwgbGluZUluZm8pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBy
ZW5kZXJlcklzRW1wdHlJbmxpbmUgPSBpc0VtcHR5SW5saW5lKGlubGluZVJlbmRlcmVyKTsKKyAg
ICB9CisKKyAgICBpZiAoIXNob3VsZENvbGxhcHNlV2hpdGVTcGFjZSgmaXQubV9vYmotPnN0eWxl
KCksIGxpbmVJbmZvLCB3aGl0ZXNwYWNlUG9zaXRpb24pKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIFVDaGFyIGN1cnJlbnQgPSBpdC5jdXJyZW50KCk7CisgICAgYm9vbCBub3RKdXN0V2hp
dGVzcGFjZSA9IGN1cnJlbnQgIT0gJyAnICYmIGN1cnJlbnQgIT0gJ1x0JyAmJiBjdXJyZW50ICE9
IHNvZnRIeXBoZW4gJiYgKGN1cnJlbnQgIT0gJ1xuJyB8fCBpdC5tX29iai0+cHJlc2VydmVzTmV3
bGluZSgpKSAmJiAhc2tpcE5vbkJyZWFraW5nU3BhY2UoaXQsIGxpbmVJbmZvKTsKKyAgICByZXR1
cm4gbm90SnVzdFdoaXRlc3BhY2UgfHwgcmVuZGVyZXJJc0VtcHR5SW5saW5lOworfQorCitpbmxp
bmUgdm9pZCBzZXRTdGF0aWNQb3NpdGlvbnMoUmVuZGVyQmxvY2tGbG93JiBibG9jaywgUmVuZGVy
Qm94JiBjaGlsZCkKK3sKKyAgICAvLyBGSVhNRTogVGhlIG1hdGggaGVyZSBpcyBhY3R1YWxseSBu
b3QgcmVhbGx5IHJpZ2h0LiBJdCdzIGEgYmVzdC1ndWVzcyBhcHByb3hpbWF0aW9uIHRoYXQKKyAg
ICAvLyB3aWxsIHdvcmsgZm9yIHRoZSBjb21tb24gY2FzZXMKKyAgICBSZW5kZXJFbGVtZW50KiBj
b250YWluZXJCbG9jayA9IGNoaWxkLmNvbnRhaW5lcigpOworICAgIExheW91dFVuaXQgYmxvY2tI
ZWlnaHQgPSBibG9jay5sb2dpY2FsSGVpZ2h0KCk7CisgICAgaWYgKGNvbnRhaW5lckJsb2NrLT5p
c1JlbmRlcklubGluZSgpKSB7CisgICAgICAgIC8vIEEgcmVsYXRpdmUgcG9zaXRpb25lZCBpbmxp
bmUgZW5jbG9zZXMgdXMuIEluIHRoaXMgY2FzZSwgd2UgYWxzbyBoYXZlIHRvIGRldGVybWluZSBv
dXIKKyAgICAgICAgLy8gcG9zaXRpb24gYXMgdGhvdWdoIHdlIHdlcmUgYW4gaW5saW5lLiBTZXQg
fHN0YXRpY0lubGluZVBvc2l0aW9ufCBhbmQgfHN0YXRpY0Jsb2NrUG9zaXRpb258IG9uIHRoZSBy
ZWxhdGl2ZSBwb3NpdGlvbmVkCisgICAgICAgIC8vIGlubGluZSBzbyB0aGF0IHdlIGNhbiBvYnRh
aW4gdGhlIHZhbHVlIGxhdGVyLgorICAgICAgICB0b1JlbmRlcklubGluZShjb250YWluZXJCbG9j
ayktPmxheWVyKCktPnNldFN0YXRpY0lubGluZVBvc2l0aW9uKGJsb2NrLnN0YXJ0QWxpZ25lZE9m
ZnNldEZvckxpbmUoYmxvY2tIZWlnaHQsIGZhbHNlKSk7CisgICAgICAgIHRvUmVuZGVySW5saW5l
KGNvbnRhaW5lckJsb2NrKS0+bGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlvbihibG9ja0hl
aWdodCk7CisgICAgfQorICAgIGJsb2NrLnVwZGF0ZVN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hp
bGQoY2hpbGQsIGJsb2NrSGVpZ2h0KTsKKyAgICBjaGlsZC5sYXllcigpLT5zZXRTdGF0aWNCbG9j
a1Bvc2l0aW9uKGJsb2NrSGVpZ2h0KTsKK30KKworfQorCisjZW5kaWYK
</data>

          </attachment>
      

    </bug>

</bugzilla>