<?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>173877</bug_id>
          
          <creation_ts>2017-06-27 09:09:51 -0700</creation_ts>
          <short_desc>[GTK][WPE] Implement API::IconLoadingClient and rework WebKitFaviconDatabase to use IconDatabase directly</short_desc>
          <delta_ts>2017-06-29 03:00:36 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit2</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>173874</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Carlos Garcia Campos">cgarcia</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>beidson</cc>
    
    <cc>bugs-noreply</cc>
    
    <cc>buildbot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1323142</commentid>
    <comment_count>0</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2017-06-27 09:09:51 -0700</bug_when>
    <thetext>This way IconDatabase and its related classes can be removed from WebCore, as well as the WebKit2 implementation and C API.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1323143</commentid>
    <comment_count>1</comment_count>
      <attachid>313916</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2017-06-27 09:15:02 -0700</bug_when>
    <thetext>Created attachment 313916
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1323150</commentid>
    <comment_count>2</comment_count>
      <attachid>313919</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2017-06-27 09:39:14 -0700</bug_when>
    <thetext>Created attachment 313919
Patch

Fix WPE build, I forgot to update the WPE makefile. We should move common glib api files to a shared makefile at some point.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1323212</commentid>
    <comment_count>3</comment_count>
      <attachid>313919</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2017-06-27 13:14:56 -0700</bug_when>
    <thetext>Comment on attachment 313919
Patch

lgtm</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1323213</commentid>
    <comment_count>4</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-06-27 13:32:31 -0700</bug_when>
    <thetext>Attachment 313919 did not pass style-queue:


ERROR: Source/WebKit2/UIProcess/API/glib/WebKitIconLoadingClient.cpp:36:  Extra space before ( in function call  [whitespace/parens] [4]
Total errors found: 1 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>1323442</commentid>
    <comment_count>5</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2017-06-27 23:04:35 -0700</bug_when>
    <thetext>(In reply to Brady Eidson from comment #3)
&gt; Comment on attachment 313919 [details]
&gt; Patch
&gt; 
&gt; lgtm

Thanks, could you also review bug #173874 that is blocking this one?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1323916</commentid>
    <comment_count>6</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2017-06-29 03:00:36 -0700</bug_when>
    <thetext>Committed r218922: &lt;http://trac.webkit.org/changeset/218922&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>313916</attachid>
            <date>2017-06-27 09:15:02 -0700</date>
            <delta_ts>2017-06-27 09:39:14 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>wk2-glib-favicons.diff</filename>
            <type>text/plain</type>
            <size>128694</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQyL0No
YW5nZUxvZwppbmRleCA0NmZlN2Q1OTQyOS4uNmFkMTAyMmQ1ZTggMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQyL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwxNDUgQEAKKzIwMTctMDYtMjcgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBp
Z2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdW1dQRV0gSW1wbGVtZW50IEFQSTo6SWNvbkxvYWRp
bmdDbGllbnQgYW5kIHJld29yayBXZWJLaXRGYXZpY29uRGF0YWJhc2UgdG8gdXNlIEljb25EYXRh
YmFzZSBkaXJlY3RseQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTczODc3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgVGhpcyB3YXkgSWNvbkRhdGFiYXNlIGFuZCBpdHMgcmVsYXRlZCBjbGFzc2VzIGNhbiBi
ZSByZW1vdmVkIGZyb20gV2ViQ29yZSwgYXMgd2VsbCBhcyB0aGUgV2ViS2l0MiBpbXBsZW1lbnRh
dGlvbgorICAgICAgICBhbmQgQyBBUEkuIEZvciBub3cgSSd2ZSBjb3BpZWQgSWNvbkRhdGFiYXNl
IGZyb20gV2ViQ29yZSB0byBXZWJLaXQyIHVuZGVyIHRoZSBnbGliIEFQSSBkaXJlY3RvcnksIGFk
ZGluZyB0aGUKKyAgICAgICAgcmVsYXRlZCBjbGFzc2VzIGFzIHByaXZhdGUgaW5zaWRlIEljb25E
YXRhYmFzZSwgYW5kIHJlbW92aW5nIHNvbWUgbWV0aG9kcyB0aGF0IGFyZSBub3QgdXNlZCBieSB0
aGUgR0xpYiBBUEkuCisKKyAgICAgICAgKiBQbGF0Zm9ybUdUSy5jbWFrZToKKyAgICAgICAgKiBV
SVByb2Nlc3MvQVBJL2dsaWIvSWNvbkRhdGFiYXNlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJL
aXQ6OnVybEZvckxvZ2dpbmcpOgorICAgICAgICAoV2ViS2l0OjpkZWZhdWx0Q2xpZW50KToKKyAg
ICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjpJY29uUmVjb3JkKToKKyAg
ICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjp+SWNvblJlY29yZCk6Cisg
ICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6SWNvblJlY29yZDo6aW1hZ2UpOgorICAgICAg
ICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6Okljb25SZWNvcmQ6OnNldEltYWdlRGF0YSk6CisgICAg
ICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6SWNvblJlY29yZDo6bG9hZEltYWdlRnJvbVJlc291
cmNlKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjppbWFnZURh
dGFTdGF0dXMpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6Okljb25SZWNvcmQ6OnNu
YXBzaG90KToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpQYWdlVVJMUmVjb3JkOjpQ
YWdlVVJMUmVjb3JkKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpQYWdlVVJMUmVj
b3JkOjp+UGFnZVVSTFJlY29yZCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6UGFn
ZVVSTFJlY29yZDo6c2V0SWNvblJlY29yZCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFz
ZTo6UGFnZVVSTFJlY29yZDo6c25hcHNob3QpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJh
c2U6OnNldENsaWVudCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6b3Blbik6Cisg
ICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6Y2xvc2UpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OnJlbW92ZUFsbEljb25zKToKKyAgICAgICAgKFdlYktpdDo6ZG9jdW1lbnRD
YW5IYXZlSWNvbik6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6c3luY2hyb25vdXNJ
Y29uRm9yUGFnZVVSTCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6c3luY2hyb25v
dXNJY29uVVJMRm9yUGFnZVVSTCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6cmV0
YWluSWNvbkZvclBhZ2VVUkwpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6OnBlcmZv
cm1SZXRhaW5JY29uRm9yUGFnZVVSTCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6
cmVsZWFzZUljb25Gb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpw
ZXJmb3JtUmVsZWFzZUljb25Gb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFi
YXNlOjpzZXRJY29uRGF0YUZvckljb25VUkwpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJh
c2U6OnNldEljb25VUkxGb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNl
OjpzeW5jaHJvbm91c0xvYWREZWNpc2lvbkZvckljb25VUkwpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OnN5bmNocm9ub3VzSWNvbkRhdGFLbm93bkZvckljb25VUkwpOgorICAgICAg
ICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6OnNldEVuYWJsZWQpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OmlzRW5hYmxlZCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6
c2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFz
ZTo6aXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFi
YXNlOjpkZWxheURhdGFiYXNlQ2xlYW51cCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFz
ZTo6YWxsb3dEYXRhYmFzZUNsZWFudXApOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6
OmNoZWNrSW50ZWdyaXR5QmVmb3JlT3BlbmluZyk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRh
YmFzZTo6SWNvbkRhdGFiYXNlKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjp+SWNv
bkRhdGFiYXNlKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjp3YWtlU3luY1RocmVh
ZCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6c2NoZWR1bGVPckRlZmVyU3luY1Rp
bWVyKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpzeW5jVGltZXJGaXJlZCk6Cisg
ICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6aXNPcGVuKToKKyAgICAgICAgKFdlYktpdDo6
SWNvbkRhdGFiYXNlOjppc09wZW5CZXNpZGVzTWFpblRocmVhZENhbGxiYWNrcyk6CisgICAgICAg
IChXZWJLaXQ6Okljb25EYXRhYmFzZTo6ZGF0YWJhc2VQYXRoKToKKyAgICAgICAgKFdlYktpdDo6
SWNvbkRhdGFiYXNlOjpkZWZhdWx0RGF0YWJhc2VGaWxlbmFtZSk6CisgICAgICAgIChXZWJLaXQ6
Okljb25EYXRhYmFzZTo6Z2V0T3JDcmVhdGVJY29uUmVjb3JkKToKKyAgICAgICAgKFdlYktpdDo6
SWNvbkRhdGFiYXNlOjpnZXRPckNyZWF0ZVBhZ2VVUkxSZWNvcmQpOgorICAgICAgICAoV2ViS2l0
OjpJY29uRGF0YWJhc2U6OnNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSk6CisgICAgICAgIChXZWJL
aXQ6Okljb25EYXRhYmFzZTo6aWNvbkRhdGFiYXNlU3luY1RocmVhZCk6CisgICAgICAgIChXZWJL
aXQ6OmRhdGFiYXNlVmVyc2lvbk51bWJlcik6CisgICAgICAgIChXZWJLaXQ6OmlzVmFsaWREYXRh
YmFzZSk6CisgICAgICAgIChXZWJLaXQ6OmNyZWF0ZURhdGFiYXNlVGFibGVzKToKKyAgICAgICAg
KFdlYktpdDo6SWNvbkRhdGFiYXNlOjpwZXJmb3JtT3BlbkluaXRpYWxpemF0aW9uKToKKyAgICAg
ICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpjaGVja0ludGVncml0eSk6CisgICAgICAgIChXZWJL
aXQ6Okljb25EYXRhYmFzZTo6cGVyZm9ybVVSTEltcG9ydCk6CisgICAgICAgIChXZWJLaXQ6Oklj
b25EYXRhYmFzZTo6c3luY1RocmVhZE1haW5Mb29wKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRh
dGFiYXNlOjpwZXJmb3JtUGVuZGluZ1JldGFpbkFuZFJlbGVhc2VPcGVyYXRpb25zKToKKyAgICAg
ICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpyZWFkRnJvbURhdGFiYXNlKToKKyAgICAgICAgKFdl
YktpdDo6SWNvbkRhdGFiYXNlOjp3cml0ZVRvRGF0YWJhc2UpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OnBydW5lVW5yZXRhaW5lZEljb25zKToKKyAgICAgICAgKFdlYktpdDo6SWNv
bkRhdGFiYXNlOjpjaGVja0ZvckRhbmdsaW5nUGFnZVVSTHMpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OnJlbW92ZUFsbEljb25zT25UaHJlYWQpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OmRlbGV0ZUFsbFByZXBhcmVkU3RhdGVtZW50cyk6CisgICAgICAgIChXZWJL
aXQ6Okljb25EYXRhYmFzZTo6Y2xlYW51cFN5bmNUaHJlYWQpOgorICAgICAgICAoV2ViS2l0Ojpy
ZWFkeVNRTGl0ZVN0YXRlbWVudCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6c2V0
SWNvblVSTEZvclBhZ2VVUkxJblNRTERhdGFiYXNlKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRh
dGFiYXNlOjpzZXRJY29uSURGb3JQYWdlVVJMSW5TUUxEYXRhYmFzZSk6CisgICAgICAgIChXZWJL
aXQ6Okljb25EYXRhYmFzZTo6cmVtb3ZlUGFnZVVSTEZyb21TUUxEYXRhYmFzZSk6CisgICAgICAg
IChXZWJLaXQ6Okljb25EYXRhYmFzZTo6Z2V0SWNvbklERm9ySWNvblVSTEZyb21TUUxEYXRhYmFz
ZSk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6YWRkSWNvblVSTFRvU1FMRGF0YWJh
c2UpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6OmdldEltYWdlRGF0YUZvckljb25V
UkxGcm9tU1FMRGF0YWJhc2UpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6OnJlbW92
ZUljb25Gcm9tU1FMRGF0YWJhc2UpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6Ondy
aXRlSWNvblNuYXBzaG90VG9TUUxEYXRhYmFzZSk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRh
YmFzZTo6Y2hlY2tDbG9zZWRBZnRlck1haW5UaHJlYWRDYWxsYmFjayk6CisgICAgICAgIChXZWJL
aXQ6Okljb25EYXRhYmFzZTo6ZGlzcGF0Y2hEaWRJbXBvcnRJY29uVVJMRm9yUGFnZVVSTE9uTWFp
blRocmVhZCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6ZGlzcGF0Y2hEaWRJbXBv
cnRJY29uRGF0YUZvclBhZ2VVUkxPbk1haW5UaHJlYWQpOgorICAgICAgICAoV2ViS2l0OjpJY29u
RGF0YWJhc2U6OmRpc3BhdGNoRGlkUmVtb3ZlQWxsSWNvbnNPbk1haW5UaHJlYWQpOgorICAgICAg
ICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6OmRpc3BhdGNoRGlkRmluaXNoVVJMSW1wb3J0T25NYWlu
VGhyZWFkKToKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2dsaWIvSWNvbkRhdGFiYXNlLmg6IEFk
ZGVkLgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2VDbGllbnQ6OmRpZEltcG9ydEljb25V
UkxGb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlQ2xpZW50OjpkaWRJ
bXBvcnRJY29uRGF0YUZvclBhZ2VVUkwpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2VD
bGllbnQ6OmRpZENoYW5nZUljb25Gb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRh
dGFiYXNlQ2xpZW50OjpkaWRSZW1vdmVBbGxJY29ucyk6CisgICAgICAgIChXZWJLaXQ6Okljb25E
YXRhYmFzZUNsaWVudDo6ZGlkRmluaXNoVVJMSW1wb3J0KToKKyAgICAgICAgKFdlYktpdDo6SWNv
bkRhdGFiYXNlQ2xpZW50OjpkaWRDbG9zZSk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFz
ZTo6SWNvblNuYXBzaG90OjpJY29uU25hcHNob3QpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0
YWJhc2U6Okljb25TbmFwc2hvdDo6aWNvblVSTCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRh
YmFzZTo6SWNvblNuYXBzaG90Ojp0aW1lc3RhbXApOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0
YWJhc2U6Okljb25TbmFwc2hvdDo6ZGF0YSk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFz
ZTo6SWNvblJlY29yZDo6Y3JlYXRlKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpJ
Y29uUmVjb3JkOjpnZXRUaW1lc3RhbXApOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6
Okljb25SZWNvcmQ6OnNldFRpbWVzdGFtcCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFz
ZTo6SWNvblJlY29yZDo6aWNvblVSTCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6
SWNvblJlY29yZDo6cmV0YWluaW5nUGFnZVVSTHMpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0
YWJhc2U6OlBhZ2VVUkxTbmFwc2hvdDo6UGFnZVVSTFNuYXBzaG90KToKKyAgICAgICAgKFdlYktp
dDo6SWNvbkRhdGFiYXNlOjpQYWdlVVJMU25hcHNob3Q6OnBhZ2VVUkwpOgorICAgICAgICAoV2Vi
S2l0OjpJY29uRGF0YWJhc2U6OlBhZ2VVUkxTbmFwc2hvdDo6aWNvblVSTCk6CisgICAgICAgIChX
ZWJLaXQ6Okljb25EYXRhYmFzZTo6UGFnZVVSTFJlY29yZDo6dXJsKToKKyAgICAgICAgKFdlYktp
dDo6SWNvbkRhdGFiYXNlOjpQYWdlVVJMUmVjb3JkOjppY29uUmVjb3JkKToKKyAgICAgICAgKFdl
YktpdDo6SWNvbkRhdGFiYXNlOjpQYWdlVVJMUmVjb3JkOjpyZXRhaW4pOgorICAgICAgICAoV2Vi
S2l0OjpJY29uRGF0YWJhc2U6OlBhZ2VVUkxSZWNvcmQ6OnJlbGVhc2UpOgorICAgICAgICAoV2Vi
S2l0OjpJY29uRGF0YWJhc2U6OlBhZ2VVUkxSZWNvcmQ6OnJldGFpbkNvdW50KToKKyAgICAgICAg
KiBVSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0RmF2aWNvbkRhdGFiYXNlLmNwcDoKKyAgICAgICAg
KF9XZWJLaXRGYXZpY29uRGF0YWJhc2VQcml2YXRlOjp+X1dlYktpdEZhdmljb25EYXRhYmFzZVBy
aXZhdGUpOgorICAgICAgICAoZ2V0SWNvblN1cmZhY2VTeW5jaHJvbm91c2x5KToKKyAgICAgICAg
KHdlYmtpdEZhdmljb25EYXRhYmFzZVNldEljb25VUkxGb3JQYWdlVVJMKToKKyAgICAgICAgKHdl
YmtpdEZhdmljb25EYXRhYmFzZUNyZWF0ZSk6CisgICAgICAgICh3ZWJraXRGYXZpY29uRGF0YWJh
c2VPcGVuKToKKyAgICAgICAgKHdlYmtpdEZhdmljb25EYXRhYmFzZUlzT3Blbik6CisgICAgICAg
ICh3ZWJraXRGYXZpY29uRGF0YWJhc2VTZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKToKKyAgICAg
ICAgKHdlYmtpdEZhdmljb25EYXRhYmFzZUdldExvYWREZWNpc2lvbkZvckljb24pOgorICAgICAg
ICAod2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZvclBhZ2VVUkwpOgorICAgICAgICAod2Vi
a2l0X2Zhdmljb25fZGF0YWJhc2VfZ2V0X2Zhdmljb24pOgorICAgICAgICAod2Via2l0X2Zhdmlj
b25fZGF0YWJhc2VfZ2V0X2Zhdmljb25fdXJpKToKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2ds
aWIvV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZS5oOgorICAgICAgICAqIFVJUHJvY2Vzcy9B
UEkvZ2xpYi9XZWJLaXRJY29uTG9hZGluZ0NsaWVudC5jcHA6IEFkZGVkLgorICAgICAgICAoSWNv
bkxvYWRpbmdDbGllbnQ6Okljb25Mb2FkaW5nQ2xpZW50KToKKyAgICAgICAgKGF0dGFjaEljb25M
b2FkaW5nQ2xpZW50VG9WaWV3KToKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0
SWNvbkxvYWRpbmdDbGllbnQuaDogQ29waWVkIGZyb20gU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZVByaXZhdGUuaC4KKyAgICAgICAgKiBVSVBy
b2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViQ29udGV4dC5jcHA6CisgICAgICAgIChlbnN1cmVGYXZp
Y29uRGF0YWJhc2UpOgorICAgICAgICAod2Via2l0V2ViQ29udGV4dEVuYWJsZUljb25EYXRhYmFz
ZVByaXZhdGVCcm93c2luZ0lmTmVlZGVkKToKKyAgICAgICAgKHdlYmtpdFdlYkNvbnRleHREaXNh
YmxlSWNvbkRhdGFiYXNlUHJpdmF0ZUJyb3dzaW5nSWZOZWVkZWQpOgorICAgICAgICAod2Via2l0
X3dlYl9jb250ZXh0X3NldF9mYXZpY29uX2RhdGFiYXNlX2RpcmVjdG9yeSk6CisgICAgICAgICog
VUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdlYlZpZXcuY3BwOgorICAgICAgICAod2Via2l0V2Vi
Vmlld0NvbnN0cnVjdGVkKToKKyAgICAgICAgKHdlYmtpdFdlYlZpZXdHZXRMb2FkRGVjaXNpb25G
b3JJY29uKToKKyAgICAgICAgKHdlYmtpdFdlYlZpZXdTZXRJY29uKToKKyAgICAgICAgKiBVSVBy
b2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViVmlld1ByaXZhdGUuaDoKKwogMjAxNy0wNi0yNiAgQ2hy
aXMgRHVtZXogIDxjZHVtZXpAYXBwbGUuY29tPgogCiAgICAgICAgIFdlYnNpdGVEYXRhU3RvcmU6
OmZldGNoRGF0YUZvclRvcFByaXZhdGVseUNvbnRyb2xsZWREb21haW5zKCkgaXMgaW5lZmZpY2ll
bnQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1BsYXRmb3JtR1RLLmNtYWtlIGIvU291cmNl
L1dlYktpdDIvUGxhdGZvcm1HVEsuY21ha2UKaW5kZXggZDg5NjJkZWFkYzIuLmM5YmZjMGMxYzNm
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9QbGF0Zm9ybUdUSy5jbWFrZQorKysgYi9Tb3Vy
Y2UvV2ViS2l0Mi9QbGF0Zm9ybUdUSy5jbWFrZQpAQCAtMTIwLDYgKzEyMCw3IEBAIGxpc3QoQVBQ
RU5EIFdlYktpdDJfU09VUkNFUwogICAgIFVJUHJvY2Vzcy9BUEkvQy9ndGsvV0tUZXh0Q2hlY2tl
ckd0ay5jcHAKICAgICBVSVByb2Nlc3MvQVBJL0MvZ3RrL1dLVmlldy5jcHAKIAorICAgIFVJUHJv
Y2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2UuY3BwCiAgICAgVUlQcm9jZXNzL0FQSS9nbGliL1dl
YktpdEF1dGhlbnRpY2F0aW9uUmVxdWVzdC5jcHAKICAgICBVSVByb2Nlc3MvQVBJL2dsaWIvV2Vi
S2l0QXV0b21hdGlvblNlc3Npb24uY3BwCiAgICAgVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEJh
Y2tGb3J3YXJkTGlzdC5jcHAKQEAgLTEzOSw2ICsxNDAsNyBAQCBsaXN0KEFQUEVORCBXZWJLaXQy
X1NPVVJDRVMKICAgICBVSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0Rm9ybVN1Ym1pc3Npb25SZXF1
ZXN0LmNwcAogICAgIFVJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRHZW9sb2NhdGlvblBlcm1pc3Np
b25SZXF1ZXN0LmNwcAogICAgIFVJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRHZW9sb2NhdGlvblBy
b3ZpZGVyLmNwcAorICAgIFVJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRJY29uTG9hZGluZ0NsaWVu
dC5jcHAKICAgICBVSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0SW5qZWN0ZWRCdW5kbGVDbGllbnQu
Y3BwCiAgICAgVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEluc3RhbGxNaXNzaW5nTWVkaWFQbHVn
aW5zUGVybWlzc2lvblJlcXVlc3QuY3BwCiAgICAgVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEph
dmFzY3JpcHRSZXN1bHQuY3BwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
QVBJL2dsaWIvSWNvbkRhdGFiYXNlLmNwcCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkv
Z2xpYi9JY29uRGF0YWJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwLi42NjAxOWY0ZWY1MAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2UuY3BwCkBAIC0wLDAgKzEsMjAyMiBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwNi0yMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAwNyBKdXN0aW4gSGF5Z29vZCAoamhheWdvb2RAcmVha3RpeC5j
b20pCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJJY29uRGF0YWJhc2UuaCIKKworI2luY2x1ZGUgIkxvZ2dp
bmcuaCIKKyNpbmNsdWRlIDxXZWJDb3JlL0JpdG1hcEltYWdlLmg+CisjaW5jbHVkZSA8V2ViQ29y
ZS9GaWxlU3lzdGVtLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9JbWFnZS5oPgorI2luY2x1ZGUgPFdl
YkNvcmUvU1FMaXRlU3RhdGVtZW50Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVUcmFuc2Fj
dGlvbi5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU2hhcmVkQnVmZmVyLmg+CisjaW5jbHVkZSA8V2Vi
Q29yZS9VUkwuaD4KKyNpbmNsdWRlIDx3dGYvQXV0b2RyYWluZWRQb29sLmg+CisjaW5jbHVkZSA8
d3RmL01haW5UaHJlYWQuaD4KKyNpbmNsdWRlIDx3dGYvTmV2ZXJEZXN0cm95ZWQuaD4KKyNpbmNs
dWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisKKy8vIEZvciBtZXRob2RzIHRoYXQgYXJlIG1lYW50
IHRvIHN1cHBvcnQgQVBJIGZyb20gdGhlIG1haW4gdGhyZWFkIC0gc2hvdWxkIG5vdCBiZSBjYWxs
ZWQgaW50ZXJuYWxseQorI2RlZmluZSBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCkgQVNTRVJUKCFt
X3N5bmNUaHJlYWRSdW5uaW5nIHx8ICFJU19JQ09OX1NZTkNfVEhSRUFEKCkpCisKKy8vIEZvciBt
ZXRob2RzIHRoYXQgYXJlIG1lYW50IHRvIHN1cHBvcnQgdGhlIHN5bmMgdGhyZWFkIE9OTFkKKyNk
ZWZpbmUgSVNfSUNPTl9TWU5DX1RIUkVBRCgpIChtX3N5bmNUaHJlYWQtPmlkKCkgPT0gY3VycmVu
dFRocmVhZCgpKQorI2RlZmluZSBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpIEFTU0VSVChJU19J
Q09OX1NZTkNfVEhSRUFEKCkpCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3Bh
Y2UgV2ViS2l0IHsKKworc3RhdGljIGludCBkYXRhYmFzZUNsZWFudXBDb3VudGVyID0gMDsKKwor
Ly8gVGhpcyB2ZXJzaW9uIG51bWJlciBpcyBpbiB0aGUgREIgYW5kIG1hcmtzIHRoZSBjdXJyZW50
IGdlbmVyYXRpb24gb2YgdGhlIHNjaGVtYQorLy8gQ3VycmVudGx5LCBhIG1pc21hdGNoZWQgc2No
ZW1hIGNhdXNlcyB0aGUgREIgdG8gYmUgd2lwZWQgYW5kIHJlc2V0LiBUaGlzIGlzbid0CisvLyBz
byBiYWQgZHVyaW5nIGRldmVsb3BtZW50IGJ1dCBpbiB0aGUgZnV0dXJlLCB3ZSB3b3VsZCBuZWVk
IHRvIHdyaXRlIGEgY29udmVyc2lvbgorLy8gZnVuY3Rpb24gdG8gYWR2YW5jZSBvbGRlciByZWxl
YXNlZCBzY2hlbWFzIHRvICJjdXJyZW50Igorc3RhdGljIGNvbnN0IGludCBjdXJyZW50RGF0YWJh
c2VWZXJzaW9uID0gNjsKKworLy8gSWNvbnMgZXhwaXJlIG9uY2UgZXZlcnkgNCBkYXlzCitzdGF0
aWMgY29uc3QgaW50IGljb25FeHBpcmF0aW9uVGltZSA9IDYwKjYwKjI0KjQ7CisKK3N0YXRpYyBj
b25zdCBTZWNvbmRzIHVwZGF0ZVRpbWVyRGVsYXkgeyA1X3MgfTsKKworc3RhdGljIGJvb2wgY2hl
Y2tJbnRlZ3JpdHlPbk9wZW4gPSBmYWxzZTsKKworLy8gV2UgYXJlIG5vdCBpbnRlcmVzdGVkIGlu
IGljb25zIHRoYXQgaGF2ZSBiZWVuIHVudXNlZCBmb3IgbW9yZSB0aGFuCisvLyAzMCBkYXlzLCBk
ZWxldGUgdGhlbSBldmVuIGlmIHRoZXkgaGF2ZSBub3QgYmVlbiBleHBsaWNpdGx5IHJlbGVhc2Vk
Lgorc3RhdGljIGNvbnN0IGludCBub3RVc2VkSWNvbkV4cGlyYXRpb25UaW1lID0gNjAqNjAqMjQq
MzA7CisKKyNpZiAhTE9HX0RJU0FCTEVEIHx8ICFFUlJPUl9ESVNBQkxFRAorc3RhdGljIFN0cmlu
ZyB1cmxGb3JMb2dnaW5nKGNvbnN0IFN0cmluZyYgdXJsKQoreworICAgIHN0YXRpYyBjb25zdCB1
bnNpZ25lZCB1cmxUcnVuY2F0aW9uTGVuZ3RoID0gMTIwOworCisgICAgaWYgKHVybC5sZW5ndGgo
KSA8IHVybFRydW5jYXRpb25MZW5ndGgpCisgICAgICAgIHJldHVybiB1cmw7CisgICAgcmV0dXJu
IHVybC5zdWJzdHJpbmcoMCwgdXJsVHJ1bmNhdGlvbkxlbmd0aCkgKyAiLi4uIjsKK30KKyNlbmRp
ZgorCitjbGFzcyBEZWZhdWx0SWNvbkRhdGFiYXNlQ2xpZW50IGZpbmFsIDogcHVibGljIEljb25E
YXRhYmFzZUNsaWVudCB7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6Cisg
ICAgdm9pZCBkaWRJbXBvcnRJY29uVVJMRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmKSBvdmVycmlk
ZSB7IH0KKyAgICB2b2lkIGRpZEltcG9ydEljb25EYXRhRm9yUGFnZVVSTChjb25zdCBTdHJpbmcm
KSBvdmVycmlkZSB7IH0KKyAgICB2b2lkIGRpZENoYW5nZUljb25Gb3JQYWdlVVJMKGNvbnN0IFN0
cmluZyYpIG92ZXJyaWRlIHsgfQorICAgIHZvaWQgZGlkUmVtb3ZlQWxsSWNvbnMoKSBvdmVycmlk
ZSB7IH0KKyAgICB2b2lkIGRpZEZpbmlzaFVSTEltcG9ydCgpIG92ZXJyaWRlIHsgfQorfTsKKwor
c3RhdGljIEljb25EYXRhYmFzZUNsaWVudCogZGVmYXVsdENsaWVudCgpCit7CisgICAgc3RhdGlj
IEljb25EYXRhYmFzZUNsaWVudCogZGVmYXVsdENsaWVudCA9IG5ldyBEZWZhdWx0SWNvbkRhdGFi
YXNlQ2xpZW50OworICAgIHJldHVybiBkZWZhdWx0Q2xpZW50OworfQorCitJY29uRGF0YWJhc2U6
Okljb25SZWNvcmQ6Okljb25SZWNvcmQoY29uc3QgU3RyaW5nJiB1cmwpCisgICAgOiBtX2ljb25V
UkwodXJsKQoreworfQorCitJY29uRGF0YWJhc2U6Okljb25SZWNvcmQ6On5JY29uUmVjb3JkKCkK
K3sKKyAgICBMT0coSWNvbkRhdGFiYXNlLCAiRGVzdHJveWluZyBJY29uUmVjb3JkIGZvciBpY29u
IHVybCAlcyIsIG1faWNvblVSTC5hc2NpaSgpLmRhdGEoKSk7Cit9CisKK0ltYWdlKiBJY29uRGF0
YWJhc2U6Okljb25SZWNvcmQ6OmltYWdlKGNvbnN0IEludFNpemUmKQoreworICAgIC8vIEZJWE1F
IHJkYXI6Ly80NjgwMzc3IC0gRm9yIHNpemUgcmlnaHQgbm93LCB3ZSBhcmUgcmV0dXJuaW5nIG91
ciBvbmUgYW5kIG9ubHkgaW1hZ2UgYW5kIHRoZSBCcmlkZ2UKKyAgICAvLyBpcyByZXNpemluZyBp
dCBpbiBwbGFjZS4gV2UgbmVlZCB0byBhY3R1YWxseSBzdG9yZSBhbGwgdGhlIG9yaWdpbmFsIHJl
cHJlc2VudGF0aW9ucyBoZXJlIGFuZCByZXR1cm4gYSBuYXRpdmUKKyAgICAvLyBvbmUsIG9yIHJl
c2l6ZSB0aGUgYmVzdCBvbmUgdG8gdGhlIHJlcXVlc3RlZCBzaXplIGFuZCBjYWNoZSB0aGF0IHJl
c3VsdC4KKyAgICByZXR1cm4gbV9pbWFnZS5nZXQoKTsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6
Okljb25SZWNvcmQ6OnNldEltYWdlRGF0YShSZWZQdHI8U2hhcmVkQnVmZmVyPiYmIGRhdGEpCit7
CisgICAgLy8gSXQncyBva2F5IHRvIGRlbGV0ZSB0aGUgcmF3IGltYWdlIGhlcmUuIEFueSBleGlz
dGluZyBjbGllbnRzIHVzaW5nIHRoaXMgaWNvbiB3aWxsIGJlCisgICAgLy8gbWFuYWdpbmcgYW4g
aW1hZ2UgdGhhdCB3YXMgY3JlYXRlZCB3aXRoIGEgY29weSBvZiB0aGlzIHJhdyBpbWFnZSBkYXRh
LgorICAgIG1faW1hZ2UgPSBCaXRtYXBJbWFnZTo6Y3JlYXRlKCk7CisKKyAgICAvLyBDb3B5IHRo
ZSBwcm92aWRlZCBkYXRhIGludG8gdGhlIGJ1ZmZlciBvZiB0aGUgbmV3IEltYWdlIG9iamVjdC4K
KyAgICBpZiAobV9pbWFnZS0+c2V0RGF0YShXVEZNb3ZlKGRhdGEpLCB0cnVlKSA8IEVuY29kZWRE
YXRhU3RhdHVzOjpTaXplQXZhaWxhYmxlKSB7CisgICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJN
YW51YWwgaW1hZ2UgZGF0YSBmb3IgaWNvblVSTCAnJXMnIEZBSUxFRCAtIGl0IHdhcyBwcm9iYWJs
eSBpbnZhbGlkIGltYWdlIGRhdGEiLCBtX2ljb25VUkwuYXNjaWkoKS5kYXRhKCkpOworICAgICAg
ICBtX2ltYWdlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBtX2RhdGFTZXQgPSB0cnVlOworfQor
Cit2b2lkIEljb25EYXRhYmFzZTo6SWNvblJlY29yZDo6bG9hZEltYWdlRnJvbVJlc291cmNlKGNv
bnN0IGNoYXIqIHJlc291cmNlKQoreworICAgIGlmICghcmVzb3VyY2UpCisgICAgICAgIHJldHVy
bjsKKworICAgIG1faW1hZ2UgPSBJbWFnZTo6bG9hZFBsYXRmb3JtUmVzb3VyY2UocmVzb3VyY2Up
OworICAgIG1fZGF0YVNldCA9IHRydWU7Cit9CisKK0ljb25EYXRhYmFzZTo6SWNvblJlY29yZDo6
SW1hZ2VEYXRhU3RhdHVzIEljb25EYXRhYmFzZTo6SWNvblJlY29yZDo6aW1hZ2VEYXRhU3RhdHVz
KCkKK3sKKyAgICBpZiAoIW1fZGF0YVNldCkKKyAgICAgICAgcmV0dXJuIEltYWdlRGF0YVN0YXR1
czo6VW5rbm93bjsKKyAgICBpZiAoIW1faW1hZ2UpCisgICAgICAgIHJldHVybiBJbWFnZURhdGFT
dGF0dXM6Ok1pc3Npbmc7CisgICAgcmV0dXJuIEltYWdlRGF0YVN0YXR1czo6UHJlc2VudDsKK30K
KworSWNvbkRhdGFiYXNlOjpJY29uU25hcHNob3QgSWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjpz
bmFwc2hvdChib29sIGZvckRlbGV0aW9uKSBjb25zdAoreworICAgIGlmIChmb3JEZWxldGlvbikK
KyAgICAgICAgcmV0dXJuIEljb25TbmFwc2hvdChtX2ljb25VUkwsIDAsIDApOworCisgICAgcmV0
dXJuIEljb25TbmFwc2hvdChtX2ljb25VUkwsIG1fc3RhbXAsIG1faW1hZ2UgPyBtX2ltYWdlLT5k
YXRhKCkgOiAwKTsKK30KKworSWNvbkRhdGFiYXNlOjpQYWdlVVJMUmVjb3JkOjpQYWdlVVJMUmVj
b3JkKGNvbnN0IFN0cmluZyYgcGFnZVVSTCkKKyAgICA6IG1fcGFnZVVSTChwYWdlVVJMKQorewor
fQorCitJY29uRGF0YWJhc2U6OlBhZ2VVUkxSZWNvcmQ6On5QYWdlVVJMUmVjb3JkKCkKK3sKKyAg
ICBpZiAobV9pY29uUmVjb3JkKQorICAgICAgICBtX2ljb25SZWNvcmQtPnJldGFpbmluZ1BhZ2VV
UkxzKCkucmVtb3ZlKG1fcGFnZVVSTCk7Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpQYWdlVVJM
UmVjb3JkOjpzZXRJY29uUmVjb3JkKFJlZlB0cjxJY29uUmVjb3JkPiYmIGljb24pCit7CisgICAg
aWYgKG1faWNvblJlY29yZCkKKyAgICAgICAgbV9pY29uUmVjb3JkLT5yZXRhaW5pbmdQYWdlVVJM
cygpLnJlbW92ZShtX3BhZ2VVUkwpOworCisgICAgbV9pY29uUmVjb3JkID0gV1RGTW92ZShpY29u
KTsKKworICAgIGlmIChtX2ljb25SZWNvcmQpCisgICAgICAgIG1faWNvblJlY29yZC0+cmV0YWlu
aW5nUGFnZVVSTHMoKS5hZGQobV9wYWdlVVJMKTsKK30KKworSWNvbkRhdGFiYXNlOjpQYWdlVVJM
U25hcHNob3QgSWNvbkRhdGFiYXNlOjpQYWdlVVJMUmVjb3JkOjpzbmFwc2hvdChib29sIGZvckRl
bGV0aW9uKSBjb25zdAoreworICAgIHJldHVybiB7IG1fcGFnZVVSTCwgKG1faWNvblJlY29yZCAm
JiAhZm9yRGVsZXRpb24pID8gbV9pY29uUmVjb3JkLT5pY29uVVJMKCkgOiBTdHJpbmcoKSB9Owor
fQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICoqKiBNYWluIFRocmVhZCBPbmx5
ICoqKgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqCisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpz
ZXRDbGllbnQoc3RkOjp1bmlxdWVfcHRyPEljb25EYXRhYmFzZUNsaWVudD4mJiBjbGllbnQpCit7
CisgICAgLy8gV2UgZG9uJ3QgYWxsb3cgYSBudWxsIGNsaWVudCwgYmVjYXVzZSB3ZSBuZXZlciBu
dWxsIGNoZWNrIGl0IGFueXdoZXJlIGluIHRoaXMgY29kZQorICAgIC8vIEFsc28gZG9uJ3QgYWxs
b3cgYSBjbGllbnQgY2hhbmdlIGFmdGVyIHRoZSB0aHJlYWQgaGFzIGFscmVhZHkgYmVnYW4KKyAg
ICAvLyAoc2V0dGluZyB0aGUgY2xpZW50IHNob3VsZCBvY2N1ciBiZWZvcmUgdGhlIGRhdGFiYXNl
IGlzIG9wZW5lZCkKKyAgICBBU1NFUlQoY2xpZW50KTsKKyAgICBBU1NFUlQoIW1fc3luY1RocmVh
ZFJ1bm5pbmcpOworICAgIGlmICghY2xpZW50IHx8IG1fc3luY1RocmVhZFJ1bm5pbmcpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fY2xpZW50ID0gV1RGTW92ZShjbGllbnQpOworfQorCitib29s
IEljb25EYXRhYmFzZTo6b3Blbihjb25zdCBTdHJpbmcmIGRpcmVjdG9yeSwgY29uc3QgU3RyaW5n
JiBmaWxlbmFtZSkKK3sKKyAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7CisKKyAgICBpZiAo
IW1faXNFbmFibGVkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaXNPcGVuKCkp
IHsKKyAgICAgICAgTE9HX0VSUk9SKCJBdHRlbXB0IHRvIHJlb3BlbiB0aGUgSWNvbkRhdGFiYXNl
IHdoaWNoIGlzIGFscmVhZHkgb3Blbi4gTXVzdCBjbG9zZSBpdCBmaXJzdC4iKTsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fZGF0YWJhc2VEaXJlY3RvcnkgPSBkaXJlY3Rv
cnkuaXNvbGF0ZWRDb3B5KCk7CisKKyAgICAvLyBGb3JtdWxhdGUgdGhlIGZ1bGwgcGF0aCBmb3Ig
dGhlIGRhdGFiYXNlIGZpbGUKKyAgICBtX2NvbXBsZXRlRGF0YWJhc2VQYXRoID0gcGF0aEJ5QXBw
ZW5kaW5nQ29tcG9uZW50KG1fZGF0YWJhc2VEaXJlY3RvcnksIGZpbGVuYW1lKTsKKworICAgIC8v
IExvY2sgaGVyZSBhcyB3ZWxsIGFzIGZpcnN0IHRoaW5nIGluIHRoZSB0aHJlYWQgc28gdGhlIHRo
cmVhZCBkb2Vzbid0IGFjdHVhbGx5IGNvbW1lbmNlIHVudGlsIHRoZSBjcmVhdGVUaHJlYWQoKSBj
YWxsCisgICAgLy8gY29tcGxldGVzIGFuZCBtX3N5bmNUaHJlYWRSdW5uaW5nIGlzIHByb3Blcmx5
IHNldAorICAgIG1fc3luY0xvY2subG9jaygpOworICAgIG1fc3luY1RocmVhZCA9IFRocmVhZDo6
Y3JlYXRlKCJXZWJDb3JlOiBJY29uRGF0YWJhc2UiLCBbdGhpc10geworICAgICAgICBpY29uRGF0
YWJhc2VTeW5jVGhyZWFkKCk7CisgICAgfSk7CisgICAgbV9zeW5jVGhyZWFkUnVubmluZyA9IG1f
c3luY1RocmVhZDsKKyAgICBtX3N5bmNMb2NrLnVubG9jaygpOworICAgIGlmICghbV9zeW5jVGhy
ZWFkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg
SWNvbkRhdGFiYXNlOjpjbG9zZSgpCit7CisgICAgQVNTRVJUX05PVF9TWU5DX1RIUkVBRCgpOwor
CisgICAgaWYgKG1fc3luY1RocmVhZFJ1bm5pbmcpIHsKKyAgICAgICAgLy8gU2V0IHRoZSBmbGFn
IHRvIHRlbGwgdGhlIHN5bmMgdGhyZWFkIHRvIHdyYXAgaXQgdXAKKyAgICAgICAgbV90aHJlYWRU
ZXJtaW5hdGlvblJlcXVlc3RlZCA9IHRydWU7CisKKyAgICAgICAgLy8gV2FrZSB1cCB0aGUgc3lu
YyB0aHJlYWQgaWYgaXQncyB3YWl0aW5nCisgICAgICAgIHdha2VTeW5jVGhyZWFkKCk7CisKKyAg
ICAgICAgLy8gV2FpdCBmb3IgdGhlIHN5bmMgdGhyZWFkIHRvIHRlcm1pbmF0ZQorICAgICAgICBt
X3N5bmNUaHJlYWQtPndhaXRGb3JDb21wbGV0aW9uKCk7CisgICAgfQorCisgICAgbV9zeW5jVGhy
ZWFkUnVubmluZyA9IGZhbHNlOworICAgIG1fdGhyZWFkVGVybWluYXRpb25SZXF1ZXN0ZWQgPSBm
YWxzZTsKKyAgICBtX3JlbW92ZUljb25zUmVxdWVzdGVkID0gZmFsc2U7CisKKyAgICBtX3N5bmNE
Qi5jbG9zZSgpOworCisgICAgLy8gSWYgdGhlcmUgYXJlIHN0aWxsIG1haW4gdGhyZWFkIGNhbGxi
YWNrcyBpbiBmbGlnaHQgdGhlbiB0aGUgZGF0YWJhc2UgbWlnaHQgbm90IGFjdHVhbGx5IGJlIGNs
b3NlZCB5ZXQuCisgICAgLy8gQnV0IGlmIGl0IGlzIGNsb3NlZCwgbm90aWZ5IHRoZSBjbGllbnQg
bm93LgorICAgIGlmICghaXNPcGVuKCkgJiYgbV9jbGllbnQpCisgICAgICAgIG1fY2xpZW50LT5k
aWRDbG9zZSgpOworfQorCit2b2lkIEljb25EYXRhYmFzZTo6cmVtb3ZlQWxsSWNvbnMoKQorewor
ICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKKworICAgIGlmICghaXNPcGVuKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIExPRyhJY29uRGF0YWJhc2UsICJSZXF1ZXN0aW5nIGJhY2tncm91
bmQgdGhyZWFkIHRvIHJlbW92ZSBhbGwgaWNvbnMiKTsKKworICAgIC8vIENsZWFyIHRoZSBpbi1t
ZW1vcnkgcmVjb3JkIG9mIGV2ZXJ5IEljb25SZWNvcmQsIGFueXRoaW5nIHdhaXRpbmcgdG8gYmUg
cmVhZCBmcm9tIGRpc2ssIGFuZCBhbnl0aGluZyB3YWl0aW5nIHRvIGJlIHdyaXR0ZW4gdG8gZGlz
aworICAgIHsKKyAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV91cmxBbmRJY29uTG9jayk7CisK
KyAgICAgICAgLy8gQ2xlYXIgdGhlIEljb25SZWNvcmRzIGZvciBldmVyeSBwYWdlIFVSTCAtIFJl
ZkNvdW50aW5nIHdpbGwgY2F1c2UgdGhlIEljb25SZWNvcmRzIHRoZW1zZWx2ZXMgdG8gYmUgZGVs
ZXRlZAorICAgICAgICAvLyBXZSBkb24ndCBkZWxldGUgdGhlIGFjdHVhbCBQYWdlUmVjb3JkcyBi
ZWNhdXNlIHdlIGhhdmUgdGhlICJyZXRhaW4gaWNvbiBmb3IgdXJsIiBjb3VudCB0byBrZWVwIHRy
YWNrIG9mCisgICAgICAgIGZvciAoYXV0byYgcGFnZVVSTCA6IG1fcGFnZVVSTFRvUmVjb3JkTWFw
LnZhbHVlcygpKQorICAgICAgICAgICAgcGFnZVVSTC0+c2V0SWNvblJlY29yZChudWxscHRyKTsK
KworICAgICAgICAvLyBDbGVhciB0aGUgaWNvblVSTCAtPiBJY29uUmVjb3JkIG1hcAorICAgICAg
ICBtX2ljb25VUkxUb1JlY29yZE1hcC5jbGVhcigpOworCisgICAgICAgIC8vIENsZWFyIGFsbCBp
bi1tZW1vcnkgcmVjb3JkcyBvZiB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlIHN5bmNlZCBvdXQgdG8g
ZGlzaworICAgICAgICB7CisgICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdT
eW5jTG9jayk7CisgICAgICAgICAgICBtX3BhZ2VVUkxzUGVuZGluZ1N5bmMuY2xlYXIoKTsKKyAg
ICAgICAgICAgIG1faWNvbnNQZW5kaW5nU3luYy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gQ2xlYXIgYWxsIGluLW1lbW9yeSByZWNvcmRzIG9mIHRoaW5ncyB0aGF0IG5lZWQgdG8g
YmUgcmVhZCBpbiBmcm9tIGRpc2sKKyAgICAgICAgeworICAgICAgICAgICAgTG9ja0hvbGRlciBs
b2NrZXIobV9wZW5kaW5nUmVhZGluZ0xvY2spOworICAgICAgICAgICAgbV9wYWdlVVJMc1BlbmRp
bmdJbXBvcnQuY2xlYXIoKTsKKyAgICAgICAgICAgIG1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29u
cy5jbGVhcigpOworICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdSZWFkaW5nLmNsZWFyKCk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBtX3JlbW92ZUljb25zUmVxdWVzdGVkID0gdHJ1ZTsKKyAg
ICB3YWtlU3luY1RocmVhZCgpOworfQorCitzdGF0aWMgYm9vbCBkb2N1bWVudENhbkhhdmVJY29u
KGNvbnN0IFN0cmluZyYgZG9jdW1lbnRVUkwpCit7CisgICAgcmV0dXJuICFkb2N1bWVudFVSTC5p
c0VtcHR5KCkgJiYgIXByb3RvY29sSXMoZG9jdW1lbnRVUkwsICJhYm91dCIpOworfQorCitJbWFn
ZSogSWNvbkRhdGFiYXNlOjpzeW5jaHJvbm91c0ljb25Gb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYg
cGFnZVVSTE9yaWdpbmFsLCBjb25zdCBJbnRTaXplJiBzaXplKQoreworICAgIEFTU0VSVF9OT1Rf
U1lOQ19USFJFQUQoKTsKKworICAgIC8vIHBhZ2VVUkxPcmlnaW5hbCBjYW5ub3QgYmUgc3RvcmVk
IHdpdGhvdXQgYmVpbmcgZGVlcCBjb3BpZWQgZmlyc3QuCisgICAgLy8gV2Ugc2hvdWxkIGdvIG91
ciBvZiBvdXIgd2F5IHRvIG9ubHkgY29weSBpdCBpZiB3ZSBoYXZlIHRvIHN0b3JlIGl0CisKKyAg
ICBpZiAoIWlzT3BlbigpIHx8ICFkb2N1bWVudENhbkhhdmVJY29uKHBhZ2VVUkxPcmlnaW5hbCkp
CisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgTG9ja0hvbGRlciBsb2NrZXIobV91cmxB
bmRJY29uTG9jayk7CisKKyAgICBwZXJmb3JtUGVuZGluZ1JldGFpbkFuZFJlbGVhc2VPcGVyYXRp
b25zKCk7CisKKyAgICBTdHJpbmcgcGFnZVVSTENvcHk7IC8vIENyZWF0ZXMgYSBudWxsIHN0cmlu
ZyBmb3IgZWFzeSB0ZXN0aW5nCisKKyAgICBQYWdlVVJMUmVjb3JkKiBwYWdlUmVjb3JkID0gbV9w
YWdlVVJMVG9SZWNvcmRNYXAuZ2V0KHBhZ2VVUkxPcmlnaW5hbCk7CisgICAgaWYgKCFwYWdlUmVj
b3JkKSB7CisgICAgICAgIHBhZ2VVUkxDb3B5ID0gcGFnZVVSTE9yaWdpbmFsLmlzb2xhdGVkQ29w
eSgpOworICAgICAgICBwYWdlUmVjb3JkID0gZ2V0T3JDcmVhdGVQYWdlVVJMUmVjb3JkKHBhZ2VV
UkxDb3B5KTsKKyAgICB9CisKKyAgICAvLyBJZiBwYWdlUmVjb3JkIGlzIG51bGxwdHIsIG9uZSBv
ZiB0d28gdGhpbmdzIGlzIHRydWUgLQorICAgIC8vIDEgLSBUaGUgaW5pdGlhbCB1cmwgaW1wb3J0
IGlzIGluY29tcGxldGUgYW5kIHRoaXMgcGFnZVVSTCB3YXMgbWFya2VkIHRvIGJlIG5vdGlmaWVk
IG9uY2UgaXQgaXMgY29tcGxldGUgaWYgYW4gaWNvblVSTCBleGlzdHMKKyAgICAvLyAyIC0gVGhl
IGluaXRpYWwgdXJsIGltcG9ydCBJUyBjb21wbGV0ZSBhbmQgdGhpcyBwYWdlVVJMIGhhcyBubyBp
Y29uCisgICAgaWYgKCFwYWdlUmVjb3JkKSB7CisgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1f
cGVuZGluZ1JlYWRpbmdMb2NrKTsKKworICAgICAgICAvLyBJbXBvcnQgaXMgb25nb2luZywgdGhl
cmUgbWlnaHQgYmUgYW4gaWNvbi4gSW4gdGhpcyBjYXNlLCByZWdpc3RlciB0byBiZSBub3RpZmll
ZCB3aGVuIHRoZSBpY29uIGNvbWVzIGluCisgICAgICAgIC8vIElmIHdlIGV2ZXIgcmVhY2ggdGhp
cyBjb25kaXRpb24sIHdlIGtub3cgd2UndmUgYWxyZWFkeSBtYWRlIHRoZSBwYWdlVVJMIGNvcHkK
KyAgICAgICAgaWYgKCFtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSkKKyAgICAgICAgICAgIG1fcGFn
ZVVSTHNJbnRlcmVzdGVkSW5JY29ucy5hZGQocGFnZVVSTENvcHkpOworCisgICAgICAgIHJldHVy
biBudWxscHRyOworICAgIH0KKworICAgIEljb25SZWNvcmQqIGljb25SZWNvcmQgPSBwYWdlUmVj
b3JkLT5pY29uUmVjb3JkKCk7CisKKyAgICAvLyBJZiB0aGUgaW5pdGlhbCBVUkwgaW1wb3J0IGlz
bid0IGNvbXBsZXRlLCBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgYSBQYWdlVVJMIHJlY29yZCB3aXRo
b3V0IGFuIGFzc29jaWF0ZWQgaWNvbgorICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIHBhZ2VVUkwg
aXMgYWxyZWFkeSBpbiB0aGUgc2V0IHRvIGFsZXJ0IHRoZSBjbGllbnQgd2hlbiB0aGUgaWNvblVS
TCBtYXBwaW5nIGlzIGNvbXBsZXRlIHNvCisgICAgLy8gd2UgY2FuIGp1c3QgYmFpbCBub3cKKyAg
ICBpZiAoIW1faWNvblVSTEltcG9ydENvbXBsZXRlICYmICFpY29uUmVjb3JkKQorICAgICAgICBy
ZXR1cm4gbnVsbHB0cjsKKworICAgIC8vIEFzc3VtaW5nIHdlJ3JlIGRvbmUgaW5pdGlhbGl6aW5n
IGFuZCBjbGVhbnVwIGlzIGFsbG93ZWQsCisgICAgLy8gdGhlIG9ubHkgd2F5IHdlIHNob3VsZCAq
bm90KiBoYXZlIGFuIGljb24gcmVjb3JkIGlzIGlmIHRoaXMgcGFnZVVSTCBpcyByZXRhaW5lZCBi
dXQgaGFzIG5vIGljb24geWV0LgorICAgIEFTU0VSVChpY29uUmVjb3JkIHx8IGRhdGFiYXNlQ2xl
YW51cENvdW50ZXIgfHwgbV9yZXRhaW5lZFBhZ2VVUkxzLmNvbnRhaW5zKHBhZ2VVUkxPcmlnaW5h
bCkpOworCisgICAgaWYgKCFpY29uUmVjb3JkKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwor
ICAgIC8vIElmIGl0J3MgYSBuZXcgSWNvblJlY29yZCBvYmplY3QgdGhhdCBkb2Vzbid0IGhhdmUg
aXRzIGltYWdlRGF0YSBzZXQgeWV0LAorICAgIC8vIG1hcmsgaXQgdG8gYmUgcmVhZCBieSB0aGUg
YmFja2dyb3VuZCB0aHJlYWQKKyAgICBpZiAoaWNvblJlY29yZC0+aW1hZ2VEYXRhU3RhdHVzKCkg
PT0gSWNvblJlY29yZDo6SW1hZ2VEYXRhU3RhdHVzOjpVbmtub3duKSB7CisgICAgICAgIGlmIChw
YWdlVVJMQ29weS5pc051bGwoKSkKKyAgICAgICAgICAgIHBhZ2VVUkxDb3B5ID0gcGFnZVVSTE9y
aWdpbmFsLmlzb2xhdGVkQ29weSgpOworCisgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVu
ZGluZ1JlYWRpbmdMb2NrKTsKKyAgICAgICAgbV9wYWdlVVJMc0ludGVyZXN0ZWRJbkljb25zLmFk
ZChwYWdlVVJMQ29weSk7CisgICAgICAgIG1faWNvbnNQZW5kaW5nUmVhZGluZy5hZGQoaWNvblJl
Y29yZCk7CisgICAgICAgIHdha2VTeW5jVGhyZWFkKCk7CisgICAgICAgIHJldHVybiBudWxscHRy
OworICAgIH0KKworICAgIC8vIElmIHRoZSBzaXplIHBhcmFtZXRlciB3YXMgKDAsIDApIHRoYXQg
bWVhbnMgdGhlIGNhbGxlciBvZiB0aGlzIG1ldGhvZCBqdXN0IHdhbnRlZCB0aGUgcmVhZCBmcm9t
IGRpc2sgdG8gYmUga2lja2VkIG9mZgorICAgIC8vIGFuZCBpc24ndCBhY3R1YWxseSBpbnRlcmVz
dGVkIGluIHRoZSBpbWFnZSByZXR1cm4gdmFsdWUKKyAgICBpZiAoc2l6ZSA9PSBJbnRTaXplKDAs
IDApKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIC8vIFBBUkFOT0lEIERJU0NVU1NJ
T046IFRoaXMgbWV0aG9kIG1ha2VzIHNvbWUgYXNzdW1wdGlvbnMuIEl0IHJldHVybnMgYSBXZWJD
b3JlOjppbWFnZSB3aGljaCB0aGUgaWNvbiBkYXRhYmFzZSBtaWdodCBkaXNwb3NlIG9mIGF0IGFu
eXRpbWUgaW4gdGhlIGZ1dHVyZSwKKyAgICAvLyBhbmQgSW1hZ2VzIGFyZW4ndCByZWYgY291bnRl
ZC4gU28gdGhlcmUgaXMgbm8gd2F5IGZvciB0aGUgY2xpZW50IHRvIGd1YXJhbnRlZSBjb250aW51
ZWQgZXhpc3RlbmNlIG9mIHRoZSBpbWFnZS4KKyAgICAvLyBUaGlzIGhhcyAqYWx3YXlzKiBiZWVu
IHRoZSBjYXNlLCBidXQgaW4gcHJhY3RpY2UgY2xpZW50cyB3b3VsZCBhbHdheXMgY3JlYXRlIHNv
bWUgb3RoZXIgcGxhdGZvcm0gc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gb2YgdGhlIGltYWdlCisg
ICAgLy8gYW5kIGRyb3AgdGhlIHJhdyBJbWFnZSouIE9uIE1hYyBhbiBOU0ltYWdlLCBhbmQgb24g
d2luZG93cyBkcmF3aW5nIGludG8gYW4gSEJJVE1BUC4KKyAgICAvLyBUaGUgYXN5bmMgYXNwZWN0
IGFkZHMgYSBodWdlIHF1ZXN0aW9uIC0gd2hhdCBpZiB0aGUgaW1hZ2UgaXMgZGVsZXRlZCBiZWZv
cmUgdGhlIHBsYXRmb3JtIHNwZWNpZmljIEFQSSBoYXMgYSBjaGFuY2UgdG8gY3JlYXRlIGl0cyBv
d24KKyAgICAvLyByZXByZXNlbnRhdGlvbiBvdXQgb2YgaXQ/CisgICAgLy8gSWYgYW4gaW1hZ2Ug
aXMgcmVhZCBpbiBmcm9tIHRoZSBpY29uZGF0YWJhc2UsIHdlIGRvICpub3QqIG92ZXJ3cml0ZSBh
bnkgaW1hZ2UgZGF0YSB0aGF0IGV4aXN0cyBpbiB0aGUgaW4tbWVtb3J5IGNhY2hlLgorICAgIC8v
IFRoaXMgaXMgYmVjYXVzZSB3ZSBtYWtlIHRoZSBhc3N1bXB0aW9uIHRoYXQgYW55dGhpbmcgaW4g
bWVtb3J5IGlzIG5ld2VyIHRoYW4gd2hhdGV2ZXIgaXMgaW4gdGhlIGRhdGFiYXNlLgorICAgIC8v
IFNvIHRoZSBvbmx5IHRpbWUgdGhlIGRhdGEgd2lsbCBiZSBzZXQgZnJvbSB0aGUgc2Vjb25kIHRo
cmVhZCBpcyB3aGVuIGl0IGlzIElOSVRJQUxMWSBiZWluZyByZWFkIGluIGZyb20gdGhlIGRhdGFi
YXNlLCBidXQgd2Ugd291bGQgbmV2ZXIKKyAgICAvLyBkZWxldGUgdGhlIGltYWdlIG9uIHRoZSBz
ZWNvbmRhcnkgdGhyZWFkIGlmIHRoZSBpbWFnZSBhbHJlYWR5IGV4aXN0cy4KKyAgICByZXR1cm4g
aWNvblJlY29yZC0+aW1hZ2Uoc2l6ZSk7Cit9CisKK1N0cmluZyBJY29uRGF0YWJhc2U6OnN5bmNo
cm9ub3VzSWNvblVSTEZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJiBwYWdlVVJMT3JpZ2luYWwpCit7
CisgICAgQVNTRVJUX05PVF9TWU5DX1RIUkVBRCgpOworCisgICAgLy8gQ2Fubm90IGRvIGFueXRo
aW5nIHdpdGggcGFnZVVSTE9yaWdpbmFsIHRoYXQgd291bGQgZW5kIHVwIHN0b3JpbmcgaXQgd2l0
aG91dCBkZWVwIGNvcHlpbmcgZmlyc3QKKyAgICAvLyBBbHNvLCBpbiB0aGUgY2FzZSB3ZSBoYXZl
IGEgcmVhbCBhbnN3ZXIgZm9yIHRoZSBjYWxsZXIsIHdlIG11c3QgZGVlcCBjb3B5IHRoYXQgYXMg
d2VsbAorCisgICAgaWYgKCFpc09wZW4oKSB8fCAhZG9jdW1lbnRDYW5IYXZlSWNvbihwYWdlVVJM
T3JpZ2luYWwpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICBMb2NrSG9sZGVyIGxv
Y2tlcihtX3VybEFuZEljb25Mb2NrKTsKKworICAgIFBhZ2VVUkxSZWNvcmQqIHBhZ2VSZWNvcmQg
PSBtX3BhZ2VVUkxUb1JlY29yZE1hcC5nZXQocGFnZVVSTE9yaWdpbmFsKTsKKyAgICBpZiAoIXBh
Z2VSZWNvcmQpCisgICAgICAgIHBhZ2VSZWNvcmQgPSBnZXRPckNyZWF0ZVBhZ2VVUkxSZWNvcmQo
cGFnZVVSTE9yaWdpbmFsLmlzb2xhdGVkQ29weSgpKTsKKworICAgIC8vIElmIHBhZ2VSZWNvcmQg
aXMgbnVsbHB0ciwgb25lIG9mIHR3byB0aGluZ3MgaXMgdHJ1ZSAtCisgICAgLy8gMSAtIFRoZSBp
bml0aWFsIHVybCBpbXBvcnQgaXMgaW5jb21wbGV0ZSBhbmQgdGhpcyBwYWdlVVJMIGhhcyBhbHJl
YWR5IGJlZW4gbWFya2VkIHRvIGJlIG5vdGlmaWVkIG9uY2UgaXQgaXMgY29tcGxldGUgaWYgYW4g
aWNvblVSTCBleGlzdHMKKyAgICAvLyAyIC0gVGhlIGluaXRpYWwgdXJsIGltcG9ydCBJUyBjb21w
bGV0ZSBhbmQgdGhpcyBwYWdlVVJMIGhhcyBubyBpY29uCisgICAgaWYgKCFwYWdlUmVjb3JkKQor
ICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICAvLyBQb3NzaWJsZSB0aGUgcGFnZVJlY29y
ZCBpcyBhcm91bmQgYmVjYXVzZSBpdCdzIGEgcmV0YWluZWQgcGFnZVVSTCB3aXRoIG5vIGljb25V
UkwsIHNvIHdlIGhhdmUgdG8gY2hlY2sKKyAgICByZXR1cm4gcGFnZVJlY29yZC0+aWNvblJlY29y
ZCgpID8gcGFnZVJlY29yZC0+aWNvblJlY29yZCgpLT5pY29uVVJMKCkuaXNvbGF0ZWRDb3B5KCkg
OiBTdHJpbmcoKTsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6OnJldGFpbkljb25Gb3JQYWdlVVJM
KGNvbnN0IFN0cmluZyYgcGFnZVVSTCkKK3sKKyAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7
CisKKyAgICBpZiAoIWlzRW5hYmxlZCgpIHx8ICFkb2N1bWVudENhbkhhdmVJY29uKHBhZ2VVUkwp
KQorICAgICAgICByZXR1cm47CisKKyAgICB7CisgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1f
dXJsc1RvUmV0YWluT3JSZWxlYXNlTG9jayk7CisgICAgICAgIG1fdXJsc1RvUmV0YWluLmFkZChw
YWdlVVJMLmlzb2xhdGVkQ29weSgpKTsKKyAgICAgICAgbV9yZXRhaW5PclJlbGVhc2VJY29uUmVx
dWVzdGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBzY2hlZHVsZU9yRGVmZXJTeW5jVGltZXIoKTsK
K30KKwordm9pZCBJY29uRGF0YWJhc2U6OnBlcmZvcm1SZXRhaW5JY29uRm9yUGFnZVVSTChjb25z
dCBTdHJpbmcmIHBhZ2VVUkxPcmlnaW5hbCwgaW50IHJldGFpbkNvdW50KQoreworICAgIFBhZ2VV
UkxSZWNvcmQqIHJlY29yZCA9IG1fcGFnZVVSTFRvUmVjb3JkTWFwLmdldChwYWdlVVJMT3JpZ2lu
YWwpOworCisgICAgU3RyaW5nIHBhZ2VVUkw7CisKKyAgICBpZiAoIXJlY29yZCkgeworICAgICAg
ICBwYWdlVVJMID0gcGFnZVVSTE9yaWdpbmFsLmlzb2xhdGVkQ29weSgpOworCisgICAgICAgIHJl
Y29yZCA9IG5ldyBQYWdlVVJMUmVjb3JkKHBhZ2VVUkwpOworICAgICAgICBtX3BhZ2VVUkxUb1Jl
Y29yZE1hcC5zZXQocGFnZVVSTCwgcmVjb3JkKTsKKyAgICB9CisKKyAgICBpZiAoIXJlY29yZC0+
cmV0YWluKHJldGFpbkNvdW50KSkgeworICAgICAgICBpZiAocGFnZVVSTC5pc051bGwoKSkKKyAg
ICAgICAgICAgIHBhZ2VVUkwgPSBwYWdlVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5KCk7CisKKyAg
ICAgICAgLy8gVGhpcyBwYWdlIGp1c3QgaGFkIGl0cyByZXRhaW4gY291bnQgYnVtcGVkIGZyb20g
MCB0byAxIC0gUmVjb3JkIHRoYXQgZmFjdAorICAgICAgICBtX3JldGFpbmVkUGFnZVVSTHMuYWRk
KHBhZ2VVUkwpOworCisgICAgICAgIC8vIElmIHdlIHJlYWQgdGhlIGljb25VUkxzIHlldCwgd2Ug
d2FudCB0byBhdm9pZCBhbnkgcGFnZVVSTC0+aWNvblVSTCBsb29rdXBzIGFuZCB0aGUgcGFnZVVS
THNQZW5kaW5nRGVsZXRpb24gaXMgbW9vdCwKKyAgICAgICAgLy8gc28gd2UgYmFpbCBoZXJlIGFu
ZCBza2lwIHRob3NlIHN0ZXBzCisgICAgICAgIGlmICghbV9pY29uVVJMSW1wb3J0Q29tcGxldGUp
CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5k
aW5nU3luY0xvY2spOworICAgICAgICAvLyBJZiB0aGlzIHBhZ2VVUkwgd2FpdGluZyB0byBiZSBz
eW5jJ2VkLCB1cGRhdGUgdGhlIHN5bmMgcmVjb3JkCisgICAgICAgIC8vIFRoaXMgc2F2ZXMgdXMg
aW4gdGhlIGNhc2Ugd2hlcmUgYSBwYWdlIHdhcyByZWFkeSB0byBiZSBkZWxldGVkIGZyb20gdGhl
IGRhdGFiYXNlIGJ1dCB3YXMganVzdCByZXRhaW5lZCAtIHNvIHRoZXJlcyBubyBuZWVkIHRvIGRl
bGV0ZSBpdCEKKyAgICAgICAgaWYgKCFtX3ByaXZhdGVCcm93c2luZ0VuYWJsZWQgJiYgbV9wYWdl
VVJMc1BlbmRpbmdTeW5jLmNvbnRhaW5zKHBhZ2VVUkwpKSB7CisgICAgICAgICAgICBMT0coSWNv
bkRhdGFiYXNlLCAiQnJpbmdpbmcgJXMgYmFjayBmcm9tIHRoZSBicmluayIsIHBhZ2VVUkwuYXNj
aWkoKS5kYXRhKCkpOworICAgICAgICAgICAgbV9wYWdlVVJMc1BlbmRpbmdTeW5jLnNldChwYWdl
VVJMLCByZWNvcmQtPnNuYXBzaG90KCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIElj
b25EYXRhYmFzZTo6cmVsZWFzZUljb25Gb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYgcGFnZVVSTCkK
K3sKKyAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7CisKKyAgICAvLyBDYW5ub3QgZG8gYW55
dGhpbmcgd2l0aCBwYWdlVVJMT3JpZ2luYWwgdGhhdCB3b3VsZCBlbmQgdXAgc3RvcmluZyBpdCB3
aXRob3V0IGRlZXAgY29weWluZyBmaXJzdAorCisgICAgaWYgKCFpc0VuYWJsZWQoKSB8fCAhZG9j
dW1lbnRDYW5IYXZlSWNvbihwYWdlVVJMKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgeworICAg
ICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3VybHNUb1JldGFpbk9yUmVsZWFzZUxvY2spOworICAg
ICAgICBtX3VybHNUb1JlbGVhc2UuYWRkKHBhZ2VVUkwuaXNvbGF0ZWRDb3B5KCkpOworICAgICAg
ICBtX3JldGFpbk9yUmVsZWFzZUljb25SZXF1ZXN0ZWQgPSB0cnVlOworICAgIH0KKyAgICBzY2hl
ZHVsZU9yRGVmZXJTeW5jVGltZXIoKTsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6OnBlcmZvcm1S
ZWxlYXNlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJiBwYWdlVVJMT3JpZ2luYWwsIGludCBy
ZWxlYXNlQ291bnQpCit7CisgICAgLy8gQ2hlY2sgaWYgdGhpcyBwYWdlVVJMIGlzIGFjdHVhbGx5
IHJldGFpbmVkCisgICAgaWYgKCFtX3JldGFpbmVkUGFnZVVSTHMuY29udGFpbnMocGFnZVVSTE9y
aWdpbmFsKSkgeworICAgICAgICBMT0dfRVJST1IoIkF0dGVtcHRpbmcgdG8gcmVsZWFzZSBpY29u
IGZvciBVUkwgJXMgd2hpY2ggaXMgbm90IHJldGFpbmVkIiwgdXJsRm9yTG9nZ2luZyhwYWdlVVJM
T3JpZ2luYWwpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIEdldCBpdHMgcmV0YWluIGNvdW50IC0gaWYgaXQncyByZXRhaW5lZCwgd2UnZCBiZXR0ZXIg
aGF2ZSBhIFBhZ2VVUkxSZWNvcmQgZm9yIGl0CisgICAgUGFnZVVSTFJlY29yZCogcGFnZVJlY29y
ZCA9IG1fcGFnZVVSTFRvUmVjb3JkTWFwLmdldChwYWdlVVJMT3JpZ2luYWwpOworICAgIEFTU0VS
VChwYWdlUmVjb3JkKTsKKyAgICBMT0coSWNvbkRhdGFiYXNlLCAiUmVsZWFzaW5nIHBhZ2VVUkwg
JXMgdG8gYSByZXRhaW4gY291bnQgb2YgJWkiLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkxPcmlnaW5h
bCkuYXNjaWkoKS5kYXRhKCksIHBhZ2VSZWNvcmQtPnJldGFpbkNvdW50KCkgLSAxKTsKKyAgICBB
U1NFUlQocGFnZVJlY29yZC0+cmV0YWluQ291bnQoKSA+IDApOworCisgICAgLy8gSWYgaXQgc3Rp
bGwgaGFzIGEgcG9zaXRpdmUgcmV0YWluIGNvdW50LCBzdG9yZSB0aGUgbmV3IGNvdW50IGFuZCBi
YWlsCisgICAgaWYgKHBhZ2VSZWNvcmQtPnJlbGVhc2UocmVsZWFzZUNvdW50KSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gVGhpcyBwYWdlUmVjb3JkIGhhcyBub3cgYmVlbiBmdWxseSByZWxl
YXNlZC4gRG8gdGhlIGFwcHJvcHJpYXRlIGNsZWFudXAKKyAgICBMT0coSWNvbkRhdGFiYXNlLCAi
Tm8gbW9yZSByZXRhaW5lcnMgZm9yIFBhZ2VVUkwgJXMiLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkxP
cmlnaW5hbCkuYXNjaWkoKS5kYXRhKCkpOworICAgIG1fcGFnZVVSTFRvUmVjb3JkTWFwLnJlbW92
ZShwYWdlVVJMT3JpZ2luYWwpOworICAgIG1fcmV0YWluZWRQYWdlVVJMcy5yZW1vdmUocGFnZVVS
TE9yaWdpbmFsKTsKKworICAgIC8vIEdyYWIgdGhlIGljb25SZWNvcmQgZm9yIGxhdGVyIHVzZSAo
YW5kIGRvIGEgc2FuaXR5IGNoZWNrIG9uIGl0IGZvciBraWNrcykKKyAgICBJY29uUmVjb3JkKiBp
Y29uUmVjb3JkID0gcGFnZVJlY29yZC0+aWNvblJlY29yZCgpOworCisgICAgQVNTRVJUKCFpY29u
UmVjb3JkIHx8IChpY29uUmVjb3JkICYmIG1faWNvblVSTFRvUmVjb3JkTWFwLmdldChpY29uUmVj
b3JkLT5pY29uVVJMKCkpID09IGljb25SZWNvcmQpKTsKKworICAgIHsKKyAgICAgICAgTG9ja0hv
bGRlciBsb2NrZXIobV9wZW5kaW5nUmVhZGluZ0xvY2spOworCisgICAgICAgIC8vIFNpbmNlIHRo
aXMgcGFnZVVSTCBpcyBnb2luZyBhd2F5LCB0aGVyZSdzIG5vIHJlYXNvbiBhbnlvbmUgd291bGQg
ZXZlciBiZSBpbnRlcmVzdGVkIGluIGl0cyByZWFkIHJlc3VsdHMKKyAgICAgICAgaWYgKCFtX2lj
b25VUkxJbXBvcnRDb21wbGV0ZSkKKyAgICAgICAgICAgIG1fcGFnZVVSTHNQZW5kaW5nSW1wb3J0
LnJlbW92ZShwYWdlVVJMT3JpZ2luYWwpOworICAgICAgICBtX3BhZ2VVUkxzSW50ZXJlc3RlZElu
SWNvbnMucmVtb3ZlKHBhZ2VVUkxPcmlnaW5hbCk7CisKKyAgICAgICAgLy8gSWYgdGhpcyBpY29u
IGlzIGRvd24gdG8gaXQncyBsYXN0IHJldGFpbmVyLCB3ZSBkb24ndCBjYXJlIGFib3V0IHJlYWRp
bmcgaXQgaW4gZnJvbSBkaXNrIGFueW1vcmUKKyAgICAgICAgaWYgKGljb25SZWNvcmQgJiYgaWNv
blJlY29yZC0+aGFzT25lUmVmKCkpIHsKKyAgICAgICAgICAgIG1faWNvblVSTFRvUmVjb3JkTWFw
LnJlbW92ZShpY29uUmVjb3JkLT5pY29uVVJMKCkpOworICAgICAgICAgICAgbV9pY29uc1BlbmRp
bmdSZWFkaW5nLnJlbW92ZShpY29uUmVjb3JkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8v
IE1hcmsgc3R1ZmYgZm9yIGRlbGV0aW9uIGZyb20gdGhlIGRhdGFiYXNlIG9ubHkgaWYgd2UncmUg
bm90IGluIHByaXZhdGUgYnJvd3NpbmcKKyAgICBpZiAoIW1fcHJpdmF0ZUJyb3dzaW5nRW5hYmxl
ZCkgeworICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdTeW5jTG9jayk7CisgICAg
ICAgIG1fcGFnZVVSTHNQZW5kaW5nU3luYy5zZXQocGFnZVVSTE9yaWdpbmFsLmlzb2xhdGVkQ29w
eSgpLCBwYWdlUmVjb3JkLT5zbmFwc2hvdCh0cnVlKSk7CisKKyAgICAgICAgLy8gSWYgdGhpcyBw
YWdlIGlzIHRoZSBsYXN0IHBhZ2UgdG8gcmVmZXIgdG8gYSBwYXJ0aWN1bGFyIEljb25SZWNvcmQs
IHRoYXQgSWNvblJlY29yZCBuZWVkcyB0bworICAgICAgICAvLyBiZSBtYXJrZWQgZm9yIGRlbGV0
aW9uCisgICAgICAgIGlmIChpY29uUmVjb3JkICYmIGljb25SZWNvcmQtPmhhc09uZVJlZigpKQor
ICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdTeW5jLnNldChpY29uUmVjb3JkLT5pY29uVVJMKCks
IGljb25SZWNvcmQtPnNuYXBzaG90KHRydWUpKTsKKyAgICB9CisKKyAgICBkZWxldGUgcGFnZVJl
Y29yZDsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6OnNldEljb25EYXRhRm9ySWNvblVSTChSZWZQ
dHI8U2hhcmVkQnVmZmVyPiYmIGRhdGEsIGNvbnN0IFN0cmluZyYgaWNvblVSTE9yaWdpbmFsKQor
eworICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKKworICAgIC8vIENhbm5vdCBkbyBhbnl0
aGluZyB3aXRoIGljb25VUkxPcmlnaW5hbCB0aGF0IHdvdWxkIGVuZCB1cCBzdG9yaW5nIHRoZW0g
d2l0aG91dCBkZWVwIGNvcHlpbmcgZmlyc3QKKworICAgIGlmICghaXNPcGVuKCkgfHwgaWNvblVS
TE9yaWdpbmFsLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgU3RyaW5nIGljb25V
UkwgPSBpY29uVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5KCk7CisgICAgVmVjdG9yPFN0cmluZz4g
cGFnZVVSTHM7CisgICAgeworICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3VybEFuZEljb25M
b2NrKTsKKworICAgICAgICAvLyBJZiB0aGlzIGljb24gd2FzIHBlbmRpbmcgYSByZWFkLCByZW1v
dmUgaXQgZnJvbSB0aGF0IHNldCBiZWNhdXNlIHRoaXMgbmV3IGRhdGEgc2hvdWxkIG92ZXJyaWRl
IHdoYXQgaXMgb24gZGlzaworICAgICAgICBSZWZQdHI8SWNvblJlY29yZD4gaWNvbiA9IG1faWNv
blVSTFRvUmVjb3JkTWFwLmdldChpY29uVVJMKTsKKyAgICAgICAgaWYgKGljb24pIHsKKyAgICAg
ICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1JlYWRpbmdMb2NrKTsKKyAgICAgICAg
ICAgIG1faWNvbnNQZW5kaW5nUmVhZGluZy5yZW1vdmUoaWNvbi5nZXQoKSk7CisgICAgICAgIH0g
ZWxzZQorICAgICAgICAgICAgaWNvbiA9IGdldE9yQ3JlYXRlSWNvblJlY29yZChpY29uVVJMKTsK
KworICAgICAgICAvLyBVcGRhdGUgdGhlIGRhdGEgYW5kIHNldCB0aGUgdGltZSBzdGFtcAorICAg
ICAgICBpY29uLT5zZXRJbWFnZURhdGEoV1RGTW92ZShkYXRhKSk7CisgICAgICAgIGljb24tPnNl
dFRpbWVzdGFtcCgoaW50KWN1cnJlbnRUaW1lKCkpOworCisgICAgICAgIC8vIENvcHkgdGhlIGN1
cnJlbnQgcmV0YWluaW5nIHBhZ2VVUkxzIC0gaWYgYW55IC0gdG8gbm90aWZ5IHRoZW0gb2YgdGhl
IGNoYW5nZQorICAgICAgICBwYWdlVVJMcy5hcHBlbmRSYW5nZShpY29uLT5yZXRhaW5pbmdQYWdl
VVJMcygpLmJlZ2luKCksIGljb24tPnJldGFpbmluZ1BhZ2VVUkxzKCkuZW5kKCkpOworCisgICAg
ICAgIC8vIE1hcmsgdGhlIEljb25SZWNvcmQgYXMgcmVxdWlyaW5nIGFuIHVwZGF0ZSB0byB0aGUg
ZGF0YWJhc2Ugb25seSBpZiBwcml2YXRlIGJyb3dzaW5nIGlzIGRpc2FibGVkCisgICAgICAgIGlm
ICghbV9wcml2YXRlQnJvd3NpbmdFbmFibGVkKSB7CisgICAgICAgICAgICBMb2NrSG9sZGVyIGxv
Y2tlcihtX3BlbmRpbmdTeW5jTG9jayk7CisgICAgICAgICAgICBtX2ljb25zUGVuZGluZ1N5bmMu
c2V0KGljb25VUkwsIGljb24tPnNuYXBzaG90KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYg
KGljb24tPmhhc09uZVJlZigpKSB7CisgICAgICAgICAgICBBU1NFUlQoaWNvbi0+cmV0YWluaW5n
UGFnZVVSTHMoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIklj
b24gZm9yIGljb24gdXJsICVzIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZCAtIHJlbW92aW5nIG1h
cHBpbmcgZm9yIGl0IiwgdXJsRm9yTG9nZ2luZyhpY29uLT5pY29uVVJMKCkpLmFzY2lpKCkuZGF0
YSgpKTsKKyAgICAgICAgICAgIG1faWNvblVSTFRvUmVjb3JkTWFwLnJlbW92ZShpY29uLT5pY29u
VVJMKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2VuZCBub3RpZmljYXRpb24gb3V0
IHJlZ2FyZGluZyBhbGwgUGFnZVVSTHMgdGhhdCByZXRhaW4gdGhpcyBpY29uCisgICAgLy8gQnV0
IG5vdCBpZiB3ZSdyZSBvbiB0aGUgc3luYyB0aHJlYWQgYmVjYXVzZSB0aGF0IGltcGxpZXMgdGhp
cyBtYXBwaW5nCisgICAgLy8gY29tZXMgZnJvbSB0aGUgaW5pdGlhbCBpbXBvcnQgd2hpY2ggd2Ug
ZG9uJ3Qgd2FudCBub3RpZmljYXRpb25zIGZvcgorICAgIGlmICghSVNfSUNPTl9TWU5DX1RIUkVB
RCgpKSB7CisgICAgICAgIC8vIFN0YXJ0IHRoZSB0aW1lciB0byBjb21taXQgdGhpcyBjaGFuZ2Ug
LSBvciBmdXJ0aGVyIGRlbGF5IHRoZSB0aW1lciBpZiBpdCB3YXMgYWxyZWFkeSBzdGFydGVkCisg
ICAgICAgIHNjaGVkdWxlT3JEZWZlclN5bmNUaW1lcigpOworCisgICAgICAgIGZvciAoYXV0byYg
cGFnZVVSTCA6IHBhZ2VVUkxzKSB7CisgICAgICAgICAgICBBdXRvZHJhaW5lZFBvb2wgcG9vbDsK
KworICAgICAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIkRpc3BhdGNoaW5nIG5vdGlmaWNhdGlv
biB0aGF0IHJldGFpbmluZyBwYWdlVVJMICVzIGhhcyBhIG5ldyBpY29uIiwgdXJsRm9yTG9nZ2lu
ZyhwYWdlVVJMKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBtX2NsaWVudC0+ZGlkQ2hh
bmdlSWNvbkZvclBhZ2VVUkwocGFnZVVSTCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQg
SWNvbkRhdGFiYXNlOjpzZXRJY29uVVJMRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIGljb25VUkxP
cmlnaW5hbCwgY29uc3QgU3RyaW5nJiBwYWdlVVJMT3JpZ2luYWwpCit7CisgICAgQVNTRVJUX05P
VF9TWU5DX1RIUkVBRCgpOworCisgICAgLy8gQ2Fubm90IGRvIGFueXRoaW5nIHdpdGggaWNvblVS
TE9yaWdpbmFsIG9yIHBhZ2VVUkxPcmlnaW5hbCB0aGF0IHdvdWxkIGVuZCB1cCBzdG9yaW5nIHRo
ZW0gd2l0aG91dCBkZWVwIGNvcHlpbmcgZmlyc3QKKworICAgIEFTU0VSVCghaWNvblVSTE9yaWdp
bmFsLmlzRW1wdHkoKSk7CisKKyAgICBpZiAoIWlzT3BlbigpIHx8ICFkb2N1bWVudENhbkhhdmVJ
Y29uKHBhZ2VVUkxPcmlnaW5hbCkpCisgICAgICAgIHJldHVybjsKKworICAgIFN0cmluZyBpY29u
VVJMLCBwYWdlVVJMOworICAgIHsKKyAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV91cmxBbmRJ
Y29uTG9jayk7CisKKyAgICAgICAgUGFnZVVSTFJlY29yZCogcGFnZVJlY29yZCA9IG1fcGFnZVVS
TFRvUmVjb3JkTWFwLmdldChwYWdlVVJMT3JpZ2luYWwpOworCisgICAgICAgIC8vIElmIHRoZSB1
cmxzIGFscmVhZHkgbWFwIHRvIGVhY2ggb3RoZXIsIGJhaWwuCisgICAgICAgIC8vIFRoaXMgaGFw
cGVucyBzdXJwcmlzaW5nbHkgb2Z0ZW4sIGFuZCBzZWVtcyB0byBjcmVhbSBpQmVuY2ggcGVyZm9y
bWFuY2UKKyAgICAgICAgaWYgKHBhZ2VSZWNvcmQgJiYgcGFnZVJlY29yZC0+aWNvblJlY29yZCgp
ICYmIHBhZ2VSZWNvcmQtPmljb25SZWNvcmQoKS0+aWNvblVSTCgpID09IGljb25VUkxPcmlnaW5h
bCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBwYWdlVVJMID0gcGFnZVVSTE9yaWdp
bmFsLmlzb2xhdGVkQ29weSgpOworICAgICAgICBpY29uVVJMID0gaWNvblVSTE9yaWdpbmFsLmlz
b2xhdGVkQ29weSgpOworCisgICAgICAgIGlmICghcGFnZVJlY29yZCkgeworICAgICAgICAgICAg
cGFnZVJlY29yZCA9IG5ldyBQYWdlVVJMUmVjb3JkKHBhZ2VVUkwpOworICAgICAgICAgICAgbV9w
YWdlVVJMVG9SZWNvcmRNYXAuc2V0KHBhZ2VVUkwsIHBhZ2VSZWNvcmQpOworICAgICAgICB9CisK
KyAgICAgICAgUmVmUHRyPEljb25SZWNvcmQ+IGljb25SZWNvcmQgPSBwYWdlUmVjb3JkLT5pY29u
UmVjb3JkKCk7CisKKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgdGhlIG5ldyBpY29uIHJlY29y
ZCBmb3IgdGhpcyBwYWdlCisgICAgICAgIHBhZ2VSZWNvcmQtPnNldEljb25SZWNvcmQoZ2V0T3JD
cmVhdGVJY29uUmVjb3JkKGljb25VUkwpKTsKKworICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBp
Y29uIGhhcyBvbmx5IGEgc2luZ2xlIHJlZiBsZWZ0LCBpdCBpcyBhYm91dCB0byBnZXQgd2lwZWQg
b3V0LgorICAgICAgICAvLyBSZW1vdmUgaXQgZnJvbSB0aGUgaW4tbWVtb3J5IHJlY29yZHMgYW5k
IGRvbid0IGJvdGhlciByZWFkaW5nIGl0IGluIGZyb20gZGlzayBhbnltb3JlCisgICAgICAgIGlm
IChpY29uUmVjb3JkICYmIGljb25SZWNvcmQtPmhhc09uZVJlZigpKSB7CisgICAgICAgICAgICBB
U1NFUlQoIWljb25SZWNvcmQtPnJldGFpbmluZ1BhZ2VVUkxzKCkuc2l6ZSgpKTsKKyAgICAgICAg
ICAgIExPRyhJY29uRGF0YWJhc2UsICJJY29uIGZvciBpY29uIHVybCAlcyBpcyBhYm91dCB0byBi
ZSBkZXN0cm95ZWQgLSByZW1vdmluZyBtYXBwaW5nIGZvciBpdCIsIHVybEZvckxvZ2dpbmcoaWNv
blJlY29yZC0+aWNvblVSTCgpKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBtX2ljb25V
UkxUb1JlY29yZE1hcC5yZW1vdmUoaWNvblJlY29yZC0+aWNvblVSTCgpKTsKKyAgICAgICAgICAg
IExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1JlYWRpbmdMb2NrKTsKKyAgICAgICAgICAgIG1f
aWNvbnNQZW5kaW5nUmVhZGluZy5yZW1vdmUoaWNvblJlY29yZC5nZXQoKSk7CisgICAgICAgIH0K
KworICAgICAgICAvLyBBbmQgbWFyayB0aGlzIG1hcHBpbmcgdG8gYmUgYWRkZWQgdG8gdGhlIGRh
dGFiYXNlCisgICAgICAgIGlmICghbV9wcml2YXRlQnJvd3NpbmdFbmFibGVkKSB7CisgICAgICAg
ICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdTeW5jTG9jayk7CisgICAgICAgICAgICBt
X3BhZ2VVUkxzUGVuZGluZ1N5bmMuc2V0KHBhZ2VVUkwsIHBhZ2VSZWNvcmQtPnNuYXBzaG90KCkp
OworCisgICAgICAgICAgICAvLyBJZiB0aGUgaWNvbiBpcyBvbiBpdHMgbGFzdCByZWYsIG1hcmsg
aXQgZm9yIGRlbGV0aW9uCisgICAgICAgICAgICBpZiAoaWNvblJlY29yZCAmJiBpY29uUmVjb3Jk
LT5oYXNPbmVSZWYoKSkKKyAgICAgICAgICAgICAgICBtX2ljb25zUGVuZGluZ1N5bmMuc2V0KGlj
b25SZWNvcmQtPmljb25VUkwoKSwgaWNvblJlY29yZC0+c25hcHNob3QodHJ1ZSkpOworICAgICAg
ICB9CisgICAgfQorCisgICAgLy8gU2luY2UgdGhpcyBtYXBwaW5nIGlzIG5ldywgc2VuZCB0aGUg
bm90aWZpY2F0aW9uIG91dCAtIGJ1dCBub3QgaWYgd2UncmUgb24gdGhlIHN5bmMgdGhyZWFkIGJl
Y2F1c2UgdGhhdCBpbXBsaWVzIHRoaXMgbWFwcGluZworICAgIC8vIGNvbWVzIGZyb20gdGhlIGlu
aXRpYWwgaW1wb3J0IHdoaWNoIHdlIGRvbid0IHdhbnQgbm90aWZpY2F0aW9ucyBmb3IKKyAgICBp
ZiAoIUlTX0lDT05fU1lOQ19USFJFQUQoKSkgeworICAgICAgICAvLyBTdGFydCB0aGUgdGltZXIg
dG8gY29tbWl0IHRoaXMgY2hhbmdlIC0gb3IgZnVydGhlciBkZWxheSB0aGUgdGltZXIgaWYgaXQg
d2FzIGFscmVhZHkgc3RhcnRlZAorICAgICAgICBzY2hlZHVsZU9yRGVmZXJTeW5jVGltZXIoKTsK
KworICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiRGlzcGF0Y2hpbmcgbm90aWZpY2F0aW9uIHRo
YXQgd2UgY2hhbmdlZCBhbiBpY29uIG1hcHBpbmcgZm9yIHVybCAlcyIsIHVybEZvckxvZ2dpbmco
cGFnZVVSTCkuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICBBdXRvZHJhaW5lZFBvb2wgcG9vbDsK
KyAgICAgICAgbV9jbGllbnQtPmRpZENoYW5nZUljb25Gb3JQYWdlVVJMKHBhZ2VVUkwpOworICAg
IH0KK30KKworSWNvbkRhdGFiYXNlOjpJY29uTG9hZERlY2lzaW9uIEljb25EYXRhYmFzZTo6c3lu
Y2hyb25vdXNMb2FkRGVjaXNpb25Gb3JJY29uVVJMKGNvbnN0IFN0cmluZyYgaWNvblVSTCkKK3sK
KyAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7CisKKyAgICBpZiAoIWlzT3BlbigpIHx8IGlj
b25VUkwuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gSWNvbkxvYWREZWNpc2lvbjo6Tm87CisK
KyAgICAvLyBJZiB3ZSBoYXZlIGEgSWNvblJlY29yZCwgaXQgc2hvdWxkIGFsc28gaGF2ZSBpdHMg
dGltZVN0YW1wIG1hcmtlZCBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgdHdvIHRpbWVzIHdoZW4gd2Ug
Y3JlYXRlIHRoZSBJY29uUmVjb3JkOgorICAgIC8vIDEgLSBXaGVuIHdlIHJlYWQgdGhlIGljb24g
dXJscyBmcm9tIGRpc2ssIGdldHRpbmcgdGhlIHRpbWVTdGFtcCBhdCB0aGUgc2FtZSB0aW1lCisg
ICAgLy8gMiAtIFdoZW4gd2UgZ2V0IGEgbmV3IGljb24gZnJvbSB0aGUgbG9hZGVyLCBpbiB3aGlj
aCBjYXNlIHRoZSB0aW1lc3RhbXAgaXMgc2V0IGF0IHRoYXQgdGltZQorICAgIHsKKyAgICAgICAg
TG9ja0hvbGRlciBsb2NrZXIobV91cmxBbmRJY29uTG9jayk7CisgICAgICAgIGlmIChJY29uUmVj
b3JkKiBpY29uID0gbV9pY29uVVJMVG9SZWNvcmRNYXAuZ2V0KGljb25VUkwpKSB7CisgICAgICAg
ICAgICBMT0coSWNvbkRhdGFiYXNlLCAiRm91bmQgZXhwaXJhdGlvbiB0aW1lIG9uIGEgcHJlc2Vu
dCBpY29uIGJhc2VkIG9uIGV4aXN0aW5nIEljb25SZWNvcmQiKTsKKyAgICAgICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxpbnQ+KGN1cnJlbnRUaW1lKCkpIC0gc3RhdGljX2Nhc3Q8aW50PihpY29u
LT5nZXRUaW1lc3RhbXAoKSkgPiBpY29uRXhwaXJhdGlvblRpbWUgPyBJY29uTG9hZERlY2lzaW9u
OjpZZXMgOiBJY29uTG9hZERlY2lzaW9uOjpObzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8v
IElmIHdlIGRvbid0IGhhdmUgYSByZWNvcmQgZm9yIGl0LCBidXQgd2UgKmhhdmUqIGltcG9ydGVk
IGFsbCBpY29uVVJMcyBmcm9tIGRpc2ssIHRoZW4gd2Ugc2hvdWxkIGxvYWQgaXQgbm93CisgICAg
TG9ja0hvbGRlciByZWFkaW5nTG9ja2VyKG1fcGVuZGluZ1JlYWRpbmdMb2NrKTsKKyAgICBpZiAo
bV9pY29uVVJMSW1wb3J0Q29tcGxldGUpCisgICAgICAgIHJldHVybiBJY29uTG9hZERlY2lzaW9u
OjpZZXM7CisKKyAgICAvLyBPdGhlcndpc2UgLSBzaW5jZSB3ZSByZWZ1c2UgdG8gcGVyZm9ybSBJ
L08gb24gdGhlIG1haW4gdGhyZWFkIHRvIGZpbmQgb3V0IGZvciBzdXJlIC0gd2UgcmV0dXJuIHRo
ZSBhbnN3ZXIgdGhhdCBzYXlzCisgICAgLy8gIllvdSBtaWdodCBiZSBhc2tlZCB0byBsb2FkIHRo
aXMgbGF0ZXIsIHNvIGZsYWcgdGhhdCIKKyAgICByZXR1cm4gSWNvbkxvYWREZWNpc2lvbjo6VW5r
bm93bjsKK30KKworYm9vbCBJY29uRGF0YWJhc2U6OnN5bmNocm9ub3VzSWNvbkRhdGFLbm93bkZv
ckljb25VUkwoY29uc3QgU3RyaW5nJiBpY29uVVJMKQoreworICAgIEFTU0VSVF9OT1RfU1lOQ19U
SFJFQUQoKTsKKworICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fdXJsQW5kSWNvbkxvY2spOworICAg
IGlmIChJY29uUmVjb3JkKiBpY29uID0gbV9pY29uVVJMVG9SZWNvcmRNYXAuZ2V0KGljb25VUkwp
KQorICAgICAgICByZXR1cm4gaWNvbi0+aW1hZ2VEYXRhU3RhdHVzKCkgIT0gSWNvblJlY29yZDo6
SW1hZ2VEYXRhU3RhdHVzOjpVbmtub3duOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lk
IEljb25EYXRhYmFzZTo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgQVNTRVJUX05P
VF9TWU5DX1RIUkVBRCgpOworCisgICAgaWYgKCFlbmFibGVkICYmIGlzT3BlbigpKQorICAgICAg
ICBjbG9zZSgpOworICAgIG1faXNFbmFibGVkID0gZW5hYmxlZDsKK30KKworYm9vbCBJY29uRGF0
YWJhc2U6OmlzRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgQVNTRVJUX05PVF9TWU5DX1RIUkVBRCgp
OworCisgICAgcmV0dXJuIG1faXNFbmFibGVkOworfQorCit2b2lkIEljb25EYXRhYmFzZTo6c2V0
UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChib29sIGZsYWcpCit7CisgICAgbV9wcml2YXRlQnJvd3Np
bmdFbmFibGVkID0gZmxhZzsKK30KKworYm9vbCBJY29uRGF0YWJhc2U6OmlzUHJpdmF0ZUJyb3dz
aW5nRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJpdmF0ZUJyb3dzaW5nRW5hYmxl
ZDsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6OmRlbGF5RGF0YWJhc2VDbGVhbnVwKCkKK3sKKyAg
ICArK2RhdGFiYXNlQ2xlYW51cENvdW50ZXI7CisgICAgaWYgKGRhdGFiYXNlQ2xlYW51cENvdW50
ZXIgPT0gMSkKKyAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIkRhdGFiYXNlIGNsZWFudXAgaXMg
bm93IERJU0FCTEVEIik7Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjphbGxvd0RhdGFiYXNlQ2xl
YW51cCgpCit7CisgICAgaWYgKC0tZGF0YWJhc2VDbGVhbnVwQ291bnRlciA8IDApCisgICAgICAg
IGRhdGFiYXNlQ2xlYW51cENvdW50ZXIgPSAwOworICAgIGlmICghZGF0YWJhc2VDbGVhbnVwQ291
bnRlcikKKyAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIkRhdGFiYXNlIGNsZWFudXAgaXMgbm93
IEVOQUJMRUQiKTsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6OmNoZWNrSW50ZWdyaXR5QmVmb3Jl
T3BlbmluZygpCit7CisgICAgY2hlY2tJbnRlZ3JpdHlPbk9wZW4gPSB0cnVlOworfQorCitJY29u
RGF0YWJhc2U6Okljb25EYXRhYmFzZSgpCisgICAgOiBtX3N5bmNUaW1lcihSdW5Mb29wOjptYWlu
KCksIHRoaXMsICZJY29uRGF0YWJhc2U6OnN5bmNUaW1lckZpcmVkKQorICAgICwgbV9tYWluVGhy
ZWFkQ2FsbGJhY2tDb3VudCgwKQorICAgICwgbV9jbGllbnQoZGVmYXVsdENsaWVudCgpKQorewor
ICAgIExPRyhJY29uRGF0YWJhc2UsICJDcmVhdGluZyBJY29uRGF0YWJhc2UgJXAiLCB0aGlzKTsK
KyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworfQorCitJY29uRGF0YWJhc2U6On5JY29uRGF0
YWJhc2UoKQoreworICAgIEFTU0VSVCghaXNPcGVuKCkpOworfQorCit2b2lkIEljb25EYXRhYmFz
ZTo6d2FrZVN5bmNUaHJlYWQoKQoreworICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fc3luY0xvY2sp
OworCisgICAgbV9zeW5jVGhyZWFkSGFzV29ya1RvRG8gPSB0cnVlOworICAgIG1fc3luY0NvbmRp
dGlvbi5ub3RpZnlPbmUoKTsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6OnNjaGVkdWxlT3JEZWZl
clN5bmNUaW1lcigpCit7CisgICAgQVNTRVJUX05PVF9TWU5DX1RIUkVBRCgpOworCisgICAgaWYg
KG1fc2NoZWR1bGVPckRlZmVyU3luY1RpbWVyUmVxdWVzdGVkKQorICAgICAgICByZXR1cm47CisK
KyAgICBtX3NjaGVkdWxlT3JEZWZlclN5bmNUaW1lclJlcXVlc3RlZCA9IHRydWU7CisgICAgY2Fs
bE9uTWFpblRocmVhZChbdGhpc10geworICAgICAgICBtX3N5bmNUaW1lci5zdGFydE9uZVNob3Qo
dXBkYXRlVGltZXJEZWxheSk7CisgICAgICAgIG1fc2NoZWR1bGVPckRlZmVyU3luY1RpbWVyUmVx
dWVzdGVkID0gZmFsc2U7CisgICAgfSk7Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpzeW5jVGlt
ZXJGaXJlZCgpCit7CisgICAgQVNTRVJUX05PVF9TWU5DX1RIUkVBRCgpOworICAgIHdha2VTeW5j
VGhyZWFkKCk7Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKgorLy8gKioqIEFueSBUaHJlYWQg
KioqCisvLyAqKioqKioqKioqKioqKioqKioKKworYm9vbCBJY29uRGF0YWJhc2U6OmlzT3Blbigp
IGNvbnN0Cit7CisgICAgcmV0dXJuIGlzT3BlbkJlc2lkZXNNYWluVGhyZWFkQ2FsbGJhY2tzKCkg
fHwgbV9tYWluVGhyZWFkQ2FsbGJhY2tDb3VudDsKK30KKworYm9vbCBJY29uRGF0YWJhc2U6Omlz
T3BlbkJlc2lkZXNNYWluVGhyZWFkQ2FsbGJhY2tzKCkgY29uc3QKK3sKKyAgICBMb2NrSG9sZGVy
IGxvY2tlcihtX3N5bmNMb2NrKTsKKyAgICByZXR1cm4gbV9zeW5jVGhyZWFkUnVubmluZyB8fCBt
X3N5bmNEQi5pc09wZW4oKTsKK30KKworU3RyaW5nIEljb25EYXRhYmFzZTo6ZGF0YWJhc2VQYXRo
KCkgY29uc3QKK3sKKyAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3N5bmNMb2NrKTsKKyAgICByZXR1
cm4gbV9jb21wbGV0ZURhdGFiYXNlUGF0aC5pc29sYXRlZENvcHkoKTsKK30KKworU3RyaW5nIElj
b25EYXRhYmFzZTo6ZGVmYXVsdERhdGFiYXNlRmlsZW5hbWUoKQoreworICAgIHN0YXRpYyBOZXZl
ckRlc3Ryb3llZDxTdHJpbmc+IGRlZmF1bHREYXRhYmFzZUZpbGVuYW1lKE1BS0VfU1RBVElDX1NU
UklOR19JTVBMKCJXZWJwYWdlSWNvbnMuZGIiKSk7CisgICAgcmV0dXJuIGRlZmF1bHREYXRhYmFz
ZUZpbGVuYW1lLmdldCgpLmlzb2xhdGVkQ29weSgpOworfQorCisvLyBVbmxpa2UgZ2V0T3JDcmVh
dGVQYWdlVVJMUmVjb3JkKCksIGdldE9yQ3JlYXRlSWNvblJlY29yZCgpIGRvZXMgbm90IG1hcmsg
dGhlIGljb24gYXMgImludGVyZXN0ZWQgaW4gaW1wb3J0IgorUmVmPEljb25EYXRhYmFzZTo6SWNv
blJlY29yZD4gSWNvbkRhdGFiYXNlOjpnZXRPckNyZWF0ZUljb25SZWNvcmQoY29uc3QgU3RyaW5n
JiBpY29uVVJMKQoreworICAgIC8vIENsaWVudHMgb2YgZ2V0T3JDcmVhdGVJY29uUmVjb3JkKCkg
YXJlIHJlcXVpcmVkIHRvIGFjcXVpcmUgdGhlIG1fdXJsQW5kSWNvbkxvY2sgYmVmb3JlIGNhbGxp
bmcgdGhpcyBtZXRob2QKKyAgICBBU1NFUlQoIW1fdXJsQW5kSWNvbkxvY2sudHJ5TG9jaygpKTsK
KworICAgIGlmIChhdXRvKiBpY29uID0gbV9pY29uVVJMVG9SZWNvcmRNYXAuZ2V0KGljb25VUkwp
KQorICAgICAgICByZXR1cm4gKmljb247CisKKyAgICBhdXRvIG5ld0ljb24gPSBJY29uUmVjb3Jk
OjpjcmVhdGUoaWNvblVSTCk7CisgICAgbV9pY29uVVJMVG9SZWNvcmRNYXAuc2V0KGljb25VUkws
IG5ld0ljb24ucHRyKCkpOworICAgIHJldHVybiBuZXdJY29uOworfQorCisvLyBUaGlzIG1ldGhv
ZCByZXRyaWV2ZXMgdGhlIGV4aXN0aW5nIFBhZ2VVUkxSZWNvcmQsIG9yIGNyZWF0ZXMgYSBuZXcg
b25lIGFuZCBtYXJrcyBpdCBhcyAiaW50ZXJlc3RlZCBpbiB0aGUgaW1wb3J0IiBmb3IgbGF0ZXIg
bm90aWZpY2F0aW9uCitJY29uRGF0YWJhc2U6OlBhZ2VVUkxSZWNvcmQqIEljb25EYXRhYmFzZTo6
Z2V0T3JDcmVhdGVQYWdlVVJMUmVjb3JkKGNvbnN0IFN0cmluZyYgcGFnZVVSTCkKK3sKKyAgICAv
LyBDbGllbnRzIG9mIGdldE9yQ3JlYXRlUGFnZVVSTFJlY29yZCgpIGFyZSByZXF1aXJlZCB0byBh
Y3F1aXJlIHRoZSBtX3VybEFuZEljb25Mb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kCisg
ICAgQVNTRVJUKCFtX3VybEFuZEljb25Mb2NrLnRyeUxvY2soKSk7CisKKyAgICBpZiAoIWRvY3Vt
ZW50Q2FuSGF2ZUljb24ocGFnZVVSTCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAg
UGFnZVVSTFJlY29yZCogcGFnZVJlY29yZCA9IG1fcGFnZVVSTFRvUmVjb3JkTWFwLmdldChwYWdl
VVJMKTsKKworICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1JlYWRpbmdMb2NrKTsKKyAg
ICBpZiAoIW1faWNvblVSTEltcG9ydENvbXBsZXRlKSB7CisgICAgICAgIC8vIElmIHRoZSBpbml0
aWFsIGltcG9ydCBvZiBhbGwgVVJMcyBoYXNuJ3QgY29tcGxldGVkIGFuZCB3ZSBoYXZlIG5vIHBh
Z2UgcmVjb3JkLCB3ZSBhc3N1bWUgd2UgKm1pZ2h0KiBrbm93IGFib3V0IHRoaXMgbGF0ZXIgYW5k
IGNyZWF0ZSBhIHJlY29yZCBmb3IgaXQKKyAgICAgICAgaWYgKCFwYWdlUmVjb3JkKSB7CisgICAg
ICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiQ3JlYXRpbmcgbmV3IFBhZ2VVUkxSZWNvcmQgZm9y
IHBhZ2VVUkwgJXMiLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkwpLmFzY2lpKCkuZGF0YSgpKTsKKyAg
ICAgICAgICAgIHBhZ2VSZWNvcmQgPSBuZXcgUGFnZVVSTFJlY29yZChwYWdlVVJMKTsKKyAgICAg
ICAgICAgIG1fcGFnZVVSTFRvUmVjb3JkTWFwLnNldChwYWdlVVJMLCBwYWdlUmVjb3JkKTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBwYWdlUmVjb3JkIGZvciB0aGlzIHBhZ2UgZG9l
cyBub3QgaGF2ZSBhbiBpY29uUmVjb3JkIGF0dGFjaGVkIHRvIGl0LCB0aGVuIGl0IGlzIGEgbmV3
IHBhZ2VSZWNvcmQgc3RpbGwgYXdhaXRpbmcgdGhlIGluaXRpYWwgaW1wb3J0CisgICAgICAgIC8v
IE1hcmsgdGhlIFVSTCBhcyAiaW50ZXJlc3RlZCBpbiB0aGUgcmVzdWx0IG9mIHRoZSBpbXBvcnQi
IHRoZW4gYmFpbAorICAgICAgICBpZiAoIXBhZ2VSZWNvcmQtPmljb25SZWNvcmQoKSkgeworICAg
ICAgICAgICAgbV9wYWdlVVJMc1BlbmRpbmdJbXBvcnQuYWRkKHBhZ2VVUkwpOworICAgICAgICAg
ICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXZSd2ZSBkb25l
IHRoZSBpbml0aWFsIGltcG9ydCBvZiBhbGwgVVJMcyBrbm93biBpbiB0aGUgZGF0YWJhc2UuIElm
IHRoaXMgcmVjb3JkIGRvZXNuJ3QgZXhpc3Qgbm93LCBpdCBuZXZlciB3aWxsCisgICAgcmV0dXJu
IHBhZ2VSZWNvcmQ7Cit9CisKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAqKiog
U3luYyBUaHJlYWQgT25seSAqKioKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKgorCitib29s
IEljb25EYXRhYmFzZTo6c2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkgY29uc3QKK3sKKyAgICBB
U1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOworCisgICAgcmV0dXJuIG1fdGhyZWFkVGVybWluYXRp
b25SZXF1ZXN0ZWQgfHwgbV9yZW1vdmVJY29uc1JlcXVlc3RlZDsKK30KKwordm9pZCBJY29uRGF0
YWJhc2U6Omljb25EYXRhYmFzZVN5bmNUaHJlYWQoKQoreworICAgIC8vIFRoZSBjYWxsIHRvIGNy
ZWF0ZSB0aGlzIHRocmVhZCBtaWdodCBub3QgY29tcGxldGUgYmVmb3JlIHRoZSB0aHJlYWQgYWN0
dWFsbHkgc3RhcnRzLCBzbyB3ZSBtaWdodCBmYWlsIHRoaXMgQVNTRVJUX0lDT05fU1lOQ19USFJF
QUQoKSBiZWNhdXNlIHRoZSBwb2ludGVyCisgICAgLy8gdG8gb3VyIHRocmVhZCBzdHJ1Y3R1cmUg
aGFzbid0IGJlZW4gZmlsbGVkIGluIHlldC4KKyAgICAvLyBUbyBmaXggdGhpcywgdGhlIG1haW4g
dGhyZWFkIGFjcXVpcmVzIHRoaXMgbG9jayBiZWZvcmUgY3JlYXRpbmcgdXMsIHRoZW4gcmVsZWFz
ZXMgdGhlIGxvY2sgYWZ0ZXIgY3JlYXRpb24gaXMgY29tcGxldGUuIEEgcXVpY2sgbG9jay91bmxv
Y2sgY3ljbGUgaGVyZSB3aWxsCisgICAgLy8gcHJldmVudCB1cyBmcm9tIHJ1bm5pbmcgYmVmb3Jl
IHRoYXQgY2FsbCBjb21wbGV0ZXMKKyAgICBtX3N5bmNMb2NrLmxvY2soKTsKKyAgICBtX3N5bmNM
b2NrLnVubG9jaygpOworCisgICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKKworICAgIExP
RyhJY29uRGF0YWJhc2UsICIoVEhSRUFEKSBJY29uRGF0YWJhc2Ugc3luYyB0aHJlYWQgc3RhcnRl
ZCIpOworCisjaWYgIUxPR19ESVNBQkxFRAorICAgIGRvdWJsZSBzdGFydFRpbWUgPSBtb25vdG9u
aWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKKyNlbmRpZgorCisgICAgLy8gTmVlZCB0byBjcmVhdGUg
dGhlIGRhdGFiYXNlIHBhdGggaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0CisgICAgbWFrZUFs
bERpcmVjdG9yaWVzKG1fZGF0YWJhc2VEaXJlY3RvcnkpOworCisgICAgLy8gRXhpc3RlbmNlIG9m
IGEgam91cm5hbCBmaWxlIGlzIGV2aWRlbmNlIG9mIGEgcHJldmlvdXMgY3Jhc2gvZm9yY2UgcXVp
dCBhbmQgYXV0b21hdGljYWxseSBxdWFsaWZpZXMKKyAgICAvLyB1cyB0byBkbyBhbiBpbnRlZ3Jp
dHkgY2hlY2sKKyAgICBTdHJpbmcgam91cm5hbEZpbGVuYW1lID0gbV9jb21wbGV0ZURhdGFiYXNl
UGF0aCArICItam91cm5hbCI7CisgICAgaWYgKCFjaGVja0ludGVncml0eU9uT3BlbikgeworICAg
ICAgICBBdXRvZHJhaW5lZFBvb2wgcG9vbDsKKyAgICAgICAgY2hlY2tJbnRlZ3JpdHlPbk9wZW4g
PSBmaWxlRXhpc3RzKGpvdXJuYWxGaWxlbmFtZSk7CisgICAgfQorCisgICAgeworICAgICAgICBM
b2NrSG9sZGVyIGxvY2tlcihtX3N5bmNMb2NrKTsKKyAgICAgICAgaWYgKCFtX3N5bmNEQi5vcGVu
KG1fY29tcGxldGVEYXRhYmFzZVBhdGgpKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIlVuYWJs
ZSB0byBvcGVuIGljb24gZGF0YWJhc2UgYXQgcGF0aCAlcyAtICVzIiwgbV9jb21wbGV0ZURhdGFi
YXNlUGF0aC5hc2NpaSgpLmRhdGEoKSwgbV9zeW5jREIubGFzdEVycm9yTXNnKCkpOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNob3VsZFN0b3BUaHJl
YWRBY3Rpdml0eSgpKSB7CisgICAgICAgIHN5bmNUaHJlYWRNYWluTG9vcCgpOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisjaWYgIUxPR19ESVNBQkxFRAorICAgIGRvdWJsZSB0aW1lU3RhbXAg
PSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKKyAgICBMT0coSWNvbkRhdGFiYXNlLCAi
KFRIUkVBRCkgT3BlbiB0b29rICUuNGYgc2Vjb25kcyIsIHRpbWVTdGFtcCAtIHN0YXJ0VGltZSk7
CisjZW5kaWYKKworICAgIHBlcmZvcm1PcGVuSW5pdGlhbGl6YXRpb24oKTsKKyAgICBpZiAoc2hv
dWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpIHsKKyAgICAgICAgc3luY1RocmVhZE1haW5Mb29wKCk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiAhTE9HX0RJU0FCTEVECisgICAgZG91Ymxl
IG5ld1N0YW1wID0gbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCk7CisgICAgTE9HKEljb25E
YXRhYmFzZSwgIihUSFJFQUQpIHBlcmZvcm1PcGVuSW5pdGlhbGl6YXRpb24oKSB0b29rICUuNGYg
c2Vjb25kcywgbm93ICUuNGYgc2Vjb25kcyBmcm9tIHRocmVhZCBzdGFydCIsIG5ld1N0YW1wIC0g
dGltZVN0YW1wLCBuZXdTdGFtcCAtIHN0YXJ0VGltZSk7CisgICAgdGltZVN0YW1wID0gbmV3U3Rh
bXA7CisjZW5kaWYKKworICAgIC8vIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gc2lt
dWxhdGUgYSBsb25nIGxhc3RpbmcgVVJMIGltcG9ydCAoKkhVR0UqIGljb24gZGF0YWJhc2VzLCBv
ciBuZXR3b3JrIGhvbWUgZGlyZWN0b3JpZXMpCisgICAgLy8gd2hpbGUgKG1vbm90b25pY2FsbHlJ
bmNyZWFzaW5nVGltZSgpIC0gdGltZVN0YW1wIDwgMTApOworCisgICAgLy8gUmVhZCBpbiBVUkwg
bWFwcGluZ3MgZnJvbSB0aGUgZGF0YWJhc2UKKyAgICBMT0coSWNvbkRhdGFiYXNlLCAiKFRIUkVB
RCkgU3RhcnRpbmcgaWNvblVSTCBpbXBvcnQiKTsKKyAgICBwZXJmb3JtVVJMSW1wb3J0KCk7CisK
KyAgICBpZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpIHsKKyAgICAgICAgc3luY1RocmVh
ZE1haW5Mb29wKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiAhTE9HX0RJU0FCTEVE
CisgICAgbmV3U3RhbXAgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKKyAgICBMT0co
SWNvbkRhdGFiYXNlLCAiKFRIUkVBRCkgcGVyZm9ybVVSTEltcG9ydCgpIHRvb2sgJS40ZiBzZWNv
bmRzLiBFbnRlcmluZyBtYWluIGxvb3AgJS40ZiBzZWNvbmRzIGZyb20gdGhyZWFkIHN0YXJ0Iiwg
bmV3U3RhbXAgLSB0aW1lU3RhbXAsIG5ld1N0YW1wIC0gc3RhcnRUaW1lKTsKKyNlbmRpZgorCisg
ICAgTE9HKEljb25EYXRhYmFzZSwgIihUSFJFQUQpIEJlZ2lubmluZyBzeW5jIik7CisgICAgc3lu
Y1RocmVhZE1haW5Mb29wKCk7Cit9CisKK3N0YXRpYyBpbnQgZGF0YWJhc2VWZXJzaW9uTnVtYmVy
KFNRTGl0ZURhdGFiYXNlJiBkYikKK3sKKyAgICByZXR1cm4gU1FMaXRlU3RhdGVtZW50KGRiLCAi
U0VMRUNUIHZhbHVlIEZST00gSWNvbkRhdGFiYXNlSW5mbyBXSEVSRSBrZXkgPSAnVmVyc2lvbic7
IikuZ2V0Q29sdW1uSW50KDApOworfQorCitzdGF0aWMgYm9vbCBpc1ZhbGlkRGF0YWJhc2UoU1FM
aXRlRGF0YWJhc2UmIGRiKQoreworICAgIC8vIFRoZXNlIGZvdXIgdGFibGVzIHNob3VsZCBhbHdh
eXMgZXhpc3QgaW4gYSB2YWxpZCBkYgorICAgIGlmICghZGIudGFibGVFeGlzdHMoIkljb25JbmZv
IikgfHwgIWRiLnRhYmxlRXhpc3RzKCJJY29uRGF0YSIpIHx8ICFkYi50YWJsZUV4aXN0cygiUGFn
ZVVSTCIpIHx8ICFkYi50YWJsZUV4aXN0cygiSWNvbkRhdGFiYXNlSW5mbyIpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoZGF0YWJhc2VWZXJzaW9uTnVtYmVyKGRiKSA8IGN1cnJl
bnREYXRhYmFzZVZlcnNpb24pIHsKKyAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIkRCIHZlcnNp
b24gaXMgbm90IGZvdW5kIG9yIGJlbG93IGV4cGVjdGVkIHZhbGlkIHZlcnNpb24iKTsKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMg
dm9pZCBjcmVhdGVEYXRhYmFzZVRhYmxlcyhTUUxpdGVEYXRhYmFzZSYgZGIpCit7CisgICAgaWYg
KCFkYi5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIFRBQkxFIFBhZ2VVUkwgKHVybCBURVhUIE5PVCBO
VUxMIE9OIENPTkZMSUNUIEZBSUwgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsaWNvbklEIElO
VEVHRVIgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCk7IikpIHsKKyAgICAgICAgTE9HX0VSUk9S
KCJDb3VsZCBub3QgY3JlYXRlIFBhZ2VVUkwgdGFibGUgaW4gZGF0YWJhc2UgKCVpKSAtICVzIiwg
ZGIubGFzdEVycm9yKCksIGRiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgZGIuY2xvc2UoKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWRiLmV4ZWN1dGVDb21tYW5kKCJDUkVB
VEUgSU5ERVggUGFnZVVSTEluZGV4IE9OIFBhZ2VVUkwgKHVybCk7IikpIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIFBhZ2VVUkwgaW5kZXggaW4gZGF0YWJhc2UgKCVpKSAt
ICVzIiwgZGIubGFzdEVycm9yKCksIGRiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgZGIuY2xv
c2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWRiLmV4ZWN1dGVDb21tYW5k
KCJDUkVBVEUgVEFCTEUgSWNvbkluZm8gKGljb25JRCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9J
TkNSRU1FTlQgVU5JUVVFIE9OIENPTkZMSUNUIFJFUExBQ0UsIHVybCBURVhUIE5PVCBOVUxMIE9O
IENPTkZMSUNUIEZBSUwgVU5JUVVFIE9OIENPTkZMSUNUIEZBSUwsIHN0YW1wIElOVEVHRVIpOyIp
KSB7CisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IGNyZWF0ZSBJY29uSW5mbyB0YWJsZSBp
biBkYXRhYmFzZSAoJWkpIC0gJXMiLCBkYi5sYXN0RXJyb3IoKSwgZGIubGFzdEVycm9yTXNnKCkp
OworICAgICAgICBkYi5jbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgh
ZGIuZXhlY3V0ZUNvbW1hbmQoIkNSRUFURSBJTkRFWCBJY29uSW5mb0luZGV4IE9OIEljb25JbmZv
ICh1cmwsIGljb25JRCk7IikpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRl
IFBhZ2VVUkwgaW5kZXggaW4gZGF0YWJhc2UgKCVpKSAtICVzIiwgZGIubGFzdEVycm9yKCksIGRi
Lmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKyAgICBpZiAoIWRiLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgVEFCTEUgSWNvbkRhdGEg
KGljb25JRCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQgVU5JUVVFIE9OIENPTkZM
SUNUIFJFUExBQ0UsIGRhdGEgQkxPQik7IikpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBu
b3QgY3JlYXRlIEljb25EYXRhIHRhYmxlIGluIGRhdGFiYXNlICglaSkgLSAlcyIsIGRiLmxhc3RF
cnJvcigpLCBkYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIGRiLmNsb3NlKCk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgaWYgKCFkYi5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIElOREVY
IEljb25EYXRhSW5kZXggT04gSWNvbkRhdGEgKGljb25JRCk7IikpIHsKKyAgICAgICAgTE9HX0VS
Uk9SKCJDb3VsZCBub3QgY3JlYXRlIFBhZ2VVUkwgaW5kZXggaW4gZGF0YWJhc2UgKCVpKSAtICVz
IiwgZGIubGFzdEVycm9yKCksIGRiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgZGIuY2xvc2Uo
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWRiLmV4ZWN1dGVDb21tYW5kKCJD
UkVBVEUgVEFCTEUgSWNvbkRhdGFiYXNlSW5mbyAoa2V5IFRFWFQgTk9UIE5VTEwgT04gQ09ORkxJ
Q1QgRkFJTCBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSx2YWx1ZSBURVhUIE5PVCBOVUxMIE9O
IENPTkZMSUNUIEZBSUwpOyIpKSB7CisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IGNyZWF0
ZSBJY29uRGF0YWJhc2VJbmZvIHRhYmxlIGluIGRhdGFiYXNlICglaSkgLSAlcyIsIGRiLmxhc3RF
cnJvcigpLCBkYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIGRiLmNsb3NlKCk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisgICAgaWYgKCFkYi5leGVjdXRlQ29tbWFuZChTdHJpbmcoIklOU0VS
VCBJTlRPIEljb25EYXRhYmFzZUluZm8gVkFMVUVTICgnVmVyc2lvbicsICIpICsgU3RyaW5nOjpu
dW1iZXIoY3VycmVudERhdGFiYXNlVmVyc2lvbikgKyAiKTsiKSkgeworICAgICAgICBMT0dfRVJS
T1IoIkNvdWxkIG5vdCBpbnNlcnQgaWNvbiBkYXRhYmFzZSB2ZXJzaW9uIGludG8gSWNvbkRhdGFi
YXNlSW5mbyB0YWJsZSAoJWkpIC0gJXMiLCBkYi5sYXN0RXJyb3IoKSwgZGIubGFzdEVycm9yTXNn
KCkpOworICAgICAgICBkYi5jbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCit2
b2lkIEljb25EYXRhYmFzZTo6cGVyZm9ybU9wZW5Jbml0aWFsaXphdGlvbigpCit7CisgICAgQVNT
RVJUX0lDT05fU1lOQ19USFJFQUQoKTsKKworICAgIGlmICghaXNPcGVuKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGlmIChjaGVja0ludGVncml0eU9uT3BlbikgeworICAgICAgICBjaGVja0lu
dGVncml0eU9uT3BlbiA9IGZhbHNlOworICAgICAgICBpZiAoIWNoZWNrSW50ZWdyaXR5KCkpIHsK
KyAgICAgICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJJbnRlZ3JpdHkgY2hlY2sgd2FzIGJhZCAt
IGR1bXBpbmcgSWNvbkRhdGFiYXNlIik7CisKKyAgICAgICAgICAgIG1fc3luY0RCLmNsb3NlKCk7
CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3N5
bmNMb2NrKTsKKyAgICAgICAgICAgICAgICAvLyBTaG91bGQndmUgYmVlbiBjb25zdW1lZCBieSBT
UUxpdGUsIGRlbGV0ZSBqdXN0IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBzZWUgaXQgYWdhaW4gaW4g
dGhlIGZ1dHVyZTsKKyAgICAgICAgICAgICAgICBkZWxldGVGaWxlKG1fY29tcGxldGVEYXRhYmFz
ZVBhdGggKyAiLWpvdXJuYWwiKTsKKyAgICAgICAgICAgICAgICBkZWxldGVGaWxlKG1fY29tcGxl
dGVEYXRhYmFzZVBhdGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZW9wZW4g
dGhlIHdyaXRlIGRhdGFiYXNlLCBjcmVhdGluZyBpdCBmcm9tIHNjcmF0Y2gKKyAgICAgICAgICAg
IGlmICghbV9zeW5jREIub3BlbihtX2NvbXBsZXRlRGF0YWJhc2VQYXRoKSkgeworICAgICAgICAg
ICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIG9wZW4gaWNvbiBkYXRhYmFzZSBhdCBwYXRoICVz
IC0gJXMiLCBtX2NvbXBsZXRlRGF0YWJhc2VQYXRoLmFzY2lpKCkuZGF0YSgpLCBtX3N5bmNEQi5s
YXN0RXJyb3JNc2coKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisgICAgfQorCisgICAgaW50IHZlcnNpb24gPSBkYXRhYmFzZVZlcnNpb25OdW1i
ZXIobV9zeW5jREIpOworCisgICAgaWYgKHZlcnNpb24gPiBjdXJyZW50RGF0YWJhc2VWZXJzaW9u
KSB7CisgICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJEYXRhYmFzZSB2ZXJzaW9uIG51bWJlciAl
aSBpcyBncmVhdGVyIHRoYW4gb3VyIGN1cnJlbnQgdmVyc2lvbiBudW1iZXIgJWkgLSBjbG9zaW5n
IHRoZSBkYXRhYmFzZSB0byBwcmV2ZW50IG92ZXJ3cml0aW5nIG5ld2VyIHZlcnNpb25zIiwgdmVy
c2lvbiwgY3VycmVudERhdGFiYXNlVmVyc2lvbik7CisgICAgICAgIG1fc3luY0RCLmNsb3NlKCk7
CisgICAgICAgIG1fdGhyZWFkVGVybWluYXRpb25SZXF1ZXN0ZWQgPSB0cnVlOworICAgICAgICBy
ZXR1cm47CisgICAgfQorCisgICAgaWYgKCFpc1ZhbGlkRGF0YWJhc2UobV9zeW5jREIpKSB7Cisg
ICAgICAgIExPRyhJY29uRGF0YWJhc2UsICIlcyBpcyBtaXNzaW5nIG9yIGluIGFuIGludmFsaWQg
c3RhdGUgLSByZWNvbnN0cnVjdGluZyIsIG1fY29tcGxldGVEYXRhYmFzZVBhdGguYXNjaWkoKS5k
YXRhKCkpOworICAgICAgICBtX3N5bmNEQi5jbGVhckFsbFRhYmxlcygpOworICAgICAgICBjcmVh
dGVEYXRhYmFzZVRhYmxlcyhtX3N5bmNEQik7CisgICAgfQorCisgICAgLy8gUmVkdWNlIHNxbGl0
ZSBSQU0gY2FjaGUgc2l6ZSBmcm9tIGRlZmF1bHQgMjAwMCBwYWdlcyAofjEuNWtCIHBlciBwYWdl
KS4gM01CIG9mIGNhY2hlIGZvciBpY29uIGRhdGFiYXNlIGlzIG92ZXJraWxsCisgICAgaWYgKCFT
UUxpdGVTdGF0ZW1lbnQobV9zeW5jREIsICJQUkFHTUEgY2FjaGVfc2l6ZSA9IDIwMDsiKS5leGVj
dXRlQ29tbWFuZCgpKQorICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBkYXRhYmFzZSBjb3VsZCBu
b3Qgc2V0IGNhY2hlX3NpemUiKTsKK30KKworYm9vbCBJY29uRGF0YWJhc2U6OmNoZWNrSW50ZWdy
aXR5KCkKK3sKKyAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOworCisgICAgU1FMaXRlU3Rh
dGVtZW50IGludGVncml0eShtX3N5bmNEQiwgIlBSQUdNQSBpbnRlZ3JpdHlfY2hlY2s7Iik7Cisg
ICAgaWYgKGludGVncml0eS5wcmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19F
UlJPUigiY2hlY2tJbnRlZ3JpdHkgZmFpbGVkIHRvIGV4ZWN1dGUiKTsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKworICAgIGludCByZXN1bHRDb2RlID0gaW50ZWdyaXR5LnN0ZXAoKTsK
KyAgICBpZiAocmVzdWx0Q29kZSA9PSBTUUxJVEVfT0spCisgICAgICAgIHJldHVybiB0cnVlOwor
CisgICAgaWYgKHJlc3VsdENvZGUgIT0gU1FMSVRFX1JPVykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgaW50IGNvbHVtbnMgPSBpbnRlZ3JpdHkuY29sdW1uQ291bnQoKTsKKyAgICBpZiAo
Y29sdW1ucyAhPSAxKSB7CisgICAgICAgIExPR19FUlJPUigiUmVjZWl2ZWQgJWkgY29sdW1ucyBw
ZXJmb3JtaW5nIGludGVncml0eSBjaGVjaywgc2hvdWxkIGJlIDEiLCBjb2x1bW5zKTsKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmluZyByZXN1bHRUZXh0ID0gaW50ZWdy
aXR5LmdldENvbHVtblRleHQoMCk7CisKKyAgICAvLyBBIHN1Y2Nlc3NmdWwsIG5vLWVycm9yIGlu
dGVncml0eSBjaGVjayB3aWxsIGJlICJvayIgLSBhbGwgb3RoZXIgc3RyaW5ncyBpbXBseSBmYWls
dXJlCisgICAgaWYgKHJlc3VsdFRleHQgPT0gIm9rIikKKyAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICBMT0dfRVJST1IoIkljb24gZGF0YWJhc2UgaW50ZWdyaXR5IGNoZWNrIGZhaWxlZCAtIFxu
JXMiLCByZXN1bHRUZXh0LmFzY2lpKCkuZGF0YSgpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3ZvaWQgSWNvbkRhdGFiYXNlOjpwZXJmb3JtVVJMSW1wb3J0KCkKK3sKKyAgICBBU1NFUlRfSUNP
Tl9TWU5DX1RIUkVBRCgpOworCisgICAgLy8gRG8gbm90IGltcG9ydCBpY29ucyBub3QgdXNlZCBp
biB0aGUgbGFzdCAzMCBkYXlzLiBUaGV5IHdpbGwgYmUgYXV0b21hdGljYWxseSBwcnVuZWQgbGF0
ZXIgaWYgbm9ib2R5IHJldGFpbnMgdGhlbS4KKyAgICAvLyBOb3RlIHRoYXQgSWNvbkluZm8uc3Rh
bXAgaXMgb25seSBzZXQgd2hlbiB0aGUgaWNvbiBkYXRhIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBz
ZXJ2ZXIgKGFuZCB0aHVzIGlzIG5vdCB1cGRhdGVkIHdoZXRoZXIKKyAgICAvLyB3ZSB1c2UgaXQg
b3Igbm90KS4gVGhpcyBjb2RlIHdvcmtzIGFueXdheSBiZWNhdXNlIHRoZSBJY29uRGF0YWJhc2Ug
ZG93bmxvYWRzIGljb25zIGFnYWluIGlmIHRoZXkgYXJlIG9sZGVyIHRoYW4gNCBkYXlzLAorICAg
IC8vIHNvIGlmIHRoZSB0aW1lc3RhbXAgZ29lcyBiYWNrIGluIHRpbWUgbW9yZSB0aGFuIHRob3Nl
IDMwIGRheXMgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgaWNvbiB3YXMgbm90IHVzZWQgYXQgYWxs
LgorICAgIFN0cmluZyBpbXBvcnRRdWVyeSA9IFN0cmluZzo6Zm9ybWF0KCJTRUxFQ1QgUGFnZVVS
TC51cmwsIEljb25JbmZvLnVybCwgSWNvbkluZm8uc3RhbXAgRlJPTSBQYWdlVVJMIElOTkVSIEpP
SU4gSWNvbkluZm8gT04gUGFnZVVSTC5pY29uSUQ9SWNvbkluZm8uaWNvbklEIFdIRVJFIEljb25J
bmZvLnN0YW1wID4gJS4wZjsiLCBmbG9vcihjdXJyZW50VGltZSgpIC0gbm90VXNlZEljb25FeHBp
cmF0aW9uVGltZSkpOworCisgICAgU1FMaXRlU3RhdGVtZW50IHF1ZXJ5KG1fc3luY0RCLCBpbXBv
cnRRdWVyeSk7CisKKyAgICBpZiAocXVlcnkucHJlcGFyZSgpICE9IFNRTElURV9PSykgeworICAg
ICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBwcmVwYXJlIGljb24gdXJsIGltcG9ydCBxdWVyeSIp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHJlc3VsdCA9IHF1ZXJ5LnN0ZXAo
KTsKKyAgICB3aGlsZSAocmVzdWx0ID09IFNRTElURV9ST1cpIHsKKyAgICAgICAgQXV0b2RyYWlu
ZWRQb29sIHBvb2w7CisgICAgICAgIFN0cmluZyBwYWdlVVJMID0gcXVlcnkuZ2V0Q29sdW1uVGV4
dCgwKTsKKyAgICAgICAgU3RyaW5nIGljb25VUkwgPSBxdWVyeS5nZXRDb2x1bW5UZXh0KDEpOwor
CisgICAgICAgIHsKKyAgICAgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fdXJsQW5kSWNvbkxv
Y2spOworCisgICAgICAgICAgICBQYWdlVVJMUmVjb3JkKiBwYWdlUmVjb3JkID0gbV9wYWdlVVJM
VG9SZWNvcmRNYXAuZ2V0KHBhZ2VVUkwpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgcGFnZVJl
Y29yZCBkb2Vzbid0IGV4aXN0IGluIHRoaXMgbWFwLCB0aGVuIG5vIG9uZSBoYXMgcmV0YWluZWQg
dGhpcyBwYWdlVVJMCisgICAgICAgICAgICAvLyBJZiB0aGUgc19kYXRhYmFzZUNsZWFudXBDb3Vu
dGVyIGNvdW50IGlzIG5vbi16ZXJvLCB0aGVuIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBiZSBwcnVu
aW5nIHRoZSBkYXRhYmFzZSBpbiBhbnkgbWFubmVyLAorICAgICAgICAgICAgLy8gc28gYWN0dWFs
bHkgY3JlYXRlIGEgcGFnZVVSTFJlY29yZCBmb3IgdGhpcyB1cmwgZXZlbiB0aG91Z2ggaXQncyBu
b3QgcmV0YWluZWQuCisgICAgICAgICAgICAvLyBJZiBkYXRhYmFzZSBjbGVhbnVwICppcyogYWxs
b3dlZCwgd2UgZG9uJ3Qgd2FudCB0byBib3RoZXIgcHVsbGluZyBpbiBhIHBhZ2UgdXJsIGZyb20g
ZGlzayB0aGF0IG5vb25lIGlzIGFjdHVhbGx5IGludGVyZXN0ZWQKKyAgICAgICAgICAgIC8vIGlu
IC0gd2UnbGwgcHJ1bmUgaXQgbGF0ZXIgaW5zdGVhZCEKKyAgICAgICAgICAgIGlmICghcGFnZVJl
Y29yZCAmJiBkYXRhYmFzZUNsZWFudXBDb3VudGVyICYmIGRvY3VtZW50Q2FuSGF2ZUljb24ocGFn
ZVVSTCkpIHsKKyAgICAgICAgICAgICAgICBwYWdlUmVjb3JkID0gbmV3IFBhZ2VVUkxSZWNvcmQo
cGFnZVVSTCk7CisgICAgICAgICAgICAgICAgbV9wYWdlVVJMVG9SZWNvcmRNYXAuc2V0KHBhZ2VV
UkwsIHBhZ2VSZWNvcmQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFnZVJl
Y29yZCkgeworICAgICAgICAgICAgICAgIEljb25SZWNvcmQqIGN1cnJlbnRJY29uID0gcGFnZVJl
Y29yZC0+aWNvblJlY29yZCgpOworCisgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50SWNvbiB8
fCBjdXJyZW50SWNvbi0+aWNvblVSTCgpICE9IGljb25VUkwpIHsKKyAgICAgICAgICAgICAgICAg
ICAgcGFnZVJlY29yZC0+c2V0SWNvblJlY29yZChnZXRPckNyZWF0ZUljb25SZWNvcmQoaWNvblVS
TCkpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50SWNvbiA9IHBhZ2VSZWNvcmQtPmljb25S
ZWNvcmQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBSZWdhcmRs
ZXNzLCB0aGUgdGltZSBzdGFtcCBmcm9tIGRpc2sgc3RpbGwgdGFrZXMgcHJlY2VkZW5jZS4gVW50
aWwgd2UgcmVhZCB0aGlzIGljb24gZnJvbSBkaXNrLCB3ZSBkaWRuJ3QgdGhpbmsgd2UnZCBzZWVu
IGl0IGJlZm9yZQorICAgICAgICAgICAgICAgIC8vIHNvIHdlIG1hcmtlZCB0aGUgdGltZXN0YW1w
IGFzICJub3ciLCBidXQgaXQncyByZWFsbHkgbXVjaCBvbGRlcgorICAgICAgICAgICAgICAgIGN1
cnJlbnRJY29uLT5zZXRUaW1lc3RhbXAocXVlcnkuZ2V0Q29sdW1uSW50KDIpKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBDdXJyZW50bHkgdGhlIFdlYktp
dCBBUEkgc3VwcG9ydHMgMSB0eXBlIG9mIG5vdGlmaWNhdGlvbiB0aGF0IGlzIHNlbnQgd2hlbmV2
ZXIgd2UgZ2V0IGFuIEljb24gVVJMIGZvciBhIFBhZ2UgVVJMLiBXZSBtaWdodCB3YW50IHRvIHJl
LXB1cnBvc2UgaXQgdG8gd29yayBmb3IKKyAgICAgICAgLy8gZ2V0dGluZyB0aGUgYWN0dWFsbHkg
aWNvbiBpdHNlbGYgYWxzbyAoc28gZWFjaCBwYWdldXJsIHdvdWxkIGdldCB0aGlzIG5vdGlmaWNh
dGlvbiB0d2ljZSkgb3Igd2UgbWlnaHQgd2FudCB0byBhZGQgYSBzZWNvbmQgdHlwZSBvZiBub3Rp
ZmljYXRpb24gLQorICAgICAgICAvLyBvbmUgZm9yIHRoZSBVUkwgYW5kIG9uZSBmb3IgdGhlIElt
YWdlIGl0c2VsZgorICAgICAgICAvLyBOb3RlIHRoYXQgV2ViSWNvbkRhdGFiYXNlIGlzIG5vdCBu
ZWNjZXNzYXJpbHkgQVBJIHNvIHdlIG1pZ2h0IGJlIGFibGUgdG8gbWFrZSB0aGlzIGNoYW5nZQor
ICAgICAgICB7CisgICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdSZWFkaW5n
TG9jayk7CisgICAgICAgICAgICBpZiAobV9wYWdlVVJMc1BlbmRpbmdJbXBvcnQuY29udGFpbnMo
cGFnZVVSTCkpIHsKKyAgICAgICAgICAgICAgICBkaXNwYXRjaERpZEltcG9ydEljb25VUkxGb3JQ
YWdlVVJMT25NYWluVGhyZWFkKHBhZ2VVUkwpOworICAgICAgICAgICAgICAgIG1fcGFnZVVSTHNQ
ZW5kaW5nSW1wb3J0LnJlbW92ZShwYWdlVVJMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
CisgICAgICAgIC8vIFN0b3AgdGhlIGltcG9ydCBhdCBhbnkgdGltZSBvZiB0aGUgdGhyZWFkIGhh
cyBiZWVuIGFza2VkIHRvIHNodXRkb3duCisgICAgICAgIGlmIChzaG91bGRTdG9wVGhyZWFkQWN0
aXZpdHkoKSkgeworICAgICAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIkljb25EYXRhYmFzZSBh
c2tlZCB0byB0ZXJtaW5hdGUgZHVyaW5nIHBlcmZvcm1VUkxJbXBvcnQoKSIpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gcXVlcnkuc3RlcCgpOwor
ICAgIH0KKworICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX0RPTkUpCisgICAgICAgIExPRyhJY29u
RGF0YWJhc2UsICJFcnJvciByZWFkaW5nIHBhZ2UtPmljb24gdXJsIG1hcHBpbmdzIGZyb20gZGF0
YWJhc2UiKTsKKworICAgIC8vIENsZWFyIHRoZSBtX3BhZ2VVUkxzUGVuZGluZ0ltcG9ydCBzZXQg
LSBlaXRoZXIgdGhlIHBhZ2UgVVJMcyBlbmRlZCB1cCB3aXRoIGFuIGljb25VUkwgKHRoYXQgd2Un
bGwgbm90aWZ5IGFib3V0KSBvciBub3QsCisgICAgLy8gYnV0IGFmdGVyIG1faWNvblVSTEltcG9y
dENvbXBsZXRlIGlzIHNldCB0byB0cnVlLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgc2V0IGFu
eW1vcmUKKyAgICBWZWN0b3I8U3RyaW5nPiB1cmxzOworICAgIHsKKyAgICAgICAgTG9ja0hvbGRl
ciBsb2NrZXIobV9wZW5kaW5nUmVhZGluZ0xvY2spOworCisgICAgICAgIHVybHMuYXBwZW5kUmFu
Z2UobV9wYWdlVVJMc1BlbmRpbmdJbXBvcnQuYmVnaW4oKSwgbV9wYWdlVVJMc1BlbmRpbmdJbXBv
cnQuZW5kKCkpOworICAgICAgICBtX3BhZ2VVUkxzUGVuZGluZ0ltcG9ydC5jbGVhcigpOworICAg
ICAgICBtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSA9IHRydWU7CisgICAgfQorCisgICAgVmVjdG9y
PFN0cmluZz4gdXJsc1RvTm90aWZ5OworCisgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSB1cmxzIHBl
bmRpbmcgaW1wb3J0CisgICAgLy8gUmVtb3ZlIHVucmV0YWluZWQgb25lcyBpZiBkYXRhYmFzZSBj
bGVhbnVwIGlzIGFsbG93ZWQKKyAgICAvLyBLZWVwIGEgc2V0IG9mIG9uZXMgdGhhdCBhcmUgcmV0
YWluZWQgYW5kIHBlbmRpbmcgbm90aWZpY2F0aW9uCisgICAgeworICAgICAgICBMb2NrSG9sZGVy
IGxvY2tlcihtX3VybEFuZEljb25Mb2NrKTsKKworICAgICAgICBwZXJmb3JtUGVuZGluZ1JldGFp
bkFuZFJlbGVhc2VPcGVyYXRpb25zKCk7CisKKyAgICAgICAgZm9yIChhdXRvJiB1cmwgOiB1cmxz
KSB7CisgICAgICAgICAgICBpZiAoIW1fcmV0YWluZWRQYWdlVVJMcy5jb250YWlucyh1cmwpKSB7
CisgICAgICAgICAgICAgICAgUGFnZVVSTFJlY29yZCogcmVjb3JkID0gbV9wYWdlVVJMVG9SZWNv
cmRNYXAuZ2V0KHVybCk7CisgICAgICAgICAgICAgICAgaWYgKHJlY29yZCAmJiAhZGF0YWJhc2VD
bGVhbnVwQ291bnRlcikgeworICAgICAgICAgICAgICAgICAgICBtX3BhZ2VVUkxUb1JlY29yZE1h
cC5yZW1vdmUodXJsKTsKKyAgICAgICAgICAgICAgICAgICAgSWNvblJlY29yZCogaWNvblJlY29y
ZCA9IHJlY29yZC0+aWNvblJlY29yZCgpOworCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRo
aXMgcGFnZSBpcyB0aGUgb25seSByZW1haW5pbmcgcmV0YWluZXIgb2YgaXRzIGljb24sIG1hcmsg
dGhhdCBpY29uIGZvciBkZWxldGlvbiBhbmQgZG9uJ3QgYm90aGVyCisgICAgICAgICAgICAgICAg
ICAgIC8vIHJlYWRpbmcgYW55dGhpbmcgcmVsYXRlZCB0byBpdAorICAgICAgICAgICAgICAgICAg
ICBpZiAoaWNvblJlY29yZCAmJiBpY29uUmVjb3JkLT5oYXNPbmVSZWYoKSkgeworICAgICAgICAg
ICAgICAgICAgICAgICAgbV9pY29uVVJMVG9SZWNvcmRNYXAucmVtb3ZlKGljb25SZWNvcmQtPmlj
b25VUkwoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdSZWFkaW5nTG9jayk7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbV9wYWdlVVJMc0ludGVyZXN0ZWRJbkljb25zLnJlbW92
ZSh1cmwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faWNvbnNQZW5kaW5nUmVhZGlu
Zy5yZW1vdmUoaWNvblJlY29yZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9ja0hvbGRl
ciBsb2NrZXIobV9wZW5kaW5nU3luY0xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG1faWNvbnNQZW5kaW5nU3luYy5zZXQoaWNvblJlY29yZC0+aWNvblVSTCgpLCBpY29uUmVjb3Jk
LT5zbmFwc2hvdCh0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVjb3JkOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHVybHNUb05v
dGlmeS5hcHBlbmQodXJsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPRyhJY29uRGF0YWJh
c2UsICJOb3RpZnlpbmcgJWx1IGludGVyZXN0ZWQgcGFnZSBVUkxzIHRoYXQgdGhlaXIgaWNvbiBV
UkwgaXMga25vd24gZHVlIHRvIHRoZSBpbXBvcnQiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25n
Pih1cmxzVG9Ob3RpZnkuc2l6ZSgpKSk7CisgICAgLy8gTm93IHRoYXQgd2UgZG9uJ3QgaG9sZCBh
bnkgbG9ja3MsIHBlcmZvcm0gdGhlIGFjdHVhbCBub3RpZmljYXRpb25zCisgICAgZm9yIChhdXRv
JiB1cmwgOiB1cmxzVG9Ob3RpZnkpIHsKKyAgICAgICAgQXV0b2RyYWluZWRQb29sIHBvb2w7CisK
KyAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIk5vdGlmeWluZyBpY29uIGluZm8ga25vd24gZm9y
IHBhZ2VVUkwgJXMiLCB1cmwuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICBkaXNwYXRjaERpZElt
cG9ydEljb25VUkxGb3JQYWdlVVJMT25NYWluVGhyZWFkKHVybCk7CisgICAgICAgIGlmIChzaG91
bGRTdG9wVGhyZWFkQWN0aXZpdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAvLyBOb3RpZnkgdGhlIGNsaWVudCB0aGF0IHRoZSBVUkwgaW1wb3J0IGlzIGNvbXBsZXRlIGlu
IGNhc2UgaXQncyBtYW5hZ2luZyBpdHMgb3duIHBlbmRpbmcgbm90aWZpY2F0aW9ucy4KKyAgICBk
aXNwYXRjaERpZEZpbmlzaFVSTEltcG9ydE9uTWFpblRocmVhZCgpOworfQorCit2b2lkIEljb25E
YXRhYmFzZTo6c3luY1RocmVhZE1haW5Mb29wKCkKK3sKKyAgICBBU1NFUlRfSUNPTl9TWU5DX1RI
UkVBRCgpOworCisgICAgbV9zeW5jTG9jay5sb2NrKCk7CisKKyAgICAvLyBXZSdsbCBlaXRoZXIg
ZG8gYW55IHBlbmRpbmcgd29yayBvbiBvdXIgZmlyc3QgcGFzcyB0aHJvdWdoIHRoZSBsb29wLCBv
ciB3ZSdsbCB0ZXJtaW5hdGUKKyAgICAvLyB3aXRob3V0IGRvaW5nIGFueSB3b3JrLiBFaXRoZXIg
d2F5IHdlJ3JlIGRlYWxpbmcgd2l0aCBhbnkgY3VycmVudGx5LXBlbmRpbmcgd29yay4KKyAgICBt
X3N5bmNUaHJlYWRIYXNXb3JrVG9EbyA9IGZhbHNlOworCisgICAgLy8gSXQncyBwb3NzaWJsZSB0
aHJlYWQgdGVybWluYXRpb24gaXMgcmVxdWVzdGVkIGJlZm9yZSB0aGUgbWFpbiBsb29wIGV2ZW4g
c3RhcnRzIC0gaW4gdGhhdCBjYXNlLCBqdXN0IHNraXAgc3RyYWlnaHQgdG8gY2xlYW51cAorICAg
IHdoaWxlICghbV90aHJlYWRUZXJtaW5hdGlvblJlcXVlc3RlZCkgeworICAgICAgICBtX3N5bmNM
b2NrLnVubG9jaygpOworCisjaWYgIUxPR19ESVNBQkxFRAorICAgICAgICBkb3VibGUgdGltZVN0
YW1wID0gbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCk7CisjZW5kaWYKKyAgICAgICAgTE9H
KEljb25EYXRhYmFzZSwgIihUSFJFQUQpIE1haW4gd29yayBsb29wIHN0YXJ0aW5nIik7CisKKyAg
ICAgICAgLy8gSWYgd2Ugc2hvdWxkIHJlbW92ZSBhbGwgaWNvbnMsIGRvIGl0IG5vdy4gVGhpcyBp
cyBhbiB1bmludGVydXB0aWJsZSBwcm9jZWR1cmUgdGhhdCB3ZSB3aWxsIGFsd2F5cyBkbyBiZWZv
cmUgcXVpdHRpbmcgaWYgaXQgaXMgcmVxdWVzdGVkCisgICAgICAgIGlmIChtX3JlbW92ZUljb25z
UmVxdWVzdGVkKSB7CisgICAgICAgICAgICByZW1vdmVBbGxJY29uc09uVGhyZWFkKCk7CisgICAg
ICAgICAgICBtX3JlbW92ZUljb25zUmVxdWVzdGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAg
ICAgICAvLyBUaGVuLCBpZiB0aGUgdGhyZWFkIHNob3VsZCBiZSBxdWl0dGluZywgcXVpdCBub3ch
CisgICAgICAgIGlmIChtX3RocmVhZFRlcm1pbmF0aW9uUmVxdWVzdGVkKSB7CisgICAgICAgICAg
ICBjbGVhbnVwU3luY1RocmVhZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisK
KyAgICAgICAgeworICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV91cmxBbmRJY29uTG9j
ayk7CisgICAgICAgICAgICBwZXJmb3JtUGVuZGluZ1JldGFpbkFuZFJlbGVhc2VPcGVyYXRpb25z
KCk7CisgICAgICAgIH0KKworICAgICAgICBib29sIGRpZEFueVdvcmsgPSB0cnVlOworICAgICAg
ICB3aGlsZSAoZGlkQW55V29yaykgeworICAgICAgICAgICAgYm9vbCBkaWRXcml0ZSA9IHdyaXRl
VG9EYXRhYmFzZSgpOworICAgICAgICAgICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgp
KQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkaWRBbnlXb3JrID0gcmVh
ZEZyb21EYXRhYmFzZSgpOworICAgICAgICAgICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0
eSgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBQcnVuZSB1bnJl
dGFpbmVkIGljb25zIGFmdGVyIHRoZSBmaXJzdCB0aW1lIHdlIHN5bmMgYW55dGhpbmcgb3V0IHRv
IHRoZSBkYXRhYmFzZQorICAgICAgICAgICAgLy8gVGhpcyB3YXksIHBydW5pbmcgd29uJ3QgYmUg
dGhlIG9ubHkgb3BlcmF0aW9uIHdlIHBlcmZvcm0gdG8gdGhlIGRhdGFiYXNlIGJ5IGl0c2VsZgor
ICAgICAgICAgICAgLy8gV2UgYWxzbyBkb24ndCB3YW50IHRvIGJvdGhlciBkb2luZyB0aGlzIGlm
IHRoZSB0aHJlYWQgc2hvdWxkIGJlIHRlcm1pbmF0aW5nICh0aGUgdXNlciBpcyBxdWl0dGluZykK
KyAgICAgICAgICAgIC8vIG9yIGlmIHByaXZhdGUgYnJvd3NpbmcgaXMgZW5hYmxlZAorICAgICAg
ICAgICAgLy8gV2UgYWxzbyBkb24ndCB3YW50IHRvIHBydW5lIGlmIHRoZSBtX2RhdGFiYXNlQ2xl
YW51cENvdW50ZXIgY291bnQgaXMgbm9uLXplcm8gLSB0aGF0IG1lYW5zIHNvbWVvbmUKKyAgICAg
ICAgICAgIC8vIGhhcyBhc2tlZCB0byBkZWxheSBwcnVuaW5nCisgICAgICAgICAgICBzdGF0aWMg
Ym9vbCBwcnVuZWRVbnJldGFpbmVkSWNvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChkaWRX
cml0ZSAmJiAhbV9wcml2YXRlQnJvd3NpbmdFbmFibGVkICYmICFwcnVuZWRVbnJldGFpbmVkSWNv
bnMgJiYgIWRhdGFiYXNlQ2xlYW51cENvdW50ZXIpIHsKKyNpZiAhTE9HX0RJU0FCTEVECisgICAg
ICAgICAgICAgICAgZG91YmxlIHRpbWUgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsK
KyNlbmRpZgorICAgICAgICAgICAgICAgIExPRyhJY29uRGF0YWJhc2UsICIoVEhSRUFEKSBTdGFy
dGluZyBwcnVuZVVucmV0YWluZWRJY29ucygpIik7CisKKyAgICAgICAgICAgICAgICBwcnVuZVVu
cmV0YWluZWRJY29ucygpOworCisgICAgICAgICAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIihU
SFJFQUQpIHBydW5lVW5yZXRhaW5lZEljb25zKCkgdG9vayAlLjRmIHNlY29uZHMiLCBtb25vdG9u
aWNhbGx5SW5jcmVhc2luZ1RpbWUoKSAtIHRpbWUpOworCisgICAgICAgICAgICAgICAgLy8gSWYg
cHJ1bmVVbnJldGFpbmVkSWNvbnMoKSByZXR1cm5lZCBlYXJseSBkdWUgdG8gcmVxdWVzdGVkIHRo
cmVhZCB0ZXJtaW5hdGlvbiwgaXRzIHN0aWxsIG9rYXkKKyAgICAgICAgICAgICAgICAvLyB0byBt
YXJrIHBydW5lZFVucmV0YWluZWRJY29ucyB0cnVlIGJlY2F1c2Ugd2UncmUgYWJvdXQgdG8gdGVy
bWluYXRlIGFueXdheQorICAgICAgICAgICAgICAgIHBydW5lZFVucmV0YWluZWRJY29ucyA9IHRy
dWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRpZEFueVdvcmsgPSBkaWRBbnlXb3Jr
IHx8IGRpZFdyaXRlOworICAgICAgICAgICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgp
KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyNpZiAhTE9HX0RJU0FCTEVE
CisgICAgICAgIGRvdWJsZSBuZXdzdGFtcCA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgp
OworICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiKFRIUkVBRCkgTWFpbiB3b3JrIGxvb3AgcmFu
IGZvciAlLjRmIHNlY29uZHMsICVzIHJlcXVlc3RlZCB0byB0ZXJtaW5hdGUiLCBuZXdzdGFtcCAt
IHRpbWVTdGFtcCwgc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkgPyAid2FzIiA6ICJ3YXMgbm90
Iik7CisjZW5kaWYKKworICAgICAgICBtX3N5bmNMb2NrLmxvY2soKTsKKworICAgICAgICAvLyBU
aGVyZSBpcyBzb21lIGNvbmRpdGlvbiB0aGF0IGlzIGFza2luZyB1cyB0byBzdG9wIHdoYXQgd2Un
cmUgZG9pbmcgbm93IGFuZCBoYW5kbGUgYSBzcGVjaWFsIGNhc2UKKyAgICAgICAgLy8gVGhpcyBp
cyBlaXRoZXIgcmVtb3ZpbmcgYWxsIGljb25zLCBvciBzaHV0dGluZyBkb3duIHRoZSB0aHJlYWQg
dG8gcXVpdCB0aGUgYXBwCisgICAgICAgIC8vIFdlIGhhbmRsZSB0aG9zZSBhdCB0aGUgdG9wIG9m
IHRoaXMgbWFpbiBsb29wIHNvIGNvbnRpbnVlIHRvIGp1bXAgYmFjayB1cCB0aGVyZQorICAgICAg
ICBpZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsK
KworICAgICAgICB3aGlsZSAoIW1fc3luY1RocmVhZEhhc1dvcmtUb0RvKQorICAgICAgICAgICAg
bV9zeW5jQ29uZGl0aW9uLndhaXQobV9zeW5jTG9jayk7CisKKyAgICAgICAgbV9zeW5jVGhyZWFk
SGFzV29ya1RvRG8gPSBmYWxzZTsKKyAgICB9CisKKyAgICBtX3N5bmNMb2NrLnVubG9jaygpOwor
CisgICAgLy8gVGhyZWFkIGlzIHRlcm1pbmF0aW5nIGF0IHRoaXMgcG9pbnQKKyAgICBjbGVhbnVw
U3luY1RocmVhZCgpOworfQorCit2b2lkIEljb25EYXRhYmFzZTo6cGVyZm9ybVBlbmRpbmdSZXRh
aW5BbmRSZWxlYXNlT3BlcmF0aW9ucygpCit7CisgICAgLy8gTk9URTogVGhlIGNhbGxlciBpcyBh
c3N1bWVkIHRvIGhvbGQgbV91cmxBbmRJY29uTG9jay4KKyAgICBBU1NFUlQoIW1fdXJsQW5kSWNv
bkxvY2sudHJ5TG9jaygpKTsKKworICAgIEhhc2hDb3VudGVkU2V0PFN0cmluZz4gdG9SZXRhaW47
CisgICAgSGFzaENvdW50ZWRTZXQ8U3RyaW5nPiB0b1JlbGVhc2U7CisKKyAgICB7CisgICAgICAg
IExvY2tIb2xkZXIgcGVuZGluZ1dvcmtMb2NrZXIobV91cmxzVG9SZXRhaW5PclJlbGVhc2VMb2Nr
KTsKKyAgICAgICAgaWYgKCFtX3JldGFpbk9yUmVsZWFzZUljb25SZXF1ZXN0ZWQpCisgICAgICAg
ICAgICByZXR1cm47CisKKyAgICAgICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIFVSTHMgdG8gcmV0
YWluIGFuZC9vciByZWxlYXNlIHNvIHdlIGNhbiByZWxlYXNlIG1fdXJsc1RvUmV0YWluT3JSZWxl
YXNlTG9jayBBU0FQLgorICAgICAgICAvLyBIb2xkaW5nIG1fdXJsQW5kSWNvbkxvY2sgcHJvdGVj
dHMgdGhpcyBmdW5jdGlvbiBmcm9tIGJlaW5nIHJlLWVudGVyZWQuCisKKyAgICAgICAgdG9SZXRh
aW4uc3dhcChtX3VybHNUb1JldGFpbik7CisgICAgICAgIHRvUmVsZWFzZS5zd2FwKG1fdXJsc1Rv
UmVsZWFzZSk7CisgICAgICAgIG1fcmV0YWluT3JSZWxlYXNlSWNvblJlcXVlc3RlZCA9IGZhbHNl
OworICAgIH0KKworICAgIGZvciAoYXV0byYgZW50cnkgOiB0b1JldGFpbikgeworICAgICAgICBB
U1NFUlQoIWVudHJ5LmtleS5pbXBsKCkgfHwgZW50cnkua2V5LmltcGwoKS0+aGFzT25lUmVmKCkp
OworICAgICAgICBwZXJmb3JtUmV0YWluSWNvbkZvclBhZ2VVUkwoZW50cnkua2V5LCBlbnRyeS52
YWx1ZSk7CisgICAgfQorCisgICAgZm9yIChhdXRvJiBlbnRyeSA6IHRvUmVsZWFzZSkgeworICAg
ICAgICBBU1NFUlQoIWVudHJ5LmtleS5pbXBsKCkgfHwgZW50cnkua2V5LmltcGwoKS0+aGFzT25l
UmVmKCkpOworICAgICAgICBwZXJmb3JtUmVsZWFzZUljb25Gb3JQYWdlVVJMKGVudHJ5LmtleSwg
ZW50cnkudmFsdWUpOworICAgIH0KK30KKworYm9vbCBJY29uRGF0YWJhc2U6OnJlYWRGcm9tRGF0
YWJhc2UoKQoreworICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7CisKKyNpZiAhTE9HX0RJ
U0FCTEVECisgICAgZG91YmxlIHRpbWVTdGFtcCA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGlt
ZSgpOworI2VuZGlmCisKKyAgICBib29sIGRpZEFueVdvcmsgPSBmYWxzZTsKKworICAgIC8vIFdl
J2xsIG1ha2UgYSBjb3B5IG9mIHRoZSBzZXRzIG9mIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUgcmVh
ZC4gVGhlbiB3ZSdsbCB2ZXJpZnkgYXQgdGhlIHRpbWUgb2YgdXBkYXRpbmcgdGhlIHJlY29yZCB0
aGF0IGl0IHN0aWxsIHdhbnRzIHRvIGJlIHVwZGF0ZWQKKyAgICAvLyBUaGlzIHdheSB3ZSB3b24n
dCBob2xkIHRoZSBsb2NrIGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUKKyAgICBWZWN0b3I8SWNv
blJlY29yZCo+IGljb25zOworICAgIHsKKyAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5k
aW5nUmVhZGluZ0xvY2spOworICAgICAgICBpY29ucy5hcHBlbmRSYW5nZShtX2ljb25zUGVuZGlu
Z1JlYWRpbmcuYmVnaW4oKSwgbV9pY29uc1BlbmRpbmdSZWFkaW5nLmVuZCgpKTsKKyAgICB9CisK
KyAgICAvLyBLZWVwIHRyYWNrIG9mIGljb25zIHdlIGFjdHVhbGx5IHJlYWQgdG8gbm90aWZ5IHRo
ZW0gb2YgdGhlIG5ldyBpY29uCisgICAgSGFzaFNldDxTdHJpbmc+IHVybHNUb05vdGlmeTsKKwor
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpY29ucy5zaXplKCk7ICsraSkgeworICAgICAg
ICBkaWRBbnlXb3JrID0gdHJ1ZTsKKyAgICAgICAgYXV0byBpbWFnZURhdGEgPSBnZXRJbWFnZURh
dGFGb3JJY29uVVJMRnJvbVNRTERhdGFiYXNlKGljb25zW2ldLT5pY29uVVJMKCkpOworCisgICAg
ICAgIC8vIFZlcmlmeSB0aGlzIGljb24gc3RpbGwgd2FudHMgdG8gYmUgcmVhZCBmcm9tIGRpc2sK
KyAgICAgICAgeworICAgICAgICAgICAgTG9ja0hvbGRlciB1cmxMb2NrZXIobV91cmxBbmRJY29u
TG9jayk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9ja0hvbGRlciByZWFkTG9j
a2VyKG1fcGVuZGluZ1JlYWRpbmdMb2NrKTsKKworICAgICAgICAgICAgICAgIGlmIChtX2ljb25z
UGVuZGluZ1JlYWRpbmcuY29udGFpbnMoaWNvbnNbaV0pKSB7CisgICAgICAgICAgICAgICAgICAg
IC8vIFNldCB0aGUgbmV3IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgaWNvbnNbaV0tPnNldElt
YWdlRGF0YShXVEZNb3ZlKGltYWdlRGF0YSkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFJl
bW92ZSB0aGlzIGljb24gZnJvbSB0aGUgc2V0IHRoYXQgbmVlZHMgdG8gYmUgcmVhZAorICAgICAg
ICAgICAgICAgICAgICBtX2ljb25zUGVuZGluZ1JlYWRpbmcucmVtb3ZlKGljb25zW2ldKTsKKwor
ICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgc2V0IG9mIGFsbCBQYWdlIFVSTHMgdGhh
dCByZXRhaW4gdGhpcyBpY29uIGFzIHdlbGwgYXMgYWxsIFBhZ2VVUkxzIHdhaXRpbmcgZm9yIGFu
IGljb24KKyAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBmaW5kIHRoZSBpbnRlcnNl
Y3Rpb24gb2YgdGhlc2UgdHdvIHNldHMgdG8gbm90aWZ5IHRoZW0KKyAgICAgICAgICAgICAgICAg
ICAgLy8gQ2hlY2sgdGhlIHNpemVzIG9mIHRoZXNlIHR3byBzZXRzIHRvIG1pbmltaXplIHRoZSBu
dW1iZXIgb2YgaXRlcmF0aW9ucworICAgICAgICAgICAgICAgICAgICBjb25zdCBIYXNoU2V0PFN0
cmluZz4qIG91dGVySGFzaDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSGFzaFNldDxTdHJp
bmc+KiBpbm5lckhhc2g7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGljb25zW2ldLT5yZXRh
aW5pbmdQYWdlVVJMcygpLnNpemUoKSA+IG1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29ucy5zaXpl
KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGVySGFzaCA9ICZtX3BhZ2VVUkxzSW50
ZXJlc3RlZEluSWNvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckhhc2ggPSAmKGlj
b25zW2ldLT5yZXRhaW5pbmdQYWdlVVJMcygpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlubmVySGFzaCA9ICZtX3BhZ2VVUkxzSW50ZXJl
c3RlZEluSWNvbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckhhc2ggPSAmKGljb25z
W2ldLT5yZXRhaW5pbmdQYWdlVVJMcygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAgICAgICAgIGZvciAoYXV0byYgb3V0ZXIgOiAqb3V0ZXJIYXNoKSB7CisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoaW5uZXJIYXNoLT5jb250YWlucyhvdXRlcikpIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiJXMgaXMgaW50ZXJlc3Rl
ZCBpbiB0aGUgaWNvbiB3ZSBqdXN0IHJlYWQuIEFkZGluZyBpdCB0byB0aGUgbm90aWZpY2F0aW9u
IGxpc3QgYW5kIHJlbW92aW5nIGl0IGZyb20gdGhlIGludGVyZXN0ZWQgc2V0IiwgdXJsRm9yTG9n
Z2luZyhvdXRlcikuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHVybHNUb05vdGlmeS5hZGQob3V0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBldmVyIGdldCB0byB0aGUgcG9pbnQgd2Vy
ZSB3ZSd2ZSBzZWVuIGV2ZXJ5IHVybCBpbnRlcmVzdGVkIGluIHRoaXMgaWNvbiwgYnJlYWsgZWFy
bHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmxzVG9Ob3RpZnkuc2l6ZSgpID09IG1f
cGFnZVVSTHNJbnRlcmVzdGVkSW5JY29ucy5zaXplKCkpCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAg
ICAvLyBXZSBkb24ndCBuZWVkIHRvIG5vdGlmeSBhIFBhZ2VVUkwgdHdpY2UsIHNvIGFsbCB0aGUg
b25lcyB3ZSdyZSBhYm91dCB0byBub3RpZnkgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgaW50ZXJl
c3RlZCBzZXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVybHNUb05vdGlmeS5zaXplKCkgPT0g
bV9wYWdlVVJMc0ludGVyZXN0ZWRJbkljb25zLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgIG1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29ucy5jbGVhcigpOworICAgICAgICAgICAgICAg
ICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byYgdXJsIDogdXJs
c1RvTm90aWZ5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFnZVVSTHNJbnRlcmVz
dGVkSW5JY29ucy5yZW1vdmUodXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaG91bGRT
dG9wVGhyZWFkQWN0aXZpdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBkaWRBbnlXb3JrOworCisg
ICAgICAgIC8vIE5vdyB0aGF0IHdlIGRvbid0IGhvbGQgYW55IGxvY2tzLCBwZXJmb3JtIHRoZSBh
Y3R1YWwgbm90aWZpY2F0aW9ucworICAgICAgICBmb3IgKEhhc2hTZXQ8U3RyaW5nPjo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSB1cmxzVG9Ob3RpZnkuYmVnaW4oKSwgZW5kID0gdXJsc1RvTm90aWZ5LmVu
ZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgICAgIEF1dG9kcmFpbmVkUG9vbCBwb29s
OworCisgICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiTm90aWZ5aW5nIGljb24gcmVjZWl2
ZWQgZm9yIHBhZ2VVUkwgJXMiLCB1cmxGb3JMb2dnaW5nKCppdCkuYXNjaWkoKS5kYXRhKCkpOwor
ICAgICAgICAgICAgZGlzcGF0Y2hEaWRJbXBvcnRJY29uRGF0YUZvclBhZ2VVUkxPbk1haW5UaHJl
YWQoKml0KTsKKyAgICAgICAgICAgIGlmIChzaG91bGRTdG9wVGhyZWFkQWN0aXZpdHkoKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gZGlkQW55V29yazsKKyAgICAgICAgfQorCisgICAgICAgIExP
RyhJY29uRGF0YWJhc2UsICJEb25lIG5vdGlmeWluZyAlaSBwYWdlVVJMcyB3aG8ganVzdCByZWNl
aXZlZCB0aGVpciBpY29ucyIsIHVybHNUb05vdGlmeS5zaXplKCkpOworICAgICAgICB1cmxzVG9O
b3RpZnkuY2xlYXIoKTsKKworICAgICAgICBpZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkp
CisgICAgICAgICAgICByZXR1cm4gZGlkQW55V29yazsKKyAgICB9CisKKyAgICBMT0coSWNvbkRh
dGFiYXNlLCAiUmVhZGluZyBmcm9tIGRhdGFiYXNlIHRvb2sgJS40ZiBzZWNvbmRzIiwgbW9ub3Rv
bmljYWxseUluY3JlYXNpbmdUaW1lKCkgLSB0aW1lU3RhbXApOworCisgICAgcmV0dXJuIGRpZEFu
eVdvcms7Cit9CisKK2Jvb2wgSWNvbkRhdGFiYXNlOjp3cml0ZVRvRGF0YWJhc2UoKQoreworICAg
IEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7CisKKyNpZiAhTE9HX0RJU0FCTEVECisgICAgZG91
YmxlIHRpbWVTdGFtcCA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOworI2VuZGlmCisK
KyAgICBib29sIGRpZEFueVdvcmsgPSBmYWxzZTsKKworICAgIC8vIFdlIGNhbiBjb3B5IHRoZSBj
dXJyZW50IHdvcmsgcXVldWUgdGhlbiBjbGVhciBpdCBvdXQgLSBJZiBhbnkgbmV3IHdvcmsgY29t
ZXMgaW4gd2hpbGUgd2UncmUgd3JpdGluZyBvdXQsCisgICAgLy8gd2UnbGwgcGljayBpdCB1cCBv
biB0aGUgbmV4dCBwYXNzLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUgbG9ja2luZyBzdHJh
dGVneSBmb3IgdGhpcyBtZXRob2QgYW5kIHJlbWFpbnMgY29oZXNpdmUgd2l0aCBjaGFuZ2VzCisg
ICAgLy8gYXNrZWQgZm9yIGJ5IHRoZSBkYXRhYmFzZSBvbiB0aGUgbWFpbiB0aHJlYWQKKyAgICB7
CisgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fdXJsQW5kSWNvbkxvY2spOworICAgICAgICBW
ZWN0b3I8SWNvblNuYXBzaG90PiBpY29uU25hcHNob3RzOworICAgICAgICBWZWN0b3I8UGFnZVVS
TFNuYXBzaG90PiBwYWdlU25hcHNob3RzOworICAgICAgICB7CisgICAgICAgICAgICBMb2NrSG9s
ZGVyIGxvY2tlcihtX3BlbmRpbmdTeW5jTG9jayk7CisKKyAgICAgICAgICAgIGljb25TbmFwc2hv
dHMuYXBwZW5kUmFuZ2UobV9pY29uc1BlbmRpbmdTeW5jLmJlZ2luKCkudmFsdWVzKCksIG1faWNv
bnNQZW5kaW5nU3luYy5lbmQoKS52YWx1ZXMoKSk7CisgICAgICAgICAgICBtX2ljb25zUGVuZGlu
Z1N5bmMuY2xlYXIoKTsKKworICAgICAgICAgICAgcGFnZVNuYXBzaG90cy5hcHBlbmRSYW5nZSht
X3BhZ2VVUkxzUGVuZGluZ1N5bmMuYmVnaW4oKS52YWx1ZXMoKSwgbV9wYWdlVVJMc1BlbmRpbmdT
eW5jLmVuZCgpLnZhbHVlcygpKTsKKyAgICAgICAgICAgIG1fcGFnZVVSTHNQZW5kaW5nU3luYy5j
bGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGljb25TbmFwc2hvdHMuc2l6ZSgpIHx8
IHBhZ2VTbmFwc2hvdHMuc2l6ZSgpKQorICAgICAgICAgICAgZGlkQW55V29yayA9IHRydWU7CisK
KyAgICAgICAgU1FMaXRlVHJhbnNhY3Rpb24gc3luY1RyYW5zYWN0aW9uKG1fc3luY0RCKTsKKyAg
ICAgICAgc3luY1RyYW5zYWN0aW9uLmJlZ2luKCk7CisKKyAgICAgICAgZm9yIChhdXRvJiBzbmFw
c2hvdCA6IGljb25TbmFwc2hvdHMpIHsKKyAgICAgICAgICAgIHdyaXRlSWNvblNuYXBzaG90VG9T
UUxEYXRhYmFzZShzbmFwc2hvdCk7CisgICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiV3Jv
dGUgSWNvblJlY29yZCBmb3IgSWNvblVSTCAlcyB3aXRoIHRpbWVTdGFtcCBvZiAlaSB0byB0aGUg
REIiLCB1cmxGb3JMb2dnaW5nKHNuYXBzaG90Lmljb25VUkwoKSkuYXNjaWkoKS5kYXRhKCksIHNu
YXBzaG90LnRpbWVzdGFtcCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byYgc25h
cHNob3QgOiBwYWdlU25hcHNob3RzKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgaWNvbiBVUkwg
aXMgZW1wdHksIHRoaXMgcGFnZSBpcyBtZWFudCB0byBiZSBkZWxldGVkCisgICAgICAgICAgICAv
LyBBU1NFUlRzIGFyZSBzYW5pdHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgbWFwcGluZ3MgZXhp
c3QgaWYgdGhleSBzaG91bGQgYW5kIGRvbid0IGlmIHRoZXkgc2hvdWxkbid0CisgICAgICAgICAg
ICBpZiAoc25hcHNob3QuaWNvblVSTCgpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICByZW1v
dmVQYWdlVVJMRnJvbVNRTERhdGFiYXNlKHNuYXBzaG90LnBhZ2VVUkwoKSk7CisgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgc2V0SWNvblVSTEZvclBhZ2VVUkxJblNRTERhdGFiYXNl
KHNuYXBzaG90Lmljb25VUkwoKSwgc25hcHNob3QucGFnZVVSTCgpKTsKKyAgICAgICAgICAgIExP
RyhJY29uRGF0YWJhc2UsICJDb21taXR0ZWQgSWNvblVSTCBmb3IgUGFnZVVSTCAlcyB0byBkYXRh
YmFzZSIsIHVybEZvckxvZ2dpbmcoc25hcHNob3QucGFnZVVSTCgpKS5hc2NpaSgpLmRhdGEoKSk7
CisgICAgICAgIH0KKworICAgICAgICBzeW5jVHJhbnNhY3Rpb24uY29tbWl0KCk7CisgICAgfQor
CisgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBkYW5nbGluZyBQYWdlVVJM
cyAtIElmIHRoZXJlIGFyZSwgd2Ugd2FudCB0byBvdXRwdXQgb25lIGxvZyBtZXNzYWdlIGJ1dCBu
b3Qgc3BhbSB0aGUgY29uc29sZSBwb3RlbnRpYWxseSBldmVyeSBmZXcgc2Vjb25kcworICAgIGlm
IChkaWRBbnlXb3JrKQorICAgICAgICBjaGVja0ZvckRhbmdsaW5nUGFnZVVSTHMoZmFsc2UpOwor
CisgICAgTE9HKEljb25EYXRhYmFzZSwgIlVwZGF0aW5nIHRoZSBkYXRhYmFzZSB0b29rICUuNGYg
c2Vjb25kcyIsIG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpIC0gdGltZVN0YW1wKTsKKwor
ICAgIHJldHVybiBkaWRBbnlXb3JrOworfQorCit2b2lkIEljb25EYXRhYmFzZTo6cHJ1bmVVbnJl
dGFpbmVkSWNvbnMoKQoreworICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7CisKKyAgICBp
ZiAoIWlzT3BlbigpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGlzIG1ldGhvZCBzaG91
bGQgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgcnVuCisgICAgQVNTRVJUKCFtX2luaXRpYWxQcnVu
aW5nQ29tcGxldGUpOworCisgICAgLy8gVGhpcyBtZXRob2QgcmVsaWVzIG9uIGhhdmluZyByZWFk
IGluIGFsbCBwYWdlIFVSTHMgZnJvbSB0aGUgZGF0YWJhc2UgZWFybGllci4KKyAgICBBU1NFUlQo
bV9pY29uVVJMSW1wb3J0Q29tcGxldGUpOworCisgICAgLy8gR2V0IHRoZSBrbm93biBQYWdlVVJM
cyBmcm9tIHRoZSBkYiwgYW5kIHJlY29yZCB0aGUgSUQgb2YgYW55IHRoYXQgYXJlIG5vdCBpbiB0
aGUgcmV0YWluIGNvdW50IHNldC4KKyAgICBWZWN0b3I8aW50NjRfdD4gcGFnZUlEc1RvRGVsZXRl
OworCisgICAgU1FMaXRlU3RhdGVtZW50IHBhZ2VTUUwobV9zeW5jREIsICJTRUxFQ1Qgcm93aWQs
IHVybCBGUk9NIFBhZ2VVUkw7Iik7CisgICAgcGFnZVNRTC5wcmVwYXJlKCk7CisKKyAgICBpbnQg
cmVzdWx0OworICAgIHdoaWxlICgocmVzdWx0ID0gcGFnZVNRTC5zdGVwKCkpID09IFNRTElURV9S
T1cpIHsKKyAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV91cmxBbmRJY29uTG9jayk7CisgICAg
ICAgIGlmICghbV9wYWdlVVJMVG9SZWNvcmRNYXAuY29udGFpbnMocGFnZVNRTC5nZXRDb2x1bW5U
ZXh0KDEpKSkKKyAgICAgICAgICAgIHBhZ2VJRHNUb0RlbGV0ZS5hcHBlbmQocGFnZVNRTC5nZXRD
b2x1bW5JbnQ2NCgwKSk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkK
KyAgICAgICAgTE9HX0VSUk9SKCJFcnJvciByZWFkaW5nIFBhZ2VVUkwgdGFibGUgZnJvbSBvbi1k
aXNrIERCIik7CisgICAgcGFnZVNRTC5maW5hbGl6ZSgpOworCisgICAgLy8gRGVsZXRlIHBhZ2Ug
VVJMcyB0aGF0IHdlcmUgaW4gdGhlIHRhYmxlLCBidXQgbm90IGluIG91ciByZXRhaW4gY291bnQg
c2V0LgorICAgIHNpemVfdCBudW1Ub0RlbGV0ZSA9IHBhZ2VJRHNUb0RlbGV0ZS5zaXplKCk7Cisg
ICAgaWYgKG51bVRvRGVsZXRlKSB7CisgICAgICAgIFNRTGl0ZVRyYW5zYWN0aW9uIHBydW5pbmdU
cmFuc2FjdGlvbihtX3N5bmNEQik7CisgICAgICAgIHBydW5pbmdUcmFuc2FjdGlvbi5iZWdpbigp
OworCisgICAgICAgIFNRTGl0ZVN0YXRlbWVudCBwYWdlRGVsZXRlU1FMKG1fc3luY0RCLCAiREVM
RVRFIEZST00gUGFnZVVSTCBXSEVSRSByb3dpZCA9ICg/KTsiKTsKKyAgICAgICAgcGFnZURlbGV0
ZVNRTC5wcmVwYXJlKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVG9EZWxl
dGU7ICsraSkgeworICAgICAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIlBydW5pbmcgcGFnZSB3
aXRoIHJvd2lkICVsbGkgZnJvbSBkaXNrIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihwYWdlSURz
VG9EZWxldGVbaV0pKTsKKyAgICAgICAgICAgIHBhZ2VEZWxldGVTUUwuYmluZEludDY0KDEsIHBh
Z2VJRHNUb0RlbGV0ZVtpXSk7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gcGFnZURlbGV0ZVNR
TC5zdGVwKCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKQorICAgICAg
ICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlZCB0byBkZWxldGUgcGFnZSB3aXRoIGlkICVsbGkg
ZnJvbSBkaXNrIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihwYWdlSURzVG9EZWxldGVbaV0pKTsK
KyAgICAgICAgICAgIHBhZ2VEZWxldGVTUUwucmVzZXQoKTsKKworICAgICAgICAgICAgLy8gSWYg
dGhlIHRocmVhZCB3YXMgYXNrZWQgdG8gdGVybWluYXRlLCB3ZSBzaG91bGQgY29tbWl0IHdoYXQg
cHJ1bmluZyB3ZSd2ZSBkb25lIHNvIGZhciwgZmlndXJpbmcgd2UgY2FuCisgICAgICAgICAgICAv
LyBmaW5pc2ggdGhlIHJlc3QgbGF0ZXIgKGhvcGVmdWxseSkKKyAgICAgICAgICAgIGlmIChzaG91
bGRTdG9wVGhyZWFkQWN0aXZpdHkoKSkgeworICAgICAgICAgICAgICAgIHBydW5pbmdUcmFuc2Fj
dGlvbi5jb21taXQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICAgICAgcHJ1bmluZ1RyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgICAgICBw
YWdlRGVsZXRlU1FMLmZpbmFsaXplKCk7CisgICAgfQorCisgICAgLy8gRGVsZXRpbmcgdW5yZWZl
cmVuY2VkIGljb25zIGZyb20gdGhlIEljb24gdGFibGVzIGhhcyB0byBiZSBhdG9taWMgLQorICAg
IC8vIElmIHRoZSB1c2VyIHF1aXRzIHdoaWxlIHRoZXNlIGFyZSB0YWtpbmcgcGxhY2UsIHRoZXkg
bWlnaHQgaGF2ZSB0byB3YWl0LiBUaGFua2Z1bGx5IHRoaXMgd2lsbCByYXJlbHkgYmUgYW4gaXNz
dWUKKyAgICAvLyBBIHVzZXIgb24gYSBuZXR3b3JrIGhvbWUgZGlyZWN0b3J5IHdpdGggYSB3aWxk
bHkgaW5jb25zaXN0ZW50IGRhdGFiYXNlIG1pZ2h0IHNlZSBxdWl0ZSBhIHBhdXNlLi4uCisKKyAg
ICBTUUxpdGVUcmFuc2FjdGlvbiBwcnVuaW5nVHJhbnNhY3Rpb24obV9zeW5jREIpOworICAgIHBy
dW5pbmdUcmFuc2FjdGlvbi5iZWdpbigpOworCisgICAgLy8gV2lwZSBJY29ucyB0aGF0IGFyZW4n
dCByZXRhaW5lZAorICAgIGlmICghbV9zeW5jREIuZXhlY3V0ZUNvbW1hbmQoIkRFTEVURSBGUk9N
IEljb25EYXRhIFdIRVJFIGljb25JRCBOT1QgSU4gKFNFTEVDVCBpY29uSUQgRlJPTSBQYWdlVVJM
KTsiKSkKKyAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gZXhlY3V0ZSBTUUwgdG8gcHJ1bmUg
dW5yZXRhaW5lZCBpY29ucyBmcm9tIHRoZSBvbi1kaXNrIEljb25EYXRhIHRhYmxlIik7CisgICAg
aWYgKCFtX3N5bmNEQi5leGVjdXRlQ29tbWFuZCgiREVMRVRFIEZST00gSWNvbkluZm8gV0hFUkUg
aWNvbklEIE5PVCBJTiAoU0VMRUNUIGljb25JRCBGUk9NIFBhZ2VVUkwpOyIpKQorICAgICAgICBM
T0dfRVJST1IoIkZhaWxlZCB0byBleGVjdXRlIFNRTCB0byBwcnVuZSB1bnJldGFpbmVkIGljb25z
IGZyb20gdGhlIG9uLWRpc2sgSWNvbkluZm8gdGFibGUiKTsKKworICAgIHBydW5pbmdUcmFuc2Fj
dGlvbi5jb21taXQoKTsKKworICAgIGNoZWNrRm9yRGFuZ2xpbmdQYWdlVVJMcyh0cnVlKTsKKwor
ICAgIG1faW5pdGlhbFBydW5pbmdDb21wbGV0ZSA9IHRydWU7Cit9CisKK3ZvaWQgSWNvbkRhdGFi
YXNlOjpjaGVja0ZvckRhbmdsaW5nUGFnZVVSTHMoYm9vbCBwcnVuZUlmRm91bmQpCit7CisgICAg
QVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKKworICAgIC8vIFRoaXMgY2hlY2sgY2FuIGJlIHJl
bGF0aXZlbHkgZXhwZW5zaXZlIHNvIHdlIGRvbid0IGRvIGl0IGluIGEgcmVsZWFzZSBidWlsZCB1
bmxlc3MgdGhlIGNhbGxlciBoYXMgYXNrZWQgdXMgdG8gcHJ1bmUgYW55IGRhbmdsaW5nCisgICAg
Ly8gZW50cmllcy4gV2UgYWxzbyBkb24ndCB3YW50IHRvIGtlZXAgcGVyZm9ybWluZyB0aGlzIGNo
ZWNrIGFuZCByZXBvcnRpbmcgdGhpcyBlcnJvciBpZiBpdCBoYXMgYWxyZWFkeSBmb3VuZCBkYW5n
bGVycyBiZWZvcmUgc28gd2UKKyAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UndmUgZm91
bmQgYW55LiBXZSBza2lwIHRoZSBjaGVjayBpbiB0aGUgcmVsZWFzZSBidWlsZCBwcmV0ZW5kaW5n
IHRvIGhhdmUgYWxyZWFkeSBmb3VuZCBkYW5nbGVycyBhbHJlYWR5LgorI2lmbmRlZiBOREVCVUcK
KyAgICBzdGF0aWMgYm9vbCBkYW5nbGVyc0ZvdW5kID0gdHJ1ZTsKKyNlbHNlCisgICAgc3RhdGlj
IGJvb2wgZGFuZ2xlcnNGb3VuZCA9IGZhbHNlOworI2VuZGlmCisKKyAgICBpZiAoKHBydW5lSWZG
b3VuZCB8fCAhZGFuZ2xlcnNGb3VuZCkgJiYgU1FMaXRlU3RhdGVtZW50KG1fc3luY0RCLCAiU0VM
RUNUIHVybCBGUk9NIFBhZ2VVUkwgV0hFUkUgUGFnZVVSTC5pY29uSUQgTk9UIElOIChTRUxFQ1Qg
aWNvbklEIEZST00gSWNvbkluZm8pIExJTUlUIDE7IikucmV0dXJuc0F0TGVhc3RPbmVSZXN1bHQo
KSkgeworICAgICAgICBkYW5nbGVyc0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgTE9HKEljb25EYXRh
YmFzZSwgIkRhbmdsaW5nIFBhZ2VVUkwgZW50cmllcyBmb3VuZCIpOworICAgICAgICBpZiAocHJ1
bmVJZkZvdW5kICYmICFtX3N5bmNEQi5leGVjdXRlQ29tbWFuZCgiREVMRVRFIEZST00gUGFnZVVS
TCBXSEVSRSBpY29uSUQgTk9UIElOIChTRUxFQ1QgaWNvbklEIEZST00gSWNvbkluZm8pOyIpKQor
ICAgICAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIlVuYWJsZSB0byBwcnVuZSBkYW5nbGluZyBQ
YWdlVVJMcyIpOworICAgIH0KK30KKwordm9pZCBJY29uRGF0YWJhc2U6OnJlbW92ZUFsbEljb25z
T25UaHJlYWQoKQoreworICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7CisKKyAgICBMT0co
SWNvbkRhdGFiYXNlLCAiUmVtb3ZpbmcgYWxsIGljb25zIG9uIHRoZSBzeW5jIHRocmVhZCIpOwor
CisgICAgLy8gRGVsZXRlIGFsbCB0aGUgcHJlcGFyZWQgc3RhdGVtZW50cyBzbyB0aGV5IGNhbiBz
dGFydCBvdmVyCisgICAgZGVsZXRlQWxsUHJlcGFyZWRTdGF0ZW1lbnRzKCk7CisKKyAgICAvLyBU
byByZXNldCB0aGUgb24tZGlzayBkYXRhYmFzZSwgd2UnbGwgd2lwZSBhbGwgaXRzIHRhYmxlcyB0
aGVuIHZhY3V1bSBpdAorICAgIC8vIFRoaXMgaXMgZWFzaWVyIGFuZCBzYWZlciB0aGFuIGNsb3Np
bmcgaXQsIGRlbGV0aW5nIHRoZSBmaWxlLCBhbmQgcmVjcmVhdGluZyBmcm9tIHNjcmF0Y2gKKyAg
ICBtX3N5bmNEQi5jbGVhckFsbFRhYmxlcygpOworICAgIG1fc3luY0RCLnJ1blZhY3V1bUNvbW1h
bmQoKTsKKyAgICBjcmVhdGVEYXRhYmFzZVRhYmxlcyhtX3N5bmNEQik7CisKKyAgICBMT0coSWNv
bkRhdGFiYXNlLCAiRGlzcGF0Y2hpbmcgbm90aWZpY2F0aW9uIHRoYXQgd2UgcmVtb3ZlZCBhbGwg
aWNvbnMiKTsKKyAgICBkaXNwYXRjaERpZFJlbW92ZUFsbEljb25zT25NYWluVGhyZWFkKCk7Cit9
CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpkZWxldGVBbGxQcmVwYXJlZFN0YXRlbWVudHMoKQorewor
ICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7CisKKyAgICBtX3NldEljb25JREZvclBhZ2VV
UkxTdGF0ZW1lbnQgPSBudWxscHRyOworICAgIG1fcmVtb3ZlUGFnZVVSTFN0YXRlbWVudCA9IG51
bGxwdHI7CisgICAgbV9nZXRJY29uSURGb3JJY29uVVJMU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAg
ICBtX2dldEltYWdlRGF0YUZvckljb25VUkxTdGF0ZW1lbnQgPSBudWxscHRyOworICAgIG1fYWRk
SWNvblRvSWNvbkluZm9TdGF0ZW1lbnQgPSBudWxscHRyOworICAgIG1fYWRkSWNvblRvSWNvbkRh
dGFTdGF0ZW1lbnQgPSBudWxscHRyOworICAgIG1fZ2V0SW1hZ2VEYXRhU3RhdGVtZW50ID0gbnVs
bHB0cjsKKyAgICBtX2RlbGV0ZVBhZ2VVUkxzRm9ySWNvblVSTFN0YXRlbWVudCA9IG51bGxwdHI7
CisgICAgbV9kZWxldGVJY29uRnJvbUljb25JbmZvU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAgICBt
X2RlbGV0ZUljb25Gcm9tSWNvbkRhdGFTdGF0ZW1lbnQgPSBudWxscHRyOworICAgIG1fdXBkYXRl
SWNvbkluZm9TdGF0ZW1lbnQgPSBudWxscHRyOworICAgIG1fdXBkYXRlSWNvbkRhdGFTdGF0ZW1l
bnQgID0gbnVsbHB0cjsKKyAgICBtX3NldEljb25JbmZvU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAg
ICBtX3NldEljb25EYXRhU3RhdGVtZW50ID0gbnVsbHB0cjsKK30KKwordm9pZCogSWNvbkRhdGFi
YXNlOjpjbGVhbnVwU3luY1RocmVhZCgpCit7CisgICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQo
KTsKKworI2lmICFMT0dfRElTQUJMRUQKKyAgICBkb3VibGUgdGltZVN0YW1wID0gbW9ub3Rvbmlj
YWxseUluY3JlYXNpbmdUaW1lKCk7CisjZW5kaWYKKworICAgIC8vIElmIHRoZSByZW1vdmVJY29u
cyBmbGFnIGlzIHNldCwgcmVtb3ZlIGFsbCBpY29ucyBmcm9tIHRoZSBkYi4KKyAgICBpZiAobV9y
ZW1vdmVJY29uc1JlcXVlc3RlZCkKKyAgICAgICAgcmVtb3ZlQWxsSWNvbnNPblRocmVhZCgpOwor
CisgICAgLy8gU3luYyByZW1haW5pbmcgaWNvbnMgb3V0CisgICAgTE9HKEljb25EYXRhYmFzZSwg
IihUSFJFQUQpIERvaW5nIGZpbmFsIHdyaXRlb3V0IGFuZCBjbG9zdXJlIG9mIHN5bmMgdGhyZWFk
Iik7CisgICAgd3JpdGVUb0RhdGFiYXNlKCk7CisKKyAgICAvLyBDbG9zZSB0aGUgZGF0YWJhc2UK
KyAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3N5bmNMb2NrKTsKKworICAgIG1fZGF0YWJhc2VEaXJl
Y3RvcnkgPSBTdHJpbmcoKTsKKyAgICBtX2NvbXBsZXRlRGF0YWJhc2VQYXRoID0gU3RyaW5nKCk7
CisgICAgZGVsZXRlQWxsUHJlcGFyZWRTdGF0ZW1lbnRzKCk7CisgICAgbV9zeW5jREIuY2xvc2Uo
KTsKKworI2lmICFMT0dfRElTQUJMRUQKKyAgICBMT0coSWNvbkRhdGFiYXNlLCAiKFRIUkVBRCkg
RmluYWwgY2xvc3VyZSB0b29rICUuNGYgc2Vjb25kcyIsIG1vbm90b25pY2FsbHlJbmNyZWFzaW5n
VGltZSgpIC0gdGltZVN0YW1wKTsKKyNlbmRpZgorCisgICAgbV9zeW5jVGhyZWFkUnVubmluZyA9
IGZhbHNlOworICAgIHJldHVybiBudWxscHRyOworfQorCisvLyByZWFkeVNRTGl0ZVN0YXRlbWVu
dCgpIGhhbmRsZXMgdHdvIHRoaW5ncworLy8gMSAtIElmIHRoZSBTUUxEYXRhYmFzZSYgYXJndW1l
bnQgaXMgZGlmZmVyZW50LCB0aGUgc3RhdGVtZW50IG11c3QgYmUgZGVzdHJveWVkIGFuZCByZW1h
ZGUuIFRoaXMgaGFwcGVucyB3aGVuIHRoZSB1c2VyCisvLyAgICAgc3dpdGNoZXMgdG8gYW5kIGZy
b20gcHJpdmF0ZSBicm93c2luZworLy8gMiAtIExhenkgY29uc3RydWN0aW9uIG9mIHRoZSBTdGF0
ZW1lbnQgaW4gdGhlIGZpcnN0IHBsYWNlLCBpbiBjYXNlIHdlJ3ZlIG5ldmVyIG1hZGUgdGhpcyBx
dWVyeSBiZWZvcmUKK2lubGluZSB2b2lkIHJlYWR5U1FMaXRlU3RhdGVtZW50KHN0ZDo6dW5pcXVl
X3B0cjxTUUxpdGVTdGF0ZW1lbnQ+JiBzdGF0ZW1lbnQsIFNRTGl0ZURhdGFiYXNlJiBkYiwgY29u
c3QgU3RyaW5nJiBzdHIpCit7CisgICAgaWYgKHN0YXRlbWVudCAmJiAoJnN0YXRlbWVudC0+ZGF0
YWJhc2UoKSAhPSAmZGIgfHwgc3RhdGVtZW50LT5pc0V4cGlyZWQoKSkpIHsKKyAgICAgICAgaWYg
KHN0YXRlbWVudC0+aXNFeHBpcmVkKCkpCisgICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAi
U1FMaXRlU3RhdGVtZW50IGFzc29jaWF0ZWQgd2l0aCAlcyBpcyBleHBpcmVkIiwgc3RyLmFzY2lp
KCkuZGF0YSgpKTsKKyAgICAgICAgc3RhdGVtZW50ID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYg
KCFzdGF0ZW1lbnQpIHsKKyAgICAgICAgc3RhdGVtZW50ID0gc3RkOjptYWtlX3VuaXF1ZTxTUUxp
dGVTdGF0ZW1lbnQ+KGRiLCBzdHIpOworICAgICAgICBpZiAoc3RhdGVtZW50LT5wcmVwYXJlKCkg
IT0gU1FMSVRFX09LKQorICAgICAgICAgICAgTE9HX0VSUk9SKCJQcmVwYXJpbmcgc3RhdGVtZW50
ICVzIGZhaWxlZCIsIHN0ci5hc2NpaSgpLmRhdGEoKSk7CisgICAgfQorfQorCit2b2lkIEljb25E
YXRhYmFzZTo6c2V0SWNvblVSTEZvclBhZ2VVUkxJblNRTERhdGFiYXNlKGNvbnN0IFN0cmluZyYg
aWNvblVSTCwgY29uc3QgU3RyaW5nJiBwYWdlVVJMKQoreworICAgIEFTU0VSVF9JQ09OX1NZTkNf
VEhSRUFEKCk7CisKKyAgICBpbnQ2NF90IGljb25JRCA9IGdldEljb25JREZvckljb25VUkxGcm9t
U1FMRGF0YWJhc2UoaWNvblVSTCk7CisKKyAgICBpZiAoIWljb25JRCkKKyAgICAgICAgaWNvbklE
ID0gYWRkSWNvblVSTFRvU1FMRGF0YWJhc2UoaWNvblVSTCk7CisKKyAgICBpZiAoIWljb25JRCkg
eworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBlc3RhYmxpc2ggYW4gSUQgZm9yIGljb25V
UkwgJXMiLCB1cmxGb3JMb2dnaW5nKGljb25VUkwpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXRJ
Y29uSURGb3JQYWdlVVJMSW5TUUxEYXRhYmFzZShpY29uSUQsIHBhZ2VVUkwpOworfQorCit2b2lk
IEljb25EYXRhYmFzZTo6c2V0SWNvbklERm9yUGFnZVVSTEluU1FMRGF0YWJhc2UoaW50NjRfdCBp
Y29uSUQsIGNvbnN0IFN0cmluZyYgcGFnZVVSTCkKK3sKKyAgICBBU1NFUlRfSUNPTl9TWU5DX1RI
UkVBRCgpOworCisgICAgcmVhZHlTUUxpdGVTdGF0ZW1lbnQobV9zZXRJY29uSURGb3JQYWdlVVJM
U3RhdGVtZW50LCBtX3N5bmNEQiwgIklOU0VSVCBJTlRPIFBhZ2VVUkwgKHVybCwgaWNvbklEKSBW
QUxVRVMgKCg/KSwgPyk7Iik7CisgICAgbV9zZXRJY29uSURGb3JQYWdlVVJMU3RhdGVtZW50LT5i
aW5kVGV4dCgxLCBwYWdlVVJMKTsKKyAgICBtX3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQt
PmJpbmRJbnQ2NCgyLCBpY29uSUQpOworCisgICAgaW50IHJlc3VsdCA9IG1fc2V0SWNvbklERm9y
UGFnZVVSTFN0YXRlbWVudC0+c3RlcCgpOworICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX0RPTkUp
IHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIExPR19FUlJPUigic2V0
SWNvbklERm9yUGFnZVVSTFF1ZXJ5IGZhaWxlZCBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2luZyhw
YWdlVVJMKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgfQorCisgICAgbV9zZXRJY29uSURGb3JQYWdl
VVJMU3RhdGVtZW50LT5yZXNldCgpOworfQorCit2b2lkIEljb25EYXRhYmFzZTo6cmVtb3ZlUGFn
ZVVSTEZyb21TUUxEYXRhYmFzZShjb25zdCBTdHJpbmcmIHBhZ2VVUkwpCit7CisgICAgQVNTRVJU
X0lDT05fU1lOQ19USFJFQUQoKTsKKworICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1fcmVtb3Zl
UGFnZVVSTFN0YXRlbWVudCwgbV9zeW5jREIsICJERUxFVEUgRlJPTSBQYWdlVVJMIFdIRVJFIHVy
bCA9ICg/KTsiKTsKKyAgICBtX3JlbW92ZVBhZ2VVUkxTdGF0ZW1lbnQtPmJpbmRUZXh0KDEsIHBh
Z2VVUkwpOworCisgICAgaWYgKG1fcmVtb3ZlUGFnZVVSTFN0YXRlbWVudC0+c3RlcCgpICE9IFNR
TElURV9ET05FKQorICAgICAgICBMT0dfRVJST1IoInJlbW92ZVBhZ2VVUkxGcm9tU1FMRGF0YWJh
c2UgZmFpbGVkIGZvciB1cmwgJXMiLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkwpLmFzY2lpKCkuZGF0
YSgpKTsKKworICAgIG1fcmVtb3ZlUGFnZVVSTFN0YXRlbWVudC0+cmVzZXQoKTsKK30KKworCitp
bnQ2NF90IEljb25EYXRhYmFzZTo6Z2V0SWNvbklERm9ySWNvblVSTEZyb21TUUxEYXRhYmFzZShj
b25zdCBTdHJpbmcmIGljb25VUkwpCit7CisgICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsK
KworICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1fZ2V0SWNvbklERm9ySWNvblVSTFN0YXRlbWVu
dCwgbV9zeW5jREIsICJTRUxFQ1QgSWNvbkluZm8uaWNvbklEIEZST00gSWNvbkluZm8gV0hFUkUg
SWNvbkluZm8udXJsID0gKD8pOyIpOworICAgIG1fZ2V0SWNvbklERm9ySWNvblVSTFN0YXRlbWVu
dC0+YmluZFRleHQoMSwgaWNvblVSTCk7CisKKyAgICBpbnQ2NF90IHJlc3VsdCA9IG1fZ2V0SWNv
bklERm9ySWNvblVSTFN0YXRlbWVudC0+c3RlcCgpOworICAgIGlmIChyZXN1bHQgPT0gU1FMSVRF
X1JPVykKKyAgICAgICAgcmVzdWx0ID0gbV9nZXRJY29uSURGb3JJY29uVVJMU3RhdGVtZW50LT5n
ZXRDb2x1bW5JbnQ2NCgwKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBTUUxJ
VEVfRE9ORSkKKyAgICAgICAgICAgIExPR19FUlJPUigiZ2V0SWNvbklERm9ySWNvblVSTEZyb21T
UUxEYXRhYmFzZSBmYWlsZWQgZm9yIHVybCAlcyIsIHVybEZvckxvZ2dpbmcoaWNvblVSTCkuYXNj
aWkoKS5kYXRhKCkpOworICAgICAgICByZXN1bHQgPSAwOworICAgIH0KKworICAgIG1fZ2V0SWNv
bklERm9ySWNvblVSTFN0YXRlbWVudC0+cmVzZXQoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQor
CitpbnQ2NF90IEljb25EYXRhYmFzZTo6YWRkSWNvblVSTFRvU1FMRGF0YWJhc2UoY29uc3QgU3Ry
aW5nJiBpY29uVVJMKQoreworICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7CisKKyAgICAv
LyBUaGVyZSB3b3VsZCBiZSBhIHRyYW5zYWN0aW9uIGhlcmUgdG8gbWFrZSBzdXJlIHRoZXNlIHR3
byBpbnNlcnRzIGFyZSBhdG9taWMKKyAgICAvLyBJbiBwcmFjdGljZSB0aGUgb25seSBjYWxsZXIg
b2YgdGhpcyBtZXRob2QgaXMgYWx3YXlzIHdyYXBwZWQgaW4gYSB0cmFuc2FjdGlvbiBpdHNlbGYg
c28gcGxhY2luZyBhbm90aGVyCisgICAgLy8gaGVyZSBpcyB1bm5lY2Vzc2FyeQorCisgICAgcmVh
ZHlTUUxpdGVTdGF0ZW1lbnQobV9hZGRJY29uVG9JY29uSW5mb1N0YXRlbWVudCwgbV9zeW5jREIs
ICJJTlNFUlQgSU5UTyBJY29uSW5mbyAodXJsLCBzdGFtcCkgVkFMVUVTICg/LCAwKTsiKTsKKyAg
ICBtX2FkZEljb25Ub0ljb25JbmZvU3RhdGVtZW50LT5iaW5kVGV4dCgxLCBpY29uVVJMKTsKKwor
ICAgIGludCByZXN1bHQgPSBtX2FkZEljb25Ub0ljb25JbmZvU3RhdGVtZW50LT5zdGVwKCk7Cisg
ICAgbV9hZGRJY29uVG9JY29uSW5mb1N0YXRlbWVudC0+cmVzZXQoKTsKKyAgICBpZiAocmVzdWx0
ICE9IFNRTElURV9ET05FKSB7CisgICAgICAgIExPR19FUlJPUigiYWRkSWNvblVSTFRvU1FMRGF0
YWJhc2UgZmFpbGVkIHRvIGluc2VydCAlcyBpbnRvIEljb25JbmZvIiwgdXJsRm9yTG9nZ2luZyhp
Y29uVVJMKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBp
bnQ2NF90IGljb25JRCA9IG1fc3luY0RCLmxhc3RJbnNlcnRSb3dJRCgpOworCisgICAgcmVhZHlT
UUxpdGVTdGF0ZW1lbnQobV9hZGRJY29uVG9JY29uRGF0YVN0YXRlbWVudCwgbV9zeW5jREIsICJJ
TlNFUlQgSU5UTyBJY29uRGF0YSAoaWNvbklELCBkYXRhKSBWQUxVRVMgKD8sID8pOyIpOworICAg
IG1fYWRkSWNvblRvSWNvbkRhdGFTdGF0ZW1lbnQtPmJpbmRJbnQ2NCgxLCBpY29uSUQpOworCisg
ICAgcmVzdWx0ID0gbV9hZGRJY29uVG9JY29uRGF0YVN0YXRlbWVudC0+c3RlcCgpOworICAgIG1f
YWRkSWNvblRvSWNvbkRhdGFTdGF0ZW1lbnQtPnJlc2V0KCk7CisgICAgaWYgKHJlc3VsdCAhPSBT
UUxJVEVfRE9ORSkgeworICAgICAgICBMT0dfRVJST1IoImFkZEljb25VUkxUb1NRTERhdGFiYXNl
IGZhaWxlZCB0byBpbnNlcnQgJXMgaW50byBJY29uRGF0YSIsIHVybEZvckxvZ2dpbmcoaWNvblVS
TCkuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1
cm4gaWNvbklEOworfQorCitSZWZQdHI8U2hhcmVkQnVmZmVyPiBJY29uRGF0YWJhc2U6OmdldElt
YWdlRGF0YUZvckljb25VUkxGcm9tU1FMRGF0YWJhc2UoY29uc3QgU3RyaW5nJiBpY29uVVJMKQor
eworICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7CisKKyAgICBSZWZQdHI8U2hhcmVkQnVm
ZmVyPiBpbWFnZURhdGE7CisKKyAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX2dldEltYWdlRGF0
YUZvckljb25VUkxTdGF0ZW1lbnQsIG1fc3luY0RCLCAiU0VMRUNUIEljb25EYXRhLmRhdGEgRlJP
TSBJY29uRGF0YSBXSEVSRSBJY29uRGF0YS5pY29uSUQgSU4gKFNFTEVDVCBpY29uSUQgRlJPTSBJ
Y29uSW5mbyBXSEVSRSBJY29uSW5mby51cmwgPSAoPykpOyIpOworICAgIG1fZ2V0SW1hZ2VEYXRh
Rm9ySWNvblVSTFN0YXRlbWVudC0+YmluZFRleHQoMSwgaWNvblVSTCk7CisKKyAgICBpbnQgcmVz
dWx0ID0gbV9nZXRJbWFnZURhdGFGb3JJY29uVVJMU3RhdGVtZW50LT5zdGVwKCk7CisgICAgaWYg
KHJlc3VsdCA9PSBTUUxJVEVfUk9XKSB7CisgICAgICAgIFZlY3RvcjxjaGFyPiBkYXRhOworICAg
ICAgICBtX2dldEltYWdlRGF0YUZvckljb25VUkxTdGF0ZW1lbnQtPmdldENvbHVtbkJsb2JBc1Zl
Y3RvcigwLCBkYXRhKTsKKyAgICAgICAgaW1hZ2VEYXRhID0gU2hhcmVkQnVmZmVyOjpjcmVhdGUo
ZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBTUUxJ
VEVfRE9ORSkKKyAgICAgICAgTE9HX0VSUk9SKCJnZXRJbWFnZURhdGFGb3JJY29uVVJMRnJvbVNR
TERhdGFiYXNlIGZhaWxlZCBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2luZyhpY29uVVJMKS5hc2Np
aSgpLmRhdGEoKSk7CisKKyAgICBtX2dldEltYWdlRGF0YUZvckljb25VUkxTdGF0ZW1lbnQtPnJl
c2V0KCk7CisKKyAgICByZXR1cm4gaW1hZ2VEYXRhOworfQorCit2b2lkIEljb25EYXRhYmFzZTo6
cmVtb3ZlSWNvbkZyb21TUUxEYXRhYmFzZShjb25zdCBTdHJpbmcmIGljb25VUkwpCit7CisgICAg
QVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKKworICAgIGlmIChpY29uVVJMLmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhlcmUgd291bGQgYmUgYSB0cmFuc2FjdGlvbiBo
ZXJlIHRvIG1ha2Ugc3VyZSB0aGVzZSByZW1vdmFscyBhcmUgYXRvbWljCisgICAgLy8gSW4gcHJh
Y3RpY2UgdGhlIG9ubHkgY2FsbGVyIG9mIHRoaXMgbWV0aG9kIGlzIGFsd2F5cyB3cmFwcGVkIGlu
IGEgdHJhbnNhY3Rpb24gaXRzZWxmIHNvIHBsYWNpbmcgYW5vdGhlciBoZXJlIGlzIHVubmVjZXNz
YXJ5CisKKyAgICAvLyBJdCdzIHBvc3NpYmxlIHRoaXMgaWNvbiBpcyBub3QgaW4gdGhlIGRhdGFi
YXNlIGJlY2F1c2Ugb2YgY2VydGFpbiByYXBpZCBicm93c2luZyBwYXR0ZXJucyAoc3VjaCBhcyBh
IHN0cmVzcyB0ZXN0KSB3aGVyZSB0aGUKKyAgICAvLyBpY29uIGlzIG1hcmtlZCB0byBiZSBhZGRl
ZCB0aGVuIG1hcmtlZCBmb3IgcmVtb3ZhbCBiZWZvcmUgaXQgaXMgZXZlciB3cml0dGVuIHRvIGRp
c2suIE5vIGJpZyBkZWFsLCBlYXJseSByZXR1cm4KKyAgICBpbnQ2NF90IGljb25JRCA9IGdldElj
b25JREZvckljb25VUkxGcm9tU1FMRGF0YWJhc2UoaWNvblVSTCk7CisgICAgaWYgKCFpY29uSUQp
CisgICAgICAgIHJldHVybjsKKworICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1fZGVsZXRlUGFn
ZVVSTHNGb3JJY29uVVJMU3RhdGVtZW50LCBtX3N5bmNEQiwgIkRFTEVURSBGUk9NIFBhZ2VVUkwg
V0hFUkUgUGFnZVVSTC5pY29uSUQgPSAoPyk7Iik7CisgICAgbV9kZWxldGVQYWdlVVJMc0Zvcklj
b25VUkxTdGF0ZW1lbnQtPmJpbmRJbnQ2NCgxLCBpY29uSUQpOworCisgICAgaWYgKG1fZGVsZXRl
UGFnZVVSTHNGb3JJY29uVVJMU3RhdGVtZW50LT5zdGVwKCkgIT0gU1FMSVRFX0RPTkUpCisgICAg
ICAgIExPR19FUlJPUigibV9kZWxldGVQYWdlVVJMc0Zvckljb25VUkxTdGF0ZW1lbnQgZmFpbGVk
IGZvciB1cmwgJXMiLCB1cmxGb3JMb2dnaW5nKGljb25VUkwpLmFzY2lpKCkuZGF0YSgpKTsKKwor
ICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1fZGVsZXRlSWNvbkZyb21JY29uSW5mb1N0YXRlbWVu
dCwgbV9zeW5jREIsICJERUxFVEUgRlJPTSBJY29uSW5mbyBXSEVSRSBJY29uSW5mby5pY29uSUQg
PSAoPyk7Iik7CisgICAgbV9kZWxldGVJY29uRnJvbUljb25JbmZvU3RhdGVtZW50LT5iaW5kSW50
NjQoMSwgaWNvbklEKTsKKworICAgIGlmIChtX2RlbGV0ZUljb25Gcm9tSWNvbkluZm9TdGF0ZW1l
bnQtPnN0ZXAoKSAhPSBTUUxJVEVfRE9ORSkKKyAgICAgICAgTE9HX0VSUk9SKCJtX2RlbGV0ZUlj
b25Gcm9tSWNvbkluZm9TdGF0ZW1lbnQgZmFpbGVkIGZvciB1cmwgJXMiLCB1cmxGb3JMb2dnaW5n
KGljb25VUkwpLmFzY2lpKCkuZGF0YSgpKTsKKworICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1f
ZGVsZXRlSWNvbkZyb21JY29uRGF0YVN0YXRlbWVudCwgbV9zeW5jREIsICJERUxFVEUgRlJPTSBJ
Y29uRGF0YSBXSEVSRSBJY29uRGF0YS5pY29uSUQgPSAoPyk7Iik7CisgICAgbV9kZWxldGVJY29u
RnJvbUljb25EYXRhU3RhdGVtZW50LT5iaW5kSW50NjQoMSwgaWNvbklEKTsKKworICAgIGlmICht
X2RlbGV0ZUljb25Gcm9tSWNvbkRhdGFTdGF0ZW1lbnQtPnN0ZXAoKSAhPSBTUUxJVEVfRE9ORSkK
KyAgICAgICAgTE9HX0VSUk9SKCJtX2RlbGV0ZUljb25Gcm9tSWNvbkRhdGFTdGF0ZW1lbnQgZmFp
bGVkIGZvciB1cmwgJXMiLCB1cmxGb3JMb2dnaW5nKGljb25VUkwpLmFzY2lpKCkuZGF0YSgpKTsK
KworICAgIG1fZGVsZXRlUGFnZVVSTHNGb3JJY29uVVJMU3RhdGVtZW50LT5yZXNldCgpOworICAg
IG1fZGVsZXRlSWNvbkZyb21JY29uSW5mb1N0YXRlbWVudC0+cmVzZXQoKTsKKyAgICBtX2RlbGV0
ZUljb25Gcm9tSWNvbkRhdGFTdGF0ZW1lbnQtPnJlc2V0KCk7Cit9CisKK3ZvaWQgSWNvbkRhdGFi
YXNlOjp3cml0ZUljb25TbmFwc2hvdFRvU1FMRGF0YWJhc2UoY29uc3QgSWNvblNuYXBzaG90JiBz
bmFwc2hvdCkKK3sKKyAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOworCisgICAgaWYgKHNu
YXBzaG90Lmljb25VUkwoKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEEg
bnVsbGVkIG91dCB0aW1lc3RhbXAgYW5kIGRhdGEgbWVhbnMgdGhpcyBpY29uIGlzIGRlc3RpbmVk
IHRvIGJlIGRlbGV0ZWQgLSBkbyB0aGF0IGluc3RlYWQgb2Ygd3JpdGluZyBpdCBvdXQKKyAgICBp
ZiAoIXNuYXBzaG90LnRpbWVzdGFtcCgpICYmICFzbmFwc2hvdC5kYXRhKCkpIHsKKyAgICAgICAg
TE9HKEljb25EYXRhYmFzZSwgIlJlbW92aW5nICVzIGZyb20gb24tZGlzayBkYXRhYmFzZSIsIHVy
bEZvckxvZ2dpbmcoc25hcHNob3QuaWNvblVSTCgpKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAg
IHJlbW92ZUljb25Gcm9tU1FMRGF0YWJhc2Uoc25hcHNob3QuaWNvblVSTCgpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIFRoZXJlIHdvdWxkIGJlIGEgdHJhbnNhY3Rpb24gaGVy
ZSB0byBtYWtlIHN1cmUgdGhlc2UgcmVtb3ZhbHMgYXJlIGF0b21pYworICAgIC8vIEluIHByYWN0
aWNlIHRoZSBvbmx5IGNhbGxlciBvZiB0aGlzIG1ldGhvZCBpcyBhbHdheXMgd3JhcHBlZCBpbiBh
IHRyYW5zYWN0aW9uIGl0c2VsZiBzbyBwbGFjaW5nIGFub3RoZXIgaGVyZSBpcyB1bm5lY2Vzc2Fy
eQorCisgICAgLy8gR2V0IHRoZSBpY29uSUQgZm9yIHRoaXMgdXJsCisgICAgaW50NjRfdCBpY29u
SUQgPSBnZXRJY29uSURGb3JJY29uVVJMRnJvbVNRTERhdGFiYXNlKHNuYXBzaG90Lmljb25VUkwo
KSk7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGljb25JRCBpbiBwbGFjZSwgdXBk
YXRlIHRoZSBkYXRhYmFzZS4KKyAgICAvLyBPdGhlcndpc2UsIGluc2VydCBuZXcgcmVjb3Jkcwor
ICAgIGlmIChpY29uSUQpIHsKKyAgICAgICAgcmVhZHlTUUxpdGVTdGF0ZW1lbnQobV91cGRhdGVJ
Y29uSW5mb1N0YXRlbWVudCwgbV9zeW5jREIsICJVUERBVEUgSWNvbkluZm8gU0VUIHN0YW1wID0g
PywgdXJsID0gPyBXSEVSRSBpY29uSUQgPSA/OyIpOworICAgICAgICBtX3VwZGF0ZUljb25JbmZv
U3RhdGVtZW50LT5iaW5kSW50NjQoMSwgc25hcHNob3QudGltZXN0YW1wKCkpOworICAgICAgICBt
X3VwZGF0ZUljb25JbmZvU3RhdGVtZW50LT5iaW5kVGV4dCgyLCBzbmFwc2hvdC5pY29uVVJMKCkp
OworICAgICAgICBtX3VwZGF0ZUljb25JbmZvU3RhdGVtZW50LT5iaW5kSW50NjQoMywgaWNvbklE
KTsKKworICAgICAgICBpZiAobV91cGRhdGVJY29uSW5mb1N0YXRlbWVudC0+c3RlcCgpICE9IFNR
TElURV9ET05FKQorICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gdXBkYXRlIGljb24g
aW5mbyBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2luZyhzbmFwc2hvdC5pY29uVVJMKCkpLmFzY2lp
KCkuZGF0YSgpKTsKKworICAgICAgICBtX3VwZGF0ZUljb25JbmZvU3RhdGVtZW50LT5yZXNldCgp
OworCisgICAgICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1fdXBkYXRlSWNvbkRhdGFTdGF0ZW1l
bnQsIG1fc3luY0RCLCAiVVBEQVRFIEljb25EYXRhIFNFVCBkYXRhID0gPyBXSEVSRSBpY29uSUQg
PSA/OyIpOworICAgICAgICBtX3VwZGF0ZUljb25EYXRhU3RhdGVtZW50LT5iaW5kSW50NjQoMiwg
aWNvbklEKTsKKworICAgICAgICAvLyBJZiB3ZSAqaGF2ZSogaW1hZ2UgZGF0YSwgYmluZCBpdCB0
byB0aGlzIHN0YXRlbWVudCAtIE90aGVyd2lzZSBiaW5kICJudWxsIiBmb3IgdGhlIGJsb2IgZGF0
YSwKKyAgICAgICAgLy8gc2lnbmlmeWluZyB0aGF0IHRoaXMgaWNvbiBkb2Vzbid0IGhhdmUgYW55
IGRhdGEKKyAgICAgICAgaWYgKHNuYXBzaG90LmRhdGEoKSAmJiBzbmFwc2hvdC5kYXRhKCktPnNp
emUoKSkKKyAgICAgICAgICAgIG1fdXBkYXRlSWNvbkRhdGFTdGF0ZW1lbnQtPmJpbmRCbG9iKDEs
IHNuYXBzaG90LmRhdGEoKS0+ZGF0YSgpLCBzbmFwc2hvdC5kYXRhKCktPnNpemUoKSk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIG1fdXBkYXRlSWNvbkRhdGFTdGF0ZW1lbnQtPmJpbmROdWxs
KDEpOworCisgICAgICAgIGlmIChtX3VwZGF0ZUljb25EYXRhU3RhdGVtZW50LT5zdGVwKCkgIT0g
U1FMSVRFX0RPTkUpCisgICAgICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byB1cGRhdGUgaWNv
biBkYXRhIGZvciB1cmwgJXMiLCB1cmxGb3JMb2dnaW5nKHNuYXBzaG90Lmljb25VUkwoKSkuYXNj
aWkoKS5kYXRhKCkpOworCisgICAgICAgIG1fdXBkYXRlSWNvbkRhdGFTdGF0ZW1lbnQtPnJlc2V0
KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVhZHlTUUxpdGVTdGF0ZW1lbnQobV9zZXRJY29u
SW5mb1N0YXRlbWVudCwgbV9zeW5jREIsICJJTlNFUlQgSU5UTyBJY29uSW5mbyAodXJsLHN0YW1w
KSBWQUxVRVMgKD8sID8pOyIpOworICAgICAgICBtX3NldEljb25JbmZvU3RhdGVtZW50LT5iaW5k
VGV4dCgxLCBzbmFwc2hvdC5pY29uVVJMKCkpOworICAgICAgICBtX3NldEljb25JbmZvU3RhdGVt
ZW50LT5iaW5kSW50NjQoMiwgc25hcHNob3QudGltZXN0YW1wKCkpOworCisgICAgICAgIGlmICht
X3NldEljb25JbmZvU3RhdGVtZW50LT5zdGVwKCkgIT0gU1FMSVRFX0RPTkUpCisgICAgICAgICAg
ICBMT0dfRVJST1IoIkZhaWxlZCB0byBzZXQgaWNvbiBpbmZvIGZvciB1cmwgJXMiLCB1cmxGb3JM
b2dnaW5nKHNuYXBzaG90Lmljb25VUkwoKSkuYXNjaWkoKS5kYXRhKCkpOworCisgICAgICAgIG1f
c2V0SWNvbkluZm9TdGF0ZW1lbnQtPnJlc2V0KCk7CisKKyAgICAgICAgaW50NjRfdCBpY29uSUQg
PSBtX3N5bmNEQi5sYXN0SW5zZXJ0Um93SUQoKTsKKworICAgICAgICByZWFkeVNRTGl0ZVN0YXRl
bWVudChtX3NldEljb25EYXRhU3RhdGVtZW50LCBtX3N5bmNEQiwgIklOU0VSVCBJTlRPIEljb25E
YXRhIChpY29uSUQsIGRhdGEpIFZBTFVFUyAoPywgPyk7Iik7CisgICAgICAgIG1fc2V0SWNvbkRh
dGFTdGF0ZW1lbnQtPmJpbmRJbnQ2NCgxLCBpY29uSUQpOworCisgICAgICAgIC8vIElmIHdlICpo
YXZlKiBpbWFnZSBkYXRhLCBiaW5kIGl0IHRvIHRoaXMgc3RhdGVtZW50IC0gT3RoZXJ3aXNlIGJp
bmQgIm51bGwiIGZvciB0aGUgYmxvYiBkYXRhLAorICAgICAgICAvLyBzaWduaWZ5aW5nIHRoYXQg
dGhpcyBpY29uIGRvZXNuJ3QgaGF2ZSBhbnkgZGF0YQorICAgICAgICBpZiAoc25hcHNob3QuZGF0
YSgpICYmIHNuYXBzaG90LmRhdGEoKS0+c2l6ZSgpKQorICAgICAgICAgICAgbV9zZXRJY29uRGF0
YVN0YXRlbWVudC0+YmluZEJsb2IoMiwgc25hcHNob3QuZGF0YSgpLT5kYXRhKCksIHNuYXBzaG90
LmRhdGEoKS0+c2l6ZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV9zZXRJY29uRGF0
YVN0YXRlbWVudC0+YmluZE51bGwoMik7CisKKyAgICAgICAgaWYgKG1fc2V0SWNvbkRhdGFTdGF0
ZW1lbnQtPnN0ZXAoKSAhPSBTUUxJVEVfRE9ORSkKKyAgICAgICAgICAgIExPR19FUlJPUigiRmFp
bGVkIHRvIHNldCBpY29uIGRhdGEgZm9yIHVybCAlcyIsIHVybEZvckxvZ2dpbmcoc25hcHNob3Qu
aWNvblVSTCgpKS5hc2NpaSgpLmRhdGEoKSk7CisKKyAgICAgICAgbV9zZXRJY29uRGF0YVN0YXRl
bWVudC0+cmVzZXQoKTsKKyAgICB9Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpjaGVja0Nsb3Nl
ZEFmdGVyTWFpblRocmVhZENhbGxiYWNrKCkKK3sKKyAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFE
KCk7CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgc3RpbGwgY2FsbGJhY2tzIGluIGZsaWdodCBmcm9t
IHRoZSBzeW5jIHRocmVhZCB3ZSBjYW5ub3QgcG9zc2libHkgYmUgY2xvc2VkLgorICAgIGlmICgt
LW1fbWFpblRocmVhZENhbGxiYWNrQ291bnQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEV2
ZW4gaWYgdGhlcmUncyBubyBtb3JlIHBlbmRpbmcgY2FsbGJhY2tzIHRoZSBkYXRhYmFzZSBtaWdo
dCBvdGhlcndpc2Ugc3RpbGwgYmUgb3Blbi4KKyAgICBpZiAoaXNPcGVuQmVzaWRlc01haW5UaHJl
YWRDYWxsYmFja3MoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhpcyBkYXRhYmFzZSBp
cyBub3cgYWN0dWFsbHkgY2xvc2VkISBCdXQgZmlyc3Qgbm90aWZ5IHRoZSBjbGllbnQuCisgICAg
aWYgKG1fY2xpZW50KQorICAgICAgICBtX2NsaWVudC0+ZGlkQ2xvc2UoKTsKK30KKwordm9pZCBJ
Y29uRGF0YWJhc2U6OmRpc3BhdGNoRGlkSW1wb3J0SWNvblVSTEZvclBhZ2VVUkxPbk1haW5UaHJl
YWQoY29uc3QgU3RyaW5nJiBwYWdlVVJMKQoreworICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFE
KCk7CisgICAgKyttX21haW5UaHJlYWRDYWxsYmFja0NvdW50OworCisgICAgY2FsbE9uTWFpblRo
cmVhZChbdGhpcywgcGFnZVVSTCA9IHBhZ2VVUkwuaXNvbGF0ZWRDb3B5KCldIHsKKyAgICAgICAg
aWYgKG1fY2xpZW50KQorICAgICAgICAgICAgbV9jbGllbnQtPmRpZEltcG9ydEljb25VUkxGb3JQ
YWdlVVJMKHBhZ2VVUkwpOworICAgICAgICBjaGVja0Nsb3NlZEFmdGVyTWFpblRocmVhZENhbGxi
YWNrKCk7CisgICAgfSk7Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpkaXNwYXRjaERpZEltcG9y
dEljb25EYXRhRm9yUGFnZVVSTE9uTWFpblRocmVhZChjb25zdCBTdHJpbmcmIHBhZ2VVUkwpCit7
CisgICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKKyAgICArK21fbWFpblRocmVhZENhbGxi
YWNrQ291bnQ7CisKKyAgICBjYWxsT25NYWluVGhyZWFkKFt0aGlzLCBwYWdlVVJMID0gcGFnZVVS
TC5pc29sYXRlZENvcHkoKV0geworICAgICAgICBpZiAobV9jbGllbnQpCisgICAgICAgICAgICBt
X2NsaWVudC0+ZGlkSW1wb3J0SWNvbkRhdGFGb3JQYWdlVVJMKHBhZ2VVUkwpOworICAgICAgICBj
aGVja0Nsb3NlZEFmdGVyTWFpblRocmVhZENhbGxiYWNrKCk7CisgICAgfSk7Cit9CisKK3ZvaWQg
SWNvbkRhdGFiYXNlOjpkaXNwYXRjaERpZFJlbW92ZUFsbEljb25zT25NYWluVGhyZWFkKCkKK3sK
KyAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOworICAgICsrbV9tYWluVGhyZWFkQ2FsbGJh
Y2tDb3VudDsKKworICAgIGNhbGxPbk1haW5UaHJlYWQoW3RoaXNdIHsKKyAgICAgICAgaWYgKG1f
Y2xpZW50KQorICAgICAgICAgICAgbV9jbGllbnQtPmRpZFJlbW92ZUFsbEljb25zKCk7CisgICAg
ICAgIGNoZWNrQ2xvc2VkQWZ0ZXJNYWluVGhyZWFkQ2FsbGJhY2soKTsKKyAgICB9KTsKK30KKwor
dm9pZCBJY29uRGF0YWJhc2U6OmRpc3BhdGNoRGlkRmluaXNoVVJMSW1wb3J0T25NYWluVGhyZWFk
KCkKK3sKKyAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOworICAgICsrbV9tYWluVGhyZWFk
Q2FsbGJhY2tDb3VudDsKKworICAgIGNhbGxPbk1haW5UaHJlYWQoW3RoaXNdIHsKKyAgICAgICAg
aWYgKG1fY2xpZW50KQorICAgICAgICAgICAgbV9jbGllbnQtPmRpZEZpbmlzaFVSTEltcG9ydCgp
OworICAgICAgICBjaGVja0Nsb3NlZEFmdGVyTWFpblRocmVhZENhbGxiYWNrKCk7CisgICAgfSk7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0FQSS9nbGliL0ljb25EYXRhYmFzZS5oIGIvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9nbGliL0ljb25EYXRhYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwLi40ZDQ3ZGU5NTBkMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2UuaApAQCAtMCwwICsxLDMzOSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxNCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgSnVzdGluIEhheWdv
b2QgKGpoYXlnb29kQHJlYWt0aXguY29tKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPFdlYkNvcmUvTmF0aXZlSW1h
Z2UuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1NRTGl0ZURhdGFiYXNlLmg+CisjaW5jbHVkZSA8d3Rm
L0NvbmRpdGlvbi5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoQ291bnRlZFNldC5oPgorI2luY2x1ZGUg
PHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYv
UnVuTG9vcC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KKyNpbmNsdWRlIDx3
dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgSW1hZ2U7
CitjbGFzcyBTaGFyZWRCdWZmZXI7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBJ
Y29uRGF0YWJhc2VDbGllbnQgeworcHVibGljOgorICAgIHZpcnR1YWwgfkljb25EYXRhYmFzZUNs
aWVudCgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBkaWRJbXBvcnRJY29uVVJMRm9y
UGFnZVVSTChjb25zdCBTdHJpbmcmKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlkSW1wb3J0SWNv
bkRhdGFGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBkaWRD
aGFuZ2VJY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQg
ZGlkUmVtb3ZlQWxsSWNvbnMoKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZGlkRmluaXNoVVJMSW1w
b3J0KCkgeyB9CisgICAgdmlydHVhbCB2b2lkIGRpZENsb3NlKCkgeyB9Cit9OworCitjbGFzcyBJ
Y29uRGF0YWJhc2UgeworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworCitwcml2YXRlOgor
ICAgIGVudW0gSW1hZ2VEYXRhU3RhdHVzIHsKKyAgICAgICAgSW1hZ2VEYXRhU3RhdHVzUHJlc2Vu
dCwgSW1hZ2VEYXRhU3RhdHVzTWlzc2luZywgSW1hZ2VEYXRhU3RhdHVzVW5rbm93bgorICAgIH07
CisKKyAgICBjbGFzcyBJY29uU25hcHNob3QgeworICAgIHB1YmxpYzoKKyAgICAgICAgSWNvblNu
YXBzaG90KCkgPSBkZWZhdWx0OworCisgICAgICAgIEljb25TbmFwc2hvdChjb25zdCBTdHJpbmcm
IGljb25VUkwsIGludCB0aW1lc3RhbXAsIFdlYkNvcmU6OlNoYXJlZEJ1ZmZlciogZGF0YSkKKyAg
ICAgICAgICAgIDogbV9pY29uVVJMKGljb25VUkwpCisgICAgICAgICAgICAsIG1fdGltZXN0YW1w
KHRpbWVzdGFtcCkKKyAgICAgICAgICAgICwgbV9kYXRhKGRhdGEpCisgICAgICAgIHsgfQorCisg
ICAgICAgIGNvbnN0IFN0cmluZyYgaWNvblVSTCgpIGNvbnN0IHsgcmV0dXJuIG1faWNvblVSTDsg
fQorICAgICAgICBpbnQgdGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gbV90aW1lc3RhbXA7IH0K
KyAgICAgICAgV2ViQ29yZTo6U2hhcmVkQnVmZmVyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9k
YXRhLmdldCgpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBTdHJpbmcgbV9pY29uVVJMOwor
ICAgICAgICBpbnQgbV90aW1lc3RhbXAgeyAwIH07CisgICAgICAgIFJlZlB0cjxXZWJDb3JlOjpT
aGFyZWRCdWZmZXI+IG1fZGF0YTsKKyAgICB9OworCisgICAgY2xhc3MgSWNvblJlY29yZCA6IHB1
YmxpYyBSZWZDb3VudGVkPEljb25SZWNvcmQ+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRp
YyBSZWY8SWNvblJlY29yZD4gY3JlYXRlKGNvbnN0IFN0cmluZyYgdXJsKQorICAgICAgICB7Cisg
ICAgICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBJY29uUmVjb3JkKHVybCkpOworICAgICAg
ICB9CisgICAgICAgIH5JY29uUmVjb3JkKCk7CisKKyAgICAgICAgdGltZV90IGdldFRpbWVzdGFt
cCgpIHsgcmV0dXJuIG1fc3RhbXA7IH0KKyAgICAgICAgdm9pZCBzZXRUaW1lc3RhbXAodGltZV90
IHN0YW1wKSB7IG1fc3RhbXAgPSBzdGFtcDsgfQorCisgICAgICAgIHZvaWQgc2V0SW1hZ2VEYXRh
KFJlZlB0cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+JiYpOworICAgICAgICBXZWJDb3JlOjpJbWFn
ZSogaW1hZ2UoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYpOworCisgICAgICAgIFN0cmluZyBpY29u
VVJMKCkgeyByZXR1cm4gbV9pY29uVVJMOyB9CisKKyAgICAgICAgdm9pZCBsb2FkSW1hZ2VGcm9t
UmVzb3VyY2UoY29uc3QgY2hhciopOworCisgICAgICAgIGVudW0gY2xhc3MgSW1hZ2VEYXRhU3Rh
dHVzIHsgUHJlc2VudCwgTWlzc2luZywgVW5rbm93biB9OworICAgICAgICBJbWFnZURhdGFTdGF0
dXMgaW1hZ2VEYXRhU3RhdHVzKCk7CisKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+JiByZXRhaW5p
bmdQYWdlVVJMcygpIHsgcmV0dXJuIG1fcmV0YWluaW5nUGFnZVVSTHM7IH0KKworICAgICAgICBJ
Y29uU25hcHNob3Qgc25hcHNob3QoYm9vbCBmb3JEZWxldGlvbiA9IGZhbHNlKSBjb25zdDsKKwor
ICAgIHByaXZhdGU6CisgICAgICAgIEljb25SZWNvcmQoY29uc3QgU3RyaW5nJiB1cmwpOworCisg
ICAgICAgIFN0cmluZyBtX2ljb25VUkw7CisgICAgICAgIHRpbWVfdCBtX3N0YW1wIHsgMCB9Owor
ICAgICAgICBSZWZQdHI8V2ViQ29yZTo6SW1hZ2U+IG1faW1hZ2U7CisKKyAgICAgICAgSGFzaFNl
dDxTdHJpbmc+IG1fcmV0YWluaW5nUGFnZVVSTHM7CisKKyAgICAgICAgLy8gVGhpcyBhbGxvd3Mg
dXMgdG8gY2FjaGUgd2hldGhlciBvciBub3QgYSBTaXRlSWNvbiBoYXMgaGFkIGl0cyBkYXRhIHNl
dCB5ZXQKKyAgICAgICAgLy8gVGhpcyBoZWxwcyB0aGUgSWNvbkRhdGFiYXNlIGtub3cgaWYgaXQg
aGFzIHRvIHNldCB0aGUgZGF0YSBvbiBhIG5ldyBvYmplY3Qgb3Igbm90LAorICAgICAgICAvLyBh
bmQgYWxzbyB0byBkZXRlcm1pbmUgaWYgdGhlIGljb24gaXMgbWlzc2luZyBkYXRhIG9yIGlmIGl0
IGp1c3QgaGFzbid0IGJlZW4gYnJvdWdodAorICAgICAgICAvLyBpbiBmcm9tIHRoZSBEQiB5ZXQK
KyAgICAgICAgYm9vbCBtX2RhdGFTZXQgeyBmYWxzZSB9OworICAgIH07CisKKyAgICBjbGFzcyBQ
YWdlVVJMU25hcHNob3QgeworICAgIHB1YmxpYzoKKyAgICAgICAgUGFnZVVSTFNuYXBzaG90KCkg
PSBkZWZhdWx0OworCisgICAgICAgIFBhZ2VVUkxTbmFwc2hvdChjb25zdCBTdHJpbmcmIHBhZ2VV
UkwsIGNvbnN0IFN0cmluZyYgaWNvblVSTCkKKyAgICAgICAgICAgIDogbV9wYWdlVVJMKHBhZ2VV
UkwpCisgICAgICAgICAgICAsIG1faWNvblVSTChpY29uVVJMKQorICAgICAgICB7IH0KKworICAg
ICAgICBjb25zdCBTdHJpbmcmIHBhZ2VVUkwoKSBjb25zdCB7IHJldHVybiBtX3BhZ2VVUkw7IH0K
KyAgICAgICAgY29uc3QgU3RyaW5nJiBpY29uVVJMKCkgY29uc3QgeyByZXR1cm4gbV9pY29uVVJM
OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBTdHJpbmcgbV9wYWdlVVJMOworICAgICAgICBT
dHJpbmcgbV9pY29uVVJMOworICAgIH07CisKKyAgICBjbGFzcyBQYWdlVVJMUmVjb3JkIHsKKyAg
ICAgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoUGFnZVVSTFJlY29yZCk7IFdURl9NQUtFX0ZBU1Rf
QUxMT0NBVEVEOworICAgIHB1YmxpYzoKKyAgICAgICAgUGFnZVVSTFJlY29yZChjb25zdCBTdHJp
bmcmIHBhZ2VVUkwpOworICAgICAgICB+UGFnZVVSTFJlY29yZCgpOworCisgICAgICAgIGlubGlu
ZSBTdHJpbmcgdXJsKCkgY29uc3QgeyByZXR1cm4gbV9wYWdlVVJMOyB9CisKKyAgICAgICAgdm9p
ZCBzZXRJY29uUmVjb3JkKFJlZlB0cjxJY29uUmVjb3JkPiYmKTsKKyAgICAgICAgSWNvblJlY29y
ZCogaWNvblJlY29yZCgpIHsgcmV0dXJuIG1faWNvblJlY29yZC5nZXQoKTsgfQorCisgICAgICAg
IFBhZ2VVUkxTbmFwc2hvdCBzbmFwc2hvdChib29sIGZvckRlbGV0aW9uID0gZmFsc2UpIGNvbnN0
OworCisgICAgICAgIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIHBhZ2Ugd2Fzbid0IHJldGFpbmVk
IGJlZm9yZWhhbmQsIHRydWUgaWYgdGhlIHJldGFpbiBjb3VudCB3YXMgYWxyZWFkeSAxIG9yIGhp
Z2hlci4KKyAgICAgICAgYm9vbCByZXRhaW4oaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAg
ICAgICBib29sIHdhc1JldGFpbmVkID0gbV9yZXRhaW5Db3VudCA+IDA7CisgICAgICAgICAgICBt
X3JldGFpbkNvdW50ICs9IGNvdW50OworICAgICAgICAgICAgcmV0dXJuIHdhc1JldGFpbmVkOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwYWdlIGlzIHN0aWxs
IHJldGFpbmVkIGFmdGVyIHRoZSBjYWxsLiBGYWxzZSBpZiB0aGUgcmV0YWluIGNvdW50IGp1c3Qg
ZHJvcHBlZCB0byAwLgorICAgICAgICBib29sIHJlbGVhc2UoaW50IGNvdW50KQorICAgICAgICB7
CisgICAgICAgICAgICBBU1NFUlQobV9yZXRhaW5Db3VudCA+PSBjb3VudCk7CisgICAgICAgICAg
ICBtX3JldGFpbkNvdW50IC09IGNvdW50OworICAgICAgICAgICAgcmV0dXJuIG1fcmV0YWluQ291
bnQgPiAwOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJldGFpbkNvdW50KCkgY29uc3QgeyBy
ZXR1cm4gbV9yZXRhaW5Db3VudDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgU3RyaW5nIG1f
cGFnZVVSTDsKKyAgICAgICAgUmVmUHRyPEljb25SZWNvcmQ+IG1faWNvblJlY29yZDsKKyAgICAg
ICAgaW50IG1fcmV0YWluQ291bnQgeyAwIH07CisgICAgfTsKKworLy8gKioqIE1haW4gVGhyZWFk
IE9ubHkgKioqCitwdWJsaWM6CisgICAgSWNvbkRhdGFiYXNlKCk7CisgICAgfkljb25EYXRhYmFz
ZSgpOworCisgICAgZW51bSBjbGFzcyBJY29uTG9hZERlY2lzaW9uIHsgWWVzLCBObywgVW5rbm93
biB9OworCisgICAgdm9pZCBzZXRDbGllbnQoc3RkOjp1bmlxdWVfcHRyPEljb25EYXRhYmFzZUNs
aWVudD4mJik7CisKKyAgICBib29sIG9wZW4oY29uc3QgU3RyaW5nJiBkaXJlY3RvcnksIGNvbnN0
IFN0cmluZyYgZmlsZW5hbWUpOworICAgIHZvaWQgY2xvc2UoKTsKKworICAgIHZvaWQgcmVtb3Zl
QWxsSWNvbnMoKTsKKworICAgIHZvaWQgcmV0YWluSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5n
Jik7CisgICAgdm9pZCByZWxlYXNlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJik7CisgICAg
dm9pZCBzZXRJY29uRGF0YUZvckljb25VUkwoUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4m
JiwgY29uc3QgU3RyaW5nJiBpY29uVVJMKTsKKyAgICB2b2lkIHNldEljb25VUkxGb3JQYWdlVVJM
KGNvbnN0IFN0cmluZyYgaWNvblVSTCwgY29uc3QgU3RyaW5nJiBwYWdlVVJMKTsKKworICAgIFdl
YkNvcmU6OkltYWdlKiBzeW5jaHJvbm91c0ljb25Gb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYsIGNv
bnN0IFdlYkNvcmU6OkludFNpemUmKTsKKyAgICBTdHJpbmcgc3luY2hyb25vdXNJY29uVVJMRm9y
UGFnZVVSTChjb25zdCBTdHJpbmcmKTsKKyAgICBib29sIHN5bmNocm9ub3VzSWNvbkRhdGFLbm93
bkZvckljb25VUkwoY29uc3QgU3RyaW5nJik7CisgICAgSWNvbkxvYWREZWNpc2lvbiBzeW5jaHJv
bm91c0xvYWREZWNpc2lvbkZvckljb25VUkwoY29uc3QgU3RyaW5nJik7CisKKyAgICB2b2lkIHNl
dEVuYWJsZWQoYm9vbCk7CisgICAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdDsKKworICAgIHZvaWQg
c2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChib29sIGZsYWcpOworICAgIGJvb2wgaXNQcml2YXRl
QnJvd3NpbmdFbmFibGVkKCkgY29uc3Q7CisKKyAgICBzdGF0aWMgdm9pZCBkZWxheURhdGFiYXNl
Q2xlYW51cCgpOworICAgIHN0YXRpYyB2b2lkIGFsbG93RGF0YWJhc2VDbGVhbnVwKCk7CisgICAg
c3RhdGljIHZvaWQgY2hlY2tJbnRlZ3JpdHlCZWZvcmVPcGVuaW5nKCk7CisKK3ByaXZhdGU6Cisg
ICAgdm9pZCB3YWtlU3luY1RocmVhZCgpOworICAgIHZvaWQgc2NoZWR1bGVPckRlZmVyU3luY1Rp
bWVyKCk7CisgICAgdm9pZCBzeW5jVGltZXJGaXJlZCgpOworCisgICAgUnVuTG9vcDo6VGltZXI8
SWNvbkRhdGFiYXNlPiBtX3N5bmNUaW1lcjsKKyAgICBSZWZQdHI8VGhyZWFkPiBtX3N5bmNUaHJl
YWQ7CisgICAgYm9vbCBtX3N5bmNUaHJlYWRSdW5uaW5nIHsgZmFsc2UgfTsKKyAgICBib29sIG1f
c2NoZWR1bGVPckRlZmVyU3luY1RpbWVyUmVxdWVzdGVkIHsgZmFsc2UgfTsKKworLy8gKioqIEFu
eSBUaHJlYWQgKioqCitwdWJsaWM6CisgICAgYm9vbCBpc09wZW4oKSBjb25zdDsKKyAgICBTdHJp
bmcgZGF0YWJhc2VQYXRoKCkgY29uc3Q7CisgICAgc3RhdGljIFN0cmluZyBkZWZhdWx0RGF0YWJh
c2VGaWxlbmFtZSgpOworCitwcml2YXRlOgorICAgIFJlZjxJY29uUmVjb3JkPiBnZXRPckNyZWF0
ZUljb25SZWNvcmQoY29uc3QgU3RyaW5nJiBpY29uVVJMKTsKKyAgICBQYWdlVVJMUmVjb3JkKiBn
ZXRPckNyZWF0ZVBhZ2VVUkxSZWNvcmQoY29uc3QgU3RyaW5nJiBwYWdlVVJMKTsKKworICAgIGJv
b2wgbV9pc0VuYWJsZWQge2ZhbHNlIH07CisgICAgYm9vbCBtX3ByaXZhdGVCcm93c2luZ0VuYWJs
ZWQgeyBmYWxzZSB9OworCisgICAgbXV0YWJsZSBMb2NrIG1fc3luY0xvY2s7CisgICAgQ29uZGl0
aW9uIG1fc3luY0NvbmRpdGlvbjsKKyAgICBTdHJpbmcgbV9kYXRhYmFzZURpcmVjdG9yeTsKKyAg
ICAvLyBIb2xkaW5nIG1fc3luY0xvY2sgaXMgcmVxdWlyZWQgd2hlbiBhY2Nlc3NpbmcgbV9jb21w
bGV0ZURhdGFiYXNlUGF0aAorICAgIFN0cmluZyBtX2NvbXBsZXRlRGF0YWJhc2VQYXRoOworCisg
ICAgYm9vbCBtX3RocmVhZFRlcm1pbmF0aW9uUmVxdWVzdGVkIHsgZmFsc2UgfTsKKyAgICBib29s
IG1fcmVtb3ZlSWNvbnNSZXF1ZXN0ZWQgeyBmYWxzZSB9OworICAgIGJvb2wgbV9pY29uVVJMSW1w
b3J0Q29tcGxldGUgeyBmYWxzZSB9OworICAgIGJvb2wgbV9zeW5jVGhyZWFkSGFzV29ya1RvRG8g
eyBmYWxzZSB9OworCisgICAgTG9jayBtX3VybEFuZEljb25Mb2NrOworICAgIC8vIEhvbGRpbmcg
bV91cmxBbmRJY29uTG9jayBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyBhbnkgb2YgdGhlIGZv
bGxvd2luZyBkYXRhIHN0cnVjdHVyZXMgb3IgdGhlIG9iamVjdHMgdGhleSBjb250YWluCisgICAg
SGFzaE1hcDxTdHJpbmcsIEljb25SZWNvcmQqPiBtX2ljb25VUkxUb1JlY29yZE1hcDsKKyAgICBI
YXNoTWFwPFN0cmluZywgUGFnZVVSTFJlY29yZCo+IG1fcGFnZVVSTFRvUmVjb3JkTWFwOworICAg
IEhhc2hTZXQ8U3RyaW5nPiBtX3JldGFpbmVkUGFnZVVSTHM7CisKKyAgICBMb2NrIG1fcGVuZGlu
Z1N5bmNMb2NrOworICAgIC8vIEhvbGRpbmcgbV9wZW5kaW5nU3luY0xvY2sgaXMgcmVxdWlyZWQg
d2hlbiBhY2Nlc3NpbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmVzCisgICAg
SGFzaE1hcDxTdHJpbmcsIFBhZ2VVUkxTbmFwc2hvdD4gbV9wYWdlVVJMc1BlbmRpbmdTeW5jOwor
ICAgIEhhc2hNYXA8U3RyaW5nLCBJY29uU25hcHNob3Q+IG1faWNvbnNQZW5kaW5nU3luYzsKKwor
ICAgIExvY2sgbV9wZW5kaW5nUmVhZGluZ0xvY2s7CisgICAgLy8gSG9sZGluZyBtX3BlbmRpbmdT
eW5jTG9jayBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyBhbnkgb2YgdGhlIGZvbGxvd2luZyBk
YXRhIHN0cnVjdHVyZXMgLSB3aGVuIGRlYWxpbmcgd2l0aCBJY29uUmVjb3JkKnMsIGhvbGRpbmcg
bV91cmxBbmRJY29uTG9jayBpcyBhbHNvIHJlcXVpcmVkCisgICAgSGFzaFNldDxTdHJpbmc+IG1f
cGFnZVVSTHNQZW5kaW5nSW1wb3J0OworICAgIEhhc2hTZXQ8U3RyaW5nPiBtX3BhZ2VVUkxzSW50
ZXJlc3RlZEluSWNvbnM7CisgICAgSGFzaFNldDxJY29uUmVjb3JkKj4gbV9pY29uc1BlbmRpbmdS
ZWFkaW5nOworCisgICAgTG9jayBtX3VybHNUb1JldGFpbk9yUmVsZWFzZUxvY2s7CisgICAgLy8g
SG9sZGluZyBtX3VybHNUb1JldGFpbk9yUmVsZWFzZUxvY2sgaXMgcmVxdWlyZWQgd2hlbiBhY2Nl
c3NpbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcgZGF0YSBzdHJ1Y3R1cmVzLgorICAgIEhhc2hDb3Vu
dGVkU2V0PFN0cmluZz4gbV91cmxzVG9SZXRhaW47CisgICAgSGFzaENvdW50ZWRTZXQ8U3RyaW5n
PiBtX3VybHNUb1JlbGVhc2U7CisgICAgYm9vbCBtX3JldGFpbk9yUmVsZWFzZUljb25SZXF1ZXN0
ZWQgeyBmYWxzZSB9OworCisvLyAqKiogU3luYyBUaHJlYWQgT25seSAqKioKK3B1YmxpYzoKKyAg
ICBib29sIHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpIGNvbnN0OworCitwcml2YXRlOgorICAg
IHZvaWQgaWNvbkRhdGFiYXNlU3luY1RocmVhZCgpOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBi
bG9jayBvZiBtZXRob2RzIGFyZSBjYWxsZWQgZXhjbHVzaXZlbHkgYnkgdGhlIHN5bmMgdGhyZWFk
IHRvIG1hbmFnZSBpL28gdG8gYW5kIGZyb20gdGhlIGRhdGFiYXNlCisgICAgLy8gRWFjaCBtZXRo
b2Qgc2hvdWxkIHBlcmlvZGljYWxseSBtb25pdG9yIG1fdGhyZWFkVGVybWluYXRpb25SZXF1ZXN0
ZWQgd2hlbiBpdCBtYWtlcyBzZW5zZSB0byByZXR1cm4gZWFybHkgb24gc2h1dGRvd24KKyAgICB2
b2lkIHBlcmZvcm1PcGVuSW5pdGlhbGl6YXRpb24oKTsKKyAgICBib29sIGNoZWNrSW50ZWdyaXR5
KCk7CisgICAgdm9pZCBwZXJmb3JtVVJMSW1wb3J0KCk7CisgICAgdm9pZCBzeW5jVGhyZWFkTWFp
bkxvb3AoKTsKKyAgICBib29sIHJlYWRGcm9tRGF0YWJhc2UoKTsKKyAgICBib29sIHdyaXRlVG9E
YXRhYmFzZSgpOworICAgIHZvaWQgcHJ1bmVVbnJldGFpbmVkSWNvbnMoKTsKKyAgICB2b2lkIGNo
ZWNrRm9yRGFuZ2xpbmdQYWdlVVJMcyhib29sIHBydW5lSWZGb3VuZCk7CisgICAgdm9pZCByZW1v
dmVBbGxJY29uc09uVGhyZWFkKCk7CisgICAgdm9pZCBkZWxldGVBbGxQcmVwYXJlZFN0YXRlbWVu
dHMoKTsKKyAgICB2b2lkKiBjbGVhbnVwU3luY1RocmVhZCgpOworICAgIHZvaWQgcGVyZm9ybVJl
dGFpbkljb25Gb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYsIGludCByZXRhaW5Db3VudCk7CisgICAg
dm9pZCBwZXJmb3JtUmVsZWFzZUljb25Gb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYsIGludCByZWxl
YXNlQ291bnQpOworCisgICAgYm9vbCBpc09wZW5CZXNpZGVzTWFpblRocmVhZENhbGxiYWNrcygp
IGNvbnN0OworICAgIHZvaWQgY2hlY2tDbG9zZWRBZnRlck1haW5UaHJlYWRDYWxsYmFjaygpOwor
CisgICAgYm9vbCBtX2luaXRpYWxQcnVuaW5nQ29tcGxldGUgeyBmYWxzZSB9OworCisgICAgdm9p
ZCBzZXRJY29uVVJMRm9yUGFnZVVSTEluU1FMRGF0YWJhc2UoY29uc3QgU3RyaW5nJiwgY29uc3Qg
U3RyaW5nJik7CisgICAgdm9pZCBzZXRJY29uSURGb3JQYWdlVVJMSW5TUUxEYXRhYmFzZShpbnQ2
NF90LCBjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIHJlbW92ZVBhZ2VVUkxGcm9tU1FMRGF0YWJh
c2UoY29uc3QgU3RyaW5nJiBwYWdlVVJMKTsKKyAgICBpbnQ2NF90IGdldEljb25JREZvckljb25V
UkxGcm9tU1FMRGF0YWJhc2UoY29uc3QgU3RyaW5nJiBpY29uVVJMKTsKKyAgICBpbnQ2NF90IGFk
ZEljb25VUkxUb1NRTERhdGFiYXNlKGNvbnN0IFN0cmluZyYpOworICAgIFJlZlB0cjxXZWJDb3Jl
OjpTaGFyZWRCdWZmZXI+IGdldEltYWdlRGF0YUZvckljb25VUkxGcm9tU1FMRGF0YWJhc2UoY29u
c3QgU3RyaW5nJiBpY29uVVJMKTsKKyAgICB2b2lkIHJlbW92ZUljb25Gcm9tU1FMRGF0YWJhc2Uo
Y29uc3QgU3RyaW5nJiBpY29uVVJMKTsKKyAgICB2b2lkIHdyaXRlSWNvblNuYXBzaG90VG9TUUxE
YXRhYmFzZShjb25zdCBJY29uU25hcHNob3QmKTsKKworICAgIHZvaWQgcGVyZm9ybVBlbmRpbmdS
ZXRhaW5BbmRSZWxlYXNlT3BlcmF0aW9ucygpOworCisgICAgLy8gTWV0aG9kcyB0byBkaXNwYXRj
aCBjbGllbnQgY2FsbGJhY2tzIG9uIHRoZSBtYWluIHRocmVhZAorICAgIHZvaWQgZGlzcGF0Y2hE
aWRJbXBvcnRJY29uVVJMRm9yUGFnZVVSTE9uTWFpblRocmVhZChjb25zdCBTdHJpbmcmKTsKKyAg
ICB2b2lkIGRpc3BhdGNoRGlkSW1wb3J0SWNvbkRhdGFGb3JQYWdlVVJMT25NYWluVGhyZWFkKGNv
bnN0IFN0cmluZyYpOworICAgIHZvaWQgZGlzcGF0Y2hEaWRSZW1vdmVBbGxJY29uc09uTWFpblRo
cmVhZCgpOworICAgIHZvaWQgZGlzcGF0Y2hEaWRGaW5pc2hVUkxJbXBvcnRPbk1haW5UaHJlYWQo
KTsKKyAgICBzdGQ6OmF0b21pYzx1aW50MzJfdD4gbV9tYWluVGhyZWFkQ2FsbGJhY2tDb3VudDsK
KworICAgIC8vIFRoZSBjbGllbnQgaXMgc2V0IGJ5IHRoZSBtYWluIHRocmVhZCBiZWZvcmUgdGhl
IHRocmVhZCBzdGFydHMsIGFuZCBmcm9tIHRoZW4gb24gaXMgb25seSB1c2VkIGJ5IHRoZSBzeW5j
IHRocmVhZAorICAgIHN0ZDo6dW5pcXVlX3B0cjxJY29uRGF0YWJhc2VDbGllbnQ+IG1fY2xpZW50
OworCisgICAgV2ViQ29yZTo6U1FMaXRlRGF0YWJhc2UgbV9zeW5jREI7CisKKyAgICBzdGQ6OnVu
aXF1ZV9wdHI8V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX3NldEljb25JREZvclBhZ2VVUkxT
dGF0ZW1lbnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4g
bV9yZW1vdmVQYWdlVVJMU3RhdGVtZW50OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpT
UUxpdGVTdGF0ZW1lbnQ+IG1fZ2V0SWNvbklERm9ySWNvblVSTFN0YXRlbWVudDsKKyAgICBzdGQ6
OnVuaXF1ZV9wdHI8V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX2dldEltYWdlRGF0YUZvcklj
b25VUkxTdGF0ZW1lbnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRl
bWVudD4gbV9hZGRJY29uVG9JY29uSW5mb1N0YXRlbWVudDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8
V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX2FkZEljb25Ub0ljb25EYXRhU3RhdGVtZW50Owor
ICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1fZ2V0SW1hZ2VE
YXRhU3RhdGVtZW50OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1l
bnQ+IG1fZGVsZXRlUGFnZVVSTHNGb3JJY29uVVJMU3RhdGVtZW50OworICAgIHN0ZDo6dW5pcXVl
X3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1fZGVsZXRlSWNvbkZyb21JY29uSW5mb1N0
YXRlbWVudDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBt
X2RlbGV0ZUljb25Gcm9tSWNvbkRhdGFTdGF0ZW1lbnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdl
YkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV91cGRhdGVJY29uSW5mb1N0YXRlbWVudDsKKyAgICBz
dGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX3VwZGF0ZUljb25EYXRh
U3RhdGVtZW50OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+
IG1fc2V0SWNvbkluZm9TdGF0ZW1lbnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlNR
TGl0ZVN0YXRlbWVudD4gbV9zZXRJY29uRGF0YVN0YXRlbWVudDsKK307CisKK30gLy8gbmFtZXNw
YWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9nbGli
L1dlYktpdEZhdmljb25EYXRhYmFzZS5jcHAgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L2dsaWIvV2ViS2l0RmF2aWNvbkRhdGFiYXNlLmNwcAppbmRleCAwMTBhN2MyMTVjYi4uOGFhY2Vl
ZmIwYWYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJL
aXRGYXZpY29uRGF0YWJhc2UuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkv
Z2xpYi9XZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwCkBAIC0yMCw3ICsyMCw5IEBACiAjaW5jbHVk
ZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiV2ViS2l0RmF2aWNvbkRhdGFiYXNlLmgiCiAKKyNpbmNs
dWRlICJJY29uRGF0YWJhc2UuaCIKICNpbmNsdWRlICJXZWJLaXRGYXZpY29uRGF0YWJhc2VQcml2
YXRlLmgiCisjaW5jbHVkZSAiV2ViUHJlZmVyZW5jZXMuaCIKICNpbmNsdWRlIDxXZWJDb3JlL0Zp
bGVTeXN0ZW0uaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ltYWdlLmg+CiAjaW5jbHVkZSA8V2ViQ29y
ZS9JbnRTaXplLmg+CkBAIC03Myw5ICs3NSwxMSBAQCBzdHJ1Y3QgX1dlYktpdEZhdmljb25EYXRh
YmFzZVByaXZhdGUgewogICAgICAgICBpY29uRGF0YWJhc2UtPnNldENsaWVudChudWxscHRyKTsK
ICAgICB9CiAKLSAgICBSZWZQdHI8V2ViSWNvbkRhdGFiYXNlPiBpY29uRGF0YWJhc2U7CisgICAg
c3RkOjp1bmlxdWVfcHRyPEljb25EYXRhYmFzZT4gaWNvbkRhdGFiYXNlOworICAgIFZlY3Rvcjxz
dGQ6OnBhaXI8U3RyaW5nLCBGdW5jdGlvbjx2b2lkKGJvb2wpPj4+IHBlbmRpbmdMb2FkRGVjaXNp
b25zOwogICAgIFBlbmRpbmdJY29uUmVxdWVzdE1hcCBwZW5kaW5nSWNvblJlcXVlc3RzOwogICAg
IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHBhZ2VVUkxUb0ljb25VUkxNYXA7CisgICAgYm9vbCBp
c1VSTEltcG9ydENvbXBsZXRlZDsKIH07CiAKIFdFQktJVF9ERUZJTkVfVFlQRShXZWJLaXRGYXZp
Y29uRGF0YWJhc2UsIHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlLCBHX1RZUEVfT0JKRUNUKQpAQCAt
MTQxLDcgKzE0NSw3IEBAIHN0YXRpYyBSZWZQdHI8Y2Fpcm9fc3VyZmFjZV90PiBnZXRJY29uU3Vy
ZmFjZVN5bmNocm9ub3VzbHkoV2ViS2l0RmF2aWNvbkRhdGFiYXNlCiAKICAgICAvLyBUaGUgZXhh
Y3Qgc2l6ZSB3ZSBwYXNzIGlzIGlycmVsZXZhbnQgdG8gdGhlIGljb25EYXRhYmFzZSBjb2RlLgog
ICAgIC8vIFdlIG11c3QgcGFzcyBzb21ldGhpbmcgZ3JlYXRlciB0aGFuIDB4MCB0byBnZXQgYW4g
aWNvbi4KLSAgICBXZWJDb3JlOjpJbWFnZSogaWNvbkltYWdlID0gZGF0YWJhc2UtPnByaXYtPmlj
b25EYXRhYmFzZS0+aW1hZ2VGb3JQYWdlVVJMKHBhZ2VVUkwsIFdlYkNvcmU6OkludFNpemUoMSwg
MSkpOworICAgIFdlYkNvcmU6OkltYWdlKiBpY29uSW1hZ2UgPSBkYXRhYmFzZS0+cHJpdi0+aWNv
bkRhdGFiYXNlLT5zeW5jaHJvbm91c0ljb25Gb3JQYWdlVVJMKHBhZ2VVUkwsIFdlYkNvcmU6Oklu
dFNpemUoMSwgMSkpOwogICAgIGlmICghaWNvbkltYWdlKSB7CiAgICAgICAgIGdfc2V0X2Vycm9y
KGVycm9yLCBXRUJLSVRfRkFWSUNPTl9EQVRBQkFTRV9FUlJPUiwgV0VCS0lUX0ZBVklDT05fREFU
QUJBU0VfRVJST1JfRkFWSUNPTl9VTktOT1dOLCBfKCJVbmtub3duIGZhdmljb24gZm9yIHBhZ2Ug
JXMiKSwgcGFnZVVSTC51dGY4KCkuZGF0YSgpKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBA
IC0xODUsNyArMTg5LDIxIEBAIHN0YXRpYyB2b2lkIHByb2Nlc3NQZW5kaW5nSWNvbnNGb3JQYWdl
VVJMKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0CiAgICAgZGVsZXRlUGVu
ZGluZ0ljb25SZXF1ZXN0cyhkYXRhYmFzZSwgcGVuZGluZ0ljb25SZXF1ZXN0cywgcGFnZVVSTCk7
CiB9CiAKLWNsYXNzIFdlYktpdEljb25EYXRhYmFzZUNsaWVudCBmaW5hbCA6IHB1YmxpYyBBUEk6
Okljb25EYXRhYmFzZUNsaWVudCB7CitzdGF0aWMgdm9pZCB3ZWJraXRGYXZpY29uRGF0YWJhc2VT
ZXRJY29uVVJMRm9yUGFnZVVSTChXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFiYXNlLCBjb25z
dCBTdHJpbmcmIGljb25VUkwsIGNvbnN0IFN0cmluZyYgcGFnZVVSTCkKK3sKKyAgICBXZWJLaXRG
YXZpY29uRGF0YWJhc2VQcml2YXRlKiBwcml2ID0gZGF0YWJhc2UtPnByaXY7CisgICAgaWYgKCFw
cml2LT5pc1VSTEltcG9ydENvbXBsZXRlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3Qg
U3RyaW5nJiBjdXJyZW50SWNvblVSTCA9IHByaXYtPnBhZ2VVUkxUb0ljb25VUkxNYXAuZ2V0KHBh
Z2VVUkwpOworICAgIGlmIChpY29uVVJMID09IGN1cnJlbnRJY29uVVJMKQorICAgICAgICByZXR1
cm47CisKKyAgICBwcml2LT5wYWdlVVJMVG9JY29uVVJMTWFwLnNldChwYWdlVVJMLCBpY29uVVJM
KTsKKyAgICBnX3NpZ25hbF9lbWl0KGRhdGFiYXNlLCBzaWduYWxzW0ZBVklDT05fQ0hBTkdFRF0s
IDAsIHBhZ2VVUkwudXRmOCgpLmRhdGEoKSwgaWNvblVSTC51dGY4KCkuZGF0YSgpKTsKK30KKwor
Y2xhc3MgV2ViS2l0SWNvbkRhdGFiYXNlQ2xpZW50IGZpbmFsIDogcHVibGljIEljb25EYXRhYmFz
ZUNsaWVudCB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgV2ViS2l0SWNvbkRhdGFiYXNlQ2xpZW50
KFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UpCiAgICAgICAgIDogbV9kYXRhYmFzZShk
YXRhYmFzZSkKQEAgLTE5Myw0MSArMjExLDExMiBAQCBwdWJsaWM6CiAgICAgfQogCiBwcml2YXRl
OgotICAgIHZvaWQgZGlkQ2hhbmdlSWNvbkZvclBhZ2VVUkwoV2ViSWNvbkRhdGFiYXNlJiwgY29u
c3QgU3RyaW5nJiBwYWdlVVJMKSBvdmVycmlkZQorICAgIHZvaWQgZGlkSW1wb3J0SWNvblVSTEZv
clBhZ2VVUkwoY29uc3QgU3RyaW5nJiBwYWdlVVJMKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAg
U3RyaW5nIGljb25VUkwgPSBtX2RhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UtPnN5bmNocm9u
b3VzSWNvblVSTEZvclBhZ2VVUkwocGFnZVVSTCk7CisgICAgICAgIHdlYmtpdEZhdmljb25EYXRh
YmFzZVNldEljb25VUkxGb3JQYWdlVVJMKG1fZGF0YWJhc2UsIGljb25VUkwsIHBhZ2VVUkwpOwor
ICAgIH0KKworICAgIHZvaWQgZGlkQ2hhbmdlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJiBw
YWdlVVJMKSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgaWYgKCFtX2RhdGFiYXNlLT5wcml2LT5p
Y29uRGF0YWJhc2UtPmlzVXJsSW1wb3J0Q29tcGxldGVkKCkpCi0gICAgICAgICAgICByZXR1cm47
Ci0KLSAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGVyZSdzIGFuIGljb24gcmVjb3JkIGluIHRoZSBk
YXRhYmFzZSBmb3IgdGhpcyBwYWdlIFVSTC4KLSAgICAgICAgV2ViQ29yZTo6SW1hZ2UqIGljb25J
bWFnZSA9IG1fZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFzZS0+aW1hZ2VGb3JQYWdlVVJMKHBh
Z2VVUkwsIFdlYkNvcmU6OkludFNpemUoMSwgMSkpOwotICAgICAgICBpZiAoIWljb25JbWFnZSB8
fCBpY29uSW1hZ2UtPmlzTnVsbCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIFN0
cmluZyBjdXJyZW50SWNvblVSTDsKLSAgICAgICAgbV9kYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFi
YXNlLT5zeW5jaHJvbm91c0ljb25VUkxGb3JQYWdlVVJMKHBhZ2VVUkwsIGN1cnJlbnRJY29uVVJM
KTsKLSAgICAgICAgY29uc3QgU3RyaW5nJiBpY29uVVJMID0gbV9kYXRhYmFzZS0+cHJpdi0+cGFn
ZVVSTFRvSWNvblVSTE1hcC5nZXQocGFnZVVSTCk7Ci0gICAgICAgIGlmIChpY29uVVJMID09IGN1
cnJlbnRJY29uVVJMKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIG1fZGF0YWJhc2Ut
PnByaXYtPnBhZ2VVUkxUb0ljb25VUkxNYXAuc2V0KHBhZ2VVUkwsIGN1cnJlbnRJY29uVVJMKTsK
LSAgICAgICAgZ19zaWduYWxfZW1pdChtX2RhdGFiYXNlLCBzaWduYWxzW0ZBVklDT05fQ0hBTkdF
RF0sIDAsIHBhZ2VVUkwudXRmOCgpLmRhdGEoKSwgY3VycmVudEljb25VUkwudXRmOCgpLmRhdGEo
KSk7CisgICAgICAgIFN0cmluZyBpY29uVVJMID0gbV9kYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFi
YXNlLT5zeW5jaHJvbm91c0ljb25VUkxGb3JQYWdlVVJMKHBhZ2VVUkwpOworICAgICAgICB3ZWJr
aXRGYXZpY29uRGF0YWJhc2VTZXRJY29uVVJMRm9yUGFnZVVSTChtX2RhdGFiYXNlLCBpY29uVVJM
LCBwYWdlVVJMKTsKICAgICB9CiAKLSAgICB2b2lkIGljb25EYXRhUmVhZHlGb3JQYWdlVVJMKFdl
Ykljb25EYXRhYmFzZSYsIGNvbnN0IFN0cmluZyYgcGFnZVVSTCkgb3ZlcnJpZGUKKyAgICB2b2lk
IGRpZEltcG9ydEljb25EYXRhRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIHBhZ2VVUkwpIG92ZXJy
aWRlCiAgICAgewotICAgICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwogICAgICAgICBw
cm9jZXNzUGVuZGluZ0ljb25zRm9yUGFnZVVSTChtX2RhdGFiYXNlLCBwYWdlVVJMKTsKKyAgICAg
ICAgU3RyaW5nIGljb25VUkwgPSBtX2RhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UtPnN5bmNo
cm9ub3VzSWNvblVSTEZvclBhZ2VVUkwocGFnZVVSTCk7CisgICAgICAgIHdlYmtpdEZhdmljb25E
YXRhYmFzZVNldEljb25VUkxGb3JQYWdlVVJMKG1fZGF0YWJhc2UsIGljb25VUkwsIHBhZ2VVUkwp
OworICAgIH0KKworICAgIHZvaWQgZGlkRmluaXNoVVJMSW1wb3J0KCkgb3ZlcnJpZGUKKyAgICB7
CisgICAgICAgIFdlYktpdEZhdmljb25EYXRhYmFzZVByaXZhdGUqIHByaXYgPSBtX2RhdGFiYXNl
LT5wcml2OworCisgICAgICAgIHdoaWxlICghcHJpdi0+cGVuZGluZ0xvYWREZWNpc2lvbnMuaXNF
bXB0eSgpKSB7CisgICAgICAgICAgICBhdXRvIGljb25VUkxBbmRDYWxsYmFjayA9IHByaXYtPnBl
bmRpbmdMb2FkRGVjaXNpb25zLnRha2VMYXN0KCk7CisgICAgICAgICAgICBhdXRvIGRlY2lzaW9u
ID0gcHJpdi0+aWNvbkRhdGFiYXNlLT5zeW5jaHJvbm91c0xvYWREZWNpc2lvbkZvckljb25VUkwo
aWNvblVSTEFuZENhbGxiYWNrLmZpcnN0KTsKKyAgICAgICAgICAgIC8vIERlY2lzaW9ucyBzaG91
bGQgbmV2ZXIgYmUgdW5rbm93biBhZnRlciB0aGUgaW5pdGFsIGltcG9ydCBpcyBjb21wbGV0ZS4K
KyAgICAgICAgICAgIEFTU0VSVChkZWNpc2lvbiAhPSBJY29uRGF0YWJhc2U6Okljb25Mb2FkRGVj
aXNpb246OlVua25vd24pOworICAgICAgICAgICAgaWNvblVSTEFuZENhbGxiYWNrLnNlY29uZChk
ZWNpc2lvbiA9PSBJY29uRGF0YWJhc2U6Okljb25Mb2FkRGVjaXNpb246Olllcyk7CisgICAgICAg
IH0KKworICAgICAgICBwcml2LT5pc1VSTEltcG9ydENvbXBsZXRlZCA9IHRydWU7CiAgICAgfQog
CiAgICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBtX2RhdGFiYXNlOwogfTsKIAotV2ViS2l0RmF2
aWNvbkRhdGFiYXNlKiB3ZWJraXRGYXZpY29uRGF0YWJhc2VDcmVhdGUoV2ViSWNvbkRhdGFiYXNl
KiBpY29uRGF0YWJhc2UpCitXZWJLaXRGYXZpY29uRGF0YWJhc2UqIHdlYmtpdEZhdmljb25EYXRh
YmFzZUNyZWF0ZSgpCit7CisgICAgcmV0dXJuIFdFQktJVF9GQVZJQ09OX0RBVEFCQVNFKGdfb2Jq
ZWN0X25ldyhXRUJLSVRfVFlQRV9GQVZJQ09OX0RBVEFCQVNFLCBudWxscHRyKSk7Cit9CisKK3Zv
aWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlT3BlbihXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFi
YXNlLCBjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgaWYgKHdlYmtpdEZhdmljb25EYXRhYmFz
ZUlzT3BlbihkYXRhYmFzZSkpCisgICAgICAgIHJldHVybjsKKworICAgIFdlYktpdEZhdmljb25E
YXRhYmFzZVByaXZhdGUqIHByaXYgPSBkYXRhYmFzZS0+cHJpdjsKKyAgICBwcml2LT5pY29uRGF0
YWJhc2UgPSBzdGQ6Om1ha2VfdW5pcXVlPEljb25EYXRhYmFzZT4oKTsKKyAgICBwcml2LT5pY29u
RGF0YWJhc2UtPnNldENsaWVudChzdGQ6Om1ha2VfdW5pcXVlPFdlYktpdEljb25EYXRhYmFzZUNs
aWVudD4oZGF0YWJhc2UpKTsKKyAgICBJY29uRGF0YWJhc2U6OmRlbGF5RGF0YWJhc2VDbGVhbnVw
KCk7CisgICAgcHJpdi0+aWNvbkRhdGFiYXNlLT5zZXRFbmFibGVkKHRydWUpOworICAgIHByaXYt
Pmljb25EYXRhYmFzZS0+c2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChXZWJQcmVmZXJlbmNlczo6
YW55UGFnZXNBcmVVc2luZ1ByaXZhdGVCcm93c2luZygpKTsKKworICAgIGlmICghcHJpdi0+aWNv
bkRhdGFiYXNlLT5vcGVuKFdlYkNvcmU6OmRpcmVjdG9yeU5hbWUocGF0aCksIFdlYkNvcmU6OnBh
dGhHZXRGaWxlTmFtZShwYXRoKSkpIHsKKyAgICAgICAgcHJpdi0+aWNvbkRhdGFiYXNlID0gbnVs
bHB0cjsKKyAgICAgICAgSWNvbkRhdGFiYXNlOjphbGxvd0RhdGFiYXNlQ2xlYW51cCgpOworICAg
IH0KK30KKworYm9vbCB3ZWJraXRGYXZpY29uRGF0YWJhc2VJc09wZW4oV2ViS2l0RmF2aWNvbkRh
dGFiYXNlKiBkYXRhYmFzZSkKK3sKKyAgICByZXR1cm4gZGF0YWJhc2UtPnByaXYtPmljb25EYXRh
YmFzZSAmJiBkYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNlLT5pc09wZW4oKTsKK30KKwordm9p
ZCB3ZWJraXRGYXZpY29uRGF0YWJhc2VTZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKFdlYktpdEZh
dmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZGF0YWJh
c2UtPnByaXYtPmljb25EYXRhYmFzZSkKKyAgICAgICAgZGF0YWJhc2UtPnByaXYtPmljb25EYXRh
YmFzZS0+c2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChlbmFibGVkKTsKK30KKwordm9pZCB3ZWJr
aXRGYXZpY29uRGF0YWJhc2VHZXRMb2FkRGVjaXNpb25Gb3JJY29uKFdlYktpdEZhdmljb25EYXRh
YmFzZSogZGF0YWJhc2UsIGNvbnN0IExpbmtJY29uJiBpY29uLCBjb25zdCBTdHJpbmcmIHBhZ2VV
UkwsIEZ1bmN0aW9uPHZvaWQoYm9vbCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCit7CisgICAgaWYg
KCF3ZWJraXRGYXZpY29uRGF0YWJhc2VJc09wZW4oZGF0YWJhc2UpKSB7CisgICAgICAgIGNvbXBs
ZXRpb25IYW5kbGVyKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFdlYktp
dEZhdmljb25EYXRhYmFzZVByaXZhdGUqIHByaXYgPSBkYXRhYmFzZS0+cHJpdjsKKyAgICBhdXRv
IGRlY2lzaW9uID0gcHJpdi0+aWNvbkRhdGFiYXNlLT5zeW5jaHJvbm91c0xvYWREZWNpc2lvbkZv
ckljb25VUkwoaWNvbi51cmwuc3RyaW5nKCkpOworICAgIHN3aXRjaCAoZGVjaXNpb24pIHsKKyAg
ICBjYXNlIEljb25EYXRhYmFzZTo6SWNvbkxvYWREZWNpc2lvbjo6VW5rbm93bjoKKyAgICAgICAg
cHJpdi0+cGVuZGluZ0xvYWREZWNpc2lvbnMuYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKGljb24udXJs
LnN0cmluZygpLCBXVEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKSkpOworICAgICAgICBwcml2LT5p
Y29uRGF0YWJhc2UtPnNldEljb25VUkxGb3JQYWdlVVJMKGljb24udXJsLnN0cmluZygpLCBwYWdl
VVJMKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJY29uRGF0YWJhc2U6Okljb25Mb2FkRGVj
aXNpb246Ok5vOgorICAgICAgICBwcml2LT5pY29uRGF0YWJhc2UtPnNldEljb25VUkxGb3JQYWdl
VVJMKGljb24udXJsLnN0cmluZygpLCBwYWdlVVJMKTsKKyAgICAgICAgY29tcGxldGlvbkhhbmRs
ZXIoZmFsc2UpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEljb25EYXRhYmFzZTo6SWNvbkxv
YWREZWNpc2lvbjo6WWVzOgorICAgICAgICBjb21wbGV0aW9uSGFuZGxlcih0cnVlKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldEljb25G
b3JQYWdlVVJMKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0IExpbmtJY29u
JiBpY29uLCBBUEk6OkRhdGEmIGljb25EYXRhLCBjb25zdCBTdHJpbmcmIHBhZ2VVUkwpCiB7Ci0g
ICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBmYXZpY29uRGF0YWJhc2UgPSBXRUJLSVRfRkFWSUNP
Tl9EQVRBQkFTRShnX29iamVjdF9uZXcoV0VCS0lUX1RZUEVfRkFWSUNPTl9EQVRBQkFTRSwgTlVM
TCkpOwotICAgIGZhdmljb25EYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNlID0gaWNvbkRhdGFi
YXNlOwotICAgIGljb25EYXRhYmFzZS0+c2V0Q2xpZW50KHN0ZDo6bWFrZV91bmlxdWU8V2ViS2l0
SWNvbkRhdGFiYXNlQ2xpZW50PihmYXZpY29uRGF0YWJhc2UpKTsKLSAgICByZXR1cm4gZmF2aWNv
bkRhdGFiYXNlOworICAgIGlmICghd2Via2l0RmF2aWNvbkRhdGFiYXNlSXNPcGVuKGRhdGFiYXNl
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZSog
cHJpdiA9IGRhdGFiYXNlLT5wcml2OworICAgIHByaXYtPmljb25EYXRhYmFzZS0+c2V0SWNvblVS
TEZvclBhZ2VVUkwoaWNvbi51cmwuc3RyaW5nKCksIHBhZ2VVUkwpOworICAgIHByaXYtPmljb25E
YXRhYmFzZS0+c2V0SWNvbkRhdGFGb3JJY29uVVJMKFNoYXJlZEJ1ZmZlcjo6Y3JlYXRlKGljb25E
YXRhLmJ5dGVzKCksIGljb25EYXRhLnNpemUoKSksIGljb24udXJsLnN0cmluZygpKTsKKyAgICB3
ZWJraXRGYXZpY29uRGF0YWJhc2VTZXRJY29uVVJMRm9yUGFnZVVSTChkYXRhYmFzZSwgaWNvbi51
cmwuc3RyaW5nKCksIHBhZ2VVUkwpOworICAgIGdfc2lnbmFsX2VtaXQoZGF0YWJhc2UsIHNpZ25h
bHNbRkFWSUNPTl9DSEFOR0VEXSwgMCwgcGFnZVVSTC51dGY4KCkuZGF0YSgpLCBpY29uLnVybC5z
dHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICBwcm9jZXNzUGVuZGluZ0ljb25zRm9yUGFnZVVS
TChkYXRhYmFzZSwgcGFnZVVSTCk7CiB9CiAKIHN0YXRpYyBQZW5kaW5nSWNvblJlcXVlc3RWZWN0
b3IqIGdldE9yQ3JlYXRlUGVuZGluZ0ljb25SZXF1ZXN0cyhXZWJLaXRGYXZpY29uRGF0YWJhc2Uq
IGRhdGFiYXNlLCBjb25zdCBTdHJpbmcmIHBhZ2VVUkwpCkBAIC0yNzQsOSArMzYzLDcgQEAgdm9p
ZCB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbihXZWJLaXRGYXZpY29uRGF0YWJh
c2UqIGRhdGFiYXNlLCBjb25zdAogICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0lTX0ZBVklD
T05fREFUQUJBU0UoZGF0YWJhc2UpKTsKICAgICBnX3JldHVybl9pZl9mYWlsKHBhZ2VVUkkpOwog
Ci0gICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZSogcHJpdiA9IGRhdGFiYXNlLT5wcml2
OwotICAgIFdlYkljb25EYXRhYmFzZSogaWNvbkRhdGFiYXNlSW1wbCA9IHByaXYtPmljb25EYXRh
YmFzZS5nZXQoKTsKLSAgICBpZiAoIWljb25EYXRhYmFzZUltcGwtPmlzT3BlbigpKSB7CisgICAg
aWYgKCF3ZWJraXRGYXZpY29uRGF0YWJhc2VJc09wZW4oZGF0YWJhc2UpKSB7CiAgICAgICAgIGdf
dGFza19yZXBvcnRfbmV3X2Vycm9yKGRhdGFiYXNlLCBjYWxsYmFjaywgdXNlckRhdGEsIDAsCiAg
ICAgICAgICAgICBXRUJLSVRfRkFWSUNPTl9EQVRBQkFTRV9FUlJPUiwgV0VCS0lUX0ZBVklDT05f
REFUQUJBU0VfRVJST1JfTk9UX0lOSVRJQUxJWkVELCBfKCJGYXZpY29ucyBkYXRhYmFzZSBub3Qg
aW5pdGlhbGl6ZWQgeWV0IikpOwogICAgICAgICByZXR1cm47CkBAIC0yOTUsNiArMzgyLDcgQEAg
dm9pZCB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbihXZWJLaXRGYXZpY29uRGF0
YWJhc2UqIGRhdGFiYXNlLCBjb25zdAogICAgIGRhdGEtPnBhZ2VVUkwgPSBTdHJpbmc6OmZyb21V
VEY4KHBhZ2VVUkkpOwogICAgIGdfdGFza19zZXRfdGFza19kYXRhKHRhc2suZ2V0KCksIGRhdGEs
IHJlaW50ZXJwcmV0X2Nhc3Q8R0Rlc3Ryb3lOb3RpZnk+KGRlc3Ryb3lHZXRGYXZpY29uU3VyZmFj
ZUFzeW5jRGF0YSkpOwogCisgICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZSogcHJpdiA9
IGRhdGFiYXNlLT5wcml2OwogICAgIHByaXYtPmljb25EYXRhYmFzZS0+cmV0YWluSWNvbkZvclBh
Z2VVUkwoZGF0YS0+cGFnZVVSTCk7CiAKICAgICAvLyBXZSBhc2sgZm9yIHRoZSBpY29uIGRpcmVj
dGx5LiBJZiB3ZSBkb24ndCBnZXQgdGhlIGljb24gZGF0YSBub3csCkBAIC0zMTgsOSArNDA2LDgg
QEAgdm9pZCB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNvbihXZWJLaXRGYXZpY29u
RGF0YWJhc2UqIGRhdGFiYXNlLCBjb25zdAogICAgIC8vIG9yIGl0J3Mgc3RpbGwgbm90IHJlZ2lz
dGVyZWQgYnV0IHRoZSBpbXBvcnQgcHJvY2VzcyBoYXNuJ3QKICAgICAvLyBmaW5pc2hlZCB5ZXQs
IHdlIG5lZWQgdG8gd2FpdCBmb3IgaWNvbkRhdGFSZWFkeUZvclBhZ2UgdG8gYmUKICAgICAvLyBj
YWxsZWQgYmVmb3JlIG1ha2luZyBhbmQgaW5mb3JtZWQgZGVjaXNpb24uCi0gICAgU3RyaW5nIGlj
b25VUkxGb3JQYWdlVVJMOwotICAgIGljb25EYXRhYmFzZUltcGwtPnN5bmNocm9ub3VzSWNvblVS
TEZvclBhZ2VVUkwoZGF0YS0+cGFnZVVSTCwgaWNvblVSTEZvclBhZ2VVUkwpOwotICAgIGlmICgh
aWNvblVSTEZvclBhZ2VVUkwuaXNFbXB0eSgpIHx8ICFpY29uRGF0YWJhc2VJbXBsLT5pc1VybElt
cG9ydENvbXBsZXRlZCgpKSB7CisgICAgU3RyaW5nIGljb25VUkxGb3JQYWdlVVJMID0gcHJpdi0+
aWNvbkRhdGFiYXNlLT5zeW5jaHJvbm91c0ljb25VUkxGb3JQYWdlVVJMKGRhdGEtPnBhZ2VVUkwp
OworICAgIGlmICghaWNvblVSTEZvclBhZ2VVUkwuaXNFbXB0eSgpIHx8ICFwcml2LT5pc1VSTElt
cG9ydENvbXBsZXRlZCkgewogICAgICAgICBQZW5kaW5nSWNvblJlcXVlc3RWZWN0b3IqIGljb25S
ZXF1ZXN0cyA9IGdldE9yQ3JlYXRlUGVuZGluZ0ljb25SZXF1ZXN0cyhkYXRhYmFzZSwgZGF0YS0+
cGFnZVVSTCk7CiAgICAgICAgIEFTU0VSVChpY29uUmVxdWVzdHMpOwogICAgICAgICBpY29uUmVx
dWVzdHMtPmFwcGVuZCh0YXNrKTsKQEAgLTM2NywxNCArNDU0LDEzIEBAIGNhaXJvX3N1cmZhY2Vf
dCogd2Via2l0X2Zhdmljb25fZGF0YWJhc2VfZ2V0X2Zhdmljb25fZmluaXNoKFdlYktpdEZhdmlj
b25EYXRhYmFzCiAgKi8KIGdjaGFyKiB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9nZXRfZmF2aWNv
bl91cmkoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgZ2NoYXIqIHBhZ2VV
UkwpCiB7Ci0gICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0lTX0ZBVklDT05fREFUQUJB
U0UoZGF0YWJhc2UpLCAwKTsKLSAgICBnX3JldHVybl92YWxfaWZfZmFpbChwYWdlVVJMLCAwKTsK
KyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfSVNfRkFWSUNPTl9EQVRBQkFTRShkYXRh
YmFzZSksIG51bGxwdHIpOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKHBhZ2VVUkwsIG51bGxw
dHIpOwogICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7CiAKLSAgICBTdHJpbmcgaWNvblVS
TEZvclBhZ2VVUkw7Ci0gICAgZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFzZS0+c3luY2hyb25v
dXNJY29uVVJMRm9yUGFnZVVSTChTdHJpbmc6OmZyb21VVEY4KHBhZ2VVUkwpLCBpY29uVVJMRm9y
UGFnZVVSTCk7CisgICAgU3RyaW5nIGljb25VUkxGb3JQYWdlVVJMID0gZGF0YWJhc2UtPnByaXYt
Pmljb25EYXRhYmFzZS0+c3luY2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTChTdHJpbmc6OmZyb21V
VEY4KHBhZ2VVUkwpKTsKICAgICBpZiAoaWNvblVSTEZvclBhZ2VVUkwuaXNFbXB0eSgpKQotICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgICByZXR1cm4gZ19z
dHJkdXAoaWNvblVSTEZvclBhZ2VVUkwudXRmOCgpLmRhdGEoKSk7CiB9CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJp
dmF0ZS5oIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25E
YXRhYmFzZVByaXZhdGUuaAppbmRleCAwYTk5MzIxYTExYS4uM2Q4ZWFjMTQxZTAgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRGYXZpY29uRGF0YWJh
c2VQcml2YXRlLmgKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktp
dEZhdmljb25EYXRhYmFzZVByaXZhdGUuaApAQCAtMTcsMTIgKzE3LDE1IEBACiAgKiBCb3N0b24s
IE1BIDAyMTEwLTEzMDEsIFVTQS4KICAqLwogCi0jaWZuZGVmIFdlYktpdEZhdmljb25EYXRhYmFz
ZVByaXZhdGVfaAotI2RlZmluZSBXZWJLaXRGYXZpY29uRGF0YWJhc2VQcml2YXRlX2gKKyNwcmFn
bWEgb25jZQogCi0jaW5jbHVkZSAiV2ViSWNvbkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiQVBJRGF0
YS5oIgogI2luY2x1ZGUgIldlYktpdEZhdmljb25EYXRhYmFzZS5oIgorI2luY2x1ZGUgPFdlYkNv
cmUvTGlua0ljb24uaD4KIAotV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiB3ZWJraXRGYXZpY29uRGF0
YWJhc2VDcmVhdGUoV2ViS2l0OjpXZWJJY29uRGF0YWJhc2UqKTsKLQotI2VuZGlmIC8vIFdlYktp
dEZhdmljb25EYXRhYmFzZVByaXZhdGVfaAorV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiB3ZWJraXRG
YXZpY29uRGF0YWJhc2VDcmVhdGUoKTsKK3ZvaWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlT3BlbihX
ZWJLaXRGYXZpY29uRGF0YWJhc2UqLCBjb25zdCBTdHJpbmcmIHBhdGgpOworYm9vbCB3ZWJraXRG
YXZpY29uRGF0YWJhc2VJc09wZW4oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKik7Cit2b2lkIHdlYmtp
dEZhdmljb25EYXRhYmFzZVNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQoV2ViS2l0RmF2aWNvbkRh
dGFiYXNlKiwgYm9vbCk7Cit2b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZUdldExvYWREZWNpc2lv
bkZvckljb24oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiwgY29uc3QgV2ViQ29yZTo6TGlua0ljb24m
LCBjb25zdCBTdHJpbmcmLCBGdW5jdGlvbjx2b2lkKGJvb2wpPiYmKTsKK3ZvaWQgd2Via2l0RmF2
aWNvbkRhdGFiYXNlU2V0SWNvbkZvclBhZ2VVUkwoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiwgY29u
c3QgV2ViQ29yZTo6TGlua0ljb24mLCBBUEk6OkRhdGEmLCBjb25zdCBTdHJpbmcmKTsKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRJY29uTG9hZGlu
Z0NsaWVudC5jcHAgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0SWNv
bkxvYWRpbmdDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
Li45MjVjMGI4M2NmOQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9BUEkvZ2xpYi9XZWJLaXRJY29uTG9hZGluZ0NsaWVudC5jcHAKQEAgLTAsMCArMSw1OSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBJZ2FsaWEgUy5MLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiV2ViS2l0SWNvbkxvYWRpbmdDbGllbnQuaCIKKworI2luY2x1ZGUgIkFQSUlj
b25Mb2FkaW5nQ2xpZW50LmgiCisjaW5jbHVkZSAiV2ViS2l0V2ViVmlld1ByaXZhdGUuaCIKKwor
dXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKKworY2xhc3MgSWNvbkxvYWRpbmdDbGllbnQgOiBwdWJs
aWMgQVBJOjpJY29uTG9hZGluZ0NsaWVudCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSWNvbkxv
YWRpbmdDbGllbnQoV2ViS2l0V2ViVmlldyogd2ViVmlldykKKyAgICAgICAgOiBtX3dlYlZpZXco
d2ViVmlldykKKyAgICB7CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgZ2V0TG9hZERlY2lz
aW9uRm9ySWNvbihjb25zdCBXZWJDb3JlOjpMaW5rSWNvbiYgaWNvbiwgRnVuY3Rpb248dm9pZCAo
RnVuY3Rpb248dm9pZCAoQVBJOjpEYXRhKiwgQ2FsbGJhY2tCYXNlOjpFcnJvcik+JiYpPiYmIGNv
bXBsZXRpb25IYW5kbGVyKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgV2ViQ29yZTo6TGlua0lj
b24gY29waWVkSWNvbiA9IGljb247CisgICAgICAgIHdlYmtpdFdlYlZpZXdHZXRMb2FkRGVjaXNp
b25Gb3JJY29uKG1fd2ViVmlldywgaWNvbiwgW3Byb3RlY3RlZFdlYlZpZXcgPSBHUmVmUHRyPFdl
YktpdFdlYlZpZXc+KG1fd2ViVmlldyksIGljb24gPSBXVEZNb3ZlKGNvcGllZEljb24pLCBjb21w
bGV0aW9uSGFuZGxlciA9IFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpXSAoYm9vbCBsb2FkSWNv
bikgbXV0YWJsZSB7CisgICAgICAgICAgICBpZiAoIWxvYWRJY29uKSB7CisgICAgICAgICAgICAg
ICAgY29tcGxldGlvbkhhbmRsZXIobnVsbHB0cik7CisgICAgICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihbcHJvdGVjdGVk
V2ViVmlldyA9IFdURk1vdmUocHJvdGVjdGVkV2ViVmlldyksIGljb24gPSBXVEZNb3ZlKGljb24p
XSAoQVBJOjpEYXRhKiBpY29uRGF0YSwgQ2FsbGJhY2tCYXNlOjpFcnJvciBlcnJvcikgeworICAg
ICAgICAgICAgICAgIGlmIChlcnJvciAhPSBDYWxsYmFja0Jhc2U6OkVycm9yOjpOb25lIHx8ICFp
Y29uRGF0YSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIHdl
YmtpdFdlYlZpZXdTZXRJY29uKHByb3RlY3RlZFdlYlZpZXcuZ2V0KCksIGljb24sICppY29uRGF0
YSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgV2ViS2l0V2Vi
VmlldyogbV93ZWJWaWV3OworfTsKKwordm9pZCBhdHRhY2hJY29uTG9hZGluZ0NsaWVudFRvVmll
dyhXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3KQoreworICAgIHdlYmtpdFdlYlZpZXdHZXRQYWdlKHdl
YlZpZXcpLnNldEljb25Mb2FkaW5nQ2xpZW50KHN0ZDo6bWFrZV91bmlxdWU8SWNvbkxvYWRpbmdD
bGllbnQ+KHdlYlZpZXcpKTsKK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9BUEkvZ2xpYi9XZWJLaXRJY29uTG9hZGluZ0NsaWVudC5oIGIvU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL0FQSS9nbGliL1dlYktpdEljb25Mb2FkaW5nQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjNiZTM2ZjVmNTBiCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEljb25Mb2FkaW5nQ2xpZW50
LmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBJZ2FsaWEgUy5M
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxp
YnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0
aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUg
dG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLwor
CisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIldlYktpdFdlYlZpZXcuaCIKKwordm9pZCBhdHRh
Y2hJY29uTG9hZGluZ0NsaWVudFRvVmlldyhXZWJLaXRXZWJWaWV3Kik7CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViQ29udGV4dC5jcHAgYi9T
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViQ29udGV4dC5jcHAKaW5k
ZXggNTU2NzkzOTZlMDQuLjM4Yjc1YWFiZWQ3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViQ29udGV4dC5jcHAKKysrIGIvU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdlYkNvbnRleHQuY3BwCkBAIC04NDMsNyArODQz
LDcgQEAgc3RhdGljIHZvaWQgZW5zdXJlRmF2aWNvbkRhdGFiYXNlKFdlYktpdFdlYkNvbnRleHQq
IGNvbnRleHQpCiAgICAgaWYgKHByaXYtPmZhdmljb25EYXRhYmFzZSkKICAgICAgICAgcmV0dXJu
OwogCi0gICAgcHJpdi0+ZmF2aWNvbkRhdGFiYXNlID0gYWRvcHRHUmVmKHdlYmtpdEZhdmljb25E
YXRhYmFzZUNyZWF0ZShwcml2LT5wcm9jZXNzUG9vbC0+aWNvbkRhdGFiYXNlKCkpKTsKKyAgICBw
cml2LT5mYXZpY29uRGF0YWJhc2UgPSBhZG9wdEdSZWYod2Via2l0RmF2aWNvbkRhdGFiYXNlQ3Jl
YXRlKCkpOwogfQogCiBzdGF0aWMgdm9pZCB3ZWJraXRXZWJDb250ZXh0RW5hYmxlSWNvbkRhdGFi
YXNlUHJpdmF0ZUJyb3dzaW5nSWZOZWVkZWQoV2ViS2l0V2ViQ29udGV4dCogY29udGV4dCwgV2Vi
S2l0V2ViVmlldyogd2ViVmlldykKQEAgLTg1Myw4ICs4NTMsOCBAQCBzdGF0aWMgdm9pZCB3ZWJr
aXRXZWJDb250ZXh0RW5hYmxlSWNvbkRhdGFiYXNlUHJpdmF0ZUJyb3dzaW5nSWZOZWVkZWQoV2Vi
S2l0V2ViQwogICAgIGlmICghd2Via2l0X3dlYl92aWV3X2lzX2VwaGVtZXJhbCh3ZWJWaWV3KSkK
ICAgICAgICAgcmV0dXJuOwogCi0gICAgaWYgKCFjb250ZXh0LT5wcml2LT5lcGhlbWVyYWxQYWdl
Q291bnQpCi0gICAgICAgIGNvbnRleHQtPnByaXYtPnByb2Nlc3NQb29sLT5pY29uRGF0YWJhc2Uo
KS0+c2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCh0cnVlKTsKKyAgICBpZiAoIWNvbnRleHQtPnBy
aXYtPmVwaGVtZXJhbFBhZ2VDb3VudCAmJiBjb250ZXh0LT5wcml2LT5mYXZpY29uRGF0YWJhc2Up
CisgICAgICAgIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQo
Y29udGV4dC0+cHJpdi0+ZmF2aWNvbkRhdGFiYXNlLmdldCgpLCB0cnVlKTsKICAgICBjb250ZXh0
LT5wcml2LT5lcGhlbWVyYWxQYWdlQ291bnQrKzsKIH0KIApAQCAtODY3LDggKzg2Nyw4IEBAIHN0
YXRpYyB2b2lkIHdlYmtpdFdlYkNvbnRleHREaXNhYmxlSWNvbkRhdGFiYXNlUHJpdmF0ZUJyb3dz
aW5nSWZOZWVkZWQoV2ViS2l0V2ViCiAKICAgICBBU1NFUlQoY29udGV4dC0+cHJpdi0+ZXBoZW1l
cmFsUGFnZUNvdW50KTsKICAgICBjb250ZXh0LT5wcml2LT5lcGhlbWVyYWxQYWdlQ291bnQtLTsK
LSAgICBpZiAoIWNvbnRleHQtPnByaXYtPmVwaGVtZXJhbFBhZ2VDb3VudCkKLSAgICAgICAgY29u
dGV4dC0+cHJpdi0+cHJvY2Vzc1Bvb2wtPmljb25EYXRhYmFzZSgpLT5zZXRQcml2YXRlQnJvd3Np
bmdFbmFibGVkKGZhbHNlKTsKKyAgICBpZiAoIWNvbnRleHQtPnByaXYtPmVwaGVtZXJhbFBhZ2VD
b3VudCAmJiBjb250ZXh0LT5wcml2LT5mYXZpY29uRGF0YWJhc2UpCisgICAgICAgIHdlYmtpdEZh
dmljb25EYXRhYmFzZVNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQoY29udGV4dC0+cHJpdi0+ZmF2
aWNvbkRhdGFiYXNlLmdldCgpLCBmYWxzZSk7CiB9CiAKIC8qKgpAQCAtODkxLDEwICs4OTEsNiBA
QCB2b2lkIHdlYmtpdF93ZWJfY29udGV4dF9zZXRfZmF2aWNvbl9kYXRhYmFzZV9kaXJlY3Rvcnko
V2ViS2l0V2ViQ29udGV4dCogY29udGV4dAogICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0lT
X1dFQl9DT05URVhUKGNvbnRleHQpKTsKIAogICAgIFdlYktpdFdlYkNvbnRleHRQcml2YXRlKiBw
cml2ID0gY29udGV4dC0+cHJpdjsKLSAgICBXZWJJY29uRGF0YWJhc2UqIGljb25EYXRhYmFzZSA9
IHByaXYtPnByb2Nlc3NQb29sLT5pY29uRGF0YWJhc2UoKTsKLSAgICBpZiAoaWNvbkRhdGFiYXNl
LT5pc09wZW4oKSkKLSAgICAgICAgcmV0dXJuOwotCiAgICAgZW5zdXJlRmF2aWNvbkRhdGFiYXNl
KGNvbnRleHQpOwogCiAgICAgLy8gVXNlIGRlZmF1bHQgaWYgMCBpcyBwYXNzZWQgYXMgcGFyYW1l
dGVyLgpAQCAtOTA4LDEwICs5MDQsMTAgQEAgdm9pZCB3ZWJraXRfd2ViX2NvbnRleHRfc2V0X2Zh
dmljb25fZGF0YWJhc2VfZGlyZWN0b3J5KFdlYktpdFdlYkNvbnRleHQqIGNvbnRleHQKICAgICAg
ICAgV2ViQ29yZTo6SWNvbkRhdGFiYXNlOjpkZWZhdWx0RGF0YWJhc2VGaWxlbmFtZSgpLnV0Zjgo
KS5kYXRhKCksIG51bGxwdHIpKTsKIAogICAgIC8vIFNldHRpbmcgdGhlIHBhdGggd2lsbCBjYXVz
ZSB0aGUgaWNvbiBkYXRhYmFzZSB0byBiZSBvcGVuZWQuCi0gICAgcHJpdi0+cHJvY2Vzc1Bvb2wt
PnNldEljb25EYXRhYmFzZVBhdGgoV2ViQ29yZTo6c3RyaW5nRnJvbUZpbGVTeXN0ZW1SZXByZXNl
bnRhdGlvbihmYXZpY29uRGF0YWJhc2VQYXRoLmdldCgpKSk7CisgICAgd2Via2l0RmF2aWNvbkRh
dGFiYXNlT3Blbihwcml2LT5mYXZpY29uRGF0YWJhc2UuZ2V0KCksIFdlYkNvcmU6OnN0cmluZ0Zy
b21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oZmF2aWNvbkRhdGFiYXNlUGF0aC5nZXQoKSkpOwog
CiAgICAgaWYgKHdlYmtpdF93ZWJfY29udGV4dF9pc19lcGhlbWVyYWwoY29udGV4dCkpCi0gICAg
ICAgIHByaXYtPnByb2Nlc3NQb29sLT5pY29uRGF0YWJhc2UoKS0+c2V0UHJpdmF0ZUJyb3dzaW5n
RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0UHJpdmF0ZUJy
b3dzaW5nRW5hYmxlZChwcml2LT5mYXZpY29uRGF0YWJhc2UuZ2V0KCksIHRydWUpOwogfQogCiAv
KioKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRX
ZWJWaWV3LmNwcCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRXZWJW
aWV3LmNwcAppbmRleCAwY2EyM2QzOGFmZC4uN2I5MzgyZGRmN2UgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRXZWJWaWV3LmNwcAorKysgYi9Tb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViVmlldy5jcHAKQEAgLTQwLDYg
KzQwLDcgQEAKICNpbmNsdWRlICJXZWJLaXRGYXZpY29uRGF0YWJhc2VQcml2YXRlLmgiCiAjaW5j
bHVkZSAiV2ViS2l0Rm9ybUNsaWVudC5oIgogI2luY2x1ZGUgIldlYktpdEhpdFRlc3RSZXN1bHRQ
cml2YXRlLmgiCisjaW5jbHVkZSAiV2ViS2l0SWNvbkxvYWRpbmdDbGllbnQuaCIKICNpbmNsdWRl
ICJXZWJLaXRJbnN0YWxsTWlzc2luZ01lZGlhUGx1Z2luc1Blcm1pc3Npb25SZXF1ZXN0UHJpdmF0
ZS5oIgogI2luY2x1ZGUgIldlYktpdEphdmFzY3JpcHRSZXN1bHRQcml2YXRlLmgiCiAjaW5jbHVk
ZSAiV2ViS2l0TG9hZGVyQ2xpZW50LmgiCkBAIC02MzYsNiArNjM3LDcgQEAgc3RhdGljIHZvaWQg
d2Via2l0V2ViVmlld0NvbnN0cnVjdGVkKEdPYmplY3QqIG9iamVjdCkKICAgICBhdHRhY2hQb2xp
Y3lDbGllbnRUb1ZpZXcod2ViVmlldyk7CiAgICAgYXR0YWNoQ29udGV4dE1lbnVDbGllbnRUb1Zp
ZXcod2ViVmlldyk7CiAgICAgYXR0YWNoRm9ybUNsaWVudFRvVmlldyh3ZWJWaWV3KTsKKyAgICBh
dHRhY2hJY29uTG9hZGluZ0NsaWVudFRvVmlldyh3ZWJWaWV3KTsKIAogI2lmIFBMQVRGT1JNKFdQ
RSkKICAgICBwcml2LT52aWV3LT5zZXRDbGllbnQoc3RkOjptYWtlX3VuaXF1ZTxXZWJWaWV3Q2xp
ZW50Pih3ZWJWaWV3KSk7CkBAIC0xOTQ3LDYgKzE5NDksMTggQEAgdm9pZCB3ZWJraXRXZWJWaWV3
TG9hZEZhaWxlZFdpdGhUTFNFcnJvcnMoV2ViS2l0V2ViVmlldyogd2ViVmlldywgY29uc3QgY2hh
ciogZmEKICAgICBnX3NpZ25hbF9lbWl0KHdlYlZpZXcsIHNpZ25hbHNbTE9BRF9DSEFOR0VEXSwg
MCwgV0VCS0lUX0xPQURfRklOSVNIRUQpOwogfQogCit2b2lkIHdlYmtpdFdlYlZpZXdHZXRMb2Fk
RGVjaXNpb25Gb3JJY29uKFdlYktpdFdlYlZpZXcqIHdlYlZpZXcsIGNvbnN0IExpbmtJY29uJiBp
Y29uLCBGdW5jdGlvbjx2b2lkKGJvb2wpPiYmIGNvbXBsZXRpb25IYW5kbGVyKQoreworICAgIFdl
YktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UgPSB3ZWJraXRfd2ViX2NvbnRleHRfZ2V0X2Zh
dmljb25fZGF0YWJhc2Uod2ViVmlldy0+cHJpdi0+Y29udGV4dC5nZXQoKSk7CisgICAgd2Via2l0
RmF2aWNvbkRhdGFiYXNlR2V0TG9hZERlY2lzaW9uRm9ySWNvbihkYXRhYmFzZSwgaWNvbiwgZ2V0
UGFnZSh3ZWJWaWV3KS5wYWdlTG9hZFN0YXRlKCkuYWN0aXZlVVJMKCksIFdURk1vdmUoY29tcGxl
dGlvbkhhbmRsZXIpKTsKK30KKwordm9pZCB3ZWJraXRXZWJWaWV3U2V0SWNvbihXZWJLaXRXZWJW
aWV3KiB3ZWJWaWV3LCBjb25zdCBMaW5rSWNvbiYgaWNvbiwgQVBJOjpEYXRhJiBpY29uRGF0YSkK
K3sKKyAgICBXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFiYXNlID0gd2Via2l0X3dlYl9jb250
ZXh0X2dldF9mYXZpY29uX2RhdGFiYXNlKHdlYlZpZXctPnByaXYtPmNvbnRleHQuZ2V0KCkpOwor
ICAgIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldEljb25Gb3JQYWdlVVJMKGRhdGFiYXNlLCBpY29u
LCBpY29uRGF0YSwgZ2V0UGFnZSh3ZWJWaWV3KS5wYWdlTG9hZFN0YXRlKCkuYWN0aXZlVVJMKCkp
OworfQorCiBXZWJQYWdlUHJveHkqIHdlYmtpdFdlYlZpZXdDcmVhdGVOZXdQYWdlKFdlYktpdFdl
YlZpZXcqIHdlYlZpZXcsIGNvbnN0IFdpbmRvd0ZlYXR1cmVzJiB3aW5kb3dGZWF0dXJlcywgV2Vi
S2l0TmF2aWdhdGlvbkFjdGlvbiogbmF2aWdhdGlvbkFjdGlvbikKIHsKICAgICBXZWJLaXRXZWJW
aWV3KiBuZXdXZWJWaWV3OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQ
SS9nbGliL1dlYktpdFdlYlZpZXdQcml2YXRlLmggYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
QVBJL2dsaWIvV2ViS2l0V2ViVmlld1ByaXZhdGUuaAppbmRleCA1M2JhOTU0MDhjNi4uYWZiODNi
ZjM1NjUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJL
aXRXZWJWaWV3UHJpdmF0ZS5oCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xp
Yi9XZWJLaXRXZWJWaWV3UHJpdmF0ZS5oCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSAiV2Vi
S2l0V2ViVmlldy5oIgogI2luY2x1ZGUgIldlYlBhZ2VQcm94eS5oIgogI2luY2x1ZGUgPFdlYkNv
cmUvSW50UmVjdC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvTGlua0ljb24uaD4KICNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+CiAKIHZvaWQgd2Via2l0V2ViVmlld0NyZWF0ZVBhZ2UoV2ViS2l0
V2ViVmlldyosIFJlZjxBUEk6OlBhZ2VDb25maWd1cmF0aW9uPiYmKTsKQEAgLTQyLDYgKzQzLDgg
QEAgV2ViS2l0OjpXZWJQYWdlUHJveHkmIHdlYmtpdFdlYlZpZXdHZXRQYWdlKFdlYktpdFdlYlZp
ZXcqKTsKIHZvaWQgd2Via2l0V2ViVmlld0xvYWRDaGFuZ2VkKFdlYktpdFdlYlZpZXcqLCBXZWJL
aXRMb2FkRXZlbnQpOwogdm9pZCB3ZWJraXRXZWJWaWV3TG9hZEZhaWxlZChXZWJLaXRXZWJWaWV3
KiwgV2ViS2l0TG9hZEV2ZW50LCBjb25zdCBjaGFyKiBmYWlsaW5nVVJJLCBHRXJyb3IqKTsKIHZv
aWQgd2Via2l0V2ViVmlld0xvYWRGYWlsZWRXaXRoVExTRXJyb3JzKFdlYktpdFdlYlZpZXcqLCBj
b25zdCBjaGFyKiBmYWlsaW5nVVJJLCBHRXJyb3IqLCBHVGxzQ2VydGlmaWNhdGVGbGFncywgR1Rs
c0NlcnRpZmljYXRlKik7Cit2b2lkIHdlYmtpdFdlYlZpZXdHZXRMb2FkRGVjaXNpb25Gb3JJY29u
KFdlYktpdFdlYlZpZXcqLCBjb25zdCBXZWJDb3JlOjpMaW5rSWNvbiYsIEZ1bmN0aW9uPHZvaWQo
Ym9vbCk+JiYpOwordm9pZCB3ZWJraXRXZWJWaWV3U2V0SWNvbihXZWJLaXRXZWJWaWV3KiwgY29u
c3QgV2ViQ29yZTo6TGlua0ljb24mLCBBUEk6OkRhdGEmKTsKIFdlYktpdDo6V2ViUGFnZVByb3h5
KiB3ZWJraXRXZWJWaWV3Q3JlYXRlTmV3UGFnZShXZWJLaXRXZWJWaWV3KiwgY29uc3QgV2ViQ29y
ZTo6V2luZG93RmVhdHVyZXMmLCBXZWJLaXROYXZpZ2F0aW9uQWN0aW9uKik7CiB2b2lkIHdlYmtp
dFdlYlZpZXdSZWFkeVRvU2hvd1BhZ2UoV2ViS2l0V2ViVmlldyopOwogdm9pZCB3ZWJraXRXZWJW
aWV3UnVuQXNNb2RhbChXZWJLaXRXZWJWaWV3Kik7CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VM
b2cgYi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggMDFhYjk1ODljYTIuLmNiMGUyNmFhNjFkIDEwMDY0
NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEs
MTYgQEAKKzIwMTctMDYtMjcgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEu
Y29tPgorCisgICAgICAgIFtHVEtdW1dQRV0gSW1wbGVtZW50IEFQSTo6SWNvbkxvYWRpbmdDbGll
bnQgYW5kIHJld29yayBXZWJLaXRGYXZpY29uRGF0YWJhc2UgdG8gdXNlIEljb25EYXRhYmFzZSBk
aXJlY3RseQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTczODc3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
VXBkYXRlIGZhdmljb25zIHVuaXQgdGVzdCB0byBlbnN1cmUgd2Ugd2FpdCB1bnRpbCB0aGUgZGF0
YWJhc2UgaXMgdXBkYXRlZCBpbiB0ZXN0R2V0RmF2aWNvbigpIGJlZm9yZSBzdGFydGluZworICAg
ICAgICB0aGUgbmV4dCB0ZXN0cy4KKworICAgICAgICAqIFRlc3RXZWJLaXRBUEkvVGVzdHMvV2Vi
S2l0R0xpYi9UZXN0V2ViS2l0RmF2aWNvbkRhdGFiYXNlLmNwcDoKKyAgICAgICAgKHRlc3RHZXRG
YXZpY29uKToKKwogMjAxNy0wNi0yNiAgSm9uYXRoYW4gQmVkYXJkICA8amJlZGFyZEBhcHBsZS5j
b20+CiAKICAgICAgICAgVW5yZXZpZXdlZCwgcm9sbGluZyBvdXQgcjIxODc4My4KZGlmZiAtLWdp
dCBhL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0R0xpYi9UZXN0V2ViS2l0RmF2aWNv
bkRhdGFiYXNlLmNwcCBiL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0R0xpYi9UZXN0
V2ViS2l0RmF2aWNvbkRhdGFiYXNlLmNwcAppbmRleCAwMDAwNzFkYTRmOS4uMDAwY2Y2NzYyZmMg
MTAwNjQ0Ci0tLSBhL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0R0xpYi9UZXN0V2Vi
S2l0RmF2aWNvbkRhdGFiYXNlLmNwcAorKysgYi9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dl
YktpdEdMaWIvVGVzdFdlYktpdEZhdmljb25EYXRhYmFzZS5jcHAKQEAgLTUwLDggKzUwLDExIEBA
IHB1YmxpYzoKIAogICAgIHN0YXRpYyB2b2lkIGZhdmljb25DaGFuZ2VkQ2FsbGJhY2soV2ViS2l0
RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgY2hhciogcGFnZVVSSSwgY29uc3QgY2hh
ciogZmF2aWNvblVSSSwgRmF2aWNvbkRhdGFiYXNlVGVzdCogdGVzdCkKICAgICB7Ci0gICAgICAg
IGlmICghZ19zdHJjbXAwKHdlYmtpdF93ZWJfdmlld19nZXRfdXJpKHRlc3QtPm1fd2ViVmlldyks
IHBhZ2VVUkkpKQorICAgICAgICBpZiAoIWdfc3RyY21wMCh3ZWJraXRfd2ViX3ZpZXdfZ2V0X3Vy
aSh0ZXN0LT5tX3dlYlZpZXcpLCBwYWdlVVJJKSkgewogICAgICAgICAgICAgdGVzdC0+bV9mYXZp
Y29uVVJJID0gZmF2aWNvblVSSTsKKyAgICAgICAgICAgIGlmICh0ZXN0LT5tX3dhaXRpbmdGb3JG
YXZpY29uVVJJKQorICAgICAgICAgICAgICAgIHRlc3QtPnF1aXRNYWluTG9vcCgpOworICAgICAg
ICB9CiAgICAgfQogCiAgICAgc3RhdGljIHZvaWQgdmlld0Zhdmljb25DaGFuZ2VkQ2FsbGJhY2so
V2ViS2l0V2ViVmlldyogd2ViVmlldywgR1BhcmFtU3BlYyogcHNwZWMsIGdwb2ludGVyIGRhdGEp
CkBAIC05MCwxMCArOTMsMjAgQEAgcHVibGljOgogICAgICAgICBnX21haW5fbG9vcF9ydW4obV9t
YWluTG9vcCk7CiAgICAgfQogCisgICAgdm9pZCB3YWl0VW50aWxGYXZpY29uVVJJQ2hhbmdlZCgp
CisgICAgeworICAgICAgICBnX2Fzc2VydCghbV93YWl0aW5nRm9yRmF2aWNvblVSSSk7CisgICAg
ICAgIG1fZmF2aWNvblVSSSA9IENTdHJpbmcoKTsKKyAgICAgICAgbV93YWl0aW5nRm9yRmF2aWNv
blVSSSA9IHRydWU7CisgICAgICAgIGdfbWFpbl9sb29wX3J1bihtX21haW5Mb29wKTsKKyAgICAg
ICAgbV93YWl0aW5nRm9yRmF2aWNvblVSSSA9IGZhbHNlOworICAgIH0KKwogICAgIGNhaXJvX3N1
cmZhY2VfdCogbV9mYXZpY29uOwogICAgIENTdHJpbmcgbV9mYXZpY29uVVJJOwogICAgIEdVbmlx
dWVPdXRQdHI8R0Vycm9yPiBtX2Vycm9yOwogICAgIGJvb2wgbV9mYXZpY29uTm90aWZpY2F0aW9u
UmVjZWl2ZWQ7CisgICAgYm9vbCBtX3dhaXRpbmdGb3JGYXZpY29uVVJJIHsgZmFsc2UgfTsKIH07
CiAKIHN0YXRpYyB2b2lkCkBAIC0yMDgsOSArMjIxLDExIEBAIHN0YXRpYyB2b2lkIHRlc3RHZXRG
YXZpY29uKEZhdmljb25EYXRhYmFzZVRlc3QqIHRlc3QpCiAgICAgZ19hc3NlcnQoIXRlc3QtPm1f
ZXJyb3IpOwogICAgIGNhaXJvX3N1cmZhY2VfZGVzdHJveShmYXZpY29uKTsKIAotICAgIC8vIENo
ZWNrIHRoZSBBUEkgcmV0cmlldmluZyBhbiBpbnZhbGlkIGZhdmljb24uCisgICAgLy8gQ2hlY2sg
dGhlIEFQSSByZXRyaWV2aW5nIGFuIGludmFsaWQgZmF2aWNvbi4gRmF2aWNvbiBjaGFuZ2VzIG9u
bHkgb25jZSB0byByZXNldCBpdCwgdGhlbgorICAgIC8vIHRoZSBkYXRhYmFzZSBpcyB1cGRhdGVk
IHdpdGggdGhlIGZhdmljb24gVVJJLCBidXQgbm90IHdpdGggZmF2aWNvbiBpbWFnZSBkYXRhLgog
ICAgIHRlc3QtPmxvYWRVUkkoa1NlcnZlci0+Z2V0VVJJRm9yUGF0aCgiL25vZmF2aWNvbiIpLmRh
dGEoKSk7CiAgICAgdGVzdC0+d2FpdFVudGlsRmF2aWNvbkNoYW5nZWQoKTsKKyAgICB0ZXN0LT53
YWl0VW50aWxGYXZpY29uVVJJQ2hhbmdlZCgpOwogCiAgICAgdGVzdC0+Z2V0RmF2aWNvbkZvclBh
Z2VVUklBbmRXYWl0VW50aWxSZWFkeShrU2VydmVyLT5nZXRVUklGb3JQYXRoKCIvbm9mYXZpY29u
IikuZGF0YSgpKTsKICAgICBnX2Fzc2VydCghdGVzdC0+bV9mYXZpY29uKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>313919</attachid>
            <date>2017-06-27 09:39:14 -0700</date>
            <delta_ts>2017-06-27 13:14:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>wk2-glib-favicons.diff</filename>
            <type>text/plain</type>
            <size>129635</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQyL0No
YW5nZUxvZwppbmRleCA0NmZlN2Q1OTQyOS4uNmFkMTAyMmQ1ZTggMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQyL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKQEAgLTEs
MyArMSwxNDUgQEAKKzIwMTctMDYtMjcgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBp
Z2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdW1dQRV0gSW1wbGVtZW50IEFQSTo6SWNvbkxvYWRp
bmdDbGllbnQgYW5kIHJld29yayBXZWJLaXRGYXZpY29uRGF0YWJhc2UgdG8gdXNlIEljb25EYXRh
YmFzZSBkaXJlY3RseQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTczODc3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgVGhpcyB3YXkgSWNvbkRhdGFiYXNlIGFuZCBpdHMgcmVsYXRlZCBjbGFzc2VzIGNhbiBi
ZSByZW1vdmVkIGZyb20gV2ViQ29yZSwgYXMgd2VsbCBhcyB0aGUgV2ViS2l0MiBpbXBsZW1lbnRh
dGlvbgorICAgICAgICBhbmQgQyBBUEkuIEZvciBub3cgSSd2ZSBjb3BpZWQgSWNvbkRhdGFiYXNl
IGZyb20gV2ViQ29yZSB0byBXZWJLaXQyIHVuZGVyIHRoZSBnbGliIEFQSSBkaXJlY3RvcnksIGFk
ZGluZyB0aGUKKyAgICAgICAgcmVsYXRlZCBjbGFzc2VzIGFzIHByaXZhdGUgaW5zaWRlIEljb25E
YXRhYmFzZSwgYW5kIHJlbW92aW5nIHNvbWUgbWV0aG9kcyB0aGF0IGFyZSBub3QgdXNlZCBieSB0
aGUgR0xpYiBBUEkuCisKKyAgICAgICAgKiBQbGF0Zm9ybUdUSy5jbWFrZToKKyAgICAgICAgKiBV
SVByb2Nlc3MvQVBJL2dsaWIvSWNvbkRhdGFiYXNlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJL
aXQ6OnVybEZvckxvZ2dpbmcpOgorICAgICAgICAoV2ViS2l0OjpkZWZhdWx0Q2xpZW50KToKKyAg
ICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjpJY29uUmVjb3JkKToKKyAg
ICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjp+SWNvblJlY29yZCk6Cisg
ICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6SWNvblJlY29yZDo6aW1hZ2UpOgorICAgICAg
ICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6Okljb25SZWNvcmQ6OnNldEltYWdlRGF0YSk6CisgICAg
ICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6SWNvblJlY29yZDo6bG9hZEltYWdlRnJvbVJlc291
cmNlKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjppbWFnZURh
dGFTdGF0dXMpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6Okljb25SZWNvcmQ6OnNu
YXBzaG90KToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpQYWdlVVJMUmVjb3JkOjpQ
YWdlVVJMUmVjb3JkKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpQYWdlVVJMUmVj
b3JkOjp+UGFnZVVSTFJlY29yZCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6UGFn
ZVVSTFJlY29yZDo6c2V0SWNvblJlY29yZCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFz
ZTo6UGFnZVVSTFJlY29yZDo6c25hcHNob3QpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJh
c2U6OnNldENsaWVudCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6b3Blbik6Cisg
ICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6Y2xvc2UpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OnJlbW92ZUFsbEljb25zKToKKyAgICAgICAgKFdlYktpdDo6ZG9jdW1lbnRD
YW5IYXZlSWNvbik6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6c3luY2hyb25vdXNJ
Y29uRm9yUGFnZVVSTCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6c3luY2hyb25v
dXNJY29uVVJMRm9yUGFnZVVSTCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6cmV0
YWluSWNvbkZvclBhZ2VVUkwpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6OnBlcmZv
cm1SZXRhaW5JY29uRm9yUGFnZVVSTCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6
cmVsZWFzZUljb25Gb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpw
ZXJmb3JtUmVsZWFzZUljb25Gb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFi
YXNlOjpzZXRJY29uRGF0YUZvckljb25VUkwpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJh
c2U6OnNldEljb25VUkxGb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNl
OjpzeW5jaHJvbm91c0xvYWREZWNpc2lvbkZvckljb25VUkwpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OnN5bmNocm9ub3VzSWNvbkRhdGFLbm93bkZvckljb25VUkwpOgorICAgICAg
ICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6OnNldEVuYWJsZWQpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OmlzRW5hYmxlZCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6
c2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFz
ZTo6aXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFi
YXNlOjpkZWxheURhdGFiYXNlQ2xlYW51cCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFz
ZTo6YWxsb3dEYXRhYmFzZUNsZWFudXApOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6
OmNoZWNrSW50ZWdyaXR5QmVmb3JlT3BlbmluZyk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRh
YmFzZTo6SWNvbkRhdGFiYXNlKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjp+SWNv
bkRhdGFiYXNlKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjp3YWtlU3luY1RocmVh
ZCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6c2NoZWR1bGVPckRlZmVyU3luY1Rp
bWVyKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpzeW5jVGltZXJGaXJlZCk6Cisg
ICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6aXNPcGVuKToKKyAgICAgICAgKFdlYktpdDo6
SWNvbkRhdGFiYXNlOjppc09wZW5CZXNpZGVzTWFpblRocmVhZENhbGxiYWNrcyk6CisgICAgICAg
IChXZWJLaXQ6Okljb25EYXRhYmFzZTo6ZGF0YWJhc2VQYXRoKToKKyAgICAgICAgKFdlYktpdDo6
SWNvbkRhdGFiYXNlOjpkZWZhdWx0RGF0YWJhc2VGaWxlbmFtZSk6CisgICAgICAgIChXZWJLaXQ6
Okljb25EYXRhYmFzZTo6Z2V0T3JDcmVhdGVJY29uUmVjb3JkKToKKyAgICAgICAgKFdlYktpdDo6
SWNvbkRhdGFiYXNlOjpnZXRPckNyZWF0ZVBhZ2VVUkxSZWNvcmQpOgorICAgICAgICAoV2ViS2l0
OjpJY29uRGF0YWJhc2U6OnNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSk6CisgICAgICAgIChXZWJL
aXQ6Okljb25EYXRhYmFzZTo6aWNvbkRhdGFiYXNlU3luY1RocmVhZCk6CisgICAgICAgIChXZWJL
aXQ6OmRhdGFiYXNlVmVyc2lvbk51bWJlcik6CisgICAgICAgIChXZWJLaXQ6OmlzVmFsaWREYXRh
YmFzZSk6CisgICAgICAgIChXZWJLaXQ6OmNyZWF0ZURhdGFiYXNlVGFibGVzKToKKyAgICAgICAg
KFdlYktpdDo6SWNvbkRhdGFiYXNlOjpwZXJmb3JtT3BlbkluaXRpYWxpemF0aW9uKToKKyAgICAg
ICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpjaGVja0ludGVncml0eSk6CisgICAgICAgIChXZWJL
aXQ6Okljb25EYXRhYmFzZTo6cGVyZm9ybVVSTEltcG9ydCk6CisgICAgICAgIChXZWJLaXQ6Oklj
b25EYXRhYmFzZTo6c3luY1RocmVhZE1haW5Mb29wKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRh
dGFiYXNlOjpwZXJmb3JtUGVuZGluZ1JldGFpbkFuZFJlbGVhc2VPcGVyYXRpb25zKToKKyAgICAg
ICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpyZWFkRnJvbURhdGFiYXNlKToKKyAgICAgICAgKFdl
YktpdDo6SWNvbkRhdGFiYXNlOjp3cml0ZVRvRGF0YWJhc2UpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OnBydW5lVW5yZXRhaW5lZEljb25zKToKKyAgICAgICAgKFdlYktpdDo6SWNv
bkRhdGFiYXNlOjpjaGVja0ZvckRhbmdsaW5nUGFnZVVSTHMpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OnJlbW92ZUFsbEljb25zT25UaHJlYWQpOgorICAgICAgICAoV2ViS2l0OjpJ
Y29uRGF0YWJhc2U6OmRlbGV0ZUFsbFByZXBhcmVkU3RhdGVtZW50cyk6CisgICAgICAgIChXZWJL
aXQ6Okljb25EYXRhYmFzZTo6Y2xlYW51cFN5bmNUaHJlYWQpOgorICAgICAgICAoV2ViS2l0Ojpy
ZWFkeVNRTGl0ZVN0YXRlbWVudCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6c2V0
SWNvblVSTEZvclBhZ2VVUkxJblNRTERhdGFiYXNlKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRh
dGFiYXNlOjpzZXRJY29uSURGb3JQYWdlVVJMSW5TUUxEYXRhYmFzZSk6CisgICAgICAgIChXZWJL
aXQ6Okljb25EYXRhYmFzZTo6cmVtb3ZlUGFnZVVSTEZyb21TUUxEYXRhYmFzZSk6CisgICAgICAg
IChXZWJLaXQ6Okljb25EYXRhYmFzZTo6Z2V0SWNvbklERm9ySWNvblVSTEZyb21TUUxEYXRhYmFz
ZSk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6YWRkSWNvblVSTFRvU1FMRGF0YWJh
c2UpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6OmdldEltYWdlRGF0YUZvckljb25V
UkxGcm9tU1FMRGF0YWJhc2UpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6OnJlbW92
ZUljb25Gcm9tU1FMRGF0YWJhc2UpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6Ondy
aXRlSWNvblNuYXBzaG90VG9TUUxEYXRhYmFzZSk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRh
YmFzZTo6Y2hlY2tDbG9zZWRBZnRlck1haW5UaHJlYWRDYWxsYmFjayk6CisgICAgICAgIChXZWJL
aXQ6Okljb25EYXRhYmFzZTo6ZGlzcGF0Y2hEaWRJbXBvcnRJY29uVVJMRm9yUGFnZVVSTE9uTWFp
blRocmVhZCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6ZGlzcGF0Y2hEaWRJbXBv
cnRJY29uRGF0YUZvclBhZ2VVUkxPbk1haW5UaHJlYWQpOgorICAgICAgICAoV2ViS2l0OjpJY29u
RGF0YWJhc2U6OmRpc3BhdGNoRGlkUmVtb3ZlQWxsSWNvbnNPbk1haW5UaHJlYWQpOgorICAgICAg
ICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6OmRpc3BhdGNoRGlkRmluaXNoVVJMSW1wb3J0T25NYWlu
VGhyZWFkKToKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2dsaWIvSWNvbkRhdGFiYXNlLmg6IEFk
ZGVkLgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2VDbGllbnQ6OmRpZEltcG9ydEljb25V
UkxGb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlQ2xpZW50OjpkaWRJ
bXBvcnRJY29uRGF0YUZvclBhZ2VVUkwpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2VD
bGllbnQ6OmRpZENoYW5nZUljb25Gb3JQYWdlVVJMKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRh
dGFiYXNlQ2xpZW50OjpkaWRSZW1vdmVBbGxJY29ucyk6CisgICAgICAgIChXZWJLaXQ6Okljb25E
YXRhYmFzZUNsaWVudDo6ZGlkRmluaXNoVVJMSW1wb3J0KToKKyAgICAgICAgKFdlYktpdDo6SWNv
bkRhdGFiYXNlQ2xpZW50OjpkaWRDbG9zZSk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFz
ZTo6SWNvblNuYXBzaG90OjpJY29uU25hcHNob3QpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0
YWJhc2U6Okljb25TbmFwc2hvdDo6aWNvblVSTCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRh
YmFzZTo6SWNvblNuYXBzaG90Ojp0aW1lc3RhbXApOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0
YWJhc2U6Okljb25TbmFwc2hvdDo6ZGF0YSk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFz
ZTo6SWNvblJlY29yZDo6Y3JlYXRlKToKKyAgICAgICAgKFdlYktpdDo6SWNvbkRhdGFiYXNlOjpJ
Y29uUmVjb3JkOjpnZXRUaW1lc3RhbXApOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0YWJhc2U6
Okljb25SZWNvcmQ6OnNldFRpbWVzdGFtcCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFz
ZTo6SWNvblJlY29yZDo6aWNvblVSTCk6CisgICAgICAgIChXZWJLaXQ6Okljb25EYXRhYmFzZTo6
SWNvblJlY29yZDo6cmV0YWluaW5nUGFnZVVSTHMpOgorICAgICAgICAoV2ViS2l0OjpJY29uRGF0
YWJhc2U6OlBhZ2VVUkxTbmFwc2hvdDo6UGFnZVVSTFNuYXBzaG90KToKKyAgICAgICAgKFdlYktp
dDo6SWNvbkRhdGFiYXNlOjpQYWdlVVJMU25hcHNob3Q6OnBhZ2VVUkwpOgorICAgICAgICAoV2Vi
S2l0OjpJY29uRGF0YWJhc2U6OlBhZ2VVUkxTbmFwc2hvdDo6aWNvblVSTCk6CisgICAgICAgIChX
ZWJLaXQ6Okljb25EYXRhYmFzZTo6UGFnZVVSTFJlY29yZDo6dXJsKToKKyAgICAgICAgKFdlYktp
dDo6SWNvbkRhdGFiYXNlOjpQYWdlVVJMUmVjb3JkOjppY29uUmVjb3JkKToKKyAgICAgICAgKFdl
YktpdDo6SWNvbkRhdGFiYXNlOjpQYWdlVVJMUmVjb3JkOjpyZXRhaW4pOgorICAgICAgICAoV2Vi
S2l0OjpJY29uRGF0YWJhc2U6OlBhZ2VVUkxSZWNvcmQ6OnJlbGVhc2UpOgorICAgICAgICAoV2Vi
S2l0OjpJY29uRGF0YWJhc2U6OlBhZ2VVUkxSZWNvcmQ6OnJldGFpbkNvdW50KToKKyAgICAgICAg
KiBVSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0RmF2aWNvbkRhdGFiYXNlLmNwcDoKKyAgICAgICAg
KF9XZWJLaXRGYXZpY29uRGF0YWJhc2VQcml2YXRlOjp+X1dlYktpdEZhdmljb25EYXRhYmFzZVBy
aXZhdGUpOgorICAgICAgICAoZ2V0SWNvblN1cmZhY2VTeW5jaHJvbm91c2x5KToKKyAgICAgICAg
KHdlYmtpdEZhdmljb25EYXRhYmFzZVNldEljb25VUkxGb3JQYWdlVVJMKToKKyAgICAgICAgKHdl
YmtpdEZhdmljb25EYXRhYmFzZUNyZWF0ZSk6CisgICAgICAgICh3ZWJraXRGYXZpY29uRGF0YWJh
c2VPcGVuKToKKyAgICAgICAgKHdlYmtpdEZhdmljb25EYXRhYmFzZUlzT3Blbik6CisgICAgICAg
ICh3ZWJraXRGYXZpY29uRGF0YWJhc2VTZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKToKKyAgICAg
ICAgKHdlYmtpdEZhdmljb25EYXRhYmFzZUdldExvYWREZWNpc2lvbkZvckljb24pOgorICAgICAg
ICAod2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZvclBhZ2VVUkwpOgorICAgICAgICAod2Vi
a2l0X2Zhdmljb25fZGF0YWJhc2VfZ2V0X2Zhdmljb24pOgorICAgICAgICAod2Via2l0X2Zhdmlj
b25fZGF0YWJhc2VfZ2V0X2Zhdmljb25fdXJpKToKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2ds
aWIvV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZS5oOgorICAgICAgICAqIFVJUHJvY2Vzcy9B
UEkvZ2xpYi9XZWJLaXRJY29uTG9hZGluZ0NsaWVudC5jcHA6IEFkZGVkLgorICAgICAgICAoSWNv
bkxvYWRpbmdDbGllbnQ6Okljb25Mb2FkaW5nQ2xpZW50KToKKyAgICAgICAgKGF0dGFjaEljb25M
b2FkaW5nQ2xpZW50VG9WaWV3KToKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0
SWNvbkxvYWRpbmdDbGllbnQuaDogQ29waWVkIGZyb20gU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZVByaXZhdGUuaC4KKyAgICAgICAgKiBVSVBy
b2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViQ29udGV4dC5jcHA6CisgICAgICAgIChlbnN1cmVGYXZp
Y29uRGF0YWJhc2UpOgorICAgICAgICAod2Via2l0V2ViQ29udGV4dEVuYWJsZUljb25EYXRhYmFz
ZVByaXZhdGVCcm93c2luZ0lmTmVlZGVkKToKKyAgICAgICAgKHdlYmtpdFdlYkNvbnRleHREaXNh
YmxlSWNvbkRhdGFiYXNlUHJpdmF0ZUJyb3dzaW5nSWZOZWVkZWQpOgorICAgICAgICAod2Via2l0
X3dlYl9jb250ZXh0X3NldF9mYXZpY29uX2RhdGFiYXNlX2RpcmVjdG9yeSk6CisgICAgICAgICog
VUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdlYlZpZXcuY3BwOgorICAgICAgICAod2Via2l0V2Vi
Vmlld0NvbnN0cnVjdGVkKToKKyAgICAgICAgKHdlYmtpdFdlYlZpZXdHZXRMb2FkRGVjaXNpb25G
b3JJY29uKToKKyAgICAgICAgKHdlYmtpdFdlYlZpZXdTZXRJY29uKToKKyAgICAgICAgKiBVSVBy
b2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViVmlld1ByaXZhdGUuaDoKKwogMjAxNy0wNi0yNiAgQ2hy
aXMgRHVtZXogIDxjZHVtZXpAYXBwbGUuY29tPgogCiAgICAgICAgIFdlYnNpdGVEYXRhU3RvcmU6
OmZldGNoRGF0YUZvclRvcFByaXZhdGVseUNvbnRyb2xsZWREb21haW5zKCkgaXMgaW5lZmZpY2ll
bnQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1BsYXRmb3JtR1RLLmNtYWtlIGIvU291cmNl
L1dlYktpdDIvUGxhdGZvcm1HVEsuY21ha2UKaW5kZXggZDg5NjJkZWFkYzIuLmM5YmZjMGMxYzNm
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9QbGF0Zm9ybUdUSy5jbWFrZQorKysgYi9Tb3Vy
Y2UvV2ViS2l0Mi9QbGF0Zm9ybUdUSy5jbWFrZQpAQCAtMTIwLDYgKzEyMCw3IEBAIGxpc3QoQVBQ
RU5EIFdlYktpdDJfU09VUkNFUwogICAgIFVJUHJvY2Vzcy9BUEkvQy9ndGsvV0tUZXh0Q2hlY2tl
ckd0ay5jcHAKICAgICBVSVByb2Nlc3MvQVBJL0MvZ3RrL1dLVmlldy5jcHAKIAorICAgIFVJUHJv
Y2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2UuY3BwCiAgICAgVUlQcm9jZXNzL0FQSS9nbGliL1dl
YktpdEF1dGhlbnRpY2F0aW9uUmVxdWVzdC5jcHAKICAgICBVSVByb2Nlc3MvQVBJL2dsaWIvV2Vi
S2l0QXV0b21hdGlvblNlc3Npb24uY3BwCiAgICAgVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEJh
Y2tGb3J3YXJkTGlzdC5jcHAKQEAgLTEzOSw2ICsxNDAsNyBAQCBsaXN0KEFQUEVORCBXZWJLaXQy
X1NPVVJDRVMKICAgICBVSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0Rm9ybVN1Ym1pc3Npb25SZXF1
ZXN0LmNwcAogICAgIFVJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRHZW9sb2NhdGlvblBlcm1pc3Np
b25SZXF1ZXN0LmNwcAogICAgIFVJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRHZW9sb2NhdGlvblBy
b3ZpZGVyLmNwcAorICAgIFVJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRJY29uTG9hZGluZ0NsaWVu
dC5jcHAKICAgICBVSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0SW5qZWN0ZWRCdW5kbGVDbGllbnQu
Y3BwCiAgICAgVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEluc3RhbGxNaXNzaW5nTWVkaWFQbHVn
aW5zUGVybWlzc2lvblJlcXVlc3QuY3BwCiAgICAgVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEph
dmFzY3JpcHRSZXN1bHQuY3BwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9QbGF0Zm9ybVdQ
RS5jbWFrZSBiL1NvdXJjZS9XZWJLaXQyL1BsYXRmb3JtV1BFLmNtYWtlCmluZGV4IGI2NTY0ZTli
YzFiLi4zY2RjYjc0Y2M4NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvUGxhdGZvcm1XUEUu
Y21ha2UKKysrIGIvU291cmNlL1dlYktpdDIvUGxhdGZvcm1XUEUuY21ha2UKQEAgLTEzNSw2ICsx
MzUsNyBAQCBsaXN0KEFQUEVORCBXZWJLaXQyX1NPVVJDRVMKIAogICAgIFVJUHJvY2Vzcy9BUEkv
Qy93cGUvV0tWaWV3LmNwcAogCisgICAgVUlQcm9jZXNzL0FQSS9nbGliL0ljb25EYXRhYmFzZS5j
cHAKICAgICBVSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0QXV0aGVudGljYXRpb25SZXF1ZXN0LmNw
cAogICAgIFVJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRBdXRvbWF0aW9uU2Vzc2lvbi5jcHAKICAg
ICBVSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0QmFja0ZvcndhcmRMaXN0LmNwcApAQCAtMTU0LDYg
KzE1NSw3IEBAIGxpc3QoQVBQRU5EIFdlYktpdDJfU09VUkNFUwogICAgIFVJUHJvY2Vzcy9BUEkv
Z2xpYi9XZWJLaXRGb3JtU3VibWlzc2lvblJlcXVlc3QuY3BwCiAgICAgVUlQcm9jZXNzL0FQSS9n
bGliL1dlYktpdEdlb2xvY2F0aW9uUGVybWlzc2lvblJlcXVlc3QuY3BwCiAgICAgVUlQcm9jZXNz
L0FQSS9nbGliL1dlYktpdEdlb2xvY2F0aW9uUHJvdmlkZXIuY3BwCisgICAgVUlQcm9jZXNzL0FQ
SS9nbGliL1dlYktpdEljb25Mb2FkaW5nQ2xpZW50LmNwcAogICAgIFVJUHJvY2Vzcy9BUEkvZ2xp
Yi9XZWJLaXRJbmplY3RlZEJ1bmRsZUNsaWVudC5jcHAKICAgICBVSVByb2Nlc3MvQVBJL2dsaWIv
V2ViS2l0SW5zdGFsbE1pc3NpbmdNZWRpYVBsdWdpbnNQZXJtaXNzaW9uUmVxdWVzdC5jcHAKICAg
ICBVSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0SmF2YXNjcmlwdFJlc3VsdC5jcHAKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xpYi9JY29uRGF0YWJhc2UuY3BwIGIv
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9nbGliL0ljb25EYXRhYmFzZS5jcHAKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjY2MDE5ZjRlZjUwCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9nbGliL0ljb25EYXRhYmFzZS5j
cHAKQEAgLTAsMCArMSwyMDIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEp1c3Rp
biBIYXlnb29kIChqaGF5Z29vZEByZWFrdGl4LmNvbSkKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkljb25E
YXRhYmFzZS5oIgorCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgPFdlYkNvcmUvQml0
bWFwSW1hZ2UuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0ZpbGVTeXN0ZW0uaD4KKyNpbmNsdWRlIDxX
ZWJDb3JlL0ltYWdlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9TUUxpdGVTdGF0ZW1lbnQuaD4KKyNp
bmNsdWRlIDxXZWJDb3JlL1NRTGl0ZVRyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9T
aGFyZWRCdWZmZXIuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1VSTC5oPgorI2luY2x1ZGUgPHd0Zi9B
dXRvZHJhaW5lZFBvb2wuaD4KKyNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgorI2luY2x1ZGUg
PHd0Zi9OZXZlckRlc3Ryb3llZC5oPgorI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKwor
Ly8gRm9yIG1ldGhvZHMgdGhhdCBhcmUgbWVhbnQgdG8gc3VwcG9ydCBBUEkgZnJvbSB0aGUgbWFp
biB0aHJlYWQgLSBzaG91bGQgbm90IGJlIGNhbGxlZCBpbnRlcm5hbGx5CisjZGVmaW5lIEFTU0VS
VF9OT1RfU1lOQ19USFJFQUQoKSBBU1NFUlQoIW1fc3luY1RocmVhZFJ1bm5pbmcgfHwgIUlTX0lD
T05fU1lOQ19USFJFQUQoKSkKKworLy8gRm9yIG1ldGhvZHMgdGhhdCBhcmUgbWVhbnQgdG8gc3Vw
cG9ydCB0aGUgc3luYyB0aHJlYWQgT05MWQorI2RlZmluZSBJU19JQ09OX1NZTkNfVEhSRUFEKCkg
KG1fc3luY1RocmVhZC0+aWQoKSA9PSBjdXJyZW50VGhyZWFkKCkpCisjZGVmaW5lIEFTU0VSVF9J
Q09OX1NZTkNfVEhSRUFEKCkgQVNTRVJUKElTX0lDT05fU1lOQ19USFJFQUQoKSkKKwordXNpbmcg
bmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitzdGF0aWMgaW50IGRh
dGFiYXNlQ2xlYW51cENvdW50ZXIgPSAwOworCisvLyBUaGlzIHZlcnNpb24gbnVtYmVyIGlzIGlu
IHRoZSBEQiBhbmQgbWFya3MgdGhlIGN1cnJlbnQgZ2VuZXJhdGlvbiBvZiB0aGUgc2NoZW1hCisv
LyBDdXJyZW50bHksIGEgbWlzbWF0Y2hlZCBzY2hlbWEgY2F1c2VzIHRoZSBEQiB0byBiZSB3aXBl
ZCBhbmQgcmVzZXQuIFRoaXMgaXNuJ3QKKy8vIHNvIGJhZCBkdXJpbmcgZGV2ZWxvcG1lbnQgYnV0
IGluIHRoZSBmdXR1cmUsIHdlIHdvdWxkIG5lZWQgdG8gd3JpdGUgYSBjb252ZXJzaW9uCisvLyBm
dW5jdGlvbiB0byBhZHZhbmNlIG9sZGVyIHJlbGVhc2VkIHNjaGVtYXMgdG8gImN1cnJlbnQiCitz
dGF0aWMgY29uc3QgaW50IGN1cnJlbnREYXRhYmFzZVZlcnNpb24gPSA2OworCisvLyBJY29ucyBl
eHBpcmUgb25jZSBldmVyeSA0IGRheXMKK3N0YXRpYyBjb25zdCBpbnQgaWNvbkV4cGlyYXRpb25U
aW1lID0gNjAqNjAqMjQqNDsKKworc3RhdGljIGNvbnN0IFNlY29uZHMgdXBkYXRlVGltZXJEZWxh
eSB7IDVfcyB9OworCitzdGF0aWMgYm9vbCBjaGVja0ludGVncml0eU9uT3BlbiA9IGZhbHNlOwor
CisvLyBXZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gaWNvbnMgdGhhdCBoYXZlIGJlZW4gdW51c2Vk
IGZvciBtb3JlIHRoYW4KKy8vIDMwIGRheXMsIGRlbGV0ZSB0aGVtIGV2ZW4gaWYgdGhleSBoYXZl
IG5vdCBiZWVuIGV4cGxpY2l0bHkgcmVsZWFzZWQuCitzdGF0aWMgY29uc3QgaW50IG5vdFVzZWRJ
Y29uRXhwaXJhdGlvblRpbWUgPSA2MCo2MCoyNCozMDsKKworI2lmICFMT0dfRElTQUJMRUQgfHwg
IUVSUk9SX0RJU0FCTEVECitzdGF0aWMgU3RyaW5nIHVybEZvckxvZ2dpbmcoY29uc3QgU3RyaW5n
JiB1cmwpCit7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVybFRydW5jYXRpb25MZW5ndGgg
PSAxMjA7CisKKyAgICBpZiAodXJsLmxlbmd0aCgpIDwgdXJsVHJ1bmNhdGlvbkxlbmd0aCkKKyAg
ICAgICAgcmV0dXJuIHVybDsKKyAgICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCB1cmxUcnVuY2F0
aW9uTGVuZ3RoKSArICIuLi4iOworfQorI2VuZGlmCisKK2NsYXNzIERlZmF1bHRJY29uRGF0YWJh
c2VDbGllbnQgZmluYWwgOiBwdWJsaWMgSWNvbkRhdGFiYXNlQ2xpZW50IHsKKyAgICBXVEZfTUFL
RV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICB2b2lkIGRpZEltcG9ydEljb25VUkxGb3JQ
YWdlVVJMKGNvbnN0IFN0cmluZyYpIG92ZXJyaWRlIHsgfQorICAgIHZvaWQgZGlkSW1wb3J0SWNv
bkRhdGFGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYpIG92ZXJyaWRlIHsgfQorICAgIHZvaWQgZGlk
Q2hhbmdlSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJikgb3ZlcnJpZGUgeyB9CisgICAgdm9p
ZCBkaWRSZW1vdmVBbGxJY29ucygpIG92ZXJyaWRlIHsgfQorICAgIHZvaWQgZGlkRmluaXNoVVJM
SW1wb3J0KCkgb3ZlcnJpZGUgeyB9Cit9OworCitzdGF0aWMgSWNvbkRhdGFiYXNlQ2xpZW50KiBk
ZWZhdWx0Q2xpZW50KCkKK3sKKyAgICBzdGF0aWMgSWNvbkRhdGFiYXNlQ2xpZW50KiBkZWZhdWx0
Q2xpZW50ID0gbmV3IERlZmF1bHRJY29uRGF0YWJhc2VDbGllbnQ7CisgICAgcmV0dXJuIGRlZmF1
bHRDbGllbnQ7Cit9CisKK0ljb25EYXRhYmFzZTo6SWNvblJlY29yZDo6SWNvblJlY29yZChjb25z
dCBTdHJpbmcmIHVybCkKKyAgICA6IG1faWNvblVSTCh1cmwpCit7Cit9CisKK0ljb25EYXRhYmFz
ZTo6SWNvblJlY29yZDo6fkljb25SZWNvcmQoKQoreworICAgIExPRyhJY29uRGF0YWJhc2UsICJE
ZXN0cm95aW5nIEljb25SZWNvcmQgZm9yIGljb24gdXJsICVzIiwgbV9pY29uVVJMLmFzY2lpKCku
ZGF0YSgpKTsKK30KKworSW1hZ2UqIEljb25EYXRhYmFzZTo6SWNvblJlY29yZDo6aW1hZ2UoY29u
c3QgSW50U2l6ZSYpCit7CisgICAgLy8gRklYTUUgcmRhcjovLzQ2ODAzNzcgLSBGb3Igc2l6ZSBy
aWdodCBub3csIHdlIGFyZSByZXR1cm5pbmcgb3VyIG9uZSBhbmQgb25seSBpbWFnZSBhbmQgdGhl
IEJyaWRnZQorICAgIC8vIGlzIHJlc2l6aW5nIGl0IGluIHBsYWNlLiBXZSBuZWVkIHRvIGFjdHVh
bGx5IHN0b3JlIGFsbCB0aGUgb3JpZ2luYWwgcmVwcmVzZW50YXRpb25zIGhlcmUgYW5kIHJldHVy
biBhIG5hdGl2ZQorICAgIC8vIG9uZSwgb3IgcmVzaXplIHRoZSBiZXN0IG9uZSB0byB0aGUgcmVx
dWVzdGVkIHNpemUgYW5kIGNhY2hlIHRoYXQgcmVzdWx0LgorICAgIHJldHVybiBtX2ltYWdlLmdl
dCgpOworfQorCit2b2lkIEljb25EYXRhYmFzZTo6SWNvblJlY29yZDo6c2V0SW1hZ2VEYXRhKFJl
ZlB0cjxTaGFyZWRCdWZmZXI+JiYgZGF0YSkKK3sKKyAgICAvLyBJdCdzIG9rYXkgdG8gZGVsZXRl
IHRoZSByYXcgaW1hZ2UgaGVyZS4gQW55IGV4aXN0aW5nIGNsaWVudHMgdXNpbmcgdGhpcyBpY29u
IHdpbGwgYmUKKyAgICAvLyBtYW5hZ2luZyBhbiBpbWFnZSB0aGF0IHdhcyBjcmVhdGVkIHdpdGgg
YSBjb3B5IG9mIHRoaXMgcmF3IGltYWdlIGRhdGEuCisgICAgbV9pbWFnZSA9IEJpdG1hcEltYWdl
OjpjcmVhdGUoKTsKKworICAgIC8vIENvcHkgdGhlIHByb3ZpZGVkIGRhdGEgaW50byB0aGUgYnVm
ZmVyIG9mIHRoZSBuZXcgSW1hZ2Ugb2JqZWN0LgorICAgIGlmIChtX2ltYWdlLT5zZXREYXRhKFdU
Rk1vdmUoZGF0YSksIHRydWUpIDwgRW5jb2RlZERhdGFTdGF0dXM6OlNpemVBdmFpbGFibGUpIHsK
KyAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIk1hbnVhbCBpbWFnZSBkYXRhIGZvciBpY29uVVJM
ICclcycgRkFJTEVEIC0gaXQgd2FzIHByb2JhYmx5IGludmFsaWQgaW1hZ2UgZGF0YSIsIG1faWNv
blVSTC5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIG1faW1hZ2UgPSBudWxscHRyOworICAgIH0K
KworICAgIG1fZGF0YVNldCA9IHRydWU7Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpJY29uUmVj
b3JkOjpsb2FkSW1hZ2VGcm9tUmVzb3VyY2UoY29uc3QgY2hhciogcmVzb3VyY2UpCit7CisgICAg
aWYgKCFyZXNvdXJjZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9pbWFnZSA9IEltYWdlOjps
b2FkUGxhdGZvcm1SZXNvdXJjZShyZXNvdXJjZSk7CisgICAgbV9kYXRhU2V0ID0gdHJ1ZTsKK30K
KworSWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkOjpJbWFnZURhdGFTdGF0dXMgSWNvbkRhdGFiYXNl
OjpJY29uUmVjb3JkOjppbWFnZURhdGFTdGF0dXMoKQoreworICAgIGlmICghbV9kYXRhU2V0KQor
ICAgICAgICByZXR1cm4gSW1hZ2VEYXRhU3RhdHVzOjpVbmtub3duOworICAgIGlmICghbV9pbWFn
ZSkKKyAgICAgICAgcmV0dXJuIEltYWdlRGF0YVN0YXR1czo6TWlzc2luZzsKKyAgICByZXR1cm4g
SW1hZ2VEYXRhU3RhdHVzOjpQcmVzZW50OworfQorCitJY29uRGF0YWJhc2U6Okljb25TbmFwc2hv
dCBJY29uRGF0YWJhc2U6Okljb25SZWNvcmQ6OnNuYXBzaG90KGJvb2wgZm9yRGVsZXRpb24pIGNv
bnN0Cit7CisgICAgaWYgKGZvckRlbGV0aW9uKQorICAgICAgICByZXR1cm4gSWNvblNuYXBzaG90
KG1faWNvblVSTCwgMCwgMCk7CisKKyAgICByZXR1cm4gSWNvblNuYXBzaG90KG1faWNvblVSTCwg
bV9zdGFtcCwgbV9pbWFnZSA/IG1faW1hZ2UtPmRhdGEoKSA6IDApOworfQorCitJY29uRGF0YWJh
c2U6OlBhZ2VVUkxSZWNvcmQ6OlBhZ2VVUkxSZWNvcmQoY29uc3QgU3RyaW5nJiBwYWdlVVJMKQor
ICAgIDogbV9wYWdlVVJMKHBhZ2VVUkwpCit7Cit9CisKK0ljb25EYXRhYmFzZTo6UGFnZVVSTFJl
Y29yZDo6flBhZ2VVUkxSZWNvcmQoKQoreworICAgIGlmIChtX2ljb25SZWNvcmQpCisgICAgICAg
IG1faWNvblJlY29yZC0+cmV0YWluaW5nUGFnZVVSTHMoKS5yZW1vdmUobV9wYWdlVVJMKTsKK30K
Kwordm9pZCBJY29uRGF0YWJhc2U6OlBhZ2VVUkxSZWNvcmQ6OnNldEljb25SZWNvcmQoUmVmUHRy
PEljb25SZWNvcmQ+JiYgaWNvbikKK3sKKyAgICBpZiAobV9pY29uUmVjb3JkKQorICAgICAgICBt
X2ljb25SZWNvcmQtPnJldGFpbmluZ1BhZ2VVUkxzKCkucmVtb3ZlKG1fcGFnZVVSTCk7CisKKyAg
ICBtX2ljb25SZWNvcmQgPSBXVEZNb3ZlKGljb24pOworCisgICAgaWYgKG1faWNvblJlY29yZCkK
KyAgICAgICAgbV9pY29uUmVjb3JkLT5yZXRhaW5pbmdQYWdlVVJMcygpLmFkZChtX3BhZ2VVUkwp
OworfQorCitJY29uRGF0YWJhc2U6OlBhZ2VVUkxTbmFwc2hvdCBJY29uRGF0YWJhc2U6OlBhZ2VV
UkxSZWNvcmQ6OnNuYXBzaG90KGJvb2wgZm9yRGVsZXRpb24pIGNvbnN0Cit7CisgICAgcmV0dXJu
IHsgbV9wYWdlVVJMLCAobV9pY29uUmVjb3JkICYmICFmb3JEZWxldGlvbikgPyBtX2ljb25SZWNv
cmQtPmljb25VUkwoKSA6IFN0cmluZygpIH07Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKioq
KioqKgorLy8gKioqIE1haW4gVGhyZWFkIE9ubHkgKioqCisvLyAqKioqKioqKioqKioqKioqKioq
KioqKioKKwordm9pZCBJY29uRGF0YWJhc2U6OnNldENsaWVudChzdGQ6OnVuaXF1ZV9wdHI8SWNv
bkRhdGFiYXNlQ2xpZW50PiYmIGNsaWVudCkKK3sKKyAgICAvLyBXZSBkb24ndCBhbGxvdyBhIG51
bGwgY2xpZW50LCBiZWNhdXNlIHdlIG5ldmVyIG51bGwgY2hlY2sgaXQgYW55d2hlcmUgaW4gdGhp
cyBjb2RlCisgICAgLy8gQWxzbyBkb24ndCBhbGxvdyBhIGNsaWVudCBjaGFuZ2UgYWZ0ZXIgdGhl
IHRocmVhZCBoYXMgYWxyZWFkeSBiZWdhbgorICAgIC8vIChzZXR0aW5nIHRoZSBjbGllbnQgc2hv
dWxkIG9jY3VyIGJlZm9yZSB0aGUgZGF0YWJhc2UgaXMgb3BlbmVkKQorICAgIEFTU0VSVChjbGll
bnQpOworICAgIEFTU0VSVCghbV9zeW5jVGhyZWFkUnVubmluZyk7CisgICAgaWYgKCFjbGllbnQg
fHwgbV9zeW5jVGhyZWFkUnVubmluZykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9jbGllbnQg
PSBXVEZNb3ZlKGNsaWVudCk7Cit9CisKK2Jvb2wgSWNvbkRhdGFiYXNlOjpvcGVuKGNvbnN0IFN0
cmluZyYgZGlyZWN0b3J5LCBjb25zdCBTdHJpbmcmIGZpbGVuYW1lKQoreworICAgIEFTU0VSVF9O
T1RfU1lOQ19USFJFQUQoKTsKKworICAgIGlmICghbV9pc0VuYWJsZWQpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGlmIChpc09wZW4oKSkgeworICAgICAgICBMT0dfRVJST1IoIkF0dGVt
cHQgdG8gcmVvcGVuIHRoZSBJY29uRGF0YWJhc2Ugd2hpY2ggaXMgYWxyZWFkeSBvcGVuLiBNdXN0
IGNsb3NlIGl0IGZpcnN0LiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
bV9kYXRhYmFzZURpcmVjdG9yeSA9IGRpcmVjdG9yeS5pc29sYXRlZENvcHkoKTsKKworICAgIC8v
IEZvcm11bGF0ZSB0aGUgZnVsbCBwYXRoIGZvciB0aGUgZGF0YWJhc2UgZmlsZQorICAgIG1fY29t
cGxldGVEYXRhYmFzZVBhdGggPSBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQobV9kYXRhYmFzZURp
cmVjdG9yeSwgZmlsZW5hbWUpOworCisgICAgLy8gTG9jayBoZXJlIGFzIHdlbGwgYXMgZmlyc3Qg
dGhpbmcgaW4gdGhlIHRocmVhZCBzbyB0aGUgdGhyZWFkIGRvZXNuJ3QgYWN0dWFsbHkgY29tbWVu
Y2UgdW50aWwgdGhlIGNyZWF0ZVRocmVhZCgpIGNhbGwKKyAgICAvLyBjb21wbGV0ZXMgYW5kIG1f
c3luY1RocmVhZFJ1bm5pbmcgaXMgcHJvcGVybHkgc2V0CisgICAgbV9zeW5jTG9jay5sb2NrKCk7
CisgICAgbV9zeW5jVGhyZWFkID0gVGhyZWFkOjpjcmVhdGUoIldlYkNvcmU6IEljb25EYXRhYmFz
ZSIsIFt0aGlzXSB7CisgICAgICAgIGljb25EYXRhYmFzZVN5bmNUaHJlYWQoKTsKKyAgICB9KTsK
KyAgICBtX3N5bmNUaHJlYWRSdW5uaW5nID0gbV9zeW5jVGhyZWFkOworICAgIG1fc3luY0xvY2su
dW5sb2NrKCk7CisgICAgaWYgKCFtX3N5bmNUaHJlYWQpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6OmNsb3NlKCkKK3sKKyAg
ICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7CisKKyAgICBpZiAobV9zeW5jVGhyZWFkUnVubmlu
ZykgeworICAgICAgICAvLyBTZXQgdGhlIGZsYWcgdG8gdGVsbCB0aGUgc3luYyB0aHJlYWQgdG8g
d3JhcCBpdCB1cAorICAgICAgICBtX3RocmVhZFRlcm1pbmF0aW9uUmVxdWVzdGVkID0gdHJ1ZTsK
KworICAgICAgICAvLyBXYWtlIHVwIHRoZSBzeW5jIHRocmVhZCBpZiBpdCdzIHdhaXRpbmcKKyAg
ICAgICAgd2FrZVN5bmNUaHJlYWQoKTsKKworICAgICAgICAvLyBXYWl0IGZvciB0aGUgc3luYyB0
aHJlYWQgdG8gdGVybWluYXRlCisgICAgICAgIG1fc3luY1RocmVhZC0+d2FpdEZvckNvbXBsZXRp
b24oKTsKKyAgICB9CisKKyAgICBtX3N5bmNUaHJlYWRSdW5uaW5nID0gZmFsc2U7CisgICAgbV90
aHJlYWRUZXJtaW5hdGlvblJlcXVlc3RlZCA9IGZhbHNlOworICAgIG1fcmVtb3ZlSWNvbnNSZXF1
ZXN0ZWQgPSBmYWxzZTsKKworICAgIG1fc3luY0RCLmNsb3NlKCk7CisKKyAgICAvLyBJZiB0aGVy
ZSBhcmUgc3RpbGwgbWFpbiB0aHJlYWQgY2FsbGJhY2tzIGluIGZsaWdodCB0aGVuIHRoZSBkYXRh
YmFzZSBtaWdodCBub3QgYWN0dWFsbHkgYmUgY2xvc2VkIHlldC4KKyAgICAvLyBCdXQgaWYgaXQg
aXMgY2xvc2VkLCBub3RpZnkgdGhlIGNsaWVudCBub3cuCisgICAgaWYgKCFpc09wZW4oKSAmJiBt
X2NsaWVudCkKKyAgICAgICAgbV9jbGllbnQtPmRpZENsb3NlKCk7Cit9CisKK3ZvaWQgSWNvbkRh
dGFiYXNlOjpyZW1vdmVBbGxJY29ucygpCit7CisgICAgQVNTRVJUX05PVF9TWU5DX1RIUkVBRCgp
OworCisgICAgaWYgKCFpc09wZW4oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgTE9HKEljb25E
YXRhYmFzZSwgIlJlcXVlc3RpbmcgYmFja2dyb3VuZCB0aHJlYWQgdG8gcmVtb3ZlIGFsbCBpY29u
cyIpOworCisgICAgLy8gQ2xlYXIgdGhlIGluLW1lbW9yeSByZWNvcmQgb2YgZXZlcnkgSWNvblJl
Y29yZCwgYW55dGhpbmcgd2FpdGluZyB0byBiZSByZWFkIGZyb20gZGlzaywgYW5kIGFueXRoaW5n
IHdhaXRpbmcgdG8gYmUgd3JpdHRlbiB0byBkaXNrCisgICAgeworICAgICAgICBMb2NrSG9sZGVy
IGxvY2tlcihtX3VybEFuZEljb25Mb2NrKTsKKworICAgICAgICAvLyBDbGVhciB0aGUgSWNvblJl
Y29yZHMgZm9yIGV2ZXJ5IHBhZ2UgVVJMIC0gUmVmQ291bnRpbmcgd2lsbCBjYXVzZSB0aGUgSWNv
blJlY29yZHMgdGhlbXNlbHZlcyB0byBiZSBkZWxldGVkCisgICAgICAgIC8vIFdlIGRvbid0IGRl
bGV0ZSB0aGUgYWN0dWFsIFBhZ2VSZWNvcmRzIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgInJldGFpbiBp
Y29uIGZvciB1cmwiIGNvdW50IHRvIGtlZXAgdHJhY2sgb2YKKyAgICAgICAgZm9yIChhdXRvJiBw
YWdlVVJMIDogbV9wYWdlVVJMVG9SZWNvcmRNYXAudmFsdWVzKCkpCisgICAgICAgICAgICBwYWdl
VVJMLT5zZXRJY29uUmVjb3JkKG51bGxwdHIpOworCisgICAgICAgIC8vIENsZWFyIHRoZSBpY29u
VVJMIC0+IEljb25SZWNvcmQgbWFwCisgICAgICAgIG1faWNvblVSTFRvUmVjb3JkTWFwLmNsZWFy
KCk7CisKKyAgICAgICAgLy8gQ2xlYXIgYWxsIGluLW1lbW9yeSByZWNvcmRzIG9mIHRoaW5ncyB0
aGF0IG5lZWQgdG8gYmUgc3luY2VkIG91dCB0byBkaXNrCisgICAgICAgIHsKKyAgICAgICAgICAg
IExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1N5bmNMb2NrKTsKKyAgICAgICAgICAgIG1fcGFn
ZVVSTHNQZW5kaW5nU3luYy5jbGVhcigpOworICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdTeW5j
LmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDbGVhciBhbGwgaW4tbWVtb3J5IHJl
Y29yZHMgb2YgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSByZWFkIGluIGZyb20gZGlzaworICAgICAg
ICB7CisgICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdSZWFkaW5nTG9jayk7
CisgICAgICAgICAgICBtX3BhZ2VVUkxzUGVuZGluZ0ltcG9ydC5jbGVhcigpOworICAgICAgICAg
ICAgbV9wYWdlVVJMc0ludGVyZXN0ZWRJbkljb25zLmNsZWFyKCk7CisgICAgICAgICAgICBtX2lj
b25zUGVuZGluZ1JlYWRpbmcuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fcmVt
b3ZlSWNvbnNSZXF1ZXN0ZWQgPSB0cnVlOworICAgIHdha2VTeW5jVGhyZWFkKCk7Cit9CisKK3N0
YXRpYyBib29sIGRvY3VtZW50Q2FuSGF2ZUljb24oY29uc3QgU3RyaW5nJiBkb2N1bWVudFVSTCkK
K3sKKyAgICByZXR1cm4gIWRvY3VtZW50VVJMLmlzRW1wdHkoKSAmJiAhcHJvdG9jb2xJcyhkb2N1
bWVudFVSTCwgImFib3V0Iik7Cit9CisKK0ltYWdlKiBJY29uRGF0YWJhc2U6OnN5bmNocm9ub3Vz
SWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJiBwYWdlVVJMT3JpZ2luYWwsIGNvbnN0IEludFNp
emUmIHNpemUpCit7CisgICAgQVNTRVJUX05PVF9TWU5DX1RIUkVBRCgpOworCisgICAgLy8gcGFn
ZVVSTE9yaWdpbmFsIGNhbm5vdCBiZSBzdG9yZWQgd2l0aG91dCBiZWluZyBkZWVwIGNvcGllZCBm
aXJzdC4KKyAgICAvLyBXZSBzaG91bGQgZ28gb3VyIG9mIG91ciB3YXkgdG8gb25seSBjb3B5IGl0
IGlmIHdlIGhhdmUgdG8gc3RvcmUgaXQKKworICAgIGlmICghaXNPcGVuKCkgfHwgIWRvY3VtZW50
Q2FuSGF2ZUljb24ocGFnZVVSTE9yaWdpbmFsKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisK
KyAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3VybEFuZEljb25Mb2NrKTsKKworICAgIHBlcmZvcm1Q
ZW5kaW5nUmV0YWluQW5kUmVsZWFzZU9wZXJhdGlvbnMoKTsKKworICAgIFN0cmluZyBwYWdlVVJM
Q29weTsgLy8gQ3JlYXRlcyBhIG51bGwgc3RyaW5nIGZvciBlYXN5IHRlc3RpbmcKKworICAgIFBh
Z2VVUkxSZWNvcmQqIHBhZ2VSZWNvcmQgPSBtX3BhZ2VVUkxUb1JlY29yZE1hcC5nZXQocGFnZVVS
TE9yaWdpbmFsKTsKKyAgICBpZiAoIXBhZ2VSZWNvcmQpIHsKKyAgICAgICAgcGFnZVVSTENvcHkg
PSBwYWdlVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5KCk7CisgICAgICAgIHBhZ2VSZWNvcmQgPSBn
ZXRPckNyZWF0ZVBhZ2VVUkxSZWNvcmQocGFnZVVSTENvcHkpOworICAgIH0KKworICAgIC8vIElm
IHBhZ2VSZWNvcmQgaXMgbnVsbHB0ciwgb25lIG9mIHR3byB0aGluZ3MgaXMgdHJ1ZSAtCisgICAg
Ly8gMSAtIFRoZSBpbml0aWFsIHVybCBpbXBvcnQgaXMgaW5jb21wbGV0ZSBhbmQgdGhpcyBwYWdl
VVJMIHdhcyBtYXJrZWQgdG8gYmUgbm90aWZpZWQgb25jZSBpdCBpcyBjb21wbGV0ZSBpZiBhbiBp
Y29uVVJMIGV4aXN0cworICAgIC8vIDIgLSBUaGUgaW5pdGlhbCB1cmwgaW1wb3J0IElTIGNvbXBs
ZXRlIGFuZCB0aGlzIHBhZ2VVUkwgaGFzIG5vIGljb24KKyAgICBpZiAoIXBhZ2VSZWNvcmQpIHsK
KyAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5nUmVhZGluZ0xvY2spOworCisgICAg
ICAgIC8vIEltcG9ydCBpcyBvbmdvaW5nLCB0aGVyZSBtaWdodCBiZSBhbiBpY29uLiBJbiB0aGlz
IGNhc2UsIHJlZ2lzdGVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGljb24gY29tZXMgaW4KKyAg
ICAgICAgLy8gSWYgd2UgZXZlciByZWFjaCB0aGlzIGNvbmRpdGlvbiwgd2Uga25vdyB3ZSd2ZSBh
bHJlYWR5IG1hZGUgdGhlIHBhZ2VVUkwgY29weQorICAgICAgICBpZiAoIW1faWNvblVSTEltcG9y
dENvbXBsZXRlKQorICAgICAgICAgICAgbV9wYWdlVVJMc0ludGVyZXN0ZWRJbkljb25zLmFkZChw
YWdlVVJMQ29weSk7CisKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgSWNv
blJlY29yZCogaWNvblJlY29yZCA9IHBhZ2VSZWNvcmQtPmljb25SZWNvcmQoKTsKKworICAgIC8v
IElmIHRoZSBpbml0aWFsIFVSTCBpbXBvcnQgaXNuJ3QgY29tcGxldGUsIGl0J3MgcG9zc2libGUg
dG8gaGF2ZSBhIFBhZ2VVUkwgcmVjb3JkIHdpdGhvdXQgYW4gYXNzb2NpYXRlZCBpY29uCisgICAg
Ly8gSW4gdGhpcyBjYXNlLCB0aGUgcGFnZVVSTCBpcyBhbHJlYWR5IGluIHRoZSBzZXQgdG8gYWxl
cnQgdGhlIGNsaWVudCB3aGVuIHRoZSBpY29uVVJMIG1hcHBpbmcgaXMgY29tcGxldGUgc28KKyAg
ICAvLyB3ZSBjYW4ganVzdCBiYWlsIG5vdworICAgIGlmICghbV9pY29uVVJMSW1wb3J0Q29tcGxl
dGUgJiYgIWljb25SZWNvcmQpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgLy8gQXNz
dW1pbmcgd2UncmUgZG9uZSBpbml0aWFsaXppbmcgYW5kIGNsZWFudXAgaXMgYWxsb3dlZCwKKyAg
ICAvLyB0aGUgb25seSB3YXkgd2Ugc2hvdWxkICpub3QqIGhhdmUgYW4gaWNvbiByZWNvcmQgaXMg
aWYgdGhpcyBwYWdlVVJMIGlzIHJldGFpbmVkIGJ1dCBoYXMgbm8gaWNvbiB5ZXQuCisgICAgQVNT
RVJUKGljb25SZWNvcmQgfHwgZGF0YWJhc2VDbGVhbnVwQ291bnRlciB8fCBtX3JldGFpbmVkUGFn
ZVVSTHMuY29udGFpbnMocGFnZVVSTE9yaWdpbmFsKSk7CisKKyAgICBpZiAoIWljb25SZWNvcmQp
CisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgLy8gSWYgaXQncyBhIG5ldyBJY29uUmVj
b3JkIG9iamVjdCB0aGF0IGRvZXNuJ3QgaGF2ZSBpdHMgaW1hZ2VEYXRhIHNldCB5ZXQsCisgICAg
Ly8gbWFyayBpdCB0byBiZSByZWFkIGJ5IHRoZSBiYWNrZ3JvdW5kIHRocmVhZAorICAgIGlmIChp
Y29uUmVjb3JkLT5pbWFnZURhdGFTdGF0dXMoKSA9PSBJY29uUmVjb3JkOjpJbWFnZURhdGFTdGF0
dXM6OlVua25vd24pIHsKKyAgICAgICAgaWYgKHBhZ2VVUkxDb3B5LmlzTnVsbCgpKQorICAgICAg
ICAgICAgcGFnZVVSTENvcHkgPSBwYWdlVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5KCk7CisKKyAg
ICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5nUmVhZGluZ0xvY2spOworICAgICAgICBt
X3BhZ2VVUkxzSW50ZXJlc3RlZEluSWNvbnMuYWRkKHBhZ2VVUkxDb3B5KTsKKyAgICAgICAgbV9p
Y29uc1BlbmRpbmdSZWFkaW5nLmFkZChpY29uUmVjb3JkKTsKKyAgICAgICAgd2FrZVN5bmNUaHJl
YWQoKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgLy8gSWYgdGhlIHNp
emUgcGFyYW1ldGVyIHdhcyAoMCwgMCkgdGhhdCBtZWFucyB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0
aG9kIGp1c3Qgd2FudGVkIHRoZSByZWFkIGZyb20gZGlzayB0byBiZSBraWNrZWQgb2ZmCisgICAg
Ly8gYW5kIGlzbid0IGFjdHVhbGx5IGludGVyZXN0ZWQgaW4gdGhlIGltYWdlIHJldHVybiB2YWx1
ZQorICAgIGlmIChzaXplID09IEludFNpemUoMCwgMCkpCisgICAgICAgIHJldHVybiBudWxscHRy
OworCisgICAgLy8gUEFSQU5PSUQgRElTQ1VTU0lPTjogVGhpcyBtZXRob2QgbWFrZXMgc29tZSBh
c3N1bXB0aW9ucy4gSXQgcmV0dXJucyBhIFdlYkNvcmU6OmltYWdlIHdoaWNoIHRoZSBpY29uIGRh
dGFiYXNlIG1pZ2h0IGRpc3Bvc2Ugb2YgYXQgYW55dGltZSBpbiB0aGUgZnV0dXJlLAorICAgIC8v
IGFuZCBJbWFnZXMgYXJlbid0IHJlZiBjb3VudGVkLiBTbyB0aGVyZSBpcyBubyB3YXkgZm9yIHRo
ZSBjbGllbnQgdG8gZ3VhcmFudGVlIGNvbnRpbnVlZCBleGlzdGVuY2Ugb2YgdGhlIGltYWdlLgor
ICAgIC8vIFRoaXMgaGFzICphbHdheXMqIGJlZW4gdGhlIGNhc2UsIGJ1dCBpbiBwcmFjdGljZSBj
bGllbnRzIHdvdWxkIGFsd2F5cyBjcmVhdGUgc29tZSBvdGhlciBwbGF0Zm9ybSBzcGVjaWZpYyBy
ZXByZXNlbnRhdGlvbiBvZiB0aGUgaW1hZ2UKKyAgICAvLyBhbmQgZHJvcCB0aGUgcmF3IEltYWdl
Ki4gT24gTWFjIGFuIE5TSW1hZ2UsIGFuZCBvbiB3aW5kb3dzIGRyYXdpbmcgaW50byBhbiBIQklU
TUFQLgorICAgIC8vIFRoZSBhc3luYyBhc3BlY3QgYWRkcyBhIGh1Z2UgcXVlc3Rpb24gLSB3aGF0
IGlmIHRoZSBpbWFnZSBpcyBkZWxldGVkIGJlZm9yZSB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgQVBJ
IGhhcyBhIGNoYW5jZSB0byBjcmVhdGUgaXRzIG93bgorICAgIC8vIHJlcHJlc2VudGF0aW9uIG91
dCBvZiBpdD8KKyAgICAvLyBJZiBhbiBpbWFnZSBpcyByZWFkIGluIGZyb20gdGhlIGljb25kYXRh
YmFzZSwgd2UgZG8gKm5vdCogb3ZlcndyaXRlIGFueSBpbWFnZSBkYXRhIHRoYXQgZXhpc3RzIGlu
IHRoZSBpbi1tZW1vcnkgY2FjaGUuCisgICAgLy8gVGhpcyBpcyBiZWNhdXNlIHdlIG1ha2UgdGhl
IGFzc3VtcHRpb24gdGhhdCBhbnl0aGluZyBpbiBtZW1vcnkgaXMgbmV3ZXIgdGhhbiB3aGF0ZXZl
ciBpcyBpbiB0aGUgZGF0YWJhc2UuCisgICAgLy8gU28gdGhlIG9ubHkgdGltZSB0aGUgZGF0YSB3
aWxsIGJlIHNldCBmcm9tIHRoZSBzZWNvbmQgdGhyZWFkIGlzIHdoZW4gaXQgaXMgSU5JVElBTExZ
IGJlaW5nIHJlYWQgaW4gZnJvbSB0aGUgZGF0YWJhc2UsIGJ1dCB3ZSB3b3VsZCBuZXZlcgorICAg
IC8vIGRlbGV0ZSB0aGUgaW1hZ2Ugb24gdGhlIHNlY29uZGFyeSB0aHJlYWQgaWYgdGhlIGltYWdl
IGFscmVhZHkgZXhpc3RzLgorICAgIHJldHVybiBpY29uUmVjb3JkLT5pbWFnZShzaXplKTsKK30K
KworU3RyaW5nIEljb25EYXRhYmFzZTo6c3luY2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTChjb25z
dCBTdHJpbmcmIHBhZ2VVUkxPcmlnaW5hbCkKK3sKKyAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFE
KCk7CisKKyAgICAvLyBDYW5ub3QgZG8gYW55dGhpbmcgd2l0aCBwYWdlVVJMT3JpZ2luYWwgdGhh
dCB3b3VsZCBlbmQgdXAgc3RvcmluZyBpdCB3aXRob3V0IGRlZXAgY29weWluZyBmaXJzdAorICAg
IC8vIEFsc28sIGluIHRoZSBjYXNlIHdlIGhhdmUgYSByZWFsIGFuc3dlciBmb3IgdGhlIGNhbGxl
ciwgd2UgbXVzdCBkZWVwIGNvcHkgdGhhdCBhcyB3ZWxsCisKKyAgICBpZiAoIWlzT3BlbigpIHx8
ICFkb2N1bWVudENhbkhhdmVJY29uKHBhZ2VVUkxPcmlnaW5hbCkpCisgICAgICAgIHJldHVybiBT
dHJpbmcoKTsKKworICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fdXJsQW5kSWNvbkxvY2spOworCisg
ICAgUGFnZVVSTFJlY29yZCogcGFnZVJlY29yZCA9IG1fcGFnZVVSTFRvUmVjb3JkTWFwLmdldChw
YWdlVVJMT3JpZ2luYWwpOworICAgIGlmICghcGFnZVJlY29yZCkKKyAgICAgICAgcGFnZVJlY29y
ZCA9IGdldE9yQ3JlYXRlUGFnZVVSTFJlY29yZChwYWdlVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5
KCkpOworCisgICAgLy8gSWYgcGFnZVJlY29yZCBpcyBudWxscHRyLCBvbmUgb2YgdHdvIHRoaW5n
cyBpcyB0cnVlIC0KKyAgICAvLyAxIC0gVGhlIGluaXRpYWwgdXJsIGltcG9ydCBpcyBpbmNvbXBs
ZXRlIGFuZCB0aGlzIHBhZ2VVUkwgaGFzIGFscmVhZHkgYmVlbiBtYXJrZWQgdG8gYmUgbm90aWZp
ZWQgb25jZSBpdCBpcyBjb21wbGV0ZSBpZiBhbiBpY29uVVJMIGV4aXN0cworICAgIC8vIDIgLSBU
aGUgaW5pdGlhbCB1cmwgaW1wb3J0IElTIGNvbXBsZXRlIGFuZCB0aGlzIHBhZ2VVUkwgaGFzIG5v
IGljb24KKyAgICBpZiAoIXBhZ2VSZWNvcmQpCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKwor
ICAgIC8vIFBvc3NpYmxlIHRoZSBwYWdlUmVjb3JkIGlzIGFyb3VuZCBiZWNhdXNlIGl0J3MgYSBy
ZXRhaW5lZCBwYWdlVVJMIHdpdGggbm8gaWNvblVSTCwgc28gd2UgaGF2ZSB0byBjaGVjaworICAg
IHJldHVybiBwYWdlUmVjb3JkLT5pY29uUmVjb3JkKCkgPyBwYWdlUmVjb3JkLT5pY29uUmVjb3Jk
KCktPmljb25VUkwoKS5pc29sYXRlZENvcHkoKSA6IFN0cmluZygpOworfQorCit2b2lkIEljb25E
YXRhYmFzZTo6cmV0YWluSWNvbkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJiBwYWdlVVJMKQorewor
ICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKKworICAgIGlmICghaXNFbmFibGVkKCkgfHwg
IWRvY3VtZW50Q2FuSGF2ZUljb24ocGFnZVVSTCkpCisgICAgICAgIHJldHVybjsKKworICAgIHsK
KyAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV91cmxzVG9SZXRhaW5PclJlbGVhc2VMb2NrKTsK
KyAgICAgICAgbV91cmxzVG9SZXRhaW4uYWRkKHBhZ2VVUkwuaXNvbGF0ZWRDb3B5KCkpOworICAg
ICAgICBtX3JldGFpbk9yUmVsZWFzZUljb25SZXF1ZXN0ZWQgPSB0cnVlOworICAgIH0KKworICAg
IHNjaGVkdWxlT3JEZWZlclN5bmNUaW1lcigpOworfQorCit2b2lkIEljb25EYXRhYmFzZTo6cGVy
Zm9ybVJldGFpbkljb25Gb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYgcGFnZVVSTE9yaWdpbmFsLCBp
bnQgcmV0YWluQ291bnQpCit7CisgICAgUGFnZVVSTFJlY29yZCogcmVjb3JkID0gbV9wYWdlVVJM
VG9SZWNvcmRNYXAuZ2V0KHBhZ2VVUkxPcmlnaW5hbCk7CisKKyAgICBTdHJpbmcgcGFnZVVSTDsK
KworICAgIGlmICghcmVjb3JkKSB7CisgICAgICAgIHBhZ2VVUkwgPSBwYWdlVVJMT3JpZ2luYWwu
aXNvbGF0ZWRDb3B5KCk7CisKKyAgICAgICAgcmVjb3JkID0gbmV3IFBhZ2VVUkxSZWNvcmQocGFn
ZVVSTCk7CisgICAgICAgIG1fcGFnZVVSTFRvUmVjb3JkTWFwLnNldChwYWdlVVJMLCByZWNvcmQp
OworICAgIH0KKworICAgIGlmICghcmVjb3JkLT5yZXRhaW4ocmV0YWluQ291bnQpKSB7CisgICAg
ICAgIGlmIChwYWdlVVJMLmlzTnVsbCgpKQorICAgICAgICAgICAgcGFnZVVSTCA9IHBhZ2VVUkxP
cmlnaW5hbC5pc29sYXRlZENvcHkoKTsKKworICAgICAgICAvLyBUaGlzIHBhZ2UganVzdCBoYWQg
aXRzIHJldGFpbiBjb3VudCBidW1wZWQgZnJvbSAwIHRvIDEgLSBSZWNvcmQgdGhhdCBmYWN0Cisg
ICAgICAgIG1fcmV0YWluZWRQYWdlVVJMcy5hZGQocGFnZVVSTCk7CisKKyAgICAgICAgLy8gSWYg
d2UgcmVhZCB0aGUgaWNvblVSTHMgeWV0LCB3ZSB3YW50IHRvIGF2b2lkIGFueSBwYWdlVVJMLT5p
Y29uVVJMIGxvb2t1cHMgYW5kIHRoZSBwYWdlVVJMc1BlbmRpbmdEZWxldGlvbiBpcyBtb290LAor
ICAgICAgICAvLyBzbyB3ZSBiYWlsIGhlcmUgYW5kIHNraXAgdGhvc2Ugc3RlcHMKKyAgICAgICAg
aWYgKCFtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAg
ICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdTeW5jTG9jayk7CisgICAgICAgIC8vIElm
IHRoaXMgcGFnZVVSTCB3YWl0aW5nIHRvIGJlIHN5bmMnZWQsIHVwZGF0ZSB0aGUgc3luYyByZWNv
cmQKKyAgICAgICAgLy8gVGhpcyBzYXZlcyB1cyBpbiB0aGUgY2FzZSB3aGVyZSBhIHBhZ2Ugd2Fz
IHJlYWR5IHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnV0IHdhcyBqdXN0IHJldGFp
bmVkIC0gc28gdGhlcmVzIG5vIG5lZWQgdG8gZGVsZXRlIGl0IQorICAgICAgICBpZiAoIW1fcHJp
dmF0ZUJyb3dzaW5nRW5hYmxlZCAmJiBtX3BhZ2VVUkxzUGVuZGluZ1N5bmMuY29udGFpbnMocGFn
ZVVSTCkpIHsKKyAgICAgICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJCcmluZ2luZyAlcyBiYWNr
IGZyb20gdGhlIGJyaW5rIiwgcGFnZVVSTC5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBt
X3BhZ2VVUkxzUGVuZGluZ1N5bmMuc2V0KHBhZ2VVUkwsIHJlY29yZC0+c25hcHNob3QoKSk7Cisg
ICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpyZWxlYXNlSWNvbkZvclBh
Z2VVUkwoY29uc3QgU3RyaW5nJiBwYWdlVVJMKQoreworICAgIEFTU0VSVF9OT1RfU1lOQ19USFJF
QUQoKTsKKworICAgIC8vIENhbm5vdCBkbyBhbnl0aGluZyB3aXRoIHBhZ2VVUkxPcmlnaW5hbCB0
aGF0IHdvdWxkIGVuZCB1cCBzdG9yaW5nIGl0IHdpdGhvdXQgZGVlcCBjb3B5aW5nIGZpcnN0CisK
KyAgICBpZiAoIWlzRW5hYmxlZCgpIHx8ICFkb2N1bWVudENhbkhhdmVJY29uKHBhZ2VVUkwpKQor
ICAgICAgICByZXR1cm47CisKKyAgICB7CisgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fdXJs
c1RvUmV0YWluT3JSZWxlYXNlTG9jayk7CisgICAgICAgIG1fdXJsc1RvUmVsZWFzZS5hZGQocGFn
ZVVSTC5pc29sYXRlZENvcHkoKSk7CisgICAgICAgIG1fcmV0YWluT3JSZWxlYXNlSWNvblJlcXVl
c3RlZCA9IHRydWU7CisgICAgfQorICAgIHNjaGVkdWxlT3JEZWZlclN5bmNUaW1lcigpOworfQor
Cit2b2lkIEljb25EYXRhYmFzZTo6cGVyZm9ybVJlbGVhc2VJY29uRm9yUGFnZVVSTChjb25zdCBT
dHJpbmcmIHBhZ2VVUkxPcmlnaW5hbCwgaW50IHJlbGVhc2VDb3VudCkKK3sKKyAgICAvLyBDaGVj
ayBpZiB0aGlzIHBhZ2VVUkwgaXMgYWN0dWFsbHkgcmV0YWluZWQKKyAgICBpZiAoIW1fcmV0YWlu
ZWRQYWdlVVJMcy5jb250YWlucyhwYWdlVVJMT3JpZ2luYWwpKSB7CisgICAgICAgIExPR19FUlJP
UigiQXR0ZW1wdGluZyB0byByZWxlYXNlIGljb24gZm9yIFVSTCAlcyB3aGljaCBpcyBub3QgcmV0
YWluZWQiLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkxPcmlnaW5hbCkuYXNjaWkoKS5kYXRhKCkpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gR2V0IGl0cyByZXRhaW4gY291bnQgLSBp
ZiBpdCdzIHJldGFpbmVkLCB3ZSdkIGJldHRlciBoYXZlIGEgUGFnZVVSTFJlY29yZCBmb3IgaXQK
KyAgICBQYWdlVVJMUmVjb3JkKiBwYWdlUmVjb3JkID0gbV9wYWdlVVJMVG9SZWNvcmRNYXAuZ2V0
KHBhZ2VVUkxPcmlnaW5hbCk7CisgICAgQVNTRVJUKHBhZ2VSZWNvcmQpOworICAgIExPRyhJY29u
RGF0YWJhc2UsICJSZWxlYXNpbmcgcGFnZVVSTCAlcyB0byBhIHJldGFpbiBjb3VudCBvZiAlaSIs
IHVybEZvckxvZ2dpbmcocGFnZVVSTE9yaWdpbmFsKS5hc2NpaSgpLmRhdGEoKSwgcGFnZVJlY29y
ZC0+cmV0YWluQ291bnQoKSAtIDEpOworICAgIEFTU0VSVChwYWdlUmVjb3JkLT5yZXRhaW5Db3Vu
dCgpID4gMCk7CisKKyAgICAvLyBJZiBpdCBzdGlsbCBoYXMgYSBwb3NpdGl2ZSByZXRhaW4gY291
bnQsIHN0b3JlIHRoZSBuZXcgY291bnQgYW5kIGJhaWwKKyAgICBpZiAocGFnZVJlY29yZC0+cmVs
ZWFzZShyZWxlYXNlQ291bnQpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGlzIHBhZ2VS
ZWNvcmQgaGFzIG5vdyBiZWVuIGZ1bGx5IHJlbGVhc2VkLiBEbyB0aGUgYXBwcm9wcmlhdGUgY2xl
YW51cAorICAgIExPRyhJY29uRGF0YWJhc2UsICJObyBtb3JlIHJldGFpbmVycyBmb3IgUGFnZVVS
TCAlcyIsIHVybEZvckxvZ2dpbmcocGFnZVVSTE9yaWdpbmFsKS5hc2NpaSgpLmRhdGEoKSk7Cisg
ICAgbV9wYWdlVVJMVG9SZWNvcmRNYXAucmVtb3ZlKHBhZ2VVUkxPcmlnaW5hbCk7CisgICAgbV9y
ZXRhaW5lZFBhZ2VVUkxzLnJlbW92ZShwYWdlVVJMT3JpZ2luYWwpOworCisgICAgLy8gR3JhYiB0
aGUgaWNvblJlY29yZCBmb3IgbGF0ZXIgdXNlIChhbmQgZG8gYSBzYW5pdHkgY2hlY2sgb24gaXQg
Zm9yIGtpY2tzKQorICAgIEljb25SZWNvcmQqIGljb25SZWNvcmQgPSBwYWdlUmVjb3JkLT5pY29u
UmVjb3JkKCk7CisKKyAgICBBU1NFUlQoIWljb25SZWNvcmQgfHwgKGljb25SZWNvcmQgJiYgbV9p
Y29uVVJMVG9SZWNvcmRNYXAuZ2V0KGljb25SZWNvcmQtPmljb25VUkwoKSkgPT0gaWNvblJlY29y
ZCkpOworCisgICAgeworICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdSZWFkaW5n
TG9jayk7CisKKyAgICAgICAgLy8gU2luY2UgdGhpcyBwYWdlVVJMIGlzIGdvaW5nIGF3YXksIHRo
ZXJlJ3Mgbm8gcmVhc29uIGFueW9uZSB3b3VsZCBldmVyIGJlIGludGVyZXN0ZWQgaW4gaXRzIHJl
YWQgcmVzdWx0cworICAgICAgICBpZiAoIW1faWNvblVSTEltcG9ydENvbXBsZXRlKQorICAgICAg
ICAgICAgbV9wYWdlVVJMc1BlbmRpbmdJbXBvcnQucmVtb3ZlKHBhZ2VVUkxPcmlnaW5hbCk7Cisg
ICAgICAgIG1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29ucy5yZW1vdmUocGFnZVVSTE9yaWdpbmFs
KTsKKworICAgICAgICAvLyBJZiB0aGlzIGljb24gaXMgZG93biB0byBpdCdzIGxhc3QgcmV0YWlu
ZXIsIHdlIGRvbid0IGNhcmUgYWJvdXQgcmVhZGluZyBpdCBpbiBmcm9tIGRpc2sgYW55bW9yZQor
ICAgICAgICBpZiAoaWNvblJlY29yZCAmJiBpY29uUmVjb3JkLT5oYXNPbmVSZWYoKSkgeworICAg
ICAgICAgICAgbV9pY29uVVJMVG9SZWNvcmRNYXAucmVtb3ZlKGljb25SZWNvcmQtPmljb25VUkwo
KSk7CisgICAgICAgICAgICBtX2ljb25zUGVuZGluZ1JlYWRpbmcucmVtb3ZlKGljb25SZWNvcmQp
OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTWFyayBzdHVmZiBmb3IgZGVsZXRpb24gZnJv
bSB0aGUgZGF0YWJhc2Ugb25seSBpZiB3ZSdyZSBub3QgaW4gcHJpdmF0ZSBicm93c2luZworICAg
IGlmICghbV9wcml2YXRlQnJvd3NpbmdFbmFibGVkKSB7CisgICAgICAgIExvY2tIb2xkZXIgbG9j
a2VyKG1fcGVuZGluZ1N5bmNMb2NrKTsKKyAgICAgICAgbV9wYWdlVVJMc1BlbmRpbmdTeW5jLnNl
dChwYWdlVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5KCksIHBhZ2VSZWNvcmQtPnNuYXBzaG90KHRy
dWUpKTsKKworICAgICAgICAvLyBJZiB0aGlzIHBhZ2UgaXMgdGhlIGxhc3QgcGFnZSB0byByZWZl
ciB0byBhIHBhcnRpY3VsYXIgSWNvblJlY29yZCwgdGhhdCBJY29uUmVjb3JkIG5lZWRzIHRvCisg
ICAgICAgIC8vIGJlIG1hcmtlZCBmb3IgZGVsZXRpb24KKyAgICAgICAgaWYgKGljb25SZWNvcmQg
JiYgaWNvblJlY29yZC0+aGFzT25lUmVmKCkpCisgICAgICAgICAgICBtX2ljb25zUGVuZGluZ1N5
bmMuc2V0KGljb25SZWNvcmQtPmljb25VUkwoKSwgaWNvblJlY29yZC0+c25hcHNob3QodHJ1ZSkp
OworICAgIH0KKworICAgIGRlbGV0ZSBwYWdlUmVjb3JkOworfQorCit2b2lkIEljb25EYXRhYmFz
ZTo6c2V0SWNvbkRhdGFGb3JJY29uVVJMKFJlZlB0cjxTaGFyZWRCdWZmZXI+JiYgZGF0YSwgY29u
c3QgU3RyaW5nJiBpY29uVVJMT3JpZ2luYWwpCit7CisgICAgQVNTRVJUX05PVF9TWU5DX1RIUkVB
RCgpOworCisgICAgLy8gQ2Fubm90IGRvIGFueXRoaW5nIHdpdGggaWNvblVSTE9yaWdpbmFsIHRo
YXQgd291bGQgZW5kIHVwIHN0b3JpbmcgdGhlbSB3aXRob3V0IGRlZXAgY29weWluZyBmaXJzdAor
CisgICAgaWYgKCFpc09wZW4oKSB8fCBpY29uVVJMT3JpZ2luYWwuaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBTdHJpbmcgaWNvblVSTCA9IGljb25VUkxPcmlnaW5hbC5pc29sYXRl
ZENvcHkoKTsKKyAgICBWZWN0b3I8U3RyaW5nPiBwYWdlVVJMczsKKyAgICB7CisgICAgICAgIExv
Y2tIb2xkZXIgbG9ja2VyKG1fdXJsQW5kSWNvbkxvY2spOworCisgICAgICAgIC8vIElmIHRoaXMg
aWNvbiB3YXMgcGVuZGluZyBhIHJlYWQsIHJlbW92ZSBpdCBmcm9tIHRoYXQgc2V0IGJlY2F1c2Ug
dGhpcyBuZXcgZGF0YSBzaG91bGQgb3ZlcnJpZGUgd2hhdCBpcyBvbiBkaXNrCisgICAgICAgIFJl
ZlB0cjxJY29uUmVjb3JkPiBpY29uID0gbV9pY29uVVJMVG9SZWNvcmRNYXAuZ2V0KGljb25VUkwp
OworICAgICAgICBpZiAoaWNvbikgeworICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9w
ZW5kaW5nUmVhZGluZ0xvY2spOworICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdSZWFkaW5nLnJl
bW92ZShpY29uLmdldCgpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpY29uID0gZ2V0
T3JDcmVhdGVJY29uUmVjb3JkKGljb25VUkwpOworCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgZGF0
YSBhbmQgc2V0IHRoZSB0aW1lIHN0YW1wCisgICAgICAgIGljb24tPnNldEltYWdlRGF0YShXVEZN
b3ZlKGRhdGEpKTsKKyAgICAgICAgaWNvbi0+c2V0VGltZXN0YW1wKChpbnQpY3VycmVudFRpbWUo
KSk7CisKKyAgICAgICAgLy8gQ29weSB0aGUgY3VycmVudCByZXRhaW5pbmcgcGFnZVVSTHMgLSBp
ZiBhbnkgLSB0byBub3RpZnkgdGhlbSBvZiB0aGUgY2hhbmdlCisgICAgICAgIHBhZ2VVUkxzLmFw
cGVuZFJhbmdlKGljb24tPnJldGFpbmluZ1BhZ2VVUkxzKCkuYmVnaW4oKSwgaWNvbi0+cmV0YWlu
aW5nUGFnZVVSTHMoKS5lbmQoKSk7CisKKyAgICAgICAgLy8gTWFyayB0aGUgSWNvblJlY29yZCBh
cyByZXF1aXJpbmcgYW4gdXBkYXRlIHRvIHRoZSBkYXRhYmFzZSBvbmx5IGlmIHByaXZhdGUgYnJv
d3NpbmcgaXMgZGlzYWJsZWQKKyAgICAgICAgaWYgKCFtX3ByaXZhdGVCcm93c2luZ0VuYWJsZWQp
IHsKKyAgICAgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1N5bmNMb2NrKTsKKyAg
ICAgICAgICAgIG1faWNvbnNQZW5kaW5nU3luYy5zZXQoaWNvblVSTCwgaWNvbi0+c25hcHNob3Qo
KSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaWNvbi0+aGFzT25lUmVmKCkpIHsKKyAgICAg
ICAgICAgIEFTU0VSVChpY29uLT5yZXRhaW5pbmdQYWdlVVJMcygpLmlzRW1wdHkoKSk7CisgICAg
ICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiSWNvbiBmb3IgaWNvbiB1cmwgJXMgaXMgYWJvdXQg
dG8gYmUgZGVzdHJveWVkIC0gcmVtb3ZpbmcgbWFwcGluZyBmb3IgaXQiLCB1cmxGb3JMb2dnaW5n
KGljb24tPmljb25VUkwoKSkuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgbV9pY29uVVJM
VG9SZWNvcmRNYXAucmVtb3ZlKGljb24tPmljb25VUkwoKSk7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICAvLyBTZW5kIG5vdGlmaWNhdGlvbiBvdXQgcmVnYXJkaW5nIGFsbCBQYWdlVVJMcyB0aGF0
IHJldGFpbiB0aGlzIGljb24KKyAgICAvLyBCdXQgbm90IGlmIHdlJ3JlIG9uIHRoZSBzeW5jIHRo
cmVhZCBiZWNhdXNlIHRoYXQgaW1wbGllcyB0aGlzIG1hcHBpbmcKKyAgICAvLyBjb21lcyBmcm9t
IHRoZSBpbml0aWFsIGltcG9ydCB3aGljaCB3ZSBkb24ndCB3YW50IG5vdGlmaWNhdGlvbnMgZm9y
CisgICAgaWYgKCFJU19JQ09OX1NZTkNfVEhSRUFEKCkpIHsKKyAgICAgICAgLy8gU3RhcnQgdGhl
IHRpbWVyIHRvIGNvbW1pdCB0aGlzIGNoYW5nZSAtIG9yIGZ1cnRoZXIgZGVsYXkgdGhlIHRpbWVy
IGlmIGl0IHdhcyBhbHJlYWR5IHN0YXJ0ZWQKKyAgICAgICAgc2NoZWR1bGVPckRlZmVyU3luY1Rp
bWVyKCk7CisKKyAgICAgICAgZm9yIChhdXRvJiBwYWdlVVJMIDogcGFnZVVSTHMpIHsKKyAgICAg
ICAgICAgIEF1dG9kcmFpbmVkUG9vbCBwb29sOworCisgICAgICAgICAgICBMT0coSWNvbkRhdGFi
YXNlLCAiRGlzcGF0Y2hpbmcgbm90aWZpY2F0aW9uIHRoYXQgcmV0YWluaW5nIHBhZ2VVUkwgJXMg
aGFzIGEgbmV3IGljb24iLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkwpLmFzY2lpKCkuZGF0YSgpKTsK
KyAgICAgICAgICAgIG1fY2xpZW50LT5kaWRDaGFuZ2VJY29uRm9yUGFnZVVSTChwYWdlVVJMKTsK
KyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBJY29uRGF0YWJhc2U6OnNldEljb25VUkxGb3JQ
YWdlVVJMKGNvbnN0IFN0cmluZyYgaWNvblVSTE9yaWdpbmFsLCBjb25zdCBTdHJpbmcmIHBhZ2VV
UkxPcmlnaW5hbCkKK3sKKyAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7CisKKyAgICAvLyBD
YW5ub3QgZG8gYW55dGhpbmcgd2l0aCBpY29uVVJMT3JpZ2luYWwgb3IgcGFnZVVSTE9yaWdpbmFs
IHRoYXQgd291bGQgZW5kIHVwIHN0b3JpbmcgdGhlbSB3aXRob3V0IGRlZXAgY29weWluZyBmaXJz
dAorCisgICAgQVNTRVJUKCFpY29uVVJMT3JpZ2luYWwuaXNFbXB0eSgpKTsKKworICAgIGlmICgh
aXNPcGVuKCkgfHwgIWRvY3VtZW50Q2FuSGF2ZUljb24ocGFnZVVSTE9yaWdpbmFsKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgU3RyaW5nIGljb25VUkwsIHBhZ2VVUkw7CisgICAgeworICAgICAg
ICBMb2NrSG9sZGVyIGxvY2tlcihtX3VybEFuZEljb25Mb2NrKTsKKworICAgICAgICBQYWdlVVJM
UmVjb3JkKiBwYWdlUmVjb3JkID0gbV9wYWdlVVJMVG9SZWNvcmRNYXAuZ2V0KHBhZ2VVUkxPcmln
aW5hbCk7CisKKyAgICAgICAgLy8gSWYgdGhlIHVybHMgYWxyZWFkeSBtYXAgdG8gZWFjaCBvdGhl
ciwgYmFpbC4KKyAgICAgICAgLy8gVGhpcyBoYXBwZW5zIHN1cnByaXNpbmdseSBvZnRlbiwgYW5k
IHNlZW1zIHRvIGNyZWFtIGlCZW5jaCBwZXJmb3JtYW5jZQorICAgICAgICBpZiAocGFnZVJlY29y
ZCAmJiBwYWdlUmVjb3JkLT5pY29uUmVjb3JkKCkgJiYgcGFnZVJlY29yZC0+aWNvblJlY29yZCgp
LT5pY29uVVJMKCkgPT0gaWNvblVSTE9yaWdpbmFsKQorICAgICAgICAgICAgcmV0dXJuOworCisg
ICAgICAgIHBhZ2VVUkwgPSBwYWdlVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5KCk7CisgICAgICAg
IGljb25VUkwgPSBpY29uVVJMT3JpZ2luYWwuaXNvbGF0ZWRDb3B5KCk7CisKKyAgICAgICAgaWYg
KCFwYWdlUmVjb3JkKSB7CisgICAgICAgICAgICBwYWdlUmVjb3JkID0gbmV3IFBhZ2VVUkxSZWNv
cmQocGFnZVVSTCk7CisgICAgICAgICAgICBtX3BhZ2VVUkxUb1JlY29yZE1hcC5zZXQocGFnZVVS
TCwgcGFnZVJlY29yZCk7CisgICAgICAgIH0KKworICAgICAgICBSZWZQdHI8SWNvblJlY29yZD4g
aWNvblJlY29yZCA9IHBhZ2VSZWNvcmQtPmljb25SZWNvcmQoKTsKKworICAgICAgICAvLyBPdGhl
cndpc2UsIHNldCB0aGUgbmV3IGljb24gcmVjb3JkIGZvciB0aGlzIHBhZ2UKKyAgICAgICAgcGFn
ZVJlY29yZC0+c2V0SWNvblJlY29yZChnZXRPckNyZWF0ZUljb25SZWNvcmQoaWNvblVSTCkpOwor
CisgICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGljb24gaGFzIG9ubHkgYSBzaW5nbGUgcmVmIGxl
ZnQsIGl0IGlzIGFib3V0IHRvIGdldCB3aXBlZCBvdXQuCisgICAgICAgIC8vIFJlbW92ZSBpdCBm
cm9tIHRoZSBpbi1tZW1vcnkgcmVjb3JkcyBhbmQgZG9uJ3QgYm90aGVyIHJlYWRpbmcgaXQgaW4g
ZnJvbSBkaXNrIGFueW1vcmUKKyAgICAgICAgaWYgKGljb25SZWNvcmQgJiYgaWNvblJlY29yZC0+
aGFzT25lUmVmKCkpIHsKKyAgICAgICAgICAgIEFTU0VSVCghaWNvblJlY29yZC0+cmV0YWluaW5n
UGFnZVVSTHMoKS5zaXplKCkpOworICAgICAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIkljb24g
Zm9yIGljb24gdXJsICVzIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZCAtIHJlbW92aW5nIG1hcHBp
bmcgZm9yIGl0IiwgdXJsRm9yTG9nZ2luZyhpY29uUmVjb3JkLT5pY29uVVJMKCkpLmFzY2lpKCku
ZGF0YSgpKTsKKyAgICAgICAgICAgIG1faWNvblVSTFRvUmVjb3JkTWFwLnJlbW92ZShpY29uUmVj
b3JkLT5pY29uVVJMKCkpOworICAgICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9wZW5kaW5n
UmVhZGluZ0xvY2spOworICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdSZWFkaW5nLnJlbW92ZShp
Y29uUmVjb3JkLmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFuZCBtYXJrIHRoaXMg
bWFwcGluZyB0byBiZSBhZGRlZCB0byB0aGUgZGF0YWJhc2UKKyAgICAgICAgaWYgKCFtX3ByaXZh
dGVCcm93c2luZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVu
ZGluZ1N5bmNMb2NrKTsKKyAgICAgICAgICAgIG1fcGFnZVVSTHNQZW5kaW5nU3luYy5zZXQocGFn
ZVVSTCwgcGFnZVJlY29yZC0+c25hcHNob3QoKSk7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBp
Y29uIGlzIG9uIGl0cyBsYXN0IHJlZiwgbWFyayBpdCBmb3IgZGVsZXRpb24KKyAgICAgICAgICAg
IGlmIChpY29uUmVjb3JkICYmIGljb25SZWNvcmQtPmhhc09uZVJlZigpKQorICAgICAgICAgICAg
ICAgIG1faWNvbnNQZW5kaW5nU3luYy5zZXQoaWNvblJlY29yZC0+aWNvblVSTCgpLCBpY29uUmVj
b3JkLT5zbmFwc2hvdCh0cnVlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTaW5jZSB0
aGlzIG1hcHBpbmcgaXMgbmV3LCBzZW5kIHRoZSBub3RpZmljYXRpb24gb3V0IC0gYnV0IG5vdCBp
ZiB3ZSdyZSBvbiB0aGUgc3luYyB0aHJlYWQgYmVjYXVzZSB0aGF0IGltcGxpZXMgdGhpcyBtYXBw
aW5nCisgICAgLy8gY29tZXMgZnJvbSB0aGUgaW5pdGlhbCBpbXBvcnQgd2hpY2ggd2UgZG9uJ3Qg
d2FudCBub3RpZmljYXRpb25zIGZvcgorICAgIGlmICghSVNfSUNPTl9TWU5DX1RIUkVBRCgpKSB7
CisgICAgICAgIC8vIFN0YXJ0IHRoZSB0aW1lciB0byBjb21taXQgdGhpcyBjaGFuZ2UgLSBvciBm
dXJ0aGVyIGRlbGF5IHRoZSB0aW1lciBpZiBpdCB3YXMgYWxyZWFkeSBzdGFydGVkCisgICAgICAg
IHNjaGVkdWxlT3JEZWZlclN5bmNUaW1lcigpOworCisgICAgICAgIExPRyhJY29uRGF0YWJhc2Us
ICJEaXNwYXRjaGluZyBub3RpZmljYXRpb24gdGhhdCB3ZSBjaGFuZ2VkIGFuIGljb24gbWFwcGlu
ZyBmb3IgdXJsICVzIiwgdXJsRm9yTG9nZ2luZyhwYWdlVVJMKS5hc2NpaSgpLmRhdGEoKSk7Cisg
ICAgICAgIEF1dG9kcmFpbmVkUG9vbCBwb29sOworICAgICAgICBtX2NsaWVudC0+ZGlkQ2hhbmdl
SWNvbkZvclBhZ2VVUkwocGFnZVVSTCk7CisgICAgfQorfQorCitJY29uRGF0YWJhc2U6Okljb25M
b2FkRGVjaXNpb24gSWNvbkRhdGFiYXNlOjpzeW5jaHJvbm91c0xvYWREZWNpc2lvbkZvckljb25V
UkwoY29uc3QgU3RyaW5nJiBpY29uVVJMKQoreworICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQo
KTsKKworICAgIGlmICghaXNPcGVuKCkgfHwgaWNvblVSTC5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybiBJY29uTG9hZERlY2lzaW9uOjpObzsKKworICAgIC8vIElmIHdlIGhhdmUgYSBJY29uUmVj
b3JkLCBpdCBzaG91bGQgYWxzbyBoYXZlIGl0cyB0aW1lU3RhbXAgbWFya2VkIGJlY2F1c2UgdGhl
cmUgaXMgb25seSB0d28gdGltZXMgd2hlbiB3ZSBjcmVhdGUgdGhlIEljb25SZWNvcmQ6CisgICAg
Ly8gMSAtIFdoZW4gd2UgcmVhZCB0aGUgaWNvbiB1cmxzIGZyb20gZGlzaywgZ2V0dGluZyB0aGUg
dGltZVN0YW1wIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAvLyAyIC0gV2hlbiB3ZSBnZXQgYSBuZXcg
aWNvbiBmcm9tIHRoZSBsb2FkZXIsIGluIHdoaWNoIGNhc2UgdGhlIHRpbWVzdGFtcCBpcyBzZXQg
YXQgdGhhdCB0aW1lCisgICAgeworICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3VybEFuZElj
b25Mb2NrKTsKKyAgICAgICAgaWYgKEljb25SZWNvcmQqIGljb24gPSBtX2ljb25VUkxUb1JlY29y
ZE1hcC5nZXQoaWNvblVSTCkpIHsKKyAgICAgICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJGb3Vu
ZCBleHBpcmF0aW9uIHRpbWUgb24gYSBwcmVzZW50IGljb24gYmFzZWQgb24gZXhpc3RpbmcgSWNv
blJlY29yZCIpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oY3VycmVudFRp
bWUoKSkgLSBzdGF0aWNfY2FzdDxpbnQ+KGljb24tPmdldFRpbWVzdGFtcCgpKSA+IGljb25FeHBp
cmF0aW9uVGltZSA/IEljb25Mb2FkRGVjaXNpb246OlllcyA6IEljb25Mb2FkRGVjaXNpb246Ok5v
OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHJlY29yZCBm
b3IgaXQsIGJ1dCB3ZSAqaGF2ZSogaW1wb3J0ZWQgYWxsIGljb25VUkxzIGZyb20gZGlzaywgdGhl
biB3ZSBzaG91bGQgbG9hZCBpdCBub3cKKyAgICBMb2NrSG9sZGVyIHJlYWRpbmdMb2NrZXIobV9w
ZW5kaW5nUmVhZGluZ0xvY2spOworICAgIGlmIChtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSkKKyAg
ICAgICAgcmV0dXJuIEljb25Mb2FkRGVjaXNpb246OlllczsKKworICAgIC8vIE90aGVyd2lzZSAt
IHNpbmNlIHdlIHJlZnVzZSB0byBwZXJmb3JtIEkvTyBvbiB0aGUgbWFpbiB0aHJlYWQgdG8gZmlu
ZCBvdXQgZm9yIHN1cmUgLSB3ZSByZXR1cm4gdGhlIGFuc3dlciB0aGF0IHNheXMKKyAgICAvLyAi
WW91IG1pZ2h0IGJlIGFza2VkIHRvIGxvYWQgdGhpcyBsYXRlciwgc28gZmxhZyB0aGF0IgorICAg
IHJldHVybiBJY29uTG9hZERlY2lzaW9uOjpVbmtub3duOworfQorCitib29sIEljb25EYXRhYmFz
ZTo6c3luY2hyb25vdXNJY29uRGF0YUtub3duRm9ySWNvblVSTChjb25zdCBTdHJpbmcmIGljb25V
UkwpCit7CisgICAgQVNTRVJUX05PVF9TWU5DX1RIUkVBRCgpOworCisgICAgTG9ja0hvbGRlciBs
b2NrZXIobV91cmxBbmRJY29uTG9jayk7CisgICAgaWYgKEljb25SZWNvcmQqIGljb24gPSBtX2lj
b25VUkxUb1JlY29yZE1hcC5nZXQoaWNvblVSTCkpCisgICAgICAgIHJldHVybiBpY29uLT5pbWFn
ZURhdGFTdGF0dXMoKSAhPSBJY29uUmVjb3JkOjpJbWFnZURhdGFTdGF0dXM6OlVua25vd247CisK
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpzZXRFbmFibGVkKGJv
b2wgZW5hYmxlZCkKK3sKKyAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7CisKKyAgICBpZiAo
IWVuYWJsZWQgJiYgaXNPcGVuKCkpCisgICAgICAgIGNsb3NlKCk7CisgICAgbV9pc0VuYWJsZWQg
PSBlbmFibGVkOworfQorCitib29sIEljb25EYXRhYmFzZTo6aXNFbmFibGVkKCkgY29uc3QKK3sK
KyAgICBBU1NFUlRfTk9UX1NZTkNfVEhSRUFEKCk7CisKKyAgICByZXR1cm4gbV9pc0VuYWJsZWQ7
Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpzZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKGJvb2wg
ZmxhZykKK3sKKyAgICBtX3ByaXZhdGVCcm93c2luZ0VuYWJsZWQgPSBmbGFnOworfQorCitib29s
IEljb25EYXRhYmFzZTo6aXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9wcml2YXRlQnJvd3NpbmdFbmFibGVkOworfQorCit2b2lkIEljb25EYXRhYmFzZTo6
ZGVsYXlEYXRhYmFzZUNsZWFudXAoKQoreworICAgICsrZGF0YWJhc2VDbGVhbnVwQ291bnRlcjsK
KyAgICBpZiAoZGF0YWJhc2VDbGVhbnVwQ291bnRlciA9PSAxKQorICAgICAgICBMT0coSWNvbkRh
dGFiYXNlLCAiRGF0YWJhc2UgY2xlYW51cCBpcyBub3cgRElTQUJMRUQiKTsKK30KKwordm9pZCBJ
Y29uRGF0YWJhc2U6OmFsbG93RGF0YWJhc2VDbGVhbnVwKCkKK3sKKyAgICBpZiAoLS1kYXRhYmFz
ZUNsZWFudXBDb3VudGVyIDwgMCkKKyAgICAgICAgZGF0YWJhc2VDbGVhbnVwQ291bnRlciA9IDA7
CisgICAgaWYgKCFkYXRhYmFzZUNsZWFudXBDb3VudGVyKQorICAgICAgICBMT0coSWNvbkRhdGFi
YXNlLCAiRGF0YWJhc2UgY2xlYW51cCBpcyBub3cgRU5BQkxFRCIpOworfQorCit2b2lkIEljb25E
YXRhYmFzZTo6Y2hlY2tJbnRlZ3JpdHlCZWZvcmVPcGVuaW5nKCkKK3sKKyAgICBjaGVja0ludGVn
cml0eU9uT3BlbiA9IHRydWU7Cit9CisKK0ljb25EYXRhYmFzZTo6SWNvbkRhdGFiYXNlKCkKKyAg
ICA6IG1fc3luY1RpbWVyKFJ1bkxvb3A6Om1haW4oKSwgdGhpcywgJkljb25EYXRhYmFzZTo6c3lu
Y1RpbWVyRmlyZWQpCisgICAgLCBtX21haW5UaHJlYWRDYWxsYmFja0NvdW50KDApCisgICAgLCBt
X2NsaWVudChkZWZhdWx0Q2xpZW50KCkpCit7CisgICAgTE9HKEljb25EYXRhYmFzZSwgIkNyZWF0
aW5nIEljb25EYXRhYmFzZSAlcCIsIHRoaXMpOworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
Cit9CisKK0ljb25EYXRhYmFzZTo6fkljb25EYXRhYmFzZSgpCit7CisgICAgQVNTRVJUKCFpc09w
ZW4oKSk7Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjp3YWtlU3luY1RocmVhZCgpCit7CisgICAg
TG9ja0hvbGRlciBsb2NrZXIobV9zeW5jTG9jayk7CisKKyAgICBtX3N5bmNUaHJlYWRIYXNXb3Jr
VG9EbyA9IHRydWU7CisgICAgbV9zeW5jQ29uZGl0aW9uLm5vdGlmeU9uZSgpOworfQorCit2b2lk
IEljb25EYXRhYmFzZTo6c2NoZWR1bGVPckRlZmVyU3luY1RpbWVyKCkKK3sKKyAgICBBU1NFUlRf
Tk9UX1NZTkNfVEhSRUFEKCk7CisKKyAgICBpZiAobV9zY2hlZHVsZU9yRGVmZXJTeW5jVGltZXJS
ZXF1ZXN0ZWQpCisgICAgICAgIHJldHVybjsKKworICAgIG1fc2NoZWR1bGVPckRlZmVyU3luY1Rp
bWVyUmVxdWVzdGVkID0gdHJ1ZTsKKyAgICBjYWxsT25NYWluVGhyZWFkKFt0aGlzXSB7CisgICAg
ICAgIG1fc3luY1RpbWVyLnN0YXJ0T25lU2hvdCh1cGRhdGVUaW1lckRlbGF5KTsKKyAgICAgICAg
bV9zY2hlZHVsZU9yRGVmZXJTeW5jVGltZXJSZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgICB9KTsKK30K
Kwordm9pZCBJY29uRGF0YWJhc2U6OnN5bmNUaW1lckZpcmVkKCkKK3sKKyAgICBBU1NFUlRfTk9U
X1NZTkNfVEhSRUFEKCk7CisgICAgd2FrZVN5bmNUaHJlYWQoKTsKK30KKworLy8gKioqKioqKioq
KioqKioqKioqCisvLyAqKiogQW55IFRocmVhZCAqKioKKy8vICoqKioqKioqKioqKioqKioqKgor
Citib29sIEljb25EYXRhYmFzZTo6aXNPcGVuKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaXNPcGVu
QmVzaWRlc01haW5UaHJlYWRDYWxsYmFja3MoKSB8fCBtX21haW5UaHJlYWRDYWxsYmFja0NvdW50
OworfQorCitib29sIEljb25EYXRhYmFzZTo6aXNPcGVuQmVzaWRlc01haW5UaHJlYWRDYWxsYmFj
a3MoKSBjb25zdAoreworICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fc3luY0xvY2spOworICAgIHJl
dHVybiBtX3N5bmNUaHJlYWRSdW5uaW5nIHx8IG1fc3luY0RCLmlzT3BlbigpOworfQorCitTdHJp
bmcgSWNvbkRhdGFiYXNlOjpkYXRhYmFzZVBhdGgoKSBjb25zdAoreworICAgIExvY2tIb2xkZXIg
bG9ja2VyKG1fc3luY0xvY2spOworICAgIHJldHVybiBtX2NvbXBsZXRlRGF0YWJhc2VQYXRoLmlz
b2xhdGVkQ29weSgpOworfQorCitTdHJpbmcgSWNvbkRhdGFiYXNlOjpkZWZhdWx0RGF0YWJhc2VG
aWxlbmFtZSgpCit7CisgICAgc3RhdGljIE5ldmVyRGVzdHJveWVkPFN0cmluZz4gZGVmYXVsdERh
dGFiYXNlRmlsZW5hbWUoTUFLRV9TVEFUSUNfU1RSSU5HX0lNUEwoIldlYnBhZ2VJY29ucy5kYiIp
KTsKKyAgICByZXR1cm4gZGVmYXVsdERhdGFiYXNlRmlsZW5hbWUuZ2V0KCkuaXNvbGF0ZWRDb3B5
KCk7Cit9CisKKy8vIFVubGlrZSBnZXRPckNyZWF0ZVBhZ2VVUkxSZWNvcmQoKSwgZ2V0T3JDcmVh
dGVJY29uUmVjb3JkKCkgZG9lcyBub3QgbWFyayB0aGUgaWNvbiBhcyAiaW50ZXJlc3RlZCBpbiBp
bXBvcnQiCitSZWY8SWNvbkRhdGFiYXNlOjpJY29uUmVjb3JkPiBJY29uRGF0YWJhc2U6OmdldE9y
Q3JlYXRlSWNvblJlY29yZChjb25zdCBTdHJpbmcmIGljb25VUkwpCit7CisgICAgLy8gQ2xpZW50
cyBvZiBnZXRPckNyZWF0ZUljb25SZWNvcmQoKSBhcmUgcmVxdWlyZWQgdG8gYWNxdWlyZSB0aGUg
bV91cmxBbmRJY29uTG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZAorICAgIEFTU0VSVCgh
bV91cmxBbmRJY29uTG9jay50cnlMb2NrKCkpOworCisgICAgaWYgKGF1dG8qIGljb24gPSBtX2lj
b25VUkxUb1JlY29yZE1hcC5nZXQoaWNvblVSTCkpCisgICAgICAgIHJldHVybiAqaWNvbjsKKwor
ICAgIGF1dG8gbmV3SWNvbiA9IEljb25SZWNvcmQ6OmNyZWF0ZShpY29uVVJMKTsKKyAgICBtX2lj
b25VUkxUb1JlY29yZE1hcC5zZXQoaWNvblVSTCwgbmV3SWNvbi5wdHIoKSk7CisgICAgcmV0dXJu
IG5ld0ljb247Cit9CisKKy8vIFRoaXMgbWV0aG9kIHJldHJpZXZlcyB0aGUgZXhpc3RpbmcgUGFn
ZVVSTFJlY29yZCwgb3IgY3JlYXRlcyBhIG5ldyBvbmUgYW5kIG1hcmtzIGl0IGFzICJpbnRlcmVz
dGVkIGluIHRoZSBpbXBvcnQiIGZvciBsYXRlciBub3RpZmljYXRpb24KK0ljb25EYXRhYmFzZTo6
UGFnZVVSTFJlY29yZCogSWNvbkRhdGFiYXNlOjpnZXRPckNyZWF0ZVBhZ2VVUkxSZWNvcmQoY29u
c3QgU3RyaW5nJiBwYWdlVVJMKQoreworICAgIC8vIENsaWVudHMgb2YgZ2V0T3JDcmVhdGVQYWdl
VVJMUmVjb3JkKCkgYXJlIHJlcXVpcmVkIHRvIGFjcXVpcmUgdGhlIG1fdXJsQW5kSWNvbkxvY2sg
YmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QKKyAgICBBU1NFUlQoIW1fdXJsQW5kSWNvbkxvY2su
dHJ5TG9jaygpKTsKKworICAgIGlmICghZG9jdW1lbnRDYW5IYXZlSWNvbihwYWdlVVJMKSkKKyAg
ICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBQYWdlVVJMUmVjb3JkKiBwYWdlUmVjb3JkID0g
bV9wYWdlVVJMVG9SZWNvcmRNYXAuZ2V0KHBhZ2VVUkwpOworCisgICAgTG9ja0hvbGRlciBsb2Nr
ZXIobV9wZW5kaW5nUmVhZGluZ0xvY2spOworICAgIGlmICghbV9pY29uVVJMSW1wb3J0Q29tcGxl
dGUpIHsKKyAgICAgICAgLy8gSWYgdGhlIGluaXRpYWwgaW1wb3J0IG9mIGFsbCBVUkxzIGhhc24n
dCBjb21wbGV0ZWQgYW5kIHdlIGhhdmUgbm8gcGFnZSByZWNvcmQsIHdlIGFzc3VtZSB3ZSAqbWln
aHQqIGtub3cgYWJvdXQgdGhpcyBsYXRlciBhbmQgY3JlYXRlIGEgcmVjb3JkIGZvciBpdAorICAg
ICAgICBpZiAoIXBhZ2VSZWNvcmQpIHsKKyAgICAgICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJD
cmVhdGluZyBuZXcgUGFnZVVSTFJlY29yZCBmb3IgcGFnZVVSTCAlcyIsIHVybEZvckxvZ2dpbmco
cGFnZVVSTCkuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgcGFnZVJlY29yZCA9IG5ldyBQ
YWdlVVJMUmVjb3JkKHBhZ2VVUkwpOworICAgICAgICAgICAgbV9wYWdlVVJMVG9SZWNvcmRNYXAu
c2V0KHBhZ2VVUkwsIHBhZ2VSZWNvcmQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhl
IHBhZ2VSZWNvcmQgZm9yIHRoaXMgcGFnZSBkb2VzIG5vdCBoYXZlIGFuIGljb25SZWNvcmQgYXR0
YWNoZWQgdG8gaXQsIHRoZW4gaXQgaXMgYSBuZXcgcGFnZVJlY29yZCBzdGlsbCBhd2FpdGluZyB0
aGUgaW5pdGlhbCBpbXBvcnQKKyAgICAgICAgLy8gTWFyayB0aGUgVVJMIGFzICJpbnRlcmVzdGVk
IGluIHRoZSByZXN1bHQgb2YgdGhlIGltcG9ydCIgdGhlbiBiYWlsCisgICAgICAgIGlmICghcGFn
ZVJlY29yZC0+aWNvblJlY29yZCgpKSB7CisgICAgICAgICAgICBtX3BhZ2VVUkxzUGVuZGluZ0lt
cG9ydC5hZGQocGFnZVVSTCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAg
fQorICAgIH0KKworICAgIC8vIFdlJ3ZlIGRvbmUgdGhlIGluaXRpYWwgaW1wb3J0IG9mIGFsbCBV
UkxzIGtub3duIGluIHRoZSBkYXRhYmFzZS4gSWYgdGhpcyByZWNvcmQgZG9lc24ndCBleGlzdCBu
b3csIGl0IG5ldmVyIHdpbGwKKyAgICByZXR1cm4gcGFnZVJlY29yZDsKK30KKworCisvLyAqKioq
KioqKioqKioqKioqKioqKioqKioKKy8vICoqKiBTeW5jIFRocmVhZCBPbmx5ICoqKgorLy8gKioq
KioqKioqKioqKioqKioqKioqKioqCisKK2Jvb2wgSWNvbkRhdGFiYXNlOjpzaG91bGRTdG9wVGhy
ZWFkQWN0aXZpdHkoKSBjb25zdAoreworICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7CisK
KyAgICByZXR1cm4gbV90aHJlYWRUZXJtaW5hdGlvblJlcXVlc3RlZCB8fCBtX3JlbW92ZUljb25z
UmVxdWVzdGVkOworfQorCit2b2lkIEljb25EYXRhYmFzZTo6aWNvbkRhdGFiYXNlU3luY1RocmVh
ZCgpCit7CisgICAgLy8gVGhlIGNhbGwgdG8gY3JlYXRlIHRoaXMgdGhyZWFkIG1pZ2h0IG5vdCBj
b21wbGV0ZSBiZWZvcmUgdGhlIHRocmVhZCBhY3R1YWxseSBzdGFydHMsIHNvIHdlIG1pZ2h0IGZh
aWwgdGhpcyBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpIGJlY2F1c2UgdGhlIHBvaW50ZXIKKyAg
ICAvLyB0byBvdXIgdGhyZWFkIHN0cnVjdHVyZSBoYXNuJ3QgYmVlbiBmaWxsZWQgaW4geWV0Lgor
ICAgIC8vIFRvIGZpeCB0aGlzLCB0aGUgbWFpbiB0aHJlYWQgYWNxdWlyZXMgdGhpcyBsb2NrIGJl
Zm9yZSBjcmVhdGluZyB1cywgdGhlbiByZWxlYXNlcyB0aGUgbG9jayBhZnRlciBjcmVhdGlvbiBp
cyBjb21wbGV0ZS4gQSBxdWljayBsb2NrL3VubG9jayBjeWNsZSBoZXJlIHdpbGwKKyAgICAvLyBw
cmV2ZW50IHVzIGZyb20gcnVubmluZyBiZWZvcmUgdGhhdCBjYWxsIGNvbXBsZXRlcworICAgIG1f
c3luY0xvY2subG9jaygpOworICAgIG1fc3luY0xvY2sudW5sb2NrKCk7CisKKyAgICBBU1NFUlRf
SUNPTl9TWU5DX1RIUkVBRCgpOworCisgICAgTE9HKEljb25EYXRhYmFzZSwgIihUSFJFQUQpIElj
b25EYXRhYmFzZSBzeW5jIHRocmVhZCBzdGFydGVkIik7CisKKyNpZiAhTE9HX0RJU0FCTEVECisg
ICAgZG91YmxlIHN0YXJ0VGltZSA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOworI2Vu
ZGlmCisKKyAgICAvLyBOZWVkIHRvIGNyZWF0ZSB0aGUgZGF0YWJhc2UgcGF0aCBpZiBpdCBkb2Vz
bid0IGFscmVhZHkgZXhpc3QKKyAgICBtYWtlQWxsRGlyZWN0b3JpZXMobV9kYXRhYmFzZURpcmVj
dG9yeSk7CisKKyAgICAvLyBFeGlzdGVuY2Ugb2YgYSBqb3VybmFsIGZpbGUgaXMgZXZpZGVuY2Ug
b2YgYSBwcmV2aW91cyBjcmFzaC9mb3JjZSBxdWl0IGFuZCBhdXRvbWF0aWNhbGx5IHF1YWxpZmll
cworICAgIC8vIHVzIHRvIGRvIGFuIGludGVncml0eSBjaGVjaworICAgIFN0cmluZyBqb3VybmFs
RmlsZW5hbWUgPSBtX2NvbXBsZXRlRGF0YWJhc2VQYXRoICsgIi1qb3VybmFsIjsKKyAgICBpZiAo
IWNoZWNrSW50ZWdyaXR5T25PcGVuKSB7CisgICAgICAgIEF1dG9kcmFpbmVkUG9vbCBwb29sOwor
ICAgICAgICBjaGVja0ludGVncml0eU9uT3BlbiA9IGZpbGVFeGlzdHMoam91cm5hbEZpbGVuYW1l
KTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fc3luY0xvY2sp
OworICAgICAgICBpZiAoIW1fc3luY0RCLm9wZW4obV9jb21wbGV0ZURhdGFiYXNlUGF0aCkpIHsK
KyAgICAgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIG9wZW4gaWNvbiBkYXRhYmFzZSBhdCBw
YXRoICVzIC0gJXMiLCBtX2NvbXBsZXRlRGF0YWJhc2VQYXRoLmFzY2lpKCkuZGF0YSgpLCBtX3N5
bmNEQi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBpZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpIHsKKyAgICAgICAgc3lu
Y1RocmVhZE1haW5Mb29wKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiAhTE9HX0RJ
U0FCTEVECisgICAgZG91YmxlIHRpbWVTdGFtcCA9IG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGlt
ZSgpOworICAgIExPRyhJY29uRGF0YWJhc2UsICIoVEhSRUFEKSBPcGVuIHRvb2sgJS40ZiBzZWNv
bmRzIiwgdGltZVN0YW1wIC0gc3RhcnRUaW1lKTsKKyNlbmRpZgorCisgICAgcGVyZm9ybU9wZW5J
bml0aWFsaXphdGlvbigpOworICAgIGlmIChzaG91bGRTdG9wVGhyZWFkQWN0aXZpdHkoKSkgewor
ICAgICAgICBzeW5jVGhyZWFkTWFpbkxvb3AoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
I2lmICFMT0dfRElTQUJMRUQKKyAgICBkb3VibGUgbmV3U3RhbXAgPSBtb25vdG9uaWNhbGx5SW5j
cmVhc2luZ1RpbWUoKTsKKyAgICBMT0coSWNvbkRhdGFiYXNlLCAiKFRIUkVBRCkgcGVyZm9ybU9w
ZW5Jbml0aWFsaXphdGlvbigpIHRvb2sgJS40ZiBzZWNvbmRzLCBub3cgJS40ZiBzZWNvbmRzIGZy
b20gdGhyZWFkIHN0YXJ0IiwgbmV3U3RhbXAgLSB0aW1lU3RhbXAsIG5ld1N0YW1wIC0gc3RhcnRU
aW1lKTsKKyAgICB0aW1lU3RhbXAgPSBuZXdTdGFtcDsKKyNlbmRpZgorCisgICAgLy8gVW5jb21t
ZW50IHRoZSBmb2xsb3dpbmcgbGluZSB0byBzaW11bGF0ZSBhIGxvbmcgbGFzdGluZyBVUkwgaW1w
b3J0ICgqSFVHRSogaWNvbiBkYXRhYmFzZXMsIG9yIG5ldHdvcmsgaG9tZSBkaXJlY3RvcmllcykK
KyAgICAvLyB3aGlsZSAobW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCkgLSB0aW1lU3RhbXAg
PCAxMCk7CisKKyAgICAvLyBSZWFkIGluIFVSTCBtYXBwaW5ncyBmcm9tIHRoZSBkYXRhYmFzZQor
ICAgIExPRyhJY29uRGF0YWJhc2UsICIoVEhSRUFEKSBTdGFydGluZyBpY29uVVJMIGltcG9ydCIp
OworICAgIHBlcmZvcm1VUkxJbXBvcnQoKTsKKworICAgIGlmIChzaG91bGRTdG9wVGhyZWFkQWN0
aXZpdHkoKSkgeworICAgICAgICBzeW5jVGhyZWFkTWFpbkxvb3AoKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworI2lmICFMT0dfRElTQUJMRUQKKyAgICBuZXdTdGFtcCA9IG1vbm90b25pY2Fs
bHlJbmNyZWFzaW5nVGltZSgpOworICAgIExPRyhJY29uRGF0YWJhc2UsICIoVEhSRUFEKSBwZXJm
b3JtVVJMSW1wb3J0KCkgdG9vayAlLjRmIHNlY29uZHMuIEVudGVyaW5nIG1haW4gbG9vcCAlLjRm
IHNlY29uZHMgZnJvbSB0aHJlYWQgc3RhcnQiLCBuZXdTdGFtcCAtIHRpbWVTdGFtcCwgbmV3U3Rh
bXAgLSBzdGFydFRpbWUpOworI2VuZGlmCisKKyAgICBMT0coSWNvbkRhdGFiYXNlLCAiKFRIUkVB
RCkgQmVnaW5uaW5nIHN5bmMiKTsKKyAgICBzeW5jVGhyZWFkTWFpbkxvb3AoKTsKK30KKworc3Rh
dGljIGludCBkYXRhYmFzZVZlcnNpb25OdW1iZXIoU1FMaXRlRGF0YWJhc2UmIGRiKQoreworICAg
IHJldHVybiBTUUxpdGVTdGF0ZW1lbnQoZGIsICJTRUxFQ1QgdmFsdWUgRlJPTSBJY29uRGF0YWJh
c2VJbmZvIFdIRVJFIGtleSA9ICdWZXJzaW9uJzsiKS5nZXRDb2x1bW5JbnQoMCk7Cit9CisKK3N0
YXRpYyBib29sIGlzVmFsaWREYXRhYmFzZShTUUxpdGVEYXRhYmFzZSYgZGIpCit7CisgICAgLy8g
VGhlc2UgZm91ciB0YWJsZXMgc2hvdWxkIGFsd2F5cyBleGlzdCBpbiBhIHZhbGlkIGRiCisgICAg
aWYgKCFkYi50YWJsZUV4aXN0cygiSWNvbkluZm8iKSB8fCAhZGIudGFibGVFeGlzdHMoIkljb25E
YXRhIikgfHwgIWRiLnRhYmxlRXhpc3RzKCJQYWdlVVJMIikgfHwgIWRiLnRhYmxlRXhpc3RzKCJJ
Y29uRGF0YWJhc2VJbmZvIikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChkYXRh
YmFzZVZlcnNpb25OdW1iZXIoZGIpIDwgY3VycmVudERhdGFiYXNlVmVyc2lvbikgeworICAgICAg
ICBMT0coSWNvbkRhdGFiYXNlLCAiREIgdmVyc2lvbiBpcyBub3QgZm91bmQgb3IgYmVsb3cgZXhw
ZWN0ZWQgdmFsaWQgdmVyc2lvbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZURhdGFiYXNlVGFibGVzKFNR
TGl0ZURhdGFiYXNlJiBkYikKK3sKKyAgICBpZiAoIWRiLmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUg
VEFCTEUgUGFnZVVSTCAodXJsIFRFWFQgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCBVTklRVUUg
T04gQ09ORkxJQ1QgUkVQTEFDRSxpY29uSUQgSU5URUdFUiBOT1QgTlVMTCBPTiBDT05GTElDVCBG
QUlMKTsiKSkgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBjcmVhdGUgUGFnZVVSTCB0
YWJsZSBpbiBkYXRhYmFzZSAoJWkpIC0gJXMiLCBkYi5sYXN0RXJyb3IoKSwgZGIubGFzdEVycm9y
TXNnKCkpOworICAgICAgICBkYi5jbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAg
IGlmICghZGIuZXhlY3V0ZUNvbW1hbmQoIkNSRUFURSBJTkRFWCBQYWdlVVJMSW5kZXggT04gUGFn
ZVVSTCAodXJsKTsiKSkgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBjcmVhdGUgUGFn
ZVVSTCBpbmRleCBpbiBkYXRhYmFzZSAoJWkpIC0gJXMiLCBkYi5sYXN0RXJyb3IoKSwgZGIubGFz
dEVycm9yTXNnKCkpOworICAgICAgICBkYi5jbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAg
fQorICAgIGlmICghZGIuZXhlY3V0ZUNvbW1hbmQoIkNSRUFURSBUQUJMRSBJY29uSW5mbyAoaWNv
bklEIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCBVTklRVUUgT04gQ09ORkxJQ1Qg
UkVQTEFDRSwgdXJsIFRFWFQgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCBVTklRVUUgT04gQ09O
RkxJQ1QgRkFJTCwgc3RhbXAgSU5URUdFUik7IikpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3Vs
ZCBub3QgY3JlYXRlIEljb25JbmZvIHRhYmxlIGluIGRhdGFiYXNlICglaSkgLSAlcyIsIGRiLmxh
c3RFcnJvcigpLCBkYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIGRiLmNsb3NlKCk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFkYi5leGVjdXRlQ29tbWFuZCgiQ1JFQVRFIElO
REVYIEljb25JbmZvSW5kZXggT04gSWNvbkluZm8gKHVybCwgaWNvbklEKTsiKSkgeworICAgICAg
ICBMT0dfRVJST1IoIkNvdWxkIG5vdCBjcmVhdGUgUGFnZVVSTCBpbmRleCBpbiBkYXRhYmFzZSAo
JWkpIC0gJXMiLCBkYi5sYXN0RXJyb3IoKSwgZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICBk
Yi5jbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghZGIuZXhlY3V0ZUNv
bW1hbmQoIkNSRUFURSBUQUJMRSBJY29uRGF0YSAoaWNvbklEIElOVEVHRVIgUFJJTUFSWSBLRVkg
QVVUT0lOQ1JFTUVOVCBVTklRVUUgT04gQ09ORkxJQ1QgUkVQTEFDRSwgZGF0YSBCTE9CKTsiKSkg
eworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBjcmVhdGUgSWNvbkRhdGEgdGFibGUgaW4g
ZGF0YWJhc2UgKCVpKSAtICVzIiwgZGIubGFzdEVycm9yKCksIGRiLmxhc3RFcnJvck1zZygpKTsK
KyAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWRi
LmV4ZWN1dGVDb21tYW5kKCJDUkVBVEUgSU5ERVggSWNvbkRhdGFJbmRleCBPTiBJY29uRGF0YSAo
aWNvbklEKTsiKSkgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBjcmVhdGUgUGFnZVVS
TCBpbmRleCBpbiBkYXRhYmFzZSAoJWkpIC0gJXMiLCBkYi5sYXN0RXJyb3IoKSwgZGIubGFzdEVy
cm9yTXNnKCkpOworICAgICAgICBkYi5jbG9zZSgpOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIGlmICghZGIuZXhlY3V0ZUNvbW1hbmQoIkNSRUFURSBUQUJMRSBJY29uRGF0YWJhc2VJbmZv
IChrZXkgVEVYVCBOT1QgTlVMTCBPTiBDT05GTElDVCBGQUlMIFVOSVFVRSBPTiBDT05GTElDVCBS
RVBMQUNFLHZhbHVlIFRFWFQgTk9UIE5VTEwgT04gQ09ORkxJQ1QgRkFJTCk7IikpIHsKKyAgICAg
ICAgTE9HX0VSUk9SKCJDb3VsZCBub3QgY3JlYXRlIEljb25EYXRhYmFzZUluZm8gdGFibGUgaW4g
ZGF0YWJhc2UgKCVpKSAtICVzIiwgZGIubGFzdEVycm9yKCksIGRiLmxhc3RFcnJvck1zZygpKTsK
KyAgICAgICAgZGIuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWRi
LmV4ZWN1dGVDb21tYW5kKFN0cmluZygiSU5TRVJUIElOVE8gSWNvbkRhdGFiYXNlSW5mbyBWQUxV
RVMgKCdWZXJzaW9uJywgIikgKyBTdHJpbmc6Om51bWJlcihjdXJyZW50RGF0YWJhc2VWZXJzaW9u
KSArICIpOyIpKSB7CisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IGluc2VydCBpY29uIGRh
dGFiYXNlIHZlcnNpb24gaW50byBJY29uRGF0YWJhc2VJbmZvIHRhYmxlICglaSkgLSAlcyIsIGRi
Lmxhc3RFcnJvcigpLCBkYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAgIGRiLmNsb3NlKCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpwZXJmb3JtT3Bl
bkluaXRpYWxpemF0aW9uKCkKK3sKKyAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOworCisg
ICAgaWYgKCFpc09wZW4oKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGNoZWNrSW50ZWdy
aXR5T25PcGVuKSB7CisgICAgICAgIGNoZWNrSW50ZWdyaXR5T25PcGVuID0gZmFsc2U7CisgICAg
ICAgIGlmICghY2hlY2tJbnRlZ3JpdHkoKSkgeworICAgICAgICAgICAgTE9HKEljb25EYXRhYmFz
ZSwgIkludGVncml0eSBjaGVjayB3YXMgYmFkIC0gZHVtcGluZyBJY29uRGF0YWJhc2UiKTsKKwor
ICAgICAgICAgICAgbV9zeW5jREIuY2xvc2UoKTsKKworICAgICAgICAgICAgeworICAgICAgICAg
ICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fc3luY0xvY2spOworICAgICAgICAgICAgICAgIC8v
IFNob3VsZCd2ZSBiZWVuIGNvbnN1bWVkIGJ5IFNRTGl0ZSwgZGVsZXRlIGp1c3QgdG8gbWFrZSBz
dXJlIHdlIGRvbid0IHNlZSBpdCBhZ2FpbiBpbiB0aGUgZnV0dXJlOworICAgICAgICAgICAgICAg
IGRlbGV0ZUZpbGUobV9jb21wbGV0ZURhdGFiYXNlUGF0aCArICItam91cm5hbCIpOworICAgICAg
ICAgICAgICAgIGRlbGV0ZUZpbGUobV9jb21wbGV0ZURhdGFiYXNlUGF0aCk7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIC8vIFJlb3BlbiB0aGUgd3JpdGUgZGF0YWJhc2UsIGNyZWF0aW5n
IGl0IGZyb20gc2NyYXRjaAorICAgICAgICAgICAgaWYgKCFtX3N5bmNEQi5vcGVuKG1fY29tcGxl
dGVEYXRhYmFzZVBhdGgpKSB7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8g
b3BlbiBpY29uIGRhdGFiYXNlIGF0IHBhdGggJXMgLSAlcyIsIG1fY29tcGxldGVEYXRhYmFzZVBh
dGguYXNjaWkoKS5kYXRhKCksIG1fc3luY0RCLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQg
dmVyc2lvbiA9IGRhdGFiYXNlVmVyc2lvbk51bWJlcihtX3N5bmNEQik7CisKKyAgICBpZiAodmVy
c2lvbiA+IGN1cnJlbnREYXRhYmFzZVZlcnNpb24pIHsKKyAgICAgICAgTE9HKEljb25EYXRhYmFz
ZSwgIkRhdGFiYXNlIHZlcnNpb24gbnVtYmVyICVpIGlzIGdyZWF0ZXIgdGhhbiBvdXIgY3VycmVu
dCB2ZXJzaW9uIG51bWJlciAlaSAtIGNsb3NpbmcgdGhlIGRhdGFiYXNlIHRvIHByZXZlbnQgb3Zl
cndyaXRpbmcgbmV3ZXIgdmVyc2lvbnMiLCB2ZXJzaW9uLCBjdXJyZW50RGF0YWJhc2VWZXJzaW9u
KTsKKyAgICAgICAgbV9zeW5jREIuY2xvc2UoKTsKKyAgICAgICAgbV90aHJlYWRUZXJtaW5hdGlv
blJlcXVlc3RlZCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIWlz
VmFsaWREYXRhYmFzZShtX3N5bmNEQikpIHsKKyAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIiVz
IGlzIG1pc3Npbmcgb3IgaW4gYW4gaW52YWxpZCBzdGF0ZSAtIHJlY29uc3RydWN0aW5nIiwgbV9j
b21wbGV0ZURhdGFiYXNlUGF0aC5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIG1fc3luY0RCLmNs
ZWFyQWxsVGFibGVzKCk7CisgICAgICAgIGNyZWF0ZURhdGFiYXNlVGFibGVzKG1fc3luY0RCKTsK
KyAgICB9CisKKyAgICAvLyBSZWR1Y2Ugc3FsaXRlIFJBTSBjYWNoZSBzaXplIGZyb20gZGVmYXVs
dCAyMDAwIHBhZ2VzICh+MS41a0IgcGVyIHBhZ2UpLiAzTUIgb2YgY2FjaGUgZm9yIGljb24gZGF0
YWJhc2UgaXMgb3ZlcmtpbGwKKyAgICBpZiAoIVNRTGl0ZVN0YXRlbWVudChtX3N5bmNEQiwgIlBS
QUdNQSBjYWNoZV9zaXplID0gMjAwOyIpLmV4ZWN1dGVDb21tYW5kKCkpCisgICAgICAgIExPR19F
UlJPUigiU1FMaXRlIGRhdGFiYXNlIGNvdWxkIG5vdCBzZXQgY2FjaGVfc2l6ZSIpOworfQorCiti
b29sIEljb25EYXRhYmFzZTo6Y2hlY2tJbnRlZ3JpdHkoKQoreworICAgIEFTU0VSVF9JQ09OX1NZ
TkNfVEhSRUFEKCk7CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgaW50ZWdyaXR5KG1fc3luY0RCLCAi
UFJBR01BIGludGVncml0eV9jaGVjazsiKTsKKyAgICBpZiAoaW50ZWdyaXR5LnByZXBhcmUoKSAh
PSBTUUxJVEVfT0spIHsKKyAgICAgICAgTE9HX0VSUk9SKCJjaGVja0ludGVncml0eSBmYWlsZWQg
dG8gZXhlY3V0ZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IHJl
c3VsdENvZGUgPSBpbnRlZ3JpdHkuc3RlcCgpOworICAgIGlmIChyZXN1bHRDb2RlID09IFNRTElU
RV9PSykKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAocmVzdWx0Q29kZSAhPSBTUUxJ
VEVfUk9XKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQgY29sdW1ucyA9IGludGVn
cml0eS5jb2x1bW5Db3VudCgpOworICAgIGlmIChjb2x1bW5zICE9IDEpIHsKKyAgICAgICAgTE9H
X0VSUk9SKCJSZWNlaXZlZCAlaSBjb2x1bW5zIHBlcmZvcm1pbmcgaW50ZWdyaXR5IGNoZWNrLCBz
aG91bGQgYmUgMSIsIGNvbHVtbnMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgU3RyaW5nIHJlc3VsdFRleHQgPSBpbnRlZ3JpdHkuZ2V0Q29sdW1uVGV4dCgwKTsKKworICAg
IC8vIEEgc3VjY2Vzc2Z1bCwgbm8tZXJyb3IgaW50ZWdyaXR5IGNoZWNrIHdpbGwgYmUgIm9rIiAt
IGFsbCBvdGhlciBzdHJpbmdzIGltcGx5IGZhaWx1cmUKKyAgICBpZiAocmVzdWx0VGV4dCA9PSAi
b2siKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIExPR19FUlJPUigiSWNvbiBkYXRhYmFz
ZSBpbnRlZ3JpdHkgY2hlY2sgZmFpbGVkIC0gXG4lcyIsIHJlc3VsdFRleHQuYXNjaWkoKS5kYXRh
KCkpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6OnBlcmZvcm1V
UkxJbXBvcnQoKQoreworICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7CisKKyAgICAvLyBE
byBub3QgaW1wb3J0IGljb25zIG5vdCB1c2VkIGluIHRoZSBsYXN0IDMwIGRheXMuIFRoZXkgd2ls
bCBiZSBhdXRvbWF0aWNhbGx5IHBydW5lZCBsYXRlciBpZiBub2JvZHkgcmV0YWlucyB0aGVtLgor
ICAgIC8vIE5vdGUgdGhhdCBJY29uSW5mby5zdGFtcCBpcyBvbmx5IHNldCB3aGVuIHRoZSBpY29u
IGRhdGEgaXMgcmV0cmlldmVkIGZyb20gdGhlIHNlcnZlciAoYW5kIHRodXMgaXMgbm90IHVwZGF0
ZWQgd2hldGhlcgorICAgIC8vIHdlIHVzZSBpdCBvciBub3QpLiBUaGlzIGNvZGUgd29ya3MgYW55
d2F5IGJlY2F1c2UgdGhlIEljb25EYXRhYmFzZSBkb3dubG9hZHMgaWNvbnMgYWdhaW4gaWYgdGhl
eSBhcmUgb2xkZXIgdGhhbiA0IGRheXMsCisgICAgLy8gc28gaWYgdGhlIHRpbWVzdGFtcCBnb2Vz
IGJhY2sgaW4gdGltZSBtb3JlIHRoYW4gdGhvc2UgMzAgZGF5cyB3ZSBjYW4gYmUgc3VyZSB0aGF0
IHRoZSBpY29uIHdhcyBub3QgdXNlZCBhdCBhbGwuCisgICAgU3RyaW5nIGltcG9ydFF1ZXJ5ID0g
U3RyaW5nOjpmb3JtYXQoIlNFTEVDVCBQYWdlVVJMLnVybCwgSWNvbkluZm8udXJsLCBJY29uSW5m
by5zdGFtcCBGUk9NIFBhZ2VVUkwgSU5ORVIgSk9JTiBJY29uSW5mbyBPTiBQYWdlVVJMLmljb25J
RD1JY29uSW5mby5pY29uSUQgV0hFUkUgSWNvbkluZm8uc3RhbXAgPiAlLjBmOyIsIGZsb29yKGN1
cnJlbnRUaW1lKCkgLSBub3RVc2VkSWNvbkV4cGlyYXRpb25UaW1lKSk7CisKKyAgICBTUUxpdGVT
dGF0ZW1lbnQgcXVlcnkobV9zeW5jREIsIGltcG9ydFF1ZXJ5KTsKKworICAgIGlmIChxdWVyeS5w
cmVwYXJlKCkgIT0gU1FMSVRFX09LKSB7CisgICAgICAgIExPR19FUlJPUigiVW5hYmxlIHRvIHBy
ZXBhcmUgaWNvbiB1cmwgaW1wb3J0IHF1ZXJ5Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBpbnQgcmVzdWx0ID0gcXVlcnkuc3RlcCgpOworICAgIHdoaWxlIChyZXN1bHQgPT0gU1FM
SVRFX1JPVykgeworICAgICAgICBBdXRvZHJhaW5lZFBvb2wgcG9vbDsKKyAgICAgICAgU3RyaW5n
IHBhZ2VVUkwgPSBxdWVyeS5nZXRDb2x1bW5UZXh0KDApOworICAgICAgICBTdHJpbmcgaWNvblVS
TCA9IHF1ZXJ5LmdldENvbHVtblRleHQoMSk7CisKKyAgICAgICAgeworICAgICAgICAgICAgTG9j
a0hvbGRlciBsb2NrZXIobV91cmxBbmRJY29uTG9jayk7CisKKyAgICAgICAgICAgIFBhZ2VVUkxS
ZWNvcmQqIHBhZ2VSZWNvcmQgPSBtX3BhZ2VVUkxUb1JlY29yZE1hcC5nZXQocGFnZVVSTCk7CisK
KyAgICAgICAgICAgIC8vIElmIHRoZSBwYWdlUmVjb3JkIGRvZXNuJ3QgZXhpc3QgaW4gdGhpcyBt
YXAsIHRoZW4gbm8gb25lIGhhcyByZXRhaW5lZCB0aGlzIHBhZ2VVUkwKKyAgICAgICAgICAgIC8v
IElmIHRoZSBzX2RhdGFiYXNlQ2xlYW51cENvdW50ZXIgY291bnQgaXMgbm9uLXplcm8sIHRoZW4g
d2UncmUgbm90IHN1cHBvc2VkIHRvIGJlIHBydW5pbmcgdGhlIGRhdGFiYXNlIGluIGFueSBtYW5u
ZXIsCisgICAgICAgICAgICAvLyBzbyBhY3R1YWxseSBjcmVhdGUgYSBwYWdlVVJMUmVjb3JkIGZv
ciB0aGlzIHVybCBldmVuIHRob3VnaCBpdCdzIG5vdCByZXRhaW5lZC4KKyAgICAgICAgICAgIC8v
IElmIGRhdGFiYXNlIGNsZWFudXAgKmlzKiBhbGxvd2VkLCB3ZSBkb24ndCB3YW50IHRvIGJvdGhl
ciBwdWxsaW5nIGluIGEgcGFnZSB1cmwgZnJvbSBkaXNrIHRoYXQgbm9vbmUgaXMgYWN0dWFsbHkg
aW50ZXJlc3RlZAorICAgICAgICAgICAgLy8gaW4gLSB3ZSdsbCBwcnVuZSBpdCBsYXRlciBpbnN0
ZWFkIQorICAgICAgICAgICAgaWYgKCFwYWdlUmVjb3JkICYmIGRhdGFiYXNlQ2xlYW51cENvdW50
ZXIgJiYgZG9jdW1lbnRDYW5IYXZlSWNvbihwYWdlVVJMKSkgeworICAgICAgICAgICAgICAgIHBh
Z2VSZWNvcmQgPSBuZXcgUGFnZVVSTFJlY29yZChwYWdlVVJMKTsKKyAgICAgICAgICAgICAgICBt
X3BhZ2VVUkxUb1JlY29yZE1hcC5zZXQocGFnZVVSTCwgcGFnZVJlY29yZCk7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGlmIChwYWdlUmVjb3JkKSB7CisgICAgICAgICAgICAgICAgSWNv
blJlY29yZCogY3VycmVudEljb24gPSBwYWdlUmVjb3JkLT5pY29uUmVjb3JkKCk7CisKKyAgICAg
ICAgICAgICAgICBpZiAoIWN1cnJlbnRJY29uIHx8IGN1cnJlbnRJY29uLT5pY29uVVJMKCkgIT0g
aWNvblVSTCkgeworICAgICAgICAgICAgICAgICAgICBwYWdlUmVjb3JkLT5zZXRJY29uUmVjb3Jk
KGdldE9yQ3JlYXRlSWNvblJlY29yZChpY29uVVJMKSk7CisgICAgICAgICAgICAgICAgICAgIGN1
cnJlbnRJY29uID0gcGFnZVJlY29yZC0+aWNvblJlY29yZCgpOworICAgICAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgICAgIC8vIFJlZ2FyZGxlc3MsIHRoZSB0aW1lIHN0YW1wIGZyb20gZGlz
ayBzdGlsbCB0YWtlcyBwcmVjZWRlbmNlLiBVbnRpbCB3ZSByZWFkIHRoaXMgaWNvbiBmcm9tIGRp
c2ssIHdlIGRpZG4ndCB0aGluayB3ZSdkIHNlZW4gaXQgYmVmb3JlCisgICAgICAgICAgICAgICAg
Ly8gc28gd2UgbWFya2VkIHRoZSB0aW1lc3RhbXAgYXMgIm5vdyIsIGJ1dCBpdCdzIHJlYWxseSBt
dWNoIG9sZGVyCisgICAgICAgICAgICAgICAgY3VycmVudEljb24tPnNldFRpbWVzdGFtcChxdWVy
eS5nZXRDb2x1bW5JbnQoMikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
Ly8gRklYTUU6IEN1cnJlbnRseSB0aGUgV2ViS2l0IEFQSSBzdXBwb3J0cyAxIHR5cGUgb2Ygbm90
aWZpY2F0aW9uIHRoYXQgaXMgc2VudCB3aGVuZXZlciB3ZSBnZXQgYW4gSWNvbiBVUkwgZm9yIGEg
UGFnZSBVUkwuIFdlIG1pZ2h0IHdhbnQgdG8gcmUtcHVycG9zZSBpdCB0byB3b3JrIGZvcgorICAg
ICAgICAvLyBnZXR0aW5nIHRoZSBhY3R1YWxseSBpY29uIGl0c2VsZiBhbHNvIChzbyBlYWNoIHBh
Z2V1cmwgd291bGQgZ2V0IHRoaXMgbm90aWZpY2F0aW9uIHR3aWNlKSBvciB3ZSBtaWdodCB3YW50
IHRvIGFkZCBhIHNlY29uZCB0eXBlIG9mIG5vdGlmaWNhdGlvbiAtCisgICAgICAgIC8vIG9uZSBm
b3IgdGhlIFVSTCBhbmQgb25lIGZvciB0aGUgSW1hZ2UgaXRzZWxmCisgICAgICAgIC8vIE5vdGUg
dGhhdCBXZWJJY29uRGF0YWJhc2UgaXMgbm90IG5lY2Nlc3NhcmlseSBBUEkgc28gd2UgbWlnaHQg
YmUgYWJsZSB0byBtYWtlIHRoaXMgY2hhbmdlCisgICAgICAgIHsKKyAgICAgICAgICAgIExvY2tI
b2xkZXIgbG9ja2VyKG1fcGVuZGluZ1JlYWRpbmdMb2NrKTsKKyAgICAgICAgICAgIGlmIChtX3Bh
Z2VVUkxzUGVuZGluZ0ltcG9ydC5jb250YWlucyhwYWdlVVJMKSkgeworICAgICAgICAgICAgICAg
IGRpc3BhdGNoRGlkSW1wb3J0SWNvblVSTEZvclBhZ2VVUkxPbk1haW5UaHJlYWQocGFnZVVSTCk7
CisgICAgICAgICAgICAgICAgbV9wYWdlVVJMc1BlbmRpbmdJbXBvcnQucmVtb3ZlKHBhZ2VVUkwp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcCB0aGUgaW1wb3J0
IGF0IGFueSB0aW1lIG9mIHRoZSB0aHJlYWQgaGFzIGJlZW4gYXNrZWQgdG8gc2h1dGRvd24KKyAg
ICAgICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKSB7CisgICAgICAgICAgICBMT0co
SWNvbkRhdGFiYXNlLCAiSWNvbkRhdGFiYXNlIGFza2VkIHRvIHRlcm1pbmF0ZSBkdXJpbmcgcGVy
Zm9ybVVSTEltcG9ydCgpIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAg
ICAgICByZXN1bHQgPSBxdWVyeS5zdGVwKCk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCAhPSBT
UUxJVEVfRE9ORSkKKyAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIkVycm9yIHJlYWRpbmcgcGFn
ZS0+aWNvbiB1cmwgbWFwcGluZ3MgZnJvbSBkYXRhYmFzZSIpOworCisgICAgLy8gQ2xlYXIgdGhl
IG1fcGFnZVVSTHNQZW5kaW5nSW1wb3J0IHNldCAtIGVpdGhlciB0aGUgcGFnZSBVUkxzIGVuZGVk
IHVwIHdpdGggYW4gaWNvblVSTCAodGhhdCB3ZSdsbCBub3RpZnkgYWJvdXQpIG9yIG5vdCwKKyAg
ICAvLyBidXQgYWZ0ZXIgbV9pY29uVVJMSW1wb3J0Q29tcGxldGUgaXMgc2V0IHRvIHRydWUsIHdl
IGRvbid0IGNhcmUgYWJvdXQgdGhpcyBzZXQgYW55bW9yZQorICAgIFZlY3RvcjxTdHJpbmc+IHVy
bHM7CisgICAgeworICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdSZWFkaW5nTG9j
ayk7CisKKyAgICAgICAgdXJscy5hcHBlbmRSYW5nZShtX3BhZ2VVUkxzUGVuZGluZ0ltcG9ydC5i
ZWdpbigpLCBtX3BhZ2VVUkxzUGVuZGluZ0ltcG9ydC5lbmQoKSk7CisgICAgICAgIG1fcGFnZVVS
THNQZW5kaW5nSW1wb3J0LmNsZWFyKCk7CisgICAgICAgIG1faWNvblVSTEltcG9ydENvbXBsZXRl
ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBWZWN0b3I8U3RyaW5nPiB1cmxzVG9Ob3RpZnk7CisKKyAg
ICAvLyBMb29wIHRocm91Z2ggdGhlIHVybHMgcGVuZGluZyBpbXBvcnQKKyAgICAvLyBSZW1vdmUg
dW5yZXRhaW5lZCBvbmVzIGlmIGRhdGFiYXNlIGNsZWFudXAgaXMgYWxsb3dlZAorICAgIC8vIEtl
ZXAgYSBzZXQgb2Ygb25lcyB0aGF0IGFyZSByZXRhaW5lZCBhbmQgcGVuZGluZyBub3RpZmljYXRp
b24KKyAgICB7CisgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fdXJsQW5kSWNvbkxvY2spOwor
CisgICAgICAgIHBlcmZvcm1QZW5kaW5nUmV0YWluQW5kUmVsZWFzZU9wZXJhdGlvbnMoKTsKKwor
ICAgICAgICBmb3IgKGF1dG8mIHVybCA6IHVybHMpIHsKKyAgICAgICAgICAgIGlmICghbV9yZXRh
aW5lZFBhZ2VVUkxzLmNvbnRhaW5zKHVybCkpIHsKKyAgICAgICAgICAgICAgICBQYWdlVVJMUmVj
b3JkKiByZWNvcmQgPSBtX3BhZ2VVUkxUb1JlY29yZE1hcC5nZXQodXJsKTsKKyAgICAgICAgICAg
ICAgICBpZiAocmVjb3JkICYmICFkYXRhYmFzZUNsZWFudXBDb3VudGVyKSB7CisgICAgICAgICAg
ICAgICAgICAgIG1fcGFnZVVSTFRvUmVjb3JkTWFwLnJlbW92ZSh1cmwpOworICAgICAgICAgICAg
ICAgICAgICBJY29uUmVjb3JkKiBpY29uUmVjb3JkID0gcmVjb3JkLT5pY29uUmVjb3JkKCk7CisK
KyAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBwYWdlIGlzIHRoZSBvbmx5IHJlbWFpbmlu
ZyByZXRhaW5lciBvZiBpdHMgaWNvbiwgbWFyayB0aGF0IGljb24gZm9yIGRlbGV0aW9uIGFuZCBk
b24ndCBib3RoZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVhZGluZyBhbnl0aGluZyByZWxh
dGVkIHRvIGl0CisgICAgICAgICAgICAgICAgICAgIGlmIChpY29uUmVjb3JkICYmIGljb25SZWNv
cmQtPmhhc09uZVJlZigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2ljb25VUkxUb1Jl
Y29yZE1hcC5yZW1vdmUoaWNvblJlY29yZC0+aWNvblVSTCgpKTsKKworICAgICAgICAgICAgICAg
ICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2tIb2xkZXIgbG9ja2Vy
KG1fcGVuZGluZ1JlYWRpbmdMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Bh
Z2VVUkxzSW50ZXJlc3RlZEluSWNvbnMucmVtb3ZlKHVybCk7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbV9pY29uc1BlbmRpbmdSZWFkaW5nLnJlbW92ZShpY29uUmVjb3JkKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdTeW5jTG9jayk7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pY29uc1BlbmRpbmdTeW5jLnNldChpY29u
UmVjb3JkLT5pY29uVVJMKCksIGljb25SZWNvcmQtPnNuYXBzaG90KHRydWUpKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgICAgIGRlbGV0ZSByZWNvcmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICAgICAgdXJsc1RvTm90aWZ5LmFwcGVuZCh1cmwpOworICAgICAgICB9
CisgICAgfQorCisgICAgTE9HKEljb25EYXRhYmFzZSwgIk5vdGlmeWluZyAlbHUgaW50ZXJlc3Rl
ZCBwYWdlIFVSTHMgdGhhdCB0aGVpciBpY29uIFVSTCBpcyBrbm93biBkdWUgdG8gdGhlIGltcG9y
dCIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHVybHNUb05vdGlmeS5zaXplKCkpKTsKKyAg
ICAvLyBOb3cgdGhhdCB3ZSBkb24ndCBob2xkIGFueSBsb2NrcywgcGVyZm9ybSB0aGUgYWN0dWFs
IG5vdGlmaWNhdGlvbnMKKyAgICBmb3IgKGF1dG8mIHVybCA6IHVybHNUb05vdGlmeSkgeworICAg
ICAgICBBdXRvZHJhaW5lZFBvb2wgcG9vbDsKKworICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAi
Tm90aWZ5aW5nIGljb24gaW5mbyBrbm93biBmb3IgcGFnZVVSTCAlcyIsIHVybC5hc2NpaSgpLmRh
dGEoKSk7CisgICAgICAgIGRpc3BhdGNoRGlkSW1wb3J0SWNvblVSTEZvclBhZ2VVUkxPbk1haW5U
aHJlYWQodXJsKTsKKyAgICAgICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vdGlmeSB0aGUgY2xpZW50IHRoYXQg
dGhlIFVSTCBpbXBvcnQgaXMgY29tcGxldGUgaW4gY2FzZSBpdCdzIG1hbmFnaW5nIGl0cyBvd24g
cGVuZGluZyBub3RpZmljYXRpb25zLgorICAgIGRpc3BhdGNoRGlkRmluaXNoVVJMSW1wb3J0T25N
YWluVGhyZWFkKCk7Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpzeW5jVGhyZWFkTWFpbkxvb3Ao
KQoreworICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7CisKKyAgICBtX3N5bmNMb2NrLmxv
Y2soKTsKKworICAgIC8vIFdlJ2xsIGVpdGhlciBkbyBhbnkgcGVuZGluZyB3b3JrIG9uIG91ciBm
aXJzdCBwYXNzIHRocm91Z2ggdGhlIGxvb3AsIG9yIHdlJ2xsIHRlcm1pbmF0ZQorICAgIC8vIHdp
dGhvdXQgZG9pbmcgYW55IHdvcmsuIEVpdGhlciB3YXkgd2UncmUgZGVhbGluZyB3aXRoIGFueSBj
dXJyZW50bHktcGVuZGluZyB3b3JrLgorICAgIG1fc3luY1RocmVhZEhhc1dvcmtUb0RvID0gZmFs
c2U7CisKKyAgICAvLyBJdCdzIHBvc3NpYmxlIHRocmVhZCB0ZXJtaW5hdGlvbiBpcyByZXF1ZXN0
ZWQgYmVmb3JlIHRoZSBtYWluIGxvb3AgZXZlbiBzdGFydHMgLSBpbiB0aGF0IGNhc2UsIGp1c3Qg
c2tpcCBzdHJhaWdodCB0byBjbGVhbnVwCisgICAgd2hpbGUgKCFtX3RocmVhZFRlcm1pbmF0aW9u
UmVxdWVzdGVkKSB7CisgICAgICAgIG1fc3luY0xvY2sudW5sb2NrKCk7CisKKyNpZiAhTE9HX0RJ
U0FCTEVECisgICAgICAgIGRvdWJsZSB0aW1lU3RhbXAgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2lu
Z1RpbWUoKTsKKyNlbmRpZgorICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiKFRIUkVBRCkgTWFp
biB3b3JrIGxvb3Agc3RhcnRpbmciKTsKKworICAgICAgICAvLyBJZiB3ZSBzaG91bGQgcmVtb3Zl
IGFsbCBpY29ucywgZG8gaXQgbm93LiBUaGlzIGlzIGFuIHVuaW50ZXJ1cHRpYmxlIHByb2NlZHVy
ZSB0aGF0IHdlIHdpbGwgYWx3YXlzIGRvIGJlZm9yZSBxdWl0dGluZyBpZiBpdCBpcyByZXF1ZXN0
ZWQKKyAgICAgICAgaWYgKG1fcmVtb3ZlSWNvbnNSZXF1ZXN0ZWQpIHsKKyAgICAgICAgICAgIHJl
bW92ZUFsbEljb25zT25UaHJlYWQoKTsKKyAgICAgICAgICAgIG1fcmVtb3ZlSWNvbnNSZXF1ZXN0
ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZW4sIGlmIHRoZSB0aHJlYWQg
c2hvdWxkIGJlIHF1aXR0aW5nLCBxdWl0IG5vdyEKKyAgICAgICAgaWYgKG1fdGhyZWFkVGVybWlu
YXRpb25SZXF1ZXN0ZWQpIHsKKyAgICAgICAgICAgIGNsZWFudXBTeW5jVGhyZWFkKCk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBMb2Nr
SG9sZGVyIGxvY2tlcihtX3VybEFuZEljb25Mb2NrKTsKKyAgICAgICAgICAgIHBlcmZvcm1QZW5k
aW5nUmV0YWluQW5kUmVsZWFzZU9wZXJhdGlvbnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJv
b2wgZGlkQW55V29yayA9IHRydWU7CisgICAgICAgIHdoaWxlIChkaWRBbnlXb3JrKSB7CisgICAg
ICAgICAgICBib29sIGRpZFdyaXRlID0gd3JpdGVUb0RhdGFiYXNlKCk7CisgICAgICAgICAgICBp
ZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisK
KyAgICAgICAgICAgIGRpZEFueVdvcmsgPSByZWFkRnJvbURhdGFiYXNlKCk7CisgICAgICAgICAg
ICBpZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpCisgICAgICAgICAgICAgICAgYnJlYWs7
CisKKyAgICAgICAgICAgIC8vIFBydW5lIHVucmV0YWluZWQgaWNvbnMgYWZ0ZXIgdGhlIGZpcnN0
IHRpbWUgd2Ugc3luYyBhbnl0aGluZyBvdXQgdG8gdGhlIGRhdGFiYXNlCisgICAgICAgICAgICAv
LyBUaGlzIHdheSwgcHJ1bmluZyB3b24ndCBiZSB0aGUgb25seSBvcGVyYXRpb24gd2UgcGVyZm9y
bSB0byB0aGUgZGF0YWJhc2UgYnkgaXRzZWxmCisgICAgICAgICAgICAvLyBXZSBhbHNvIGRvbid0
IHdhbnQgdG8gYm90aGVyIGRvaW5nIHRoaXMgaWYgdGhlIHRocmVhZCBzaG91bGQgYmUgdGVybWlu
YXRpbmcgKHRoZSB1c2VyIGlzIHF1aXR0aW5nKQorICAgICAgICAgICAgLy8gb3IgaWYgcHJpdmF0
ZSBicm93c2luZyBpcyBlbmFibGVkCisgICAgICAgICAgICAvLyBXZSBhbHNvIGRvbid0IHdhbnQg
dG8gcHJ1bmUgaWYgdGhlIG1fZGF0YWJhc2VDbGVhbnVwQ291bnRlciBjb3VudCBpcyBub24temVy
byAtIHRoYXQgbWVhbnMgc29tZW9uZQorICAgICAgICAgICAgLy8gaGFzIGFza2VkIHRvIGRlbGF5
IHBydW5pbmcKKyAgICAgICAgICAgIHN0YXRpYyBib29sIHBydW5lZFVucmV0YWluZWRJY29ucyA9
IGZhbHNlOworICAgICAgICAgICAgaWYgKGRpZFdyaXRlICYmICFtX3ByaXZhdGVCcm93c2luZ0Vu
YWJsZWQgJiYgIXBydW5lZFVucmV0YWluZWRJY29ucyAmJiAhZGF0YWJhc2VDbGVhbnVwQ291bnRl
cikgeworI2lmICFMT0dfRElTQUJMRUQKKyAgICAgICAgICAgICAgICBkb3VibGUgdGltZSA9IG1v
bm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOworI2VuZGlmCisgICAgICAgICAgICAgICAgTE9H
KEljb25EYXRhYmFzZSwgIihUSFJFQUQpIFN0YXJ0aW5nIHBydW5lVW5yZXRhaW5lZEljb25zKCki
KTsKKworICAgICAgICAgICAgICAgIHBydW5lVW5yZXRhaW5lZEljb25zKCk7CisKKyAgICAgICAg
ICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiKFRIUkVBRCkgcHJ1bmVVbnJldGFpbmVkSWNvbnMo
KSB0b29rICUuNGYgc2Vjb25kcyIsIG1vbm90b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpIC0gdGlt
ZSk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiBwcnVuZVVucmV0YWluZWRJY29ucygpIHJldHVy
bmVkIGVhcmx5IGR1ZSB0byByZXF1ZXN0ZWQgdGhyZWFkIHRlcm1pbmF0aW9uLCBpdHMgc3RpbGwg
b2theQorICAgICAgICAgICAgICAgIC8vIHRvIG1hcmsgcHJ1bmVkVW5yZXRhaW5lZEljb25zIHRy
dWUgYmVjYXVzZSB3ZSdyZSBhYm91dCB0byB0ZXJtaW5hdGUgYW55d2F5CisgICAgICAgICAgICAg
ICAgcHJ1bmVkVW5yZXRhaW5lZEljb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgZGlkQW55V29yayA9IGRpZEFueVdvcmsgfHwgZGlkV3JpdGU7CisgICAgICAgICAgICBp
ZiAoc2hvdWxkU3RvcFRocmVhZEFjdGl2aXR5KCkpCisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKworI2lmICFMT0dfRElTQUJMRUQKKyAgICAgICAgZG91YmxlIG5ld3N0YW1wID0g
bW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCk7CisgICAgICAgIExPRyhJY29uRGF0YWJhc2Us
ICIoVEhSRUFEKSBNYWluIHdvcmsgbG9vcCByYW4gZm9yICUuNGYgc2Vjb25kcywgJXMgcmVxdWVz
dGVkIHRvIHRlcm1pbmF0ZSIsIG5ld3N0YW1wIC0gdGltZVN0YW1wLCBzaG91bGRTdG9wVGhyZWFk
QWN0aXZpdHkoKSA/ICJ3YXMiIDogIndhcyBub3QiKTsKKyNlbmRpZgorCisgICAgICAgIG1fc3lu
Y0xvY2subG9jaygpOworCisgICAgICAgIC8vIFRoZXJlIGlzIHNvbWUgY29uZGl0aW9uIHRoYXQg
aXMgYXNraW5nIHVzIHRvIHN0b3Agd2hhdCB3ZSdyZSBkb2luZyBub3cgYW5kIGhhbmRsZSBhIHNw
ZWNpYWwgY2FzZQorICAgICAgICAvLyBUaGlzIGlzIGVpdGhlciByZW1vdmluZyBhbGwgaWNvbnMs
IG9yIHNodXR0aW5nIGRvd24gdGhlIHRocmVhZCB0byBxdWl0IHRoZSBhcHAKKyAgICAgICAgLy8g
V2UgaGFuZGxlIHRob3NlIGF0IHRoZSB0b3Agb2YgdGhpcyBtYWluIGxvb3Agc28gY29udGludWUg
dG8ganVtcCBiYWNrIHVwIHRoZXJlCisgICAgICAgIGlmIChzaG91bGRTdG9wVGhyZWFkQWN0aXZp
dHkoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHdoaWxlICghbV9zeW5jVGhy
ZWFkSGFzV29ya1RvRG8pCisgICAgICAgICAgICBtX3N5bmNDb25kaXRpb24ud2FpdChtX3N5bmNM
b2NrKTsKKworICAgICAgICBtX3N5bmNUaHJlYWRIYXNXb3JrVG9EbyA9IGZhbHNlOworICAgIH0K
KworICAgIG1fc3luY0xvY2sudW5sb2NrKCk7CisKKyAgICAvLyBUaHJlYWQgaXMgdGVybWluYXRp
bmcgYXQgdGhpcyBwb2ludAorICAgIGNsZWFudXBTeW5jVGhyZWFkKCk7Cit9CisKK3ZvaWQgSWNv
bkRhdGFiYXNlOjpwZXJmb3JtUGVuZGluZ1JldGFpbkFuZFJlbGVhc2VPcGVyYXRpb25zKCkKK3sK
KyAgICAvLyBOT1RFOiBUaGUgY2FsbGVyIGlzIGFzc3VtZWQgdG8gaG9sZCBtX3VybEFuZEljb25M
b2NrLgorICAgIEFTU0VSVCghbV91cmxBbmRJY29uTG9jay50cnlMb2NrKCkpOworCisgICAgSGFz
aENvdW50ZWRTZXQ8U3RyaW5nPiB0b1JldGFpbjsKKyAgICBIYXNoQ291bnRlZFNldDxTdHJpbmc+
IHRvUmVsZWFzZTsKKworICAgIHsKKyAgICAgICAgTG9ja0hvbGRlciBwZW5kaW5nV29ya0xvY2tl
cihtX3VybHNUb1JldGFpbk9yUmVsZWFzZUxvY2spOworICAgICAgICBpZiAoIW1fcmV0YWluT3JS
ZWxlYXNlSWNvblJlcXVlc3RlZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBN
YWtlIGEgY29weSBvZiB0aGUgVVJMcyB0byByZXRhaW4gYW5kL29yIHJlbGVhc2Ugc28gd2UgY2Fu
IHJlbGVhc2UgbV91cmxzVG9SZXRhaW5PclJlbGVhc2VMb2NrIEFTQVAuCisgICAgICAgIC8vIEhv
bGRpbmcgbV91cmxBbmRJY29uTG9jayBwcm90ZWN0cyB0aGlzIGZ1bmN0aW9uIGZyb20gYmVpbmcg
cmUtZW50ZXJlZC4KKworICAgICAgICB0b1JldGFpbi5zd2FwKG1fdXJsc1RvUmV0YWluKTsKKyAg
ICAgICAgdG9SZWxlYXNlLnN3YXAobV91cmxzVG9SZWxlYXNlKTsKKyAgICAgICAgbV9yZXRhaW5P
clJlbGVhc2VJY29uUmVxdWVzdGVkID0gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChhdXRvJiBl
bnRyeSA6IHRvUmV0YWluKSB7CisgICAgICAgIEFTU0VSVCghZW50cnkua2V5LmltcGwoKSB8fCBl
bnRyeS5rZXkuaW1wbCgpLT5oYXNPbmVSZWYoKSk7CisgICAgICAgIHBlcmZvcm1SZXRhaW5JY29u
Rm9yUGFnZVVSTChlbnRyeS5rZXksIGVudHJ5LnZhbHVlKTsKKyAgICB9CisKKyAgICBmb3IgKGF1
dG8mIGVudHJ5IDogdG9SZWxlYXNlKSB7CisgICAgICAgIEFTU0VSVCghZW50cnkua2V5LmltcGwo
KSB8fCBlbnRyeS5rZXkuaW1wbCgpLT5oYXNPbmVSZWYoKSk7CisgICAgICAgIHBlcmZvcm1SZWxl
YXNlSWNvbkZvclBhZ2VVUkwoZW50cnkua2V5LCBlbnRyeS52YWx1ZSk7CisgICAgfQorfQorCiti
b29sIEljb25EYXRhYmFzZTo6cmVhZEZyb21EYXRhYmFzZSgpCit7CisgICAgQVNTRVJUX0lDT05f
U1lOQ19USFJFQUQoKTsKKworI2lmICFMT0dfRElTQUJMRUQKKyAgICBkb3VibGUgdGltZVN0YW1w
ID0gbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCk7CisjZW5kaWYKKworICAgIGJvb2wgZGlk
QW55V29yayA9IGZhbHNlOworCisgICAgLy8gV2UnbGwgbWFrZSBhIGNvcHkgb2YgdGhlIHNldHMg
b2YgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSByZWFkLiBUaGVuIHdlJ2xsIHZlcmlmeSBhdCB0aGUg
dGltZSBvZiB1cGRhdGluZyB0aGUgcmVjb3JkIHRoYXQgaXQgc3RpbGwgd2FudHMgdG8gYmUgdXBk
YXRlZAorICAgIC8vIFRoaXMgd2F5IHdlIHdvbid0IGhvbGQgdGhlIGxvY2sgZm9yIGEgbG9uZyBw
ZXJpb2Qgb2YgdGltZQorICAgIFZlY3RvcjxJY29uUmVjb3JkKj4gaWNvbnM7CisgICAgeworICAg
ICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX3BlbmRpbmdSZWFkaW5nTG9jayk7CisgICAgICAgIGlj
b25zLmFwcGVuZFJhbmdlKG1faWNvbnNQZW5kaW5nUmVhZGluZy5iZWdpbigpLCBtX2ljb25zUGVu
ZGluZ1JlYWRpbmcuZW5kKCkpOworICAgIH0KKworICAgIC8vIEtlZXAgdHJhY2sgb2YgaWNvbnMg
d2UgYWN0dWFsbHkgcmVhZCB0byBub3RpZnkgdGhlbSBvZiB0aGUgbmV3IGljb24KKyAgICBIYXNo
U2V0PFN0cmluZz4gdXJsc1RvTm90aWZ5OworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IGljb25zLnNpemUoKTsgKytpKSB7CisgICAgICAgIGRpZEFueVdvcmsgPSB0cnVlOworICAgICAg
ICBhdXRvIGltYWdlRGF0YSA9IGdldEltYWdlRGF0YUZvckljb25VUkxGcm9tU1FMRGF0YWJhc2Uo
aWNvbnNbaV0tPmljb25VUkwoKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoaXMgaWNvbiBzdGls
bCB3YW50cyB0byBiZSByZWFkIGZyb20gZGlzaworICAgICAgICB7CisgICAgICAgICAgICBMb2Nr
SG9sZGVyIHVybExvY2tlcihtX3VybEFuZEljb25Mb2NrKTsKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICBMb2NrSG9sZGVyIHJlYWRMb2NrZXIobV9wZW5kaW5nUmVhZGluZ0xvY2spOwor
CisgICAgICAgICAgICAgICAgaWYgKG1faWNvbnNQZW5kaW5nUmVhZGluZy5jb250YWlucyhpY29u
c1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBuZXcgZGF0YQorICAgICAg
ICAgICAgICAgICAgICBpY29uc1tpXS0+c2V0SW1hZ2VEYXRhKFdURk1vdmUoaW1hZ2VEYXRhKSk7
CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgaWNvbiBmcm9tIHRoZSBzZXQg
dGhhdCBuZWVkcyB0byBiZSByZWFkCisgICAgICAgICAgICAgICAgICAgIG1faWNvbnNQZW5kaW5n
UmVhZGluZy5yZW1vdmUoaWNvbnNbaV0pOworCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhh
dmUgYSBzZXQgb2YgYWxsIFBhZ2UgVVJMcyB0aGF0IHJldGFpbiB0aGlzIGljb24gYXMgd2VsbCBh
cyBhbGwgUGFnZVVSTHMgd2FpdGluZyBmb3IgYW4gaWNvbgorICAgICAgICAgICAgICAgICAgICAv
LyBXZSB3YW50IHRvIGZpbmQgdGhlIGludGVyc2VjdGlvbiBvZiB0aGVzZSB0d28gc2V0cyB0byBu
b3RpZnkgdGhlbQorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgc2l6ZXMgb2YgdGhl
c2UgdHdvIHNldHMgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zCisgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IEhhc2hTZXQ8U3RyaW5nPiogb3V0ZXJIYXNoOworICAgICAgICAg
ICAgICAgICAgICBjb25zdCBIYXNoU2V0PFN0cmluZz4qIGlubmVySGFzaDsKKworICAgICAgICAg
ICAgICAgICAgICBpZiAoaWNvbnNbaV0tPnJldGFpbmluZ1BhZ2VVUkxzKCkuc2l6ZSgpID4gbV9w
YWdlVVJMc0ludGVyZXN0ZWRJbkljb25zLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgb3V0ZXJIYXNoID0gJm1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29uczsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlubmVySGFzaCA9ICYoaWNvbnNbaV0tPnJldGFpbmluZ1BhZ2VVUkxzKCkp
OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAg
aW5uZXJIYXNoID0gJm1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29uczsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIG91dGVySGFzaCA9ICYoaWNvbnNbaV0tPnJldGFpbmluZ1BhZ2VVUkxzKCkpOwor
ICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBv
dXRlciA6ICpvdXRlckhhc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbm5lckhh
c2gtPmNvbnRhaW5zKG91dGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhJ
Y29uRGF0YWJhc2UsICIlcyBpcyBpbnRlcmVzdGVkIGluIHRoZSBpY29uIHdlIGp1c3QgcmVhZC4g
QWRkaW5nIGl0IHRvIHRoZSBub3RpZmljYXRpb24gbGlzdCBhbmQgcmVtb3ZpbmcgaXQgZnJvbSB0
aGUgaW50ZXJlc3RlZCBzZXQiLCB1cmxGb3JMb2dnaW5nKG91dGVyKS5hc2NpaSgpLmRhdGEoKSk7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsc1RvTm90aWZ5LmFkZChvdXRlcik7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElm
IHdlIGV2ZXIgZ2V0IHRvIHRoZSBwb2ludCB3ZXJlIHdlJ3ZlIHNlZW4gZXZlcnkgdXJsIGludGVy
ZXN0ZWQgaW4gdGhpcyBpY29uLCBicmVhayBlYXJseQorICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKHVybHNUb05vdGlmeS5zaXplKCkgPT0gbV9wYWdlVVJMc0ludGVyZXN0ZWRJbkljb25zLnNp
emUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gbm90aWZ5
IGEgUGFnZVVSTCB0d2ljZSwgc28gYWxsIHRoZSBvbmVzIHdlJ3JlIGFib3V0IHRvIG5vdGlmeSBj
YW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBpbnRlcmVzdGVkIHNldAorICAgICAgICAgICAgICAgICAg
ICBpZiAodXJsc1RvTm90aWZ5LnNpemUoKSA9PSBtX3BhZ2VVUkxzSW50ZXJlc3RlZEluSWNvbnMu
c2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wYWdlVVJMc0ludGVyZXN0ZWRJbklj
b25zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAg
ICAgICAgICAgZm9yIChhdXRvJiB1cmwgOiB1cmxzVG9Ob3RpZnkpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbV9wYWdlVVJMc0ludGVyZXN0ZWRJbkljb25zLnJlbW92ZSh1cmwpOworICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICB9CisKKyAgICAgICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKQorICAgICAg
ICAgICAgcmV0dXJuIGRpZEFueVdvcms7CisKKyAgICAgICAgLy8gTm93IHRoYXQgd2UgZG9uJ3Qg
aG9sZCBhbnkgbG9ja3MsIHBlcmZvcm0gdGhlIGFjdHVhbCBub3RpZmljYXRpb25zCisgICAgICAg
IGZvciAoSGFzaFNldDxTdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHVybHNUb05vdGlmeS5i
ZWdpbigpLCBlbmQgPSB1cmxzVG9Ob3RpZnkuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAg
ICAgICAgICAgQXV0b2RyYWluZWRQb29sIHBvb2w7CisKKyAgICAgICAgICAgIExPRyhJY29uRGF0
YWJhc2UsICJOb3RpZnlpbmcgaWNvbiByZWNlaXZlZCBmb3IgcGFnZVVSTCAlcyIsIHVybEZvckxv
Z2dpbmcoKml0KS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBkaXNwYXRjaERpZEltcG9y
dEljb25EYXRhRm9yUGFnZVVSTE9uTWFpblRocmVhZCgqaXQpOworICAgICAgICAgICAgaWYgKHNo
b3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBkaWRBbnlX
b3JrOworICAgICAgICB9CisKKyAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIkRvbmUgbm90aWZ5
aW5nICVpIHBhZ2VVUkxzIHdobyBqdXN0IHJlY2VpdmVkIHRoZWlyIGljb25zIiwgdXJsc1RvTm90
aWZ5LnNpemUoKSk7CisgICAgICAgIHVybHNUb05vdGlmeS5jbGVhcigpOworCisgICAgICAgIGlm
IChzaG91bGRTdG9wVGhyZWFkQWN0aXZpdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBkaWRBbnlX
b3JrOworICAgIH0KKworICAgIExPRyhJY29uRGF0YWJhc2UsICJSZWFkaW5nIGZyb20gZGF0YWJh
c2UgdG9vayAlLjRmIHNlY29uZHMiLCBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKSAtIHRp
bWVTdGFtcCk7CisKKyAgICByZXR1cm4gZGlkQW55V29yazsKK30KKworYm9vbCBJY29uRGF0YWJh
c2U6OndyaXRlVG9EYXRhYmFzZSgpCit7CisgICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsK
KworI2lmICFMT0dfRElTQUJMRUQKKyAgICBkb3VibGUgdGltZVN0YW1wID0gbW9ub3RvbmljYWxs
eUluY3JlYXNpbmdUaW1lKCk7CisjZW5kaWYKKworICAgIGJvb2wgZGlkQW55V29yayA9IGZhbHNl
OworCisgICAgLy8gV2UgY2FuIGNvcHkgdGhlIGN1cnJlbnQgd29yayBxdWV1ZSB0aGVuIGNsZWFy
IGl0IG91dCAtIElmIGFueSBuZXcgd29yayBjb21lcyBpbiB3aGlsZSB3ZSdyZSB3cml0aW5nIG91
dCwKKyAgICAvLyB3ZSdsbCBwaWNrIGl0IHVwIG9uIHRoZSBuZXh0IHBhc3MuIFRoaXMgZ3JlYXRs
eSBzaW1wbGlmaWVzIHRoZSBsb2NraW5nIHN0cmF0ZWd5IGZvciB0aGlzIG1ldGhvZCBhbmQgcmVt
YWlucyBjb2hlc2l2ZSB3aXRoIGNoYW5nZXMKKyAgICAvLyBhc2tlZCBmb3IgYnkgdGhlIGRhdGFi
YXNlIG9uIHRoZSBtYWluIHRocmVhZAorICAgIHsKKyAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIo
bV91cmxBbmRJY29uTG9jayk7CisgICAgICAgIFZlY3RvcjxJY29uU25hcHNob3Q+IGljb25TbmFw
c2hvdHM7CisgICAgICAgIFZlY3RvcjxQYWdlVVJMU25hcHNob3Q+IHBhZ2VTbmFwc2hvdHM7Cisg
ICAgICAgIHsKKyAgICAgICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fcGVuZGluZ1N5bmNMb2Nr
KTsKKworICAgICAgICAgICAgaWNvblNuYXBzaG90cy5hcHBlbmRSYW5nZShtX2ljb25zUGVuZGlu
Z1N5bmMuYmVnaW4oKS52YWx1ZXMoKSwgbV9pY29uc1BlbmRpbmdTeW5jLmVuZCgpLnZhbHVlcygp
KTsKKyAgICAgICAgICAgIG1faWNvbnNQZW5kaW5nU3luYy5jbGVhcigpOworCisgICAgICAgICAg
ICBwYWdlU25hcHNob3RzLmFwcGVuZFJhbmdlKG1fcGFnZVVSTHNQZW5kaW5nU3luYy5iZWdpbigp
LnZhbHVlcygpLCBtX3BhZ2VVUkxzUGVuZGluZ1N5bmMuZW5kKCkudmFsdWVzKCkpOworICAgICAg
ICAgICAgbV9wYWdlVVJMc1BlbmRpbmdTeW5jLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAg
ICBpZiAoaWNvblNuYXBzaG90cy5zaXplKCkgfHwgcGFnZVNuYXBzaG90cy5zaXplKCkpCisgICAg
ICAgICAgICBkaWRBbnlXb3JrID0gdHJ1ZTsKKworICAgICAgICBTUUxpdGVUcmFuc2FjdGlvbiBz
eW5jVHJhbnNhY3Rpb24obV9zeW5jREIpOworICAgICAgICBzeW5jVHJhbnNhY3Rpb24uYmVnaW4o
KTsKKworICAgICAgICBmb3IgKGF1dG8mIHNuYXBzaG90IDogaWNvblNuYXBzaG90cykgeworICAg
ICAgICAgICAgd3JpdGVJY29uU25hcHNob3RUb1NRTERhdGFiYXNlKHNuYXBzaG90KTsKKyAgICAg
ICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJXcm90ZSBJY29uUmVjb3JkIGZvciBJY29uVVJMICVz
IHdpdGggdGltZVN0YW1wIG9mICVpIHRvIHRoZSBEQiIsIHVybEZvckxvZ2dpbmcoc25hcHNob3Qu
aWNvblVSTCgpKS5hc2NpaSgpLmRhdGEoKSwgc25hcHNob3QudGltZXN0YW1wKCkpOworICAgICAg
ICB9CisKKyAgICAgICAgZm9yIChhdXRvJiBzbmFwc2hvdCA6IHBhZ2VTbmFwc2hvdHMpIHsKKyAg
ICAgICAgICAgIC8vIElmIHRoZSBpY29uIFVSTCBpcyBlbXB0eSwgdGhpcyBwYWdlIGlzIG1lYW50
IHRvIGJlIGRlbGV0ZWQKKyAgICAgICAgICAgIC8vIEFTU0VSVHMgYXJlIHNhbml0eSBjaGVja3Mg
dG8gbWFrZSBzdXJlIHRoZSBtYXBwaW5ncyBleGlzdCBpZiB0aGV5IHNob3VsZCBhbmQgZG9uJ3Qg
aWYgdGhleSBzaG91bGRuJ3QKKyAgICAgICAgICAgIGlmIChzbmFwc2hvdC5pY29uVVJMKCkuaXNF
bXB0eSgpKQorICAgICAgICAgICAgICAgIHJlbW92ZVBhZ2VVUkxGcm9tU1FMRGF0YWJhc2Uoc25h
cHNob3QucGFnZVVSTCgpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXRJ
Y29uVVJMRm9yUGFnZVVSTEluU1FMRGF0YWJhc2Uoc25hcHNob3QuaWNvblVSTCgpLCBzbmFwc2hv
dC5wYWdlVVJMKCkpOworICAgICAgICAgICAgTE9HKEljb25EYXRhYmFzZSwgIkNvbW1pdHRlZCBJ
Y29uVVJMIGZvciBQYWdlVVJMICVzIHRvIGRhdGFiYXNlIiwgdXJsRm9yTG9nZ2luZyhzbmFwc2hv
dC5wYWdlVVJMKCkpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNU
cmFuc2FjdGlvbi5jb21taXQoKTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUg
dGhlcmUgYXJlIG5vIGRhbmdsaW5nIFBhZ2VVUkxzIC0gSWYgdGhlcmUgYXJlLCB3ZSB3YW50IHRv
IG91dHB1dCBvbmUgbG9nIG1lc3NhZ2UgYnV0IG5vdCBzcGFtIHRoZSBjb25zb2xlIHBvdGVudGlh
bGx5IGV2ZXJ5IGZldyBzZWNvbmRzCisgICAgaWYgKGRpZEFueVdvcmspCisgICAgICAgIGNoZWNr
Rm9yRGFuZ2xpbmdQYWdlVVJMcyhmYWxzZSk7CisKKyAgICBMT0coSWNvbkRhdGFiYXNlLCAiVXBk
YXRpbmcgdGhlIGRhdGFiYXNlIHRvb2sgJS40ZiBzZWNvbmRzIiwgbW9ub3RvbmljYWxseUluY3Jl
YXNpbmdUaW1lKCkgLSB0aW1lU3RhbXApOworCisgICAgcmV0dXJuIGRpZEFueVdvcms7Cit9CisK
K3ZvaWQgSWNvbkRhdGFiYXNlOjpwcnVuZVVucmV0YWluZWRJY29ucygpCit7CisgICAgQVNTRVJU
X0lDT05fU1lOQ19USFJFQUQoKTsKKworICAgIGlmICghaXNPcGVuKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBy
dW4KKyAgICBBU1NFUlQoIW1faW5pdGlhbFBydW5pbmdDb21wbGV0ZSk7CisKKyAgICAvLyBUaGlz
IG1ldGhvZCByZWxpZXMgb24gaGF2aW5nIHJlYWQgaW4gYWxsIHBhZ2UgVVJMcyBmcm9tIHRoZSBk
YXRhYmFzZSBlYXJsaWVyLgorICAgIEFTU0VSVChtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSk7CisK
KyAgICAvLyBHZXQgdGhlIGtub3duIFBhZ2VVUkxzIGZyb20gdGhlIGRiLCBhbmQgcmVjb3JkIHRo
ZSBJRCBvZiBhbnkgdGhhdCBhcmUgbm90IGluIHRoZSByZXRhaW4gY291bnQgc2V0LgorICAgIFZl
Y3RvcjxpbnQ2NF90PiBwYWdlSURzVG9EZWxldGU7CisKKyAgICBTUUxpdGVTdGF0ZW1lbnQgcGFn
ZVNRTChtX3N5bmNEQiwgIlNFTEVDVCByb3dpZCwgdXJsIEZST00gUGFnZVVSTDsiKTsKKyAgICBw
YWdlU1FMLnByZXBhcmUoKTsKKworICAgIGludCByZXN1bHQ7CisgICAgd2hpbGUgKChyZXN1bHQg
PSBwYWdlU1FMLnN0ZXAoKSkgPT0gU1FMSVRFX1JPVykgeworICAgICAgICBMb2NrSG9sZGVyIGxv
Y2tlcihtX3VybEFuZEljb25Mb2NrKTsKKyAgICAgICAgaWYgKCFtX3BhZ2VVUkxUb1JlY29yZE1h
cC5jb250YWlucyhwYWdlU1FMLmdldENvbHVtblRleHQoMSkpKQorICAgICAgICAgICAgcGFnZUlE
c1RvRGVsZXRlLmFwcGVuZChwYWdlU1FMLmdldENvbHVtbkludDY0KDApKTsKKyAgICB9CisKKyAg
ICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKQorICAgICAgICBMT0dfRVJST1IoIkVycm9yIHJl
YWRpbmcgUGFnZVVSTCB0YWJsZSBmcm9tIG9uLWRpc2sgREIiKTsKKyAgICBwYWdlU1FMLmZpbmFs
aXplKCk7CisKKyAgICAvLyBEZWxldGUgcGFnZSBVUkxzIHRoYXQgd2VyZSBpbiB0aGUgdGFibGUs
IGJ1dCBub3QgaW4gb3VyIHJldGFpbiBjb3VudCBzZXQuCisgICAgc2l6ZV90IG51bVRvRGVsZXRl
ID0gcGFnZUlEc1RvRGVsZXRlLnNpemUoKTsKKyAgICBpZiAobnVtVG9EZWxldGUpIHsKKyAgICAg
ICAgU1FMaXRlVHJhbnNhY3Rpb24gcHJ1bmluZ1RyYW5zYWN0aW9uKG1fc3luY0RCKTsKKyAgICAg
ICAgcHJ1bmluZ1RyYW5zYWN0aW9uLmJlZ2luKCk7CisKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50
IHBhZ2VEZWxldGVTUUwobV9zeW5jREIsICJERUxFVEUgRlJPTSBQYWdlVVJMIFdIRVJFIHJvd2lk
ID0gKD8pOyIpOworICAgICAgICBwYWdlRGVsZXRlU1FMLnByZXBhcmUoKTsKKyAgICAgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBudW1Ub0RlbGV0ZTsgKytpKSB7CisgICAgICAgICAgICBMT0co
SWNvbkRhdGFiYXNlLCAiUHJ1bmluZyBwYWdlIHdpdGggcm93aWQgJWxsaSBmcm9tIGRpc2siLCBz
dGF0aWNfY2FzdDxsb25nIGxvbmc+KHBhZ2VJRHNUb0RlbGV0ZVtpXSkpOworICAgICAgICAgICAg
cGFnZURlbGV0ZVNRTC5iaW5kSW50NjQoMSwgcGFnZUlEc1RvRGVsZXRlW2ldKTsKKyAgICAgICAg
ICAgIGludCByZXN1bHQgPSBwYWdlRGVsZXRlU1FMLnN0ZXAoKTsKKyAgICAgICAgICAgIGlmIChy
ZXN1bHQgIT0gU1FMSVRFX0RPTkUpCisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJVbmFibGVk
IHRvIGRlbGV0ZSBwYWdlIHdpdGggaWQgJWxsaSBmcm9tIGRpc2siLCBzdGF0aWNfY2FzdDxsb25n
IGxvbmc+KHBhZ2VJRHNUb0RlbGV0ZVtpXSkpOworICAgICAgICAgICAgcGFnZURlbGV0ZVNRTC5y
ZXNldCgpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgdGhyZWFkIHdhcyBhc2tlZCB0byB0ZXJt
aW5hdGUsIHdlIHNob3VsZCBjb21taXQgd2hhdCBwcnVuaW5nIHdlJ3ZlIGRvbmUgc28gZmFyLCBm
aWd1cmluZyB3ZSBjYW4KKyAgICAgICAgICAgIC8vIGZpbmlzaCB0aGUgcmVzdCBsYXRlciAoaG9w
ZWZ1bGx5KQorICAgICAgICAgICAgaWYgKHNob3VsZFN0b3BUaHJlYWRBY3Rpdml0eSgpKSB7Cisg
ICAgICAgICAgICAgICAgcHJ1bmluZ1RyYW5zYWN0aW9uLmNvbW1pdCgpOworICAgICAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcnVuaW5nVHJh
bnNhY3Rpb24uY29tbWl0KCk7CisgICAgICAgIHBhZ2VEZWxldGVTUUwuZmluYWxpemUoKTsKKyAg
ICB9CisKKyAgICAvLyBEZWxldGluZyB1bnJlZmVyZW5jZWQgaWNvbnMgZnJvbSB0aGUgSWNvbiB0
YWJsZXMgaGFzIHRvIGJlIGF0b21pYyAtCisgICAgLy8gSWYgdGhlIHVzZXIgcXVpdHMgd2hpbGUg
dGhlc2UgYXJlIHRha2luZyBwbGFjZSwgdGhleSBtaWdodCBoYXZlIHRvIHdhaXQuIFRoYW5rZnVs
bHkgdGhpcyB3aWxsIHJhcmVseSBiZSBhbiBpc3N1ZQorICAgIC8vIEEgdXNlciBvbiBhIG5ldHdv
cmsgaG9tZSBkaXJlY3Rvcnkgd2l0aCBhIHdpbGRseSBpbmNvbnNpc3RlbnQgZGF0YWJhc2UgbWln
aHQgc2VlIHF1aXRlIGEgcGF1c2UuLi4KKworICAgIFNRTGl0ZVRyYW5zYWN0aW9uIHBydW5pbmdU
cmFuc2FjdGlvbihtX3N5bmNEQik7CisgICAgcHJ1bmluZ1RyYW5zYWN0aW9uLmJlZ2luKCk7CisK
KyAgICAvLyBXaXBlIEljb25zIHRoYXQgYXJlbid0IHJldGFpbmVkCisgICAgaWYgKCFtX3N5bmNE
Qi5leGVjdXRlQ29tbWFuZCgiREVMRVRFIEZST00gSWNvbkRhdGEgV0hFUkUgaWNvbklEIE5PVCBJ
TiAoU0VMRUNUIGljb25JRCBGUk9NIFBhZ2VVUkwpOyIpKQorICAgICAgICBMT0dfRVJST1IoIkZh
aWxlZCB0byBleGVjdXRlIFNRTCB0byBwcnVuZSB1bnJldGFpbmVkIGljb25zIGZyb20gdGhlIG9u
LWRpc2sgSWNvbkRhdGEgdGFibGUiKTsKKyAgICBpZiAoIW1fc3luY0RCLmV4ZWN1dGVDb21tYW5k
KCJERUxFVEUgRlJPTSBJY29uSW5mbyBXSEVSRSBpY29uSUQgTk9UIElOIChTRUxFQ1QgaWNvbklE
IEZST00gUGFnZVVSTCk7IikpCisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGV4ZWN1dGUg
U1FMIHRvIHBydW5lIHVucmV0YWluZWQgaWNvbnMgZnJvbSB0aGUgb24tZGlzayBJY29uSW5mbyB0
YWJsZSIpOworCisgICAgcHJ1bmluZ1RyYW5zYWN0aW9uLmNvbW1pdCgpOworCisgICAgY2hlY2tG
b3JEYW5nbGluZ1BhZ2VVUkxzKHRydWUpOworCisgICAgbV9pbml0aWFsUHJ1bmluZ0NvbXBsZXRl
ID0gdHJ1ZTsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6OmNoZWNrRm9yRGFuZ2xpbmdQYWdlVVJM
cyhib29sIHBydW5lSWZGb3VuZCkKK3sKKyAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOwor
CisgICAgLy8gVGhpcyBjaGVjayBjYW4gYmUgcmVsYXRpdmVseSBleHBlbnNpdmUgc28gd2UgZG9u
J3QgZG8gaXQgaW4gYSByZWxlYXNlIGJ1aWxkIHVubGVzcyB0aGUgY2FsbGVyIGhhcyBhc2tlZCB1
cyB0byBwcnVuZSBhbnkgZGFuZ2xpbmcKKyAgICAvLyBlbnRyaWVzLiBXZSBhbHNvIGRvbid0IHdh
bnQgdG8ga2VlcCBwZXJmb3JtaW5nIHRoaXMgY2hlY2sgYW5kIHJlcG9ydGluZyB0aGlzIGVycm9y
IGlmIGl0IGhhcyBhbHJlYWR5IGZvdW5kIGRhbmdsZXJzIGJlZm9yZSBzbyB3ZQorICAgIC8vIGtl
ZXAgdHJhY2sgb2Ygd2hldGhlciB3ZSd2ZSBmb3VuZCBhbnkuIFdlIHNraXAgdGhlIGNoZWNrIGlu
IHRoZSByZWxlYXNlIGJ1aWxkIHByZXRlbmRpbmcgdG8gaGF2ZSBhbHJlYWR5IGZvdW5kIGRhbmds
ZXJzIGFscmVhZHkuCisjaWZuZGVmIE5ERUJVRworICAgIHN0YXRpYyBib29sIGRhbmdsZXJzRm91
bmQgPSB0cnVlOworI2Vsc2UKKyAgICBzdGF0aWMgYm9vbCBkYW5nbGVyc0ZvdW5kID0gZmFsc2U7
CisjZW5kaWYKKworICAgIGlmICgocHJ1bmVJZkZvdW5kIHx8ICFkYW5nbGVyc0ZvdW5kKSAmJiBT
UUxpdGVTdGF0ZW1lbnQobV9zeW5jREIsICJTRUxFQ1QgdXJsIEZST00gUGFnZVVSTCBXSEVSRSBQ
YWdlVVJMLmljb25JRCBOT1QgSU4gKFNFTEVDVCBpY29uSUQgRlJPTSBJY29uSW5mbykgTElNSVQg
MTsiKS5yZXR1cm5zQXRMZWFzdE9uZVJlc3VsdCgpKSB7CisgICAgICAgIGRhbmdsZXJzRm91bmQg
PSB0cnVlOworICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiRGFuZ2xpbmcgUGFnZVVSTCBlbnRy
aWVzIGZvdW5kIik7CisgICAgICAgIGlmIChwcnVuZUlmRm91bmQgJiYgIW1fc3luY0RCLmV4ZWN1
dGVDb21tYW5kKCJERUxFVEUgRlJPTSBQYWdlVVJMIFdIRVJFIGljb25JRCBOT1QgSU4gKFNFTEVD
VCBpY29uSUQgRlJPTSBJY29uSW5mbyk7IikpCisgICAgICAgICAgICBMT0coSWNvbkRhdGFiYXNl
LCAiVW5hYmxlIHRvIHBydW5lIGRhbmdsaW5nIFBhZ2VVUkxzIik7CisgICAgfQorfQorCit2b2lk
IEljb25EYXRhYmFzZTo6cmVtb3ZlQWxsSWNvbnNPblRocmVhZCgpCit7CisgICAgQVNTRVJUX0lD
T05fU1lOQ19USFJFQUQoKTsKKworICAgIExPRyhJY29uRGF0YWJhc2UsICJSZW1vdmluZyBhbGwg
aWNvbnMgb24gdGhlIHN5bmMgdGhyZWFkIik7CisKKyAgICAvLyBEZWxldGUgYWxsIHRoZSBwcmVw
YXJlZCBzdGF0ZW1lbnRzIHNvIHRoZXkgY2FuIHN0YXJ0IG92ZXIKKyAgICBkZWxldGVBbGxQcmVw
YXJlZFN0YXRlbWVudHMoKTsKKworICAgIC8vIFRvIHJlc2V0IHRoZSBvbi1kaXNrIGRhdGFiYXNl
LCB3ZSdsbCB3aXBlIGFsbCBpdHMgdGFibGVzIHRoZW4gdmFjdXVtIGl0CisgICAgLy8gVGhpcyBp
cyBlYXNpZXIgYW5kIHNhZmVyIHRoYW4gY2xvc2luZyBpdCwgZGVsZXRpbmcgdGhlIGZpbGUsIGFu
ZCByZWNyZWF0aW5nIGZyb20gc2NyYXRjaAorICAgIG1fc3luY0RCLmNsZWFyQWxsVGFibGVzKCk7
CisgICAgbV9zeW5jREIucnVuVmFjdXVtQ29tbWFuZCgpOworICAgIGNyZWF0ZURhdGFiYXNlVGFi
bGVzKG1fc3luY0RCKTsKKworICAgIExPRyhJY29uRGF0YWJhc2UsICJEaXNwYXRjaGluZyBub3Rp
ZmljYXRpb24gdGhhdCB3ZSByZW1vdmVkIGFsbCBpY29ucyIpOworICAgIGRpc3BhdGNoRGlkUmVt
b3ZlQWxsSWNvbnNPbk1haW5UaHJlYWQoKTsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6OmRlbGV0
ZUFsbFByZXBhcmVkU3RhdGVtZW50cygpCit7CisgICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQo
KTsKKworICAgIG1fc2V0SWNvbklERm9yUGFnZVVSTFN0YXRlbWVudCA9IG51bGxwdHI7CisgICAg
bV9yZW1vdmVQYWdlVVJMU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAgICBtX2dldEljb25JREZvcklj
b25VUkxTdGF0ZW1lbnQgPSBudWxscHRyOworICAgIG1fZ2V0SW1hZ2VEYXRhRm9ySWNvblVSTFN0
YXRlbWVudCA9IG51bGxwdHI7CisgICAgbV9hZGRJY29uVG9JY29uSW5mb1N0YXRlbWVudCA9IG51
bGxwdHI7CisgICAgbV9hZGRJY29uVG9JY29uRGF0YVN0YXRlbWVudCA9IG51bGxwdHI7CisgICAg
bV9nZXRJbWFnZURhdGFTdGF0ZW1lbnQgPSBudWxscHRyOworICAgIG1fZGVsZXRlUGFnZVVSTHNG
b3JJY29uVVJMU3RhdGVtZW50ID0gbnVsbHB0cjsKKyAgICBtX2RlbGV0ZUljb25Gcm9tSWNvbklu
Zm9TdGF0ZW1lbnQgPSBudWxscHRyOworICAgIG1fZGVsZXRlSWNvbkZyb21JY29uRGF0YVN0YXRl
bWVudCA9IG51bGxwdHI7CisgICAgbV91cGRhdGVJY29uSW5mb1N0YXRlbWVudCA9IG51bGxwdHI7
CisgICAgbV91cGRhdGVJY29uRGF0YVN0YXRlbWVudCAgPSBudWxscHRyOworICAgIG1fc2V0SWNv
bkluZm9TdGF0ZW1lbnQgPSBudWxscHRyOworICAgIG1fc2V0SWNvbkRhdGFTdGF0ZW1lbnQgPSBu
dWxscHRyOworfQorCit2b2lkKiBJY29uRGF0YWJhc2U6OmNsZWFudXBTeW5jVGhyZWFkKCkKK3sK
KyAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOworCisjaWYgIUxPR19ESVNBQkxFRAorICAg
IGRvdWJsZSB0aW1lU3RhbXAgPSBtb25vdG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKKyNlbmRp
ZgorCisgICAgLy8gSWYgdGhlIHJlbW92ZUljb25zIGZsYWcgaXMgc2V0LCByZW1vdmUgYWxsIGlj
b25zIGZyb20gdGhlIGRiLgorICAgIGlmIChtX3JlbW92ZUljb25zUmVxdWVzdGVkKQorICAgICAg
ICByZW1vdmVBbGxJY29uc09uVGhyZWFkKCk7CisKKyAgICAvLyBTeW5jIHJlbWFpbmluZyBpY29u
cyBvdXQKKyAgICBMT0coSWNvbkRhdGFiYXNlLCAiKFRIUkVBRCkgRG9pbmcgZmluYWwgd3JpdGVv
dXQgYW5kIGNsb3N1cmUgb2Ygc3luYyB0aHJlYWQiKTsKKyAgICB3cml0ZVRvRGF0YWJhc2UoKTsK
KworICAgIC8vIENsb3NlIHRoZSBkYXRhYmFzZQorICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fc3lu
Y0xvY2spOworCisgICAgbV9kYXRhYmFzZURpcmVjdG9yeSA9IFN0cmluZygpOworICAgIG1fY29t
cGxldGVEYXRhYmFzZVBhdGggPSBTdHJpbmcoKTsKKyAgICBkZWxldGVBbGxQcmVwYXJlZFN0YXRl
bWVudHMoKTsKKyAgICBtX3N5bmNEQi5jbG9zZSgpOworCisjaWYgIUxPR19ESVNBQkxFRAorICAg
IExPRyhJY29uRGF0YWJhc2UsICIoVEhSRUFEKSBGaW5hbCBjbG9zdXJlIHRvb2sgJS40ZiBzZWNv
bmRzIiwgbW9ub3RvbmljYWxseUluY3JlYXNpbmdUaW1lKCkgLSB0aW1lU3RhbXApOworI2VuZGlm
CisKKyAgICBtX3N5bmNUaHJlYWRSdW5uaW5nID0gZmFsc2U7CisgICAgcmV0dXJuIG51bGxwdHI7
Cit9CisKKy8vIHJlYWR5U1FMaXRlU3RhdGVtZW50KCkgaGFuZGxlcyB0d28gdGhpbmdzCisvLyAx
IC0gSWYgdGhlIFNRTERhdGFiYXNlJiBhcmd1bWVudCBpcyBkaWZmZXJlbnQsIHRoZSBzdGF0ZW1l
bnQgbXVzdCBiZSBkZXN0cm95ZWQgYW5kIHJlbWFkZS4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIHVz
ZXIKKy8vICAgICBzd2l0Y2hlcyB0byBhbmQgZnJvbSBwcml2YXRlIGJyb3dzaW5nCisvLyAyIC0g
TGF6eSBjb25zdHJ1Y3Rpb24gb2YgdGhlIFN0YXRlbWVudCBpbiB0aGUgZmlyc3QgcGxhY2UsIGlu
IGNhc2Ugd2UndmUgbmV2ZXIgbWFkZSB0aGlzIHF1ZXJ5IGJlZm9yZQoraW5saW5lIHZvaWQgcmVh
ZHlTUUxpdGVTdGF0ZW1lbnQoc3RkOjp1bmlxdWVfcHRyPFNRTGl0ZVN0YXRlbWVudD4mIHN0YXRl
bWVudCwgU1FMaXRlRGF0YWJhc2UmIGRiLCBjb25zdCBTdHJpbmcmIHN0cikKK3sKKyAgICBpZiAo
c3RhdGVtZW50ICYmICgmc3RhdGVtZW50LT5kYXRhYmFzZSgpICE9ICZkYiB8fCBzdGF0ZW1lbnQt
PmlzRXhwaXJlZCgpKSkgeworICAgICAgICBpZiAoc3RhdGVtZW50LT5pc0V4cGlyZWQoKSkKKyAg
ICAgICAgICAgIExPRyhJY29uRGF0YWJhc2UsICJTUUxpdGVTdGF0ZW1lbnQgYXNzb2NpYXRlZCB3
aXRoICVzIGlzIGV4cGlyZWQiLCBzdHIuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICBzdGF0ZW1l
bnQgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAoIXN0YXRlbWVudCkgeworICAgICAgICBzdGF0
ZW1lbnQgPSBzdGQ6Om1ha2VfdW5pcXVlPFNRTGl0ZVN0YXRlbWVudD4oZGIsIHN0cik7CisgICAg
ICAgIGlmIChzdGF0ZW1lbnQtPnByZXBhcmUoKSAhPSBTUUxJVEVfT0spCisgICAgICAgICAgICBM
T0dfRVJST1IoIlByZXBhcmluZyBzdGF0ZW1lbnQgJXMgZmFpbGVkIiwgc3RyLmFzY2lpKCkuZGF0
YSgpKTsKKyAgICB9Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpzZXRJY29uVVJMRm9yUGFnZVVS
TEluU1FMRGF0YWJhc2UoY29uc3QgU3RyaW5nJiBpY29uVVJMLCBjb25zdCBTdHJpbmcmIHBhZ2VV
UkwpCit7CisgICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKKworICAgIGludDY0X3QgaWNv
bklEID0gZ2V0SWNvbklERm9ySWNvblVSTEZyb21TUUxEYXRhYmFzZShpY29uVVJMKTsKKworICAg
IGlmICghaWNvbklEKQorICAgICAgICBpY29uSUQgPSBhZGRJY29uVVJMVG9TUUxEYXRhYmFzZShp
Y29uVVJMKTsKKworICAgIGlmICghaWNvbklEKSB7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVk
IHRvIGVzdGFibGlzaCBhbiBJRCBmb3IgaWNvblVSTCAlcyIsIHVybEZvckxvZ2dpbmcoaWNvblVS
TCkuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIHNldEljb25JREZvclBhZ2VVUkxJblNRTERhdGFiYXNl
KGljb25JRCwgcGFnZVVSTCk7Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpzZXRJY29uSURGb3JQ
YWdlVVJMSW5TUUxEYXRhYmFzZShpbnQ2NF90IGljb25JRCwgY29uc3QgU3RyaW5nJiBwYWdlVVJM
KQoreworICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFEKCk7CisKKyAgICByZWFkeVNRTGl0ZVN0
YXRlbWVudChtX3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQsIG1fc3luY0RCLCAiSU5TRVJU
IElOVE8gUGFnZVVSTCAodXJsLCBpY29uSUQpIFZBTFVFUyAoKD8pLCA/KTsiKTsKKyAgICBtX3Nl
dEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQtPmJpbmRUZXh0KDEsIHBhZ2VVUkwpOworICAgIG1f
c2V0SWNvbklERm9yUGFnZVVSTFN0YXRlbWVudC0+YmluZEludDY0KDIsIGljb25JRCk7CisKKyAg
ICBpbnQgcmVzdWx0ID0gbV9zZXRJY29uSURGb3JQYWdlVVJMU3RhdGVtZW50LT5zdGVwKCk7Cisg
ICAgaWYgKHJlc3VsdCAhPSBTUUxJVEVfRE9ORSkgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICAgICAgTE9HX0VSUk9SKCJzZXRJY29uSURGb3JQYWdlVVJMUXVlcnkgZmFpbGVk
IGZvciB1cmwgJXMiLCB1cmxGb3JMb2dnaW5nKHBhZ2VVUkwpLmFzY2lpKCkuZGF0YSgpKTsKKyAg
ICB9CisKKyAgICBtX3NldEljb25JREZvclBhZ2VVUkxTdGF0ZW1lbnQtPnJlc2V0KCk7Cit9CisK
K3ZvaWQgSWNvbkRhdGFiYXNlOjpyZW1vdmVQYWdlVVJMRnJvbVNRTERhdGFiYXNlKGNvbnN0IFN0
cmluZyYgcGFnZVVSTCkKK3sKKyAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOworCisgICAg
cmVhZHlTUUxpdGVTdGF0ZW1lbnQobV9yZW1vdmVQYWdlVVJMU3RhdGVtZW50LCBtX3N5bmNEQiwg
IkRFTEVURSBGUk9NIFBhZ2VVUkwgV0hFUkUgdXJsID0gKD8pOyIpOworICAgIG1fcmVtb3ZlUGFn
ZVVSTFN0YXRlbWVudC0+YmluZFRleHQoMSwgcGFnZVVSTCk7CisKKyAgICBpZiAobV9yZW1vdmVQ
YWdlVVJMU3RhdGVtZW50LT5zdGVwKCkgIT0gU1FMSVRFX0RPTkUpCisgICAgICAgIExPR19FUlJP
UigicmVtb3ZlUGFnZVVSTEZyb21TUUxEYXRhYmFzZSBmYWlsZWQgZm9yIHVybCAlcyIsIHVybEZv
ckxvZ2dpbmcocGFnZVVSTCkuYXNjaWkoKS5kYXRhKCkpOworCisgICAgbV9yZW1vdmVQYWdlVVJM
U3RhdGVtZW50LT5yZXNldCgpOworfQorCisKK2ludDY0X3QgSWNvbkRhdGFiYXNlOjpnZXRJY29u
SURGb3JJY29uVVJMRnJvbVNRTERhdGFiYXNlKGNvbnN0IFN0cmluZyYgaWNvblVSTCkKK3sKKyAg
ICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOworCisgICAgcmVhZHlTUUxpdGVTdGF0ZW1lbnQo
bV9nZXRJY29uSURGb3JJY29uVVJMU3RhdGVtZW50LCBtX3N5bmNEQiwgIlNFTEVDVCBJY29uSW5m
by5pY29uSUQgRlJPTSBJY29uSW5mbyBXSEVSRSBJY29uSW5mby51cmwgPSAoPyk7Iik7CisgICAg
bV9nZXRJY29uSURGb3JJY29uVVJMU3RhdGVtZW50LT5iaW5kVGV4dCgxLCBpY29uVVJMKTsKKwor
ICAgIGludDY0X3QgcmVzdWx0ID0gbV9nZXRJY29uSURGb3JJY29uVVJMU3RhdGVtZW50LT5zdGVw
KCk7CisgICAgaWYgKHJlc3VsdCA9PSBTUUxJVEVfUk9XKQorICAgICAgICByZXN1bHQgPSBtX2dl
dEljb25JREZvckljb25VUkxTdGF0ZW1lbnQtPmdldENvbHVtbkludDY0KDApOworICAgIGVsc2Ug
eworICAgICAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKQorICAgICAgICAgICAgTE9HX0VS
Uk9SKCJnZXRJY29uSURGb3JJY29uVVJMRnJvbVNRTERhdGFiYXNlIGZhaWxlZCBmb3IgdXJsICVz
IiwgdXJsRm9yTG9nZ2luZyhpY29uVVJMKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgIHJlc3Vs
dCA9IDA7CisgICAgfQorCisgICAgbV9nZXRJY29uSURGb3JJY29uVVJMU3RhdGVtZW50LT5yZXNl
dCgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludDY0X3QgSWNvbkRhdGFiYXNlOjphZGRJ
Y29uVVJMVG9TUUxEYXRhYmFzZShjb25zdCBTdHJpbmcmIGljb25VUkwpCit7CisgICAgQVNTRVJU
X0lDT05fU1lOQ19USFJFQUQoKTsKKworICAgIC8vIFRoZXJlIHdvdWxkIGJlIGEgdHJhbnNhY3Rp
b24gaGVyZSB0byBtYWtlIHN1cmUgdGhlc2UgdHdvIGluc2VydHMgYXJlIGF0b21pYworICAgIC8v
IEluIHByYWN0aWNlIHRoZSBvbmx5IGNhbGxlciBvZiB0aGlzIG1ldGhvZCBpcyBhbHdheXMgd3Jh
cHBlZCBpbiBhIHRyYW5zYWN0aW9uIGl0c2VsZiBzbyBwbGFjaW5nIGFub3RoZXIKKyAgICAvLyBo
ZXJlIGlzIHVubmVjZXNzYXJ5CisKKyAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX2FkZEljb25U
b0ljb25JbmZvU3RhdGVtZW50LCBtX3N5bmNEQiwgIklOU0VSVCBJTlRPIEljb25JbmZvICh1cmws
IHN0YW1wKSBWQUxVRVMgKD8sIDApOyIpOworICAgIG1fYWRkSWNvblRvSWNvbkluZm9TdGF0ZW1l
bnQtPmJpbmRUZXh0KDEsIGljb25VUkwpOworCisgICAgaW50IHJlc3VsdCA9IG1fYWRkSWNvblRv
SWNvbkluZm9TdGF0ZW1lbnQtPnN0ZXAoKTsKKyAgICBtX2FkZEljb25Ub0ljb25JbmZvU3RhdGVt
ZW50LT5yZXNldCgpOworICAgIGlmIChyZXN1bHQgIT0gU1FMSVRFX0RPTkUpIHsKKyAgICAgICAg
TE9HX0VSUk9SKCJhZGRJY29uVVJMVG9TUUxEYXRhYmFzZSBmYWlsZWQgdG8gaW5zZXJ0ICVzIGlu
dG8gSWNvbkluZm8iLCB1cmxGb3JMb2dnaW5nKGljb25VUkwpLmFzY2lpKCkuZGF0YSgpKTsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludDY0X3QgaWNvbklEID0gbV9zeW5jREIubGFz
dEluc2VydFJvd0lEKCk7CisKKyAgICByZWFkeVNRTGl0ZVN0YXRlbWVudChtX2FkZEljb25Ub0lj
b25EYXRhU3RhdGVtZW50LCBtX3N5bmNEQiwgIklOU0VSVCBJTlRPIEljb25EYXRhIChpY29uSUQs
IGRhdGEpIFZBTFVFUyAoPywgPyk7Iik7CisgICAgbV9hZGRJY29uVG9JY29uRGF0YVN0YXRlbWVu
dC0+YmluZEludDY0KDEsIGljb25JRCk7CisKKyAgICByZXN1bHQgPSBtX2FkZEljb25Ub0ljb25E
YXRhU3RhdGVtZW50LT5zdGVwKCk7CisgICAgbV9hZGRJY29uVG9JY29uRGF0YVN0YXRlbWVudC0+
cmVzZXQoKTsKKyAgICBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKSB7CisgICAgICAgIExPR19F
UlJPUigiYWRkSWNvblVSTFRvU1FMRGF0YWJhc2UgZmFpbGVkIHRvIGluc2VydCAlcyBpbnRvIElj
b25EYXRhIiwgdXJsRm9yTG9nZ2luZyhpY29uVVJMKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAg
IHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBpY29uSUQ7Cit9CisKK1JlZlB0cjxTaGFy
ZWRCdWZmZXI+IEljb25EYXRhYmFzZTo6Z2V0SW1hZ2VEYXRhRm9ySWNvblVSTEZyb21TUUxEYXRh
YmFzZShjb25zdCBTdHJpbmcmIGljb25VUkwpCit7CisgICAgQVNTRVJUX0lDT05fU1lOQ19USFJF
QUQoKTsKKworICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IGltYWdlRGF0YTsKKworICAgIHJlYWR5
U1FMaXRlU3RhdGVtZW50KG1fZ2V0SW1hZ2VEYXRhRm9ySWNvblVSTFN0YXRlbWVudCwgbV9zeW5j
REIsICJTRUxFQ1QgSWNvbkRhdGEuZGF0YSBGUk9NIEljb25EYXRhIFdIRVJFIEljb25EYXRhLmlj
b25JRCBJTiAoU0VMRUNUIGljb25JRCBGUk9NIEljb25JbmZvIFdIRVJFIEljb25JbmZvLnVybCA9
ICg/KSk7Iik7CisgICAgbV9nZXRJbWFnZURhdGFGb3JJY29uVVJMU3RhdGVtZW50LT5iaW5kVGV4
dCgxLCBpY29uVVJMKTsKKworICAgIGludCByZXN1bHQgPSBtX2dldEltYWdlRGF0YUZvckljb25V
UkxTdGF0ZW1lbnQtPnN0ZXAoKTsKKyAgICBpZiAocmVzdWx0ID09IFNRTElURV9ST1cpIHsKKyAg
ICAgICAgVmVjdG9yPGNoYXI+IGRhdGE7CisgICAgICAgIG1fZ2V0SW1hZ2VEYXRhRm9ySWNvblVS
TFN0YXRlbWVudC0+Z2V0Q29sdW1uQmxvYkFzVmVjdG9yKDAsIGRhdGEpOworICAgICAgICBpbWFn
ZURhdGEgPSBTaGFyZWRCdWZmZXI6OmNyZWF0ZShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOwor
ICAgIH0gZWxzZSBpZiAocmVzdWx0ICE9IFNRTElURV9ET05FKQorICAgICAgICBMT0dfRVJST1Io
ImdldEltYWdlRGF0YUZvckljb25VUkxGcm9tU1FMRGF0YWJhc2UgZmFpbGVkIGZvciB1cmwgJXMi
LCB1cmxGb3JMb2dnaW5nKGljb25VUkwpLmFzY2lpKCkuZGF0YSgpKTsKKworICAgIG1fZ2V0SW1h
Z2VEYXRhRm9ySWNvblVSTFN0YXRlbWVudC0+cmVzZXQoKTsKKworICAgIHJldHVybiBpbWFnZURh
dGE7Cit9CisKK3ZvaWQgSWNvbkRhdGFiYXNlOjpyZW1vdmVJY29uRnJvbVNRTERhdGFiYXNlKGNv
bnN0IFN0cmluZyYgaWNvblVSTCkKK3sKKyAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVBRCgpOwor
CisgICAgaWYgKGljb25VUkwuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBU
aGVyZSB3b3VsZCBiZSBhIHRyYW5zYWN0aW9uIGhlcmUgdG8gbWFrZSBzdXJlIHRoZXNlIHJlbW92
YWxzIGFyZSBhdG9taWMKKyAgICAvLyBJbiBwcmFjdGljZSB0aGUgb25seSBjYWxsZXIgb2YgdGhp
cyBtZXRob2QgaXMgYWx3YXlzIHdyYXBwZWQgaW4gYSB0cmFuc2FjdGlvbiBpdHNlbGYgc28gcGxh
Y2luZyBhbm90aGVyIGhlcmUgaXMgdW5uZWNlc3NhcnkKKworICAgIC8vIEl0J3MgcG9zc2libGUg
dGhpcyBpY29uIGlzIG5vdCBpbiB0aGUgZGF0YWJhc2UgYmVjYXVzZSBvZiBjZXJ0YWluIHJhcGlk
IGJyb3dzaW5nIHBhdHRlcm5zIChzdWNoIGFzIGEgc3RyZXNzIHRlc3QpIHdoZXJlIHRoZQorICAg
IC8vIGljb24gaXMgbWFya2VkIHRvIGJlIGFkZGVkIHRoZW4gbWFya2VkIGZvciByZW1vdmFsIGJl
Zm9yZSBpdCBpcyBldmVyIHdyaXR0ZW4gdG8gZGlzay4gTm8gYmlnIGRlYWwsIGVhcmx5IHJldHVy
bgorICAgIGludDY0X3QgaWNvbklEID0gZ2V0SWNvbklERm9ySWNvblVSTEZyb21TUUxEYXRhYmFz
ZShpY29uVVJMKTsKKyAgICBpZiAoIWljb25JRCkKKyAgICAgICAgcmV0dXJuOworCisgICAgcmVh
ZHlTUUxpdGVTdGF0ZW1lbnQobV9kZWxldGVQYWdlVVJMc0Zvckljb25VUkxTdGF0ZW1lbnQsIG1f
c3luY0RCLCAiREVMRVRFIEZST00gUGFnZVVSTCBXSEVSRSBQYWdlVVJMLmljb25JRCA9ICg/KTsi
KTsKKyAgICBtX2RlbGV0ZVBhZ2VVUkxzRm9ySWNvblVSTFN0YXRlbWVudC0+YmluZEludDY0KDEs
IGljb25JRCk7CisKKyAgICBpZiAobV9kZWxldGVQYWdlVVJMc0Zvckljb25VUkxTdGF0ZW1lbnQt
PnN0ZXAoKSAhPSBTUUxJVEVfRE9ORSkKKyAgICAgICAgTE9HX0VSUk9SKCJtX2RlbGV0ZVBhZ2VV
UkxzRm9ySWNvblVSTFN0YXRlbWVudCBmYWlsZWQgZm9yIHVybCAlcyIsIHVybEZvckxvZ2dpbmco
aWNvblVSTCkuYXNjaWkoKS5kYXRhKCkpOworCisgICAgcmVhZHlTUUxpdGVTdGF0ZW1lbnQobV9k
ZWxldGVJY29uRnJvbUljb25JbmZvU3RhdGVtZW50LCBtX3N5bmNEQiwgIkRFTEVURSBGUk9NIElj
b25JbmZvIFdIRVJFIEljb25JbmZvLmljb25JRCA9ICg/KTsiKTsKKyAgICBtX2RlbGV0ZUljb25G
cm9tSWNvbkluZm9TdGF0ZW1lbnQtPmJpbmRJbnQ2NCgxLCBpY29uSUQpOworCisgICAgaWYgKG1f
ZGVsZXRlSWNvbkZyb21JY29uSW5mb1N0YXRlbWVudC0+c3RlcCgpICE9IFNRTElURV9ET05FKQor
ICAgICAgICBMT0dfRVJST1IoIm1fZGVsZXRlSWNvbkZyb21JY29uSW5mb1N0YXRlbWVudCBmYWls
ZWQgZm9yIHVybCAlcyIsIHVybEZvckxvZ2dpbmcoaWNvblVSTCkuYXNjaWkoKS5kYXRhKCkpOwor
CisgICAgcmVhZHlTUUxpdGVTdGF0ZW1lbnQobV9kZWxldGVJY29uRnJvbUljb25EYXRhU3RhdGVt
ZW50LCBtX3N5bmNEQiwgIkRFTEVURSBGUk9NIEljb25EYXRhIFdIRVJFIEljb25EYXRhLmljb25J
RCA9ICg/KTsiKTsKKyAgICBtX2RlbGV0ZUljb25Gcm9tSWNvbkRhdGFTdGF0ZW1lbnQtPmJpbmRJ
bnQ2NCgxLCBpY29uSUQpOworCisgICAgaWYgKG1fZGVsZXRlSWNvbkZyb21JY29uRGF0YVN0YXRl
bWVudC0+c3RlcCgpICE9IFNRTElURV9ET05FKQorICAgICAgICBMT0dfRVJST1IoIm1fZGVsZXRl
SWNvbkZyb21JY29uRGF0YVN0YXRlbWVudCBmYWlsZWQgZm9yIHVybCAlcyIsIHVybEZvckxvZ2dp
bmcoaWNvblVSTCkuYXNjaWkoKS5kYXRhKCkpOworCisgICAgbV9kZWxldGVQYWdlVVJMc0Zvcklj
b25VUkxTdGF0ZW1lbnQtPnJlc2V0KCk7CisgICAgbV9kZWxldGVJY29uRnJvbUljb25JbmZvU3Rh
dGVtZW50LT5yZXNldCgpOworICAgIG1fZGVsZXRlSWNvbkZyb21JY29uRGF0YVN0YXRlbWVudC0+
cmVzZXQoKTsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6OndyaXRlSWNvblNuYXBzaG90VG9TUUxE
YXRhYmFzZShjb25zdCBJY29uU25hcHNob3QmIHNuYXBzaG90KQoreworICAgIEFTU0VSVF9JQ09O
X1NZTkNfVEhSRUFEKCk7CisKKyAgICBpZiAoc25hcHNob3QuaWNvblVSTCgpLmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gQSBudWxsZWQgb3V0IHRpbWVzdGFtcCBhbmQgZGF0
YSBtZWFucyB0aGlzIGljb24gaXMgZGVzdGluZWQgdG8gYmUgZGVsZXRlZCAtIGRvIHRoYXQgaW5z
dGVhZCBvZiB3cml0aW5nIGl0IG91dAorICAgIGlmICghc25hcHNob3QudGltZXN0YW1wKCkgJiYg
IXNuYXBzaG90LmRhdGEoKSkgeworICAgICAgICBMT0coSWNvbkRhdGFiYXNlLCAiUmVtb3Zpbmcg
JXMgZnJvbSBvbi1kaXNrIGRhdGFiYXNlIiwgdXJsRm9yTG9nZ2luZyhzbmFwc2hvdC5pY29uVVJM
KCkpLmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgcmVtb3ZlSWNvbkZyb21TUUxEYXRhYmFzZShz
bmFwc2hvdC5pY29uVVJMKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhl
cmUgd291bGQgYmUgYSB0cmFuc2FjdGlvbiBoZXJlIHRvIG1ha2Ugc3VyZSB0aGVzZSByZW1vdmFs
cyBhcmUgYXRvbWljCisgICAgLy8gSW4gcHJhY3RpY2UgdGhlIG9ubHkgY2FsbGVyIG9mIHRoaXMg
bWV0aG9kIGlzIGFsd2F5cyB3cmFwcGVkIGluIGEgdHJhbnNhY3Rpb24gaXRzZWxmIHNvIHBsYWNp
bmcgYW5vdGhlciBoZXJlIGlzIHVubmVjZXNzYXJ5CisKKyAgICAvLyBHZXQgdGhlIGljb25JRCBm
b3IgdGhpcyB1cmwKKyAgICBpbnQ2NF90IGljb25JRCA9IGdldEljb25JREZvckljb25VUkxGcm9t
U1FMRGF0YWJhc2Uoc25hcHNob3QuaWNvblVSTCgpKTsKKworICAgIC8vIElmIHRoZXJlIGlzIGFs
cmVhZHkgYW4gaWNvbklEIGluIHBsYWNlLCB1cGRhdGUgdGhlIGRhdGFiYXNlLgorICAgIC8vIE90
aGVyd2lzZSwgaW5zZXJ0IG5ldyByZWNvcmRzCisgICAgaWYgKGljb25JRCkgeworICAgICAgICBy
ZWFkeVNRTGl0ZVN0YXRlbWVudChtX3VwZGF0ZUljb25JbmZvU3RhdGVtZW50LCBtX3N5bmNEQiwg
IlVQREFURSBJY29uSW5mbyBTRVQgc3RhbXAgPSA/LCB1cmwgPSA/IFdIRVJFIGljb25JRCA9ID87
Iik7CisgICAgICAgIG1fdXBkYXRlSWNvbkluZm9TdGF0ZW1lbnQtPmJpbmRJbnQ2NCgxLCBzbmFw
c2hvdC50aW1lc3RhbXAoKSk7CisgICAgICAgIG1fdXBkYXRlSWNvbkluZm9TdGF0ZW1lbnQtPmJp
bmRUZXh0KDIsIHNuYXBzaG90Lmljb25VUkwoKSk7CisgICAgICAgIG1fdXBkYXRlSWNvbkluZm9T
dGF0ZW1lbnQtPmJpbmRJbnQ2NCgzLCBpY29uSUQpOworCisgICAgICAgIGlmIChtX3VwZGF0ZUlj
b25JbmZvU3RhdGVtZW50LT5zdGVwKCkgIT0gU1FMSVRFX0RPTkUpCisgICAgICAgICAgICBMT0df
RVJST1IoIkZhaWxlZCB0byB1cGRhdGUgaWNvbiBpbmZvIGZvciB1cmwgJXMiLCB1cmxGb3JMb2dn
aW5nKHNuYXBzaG90Lmljb25VUkwoKSkuYXNjaWkoKS5kYXRhKCkpOworCisgICAgICAgIG1fdXBk
YXRlSWNvbkluZm9TdGF0ZW1lbnQtPnJlc2V0KCk7CisKKyAgICAgICAgcmVhZHlTUUxpdGVTdGF0
ZW1lbnQobV91cGRhdGVJY29uRGF0YVN0YXRlbWVudCwgbV9zeW5jREIsICJVUERBVEUgSWNvbkRh
dGEgU0VUIGRhdGEgPSA/IFdIRVJFIGljb25JRCA9ID87Iik7CisgICAgICAgIG1fdXBkYXRlSWNv
bkRhdGFTdGF0ZW1lbnQtPmJpbmRJbnQ2NCgyLCBpY29uSUQpOworCisgICAgICAgIC8vIElmIHdl
ICpoYXZlKiBpbWFnZSBkYXRhLCBiaW5kIGl0IHRvIHRoaXMgc3RhdGVtZW50IC0gT3RoZXJ3aXNl
IGJpbmQgIm51bGwiIGZvciB0aGUgYmxvYiBkYXRhLAorICAgICAgICAvLyBzaWduaWZ5aW5nIHRo
YXQgdGhpcyBpY29uIGRvZXNuJ3QgaGF2ZSBhbnkgZGF0YQorICAgICAgICBpZiAoc25hcHNob3Qu
ZGF0YSgpICYmIHNuYXBzaG90LmRhdGEoKS0+c2l6ZSgpKQorICAgICAgICAgICAgbV91cGRhdGVJ
Y29uRGF0YVN0YXRlbWVudC0+YmluZEJsb2IoMSwgc25hcHNob3QuZGF0YSgpLT5kYXRhKCksIHNu
YXBzaG90LmRhdGEoKS0+c2l6ZSgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV91cGRh
dGVJY29uRGF0YVN0YXRlbWVudC0+YmluZE51bGwoMSk7CisKKyAgICAgICAgaWYgKG1fdXBkYXRl
SWNvbkRhdGFTdGF0ZW1lbnQtPnN0ZXAoKSAhPSBTUUxJVEVfRE9ORSkKKyAgICAgICAgICAgIExP
R19FUlJPUigiRmFpbGVkIHRvIHVwZGF0ZSBpY29uIGRhdGEgZm9yIHVybCAlcyIsIHVybEZvckxv
Z2dpbmcoc25hcHNob3QuaWNvblVSTCgpKS5hc2NpaSgpLmRhdGEoKSk7CisKKyAgICAgICAgbV91
cGRhdGVJY29uRGF0YVN0YXRlbWVudC0+cmVzZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBy
ZWFkeVNRTGl0ZVN0YXRlbWVudChtX3NldEljb25JbmZvU3RhdGVtZW50LCBtX3N5bmNEQiwgIklO
U0VSVCBJTlRPIEljb25JbmZvICh1cmwsc3RhbXApIFZBTFVFUyAoPywgPyk7Iik7CisgICAgICAg
IG1fc2V0SWNvbkluZm9TdGF0ZW1lbnQtPmJpbmRUZXh0KDEsIHNuYXBzaG90Lmljb25VUkwoKSk7
CisgICAgICAgIG1fc2V0SWNvbkluZm9TdGF0ZW1lbnQtPmJpbmRJbnQ2NCgyLCBzbmFwc2hvdC50
aW1lc3RhbXAoKSk7CisKKyAgICAgICAgaWYgKG1fc2V0SWNvbkluZm9TdGF0ZW1lbnQtPnN0ZXAo
KSAhPSBTUUxJVEVfRE9ORSkKKyAgICAgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIHNldCBp
Y29uIGluZm8gZm9yIHVybCAlcyIsIHVybEZvckxvZ2dpbmcoc25hcHNob3QuaWNvblVSTCgpKS5h
c2NpaSgpLmRhdGEoKSk7CisKKyAgICAgICAgbV9zZXRJY29uSW5mb1N0YXRlbWVudC0+cmVzZXQo
KTsKKworICAgICAgICBpbnQ2NF90IGljb25JRCA9IG1fc3luY0RCLmxhc3RJbnNlcnRSb3dJRCgp
OworCisgICAgICAgIHJlYWR5U1FMaXRlU3RhdGVtZW50KG1fc2V0SWNvbkRhdGFTdGF0ZW1lbnQs
IG1fc3luY0RCLCAiSU5TRVJUIElOVE8gSWNvbkRhdGEgKGljb25JRCwgZGF0YSkgVkFMVUVTICg/
LCA/KTsiKTsKKyAgICAgICAgbV9zZXRJY29uRGF0YVN0YXRlbWVudC0+YmluZEludDY0KDEsIGlj
b25JRCk7CisKKyAgICAgICAgLy8gSWYgd2UgKmhhdmUqIGltYWdlIGRhdGEsIGJpbmQgaXQgdG8g
dGhpcyBzdGF0ZW1lbnQgLSBPdGhlcndpc2UgYmluZCAibnVsbCIgZm9yIHRoZSBibG9iIGRhdGEs
CisgICAgICAgIC8vIHNpZ25pZnlpbmcgdGhhdCB0aGlzIGljb24gZG9lc24ndCBoYXZlIGFueSBk
YXRhCisgICAgICAgIGlmIChzbmFwc2hvdC5kYXRhKCkgJiYgc25hcHNob3QuZGF0YSgpLT5zaXpl
KCkpCisgICAgICAgICAgICBtX3NldEljb25EYXRhU3RhdGVtZW50LT5iaW5kQmxvYigyLCBzbmFw
c2hvdC5kYXRhKCktPmRhdGEoKSwgc25hcHNob3QuZGF0YSgpLT5zaXplKCkpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBtX3NldEljb25EYXRhU3RhdGVtZW50LT5iaW5kTnVsbCgyKTsKKwor
ICAgICAgICBpZiAobV9zZXRJY29uRGF0YVN0YXRlbWVudC0+c3RlcCgpICE9IFNRTElURV9ET05F
KQorICAgICAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gc2V0IGljb24gZGF0YSBmb3IgdXJs
ICVzIiwgdXJsRm9yTG9nZ2luZyhzbmFwc2hvdC5pY29uVVJMKCkpLmFzY2lpKCkuZGF0YSgpKTsK
KworICAgICAgICBtX3NldEljb25EYXRhU3RhdGVtZW50LT5yZXNldCgpOworICAgIH0KK30KKwor
dm9pZCBJY29uRGF0YWJhc2U6OmNoZWNrQ2xvc2VkQWZ0ZXJNYWluVGhyZWFkQ2FsbGJhY2soKQor
eworICAgIEFTU0VSVF9OT1RfU1lOQ19USFJFQUQoKTsKKworICAgIC8vIElmIHRoZXJlIGFyZSBz
dGlsbCBjYWxsYmFja3MgaW4gZmxpZ2h0IGZyb20gdGhlIHN5bmMgdGhyZWFkIHdlIGNhbm5vdCBw
b3NzaWJseSBiZSBjbG9zZWQuCisgICAgaWYgKC0tbV9tYWluVGhyZWFkQ2FsbGJhY2tDb3VudCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRXZlbiBpZiB0aGVyZSdzIG5vIG1vcmUgcGVuZGlu
ZyBjYWxsYmFja3MgdGhlIGRhdGFiYXNlIG1pZ2h0IG90aGVyd2lzZSBzdGlsbCBiZSBvcGVuLgor
ICAgIGlmIChpc09wZW5CZXNpZGVzTWFpblRocmVhZENhbGxiYWNrcygpKQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBUaGlzIGRhdGFiYXNlIGlzIG5vdyBhY3R1YWxseSBjbG9zZWQhIEJ1dCBm
aXJzdCBub3RpZnkgdGhlIGNsaWVudC4KKyAgICBpZiAobV9jbGllbnQpCisgICAgICAgIG1fY2xp
ZW50LT5kaWRDbG9zZSgpOworfQorCit2b2lkIEljb25EYXRhYmFzZTo6ZGlzcGF0Y2hEaWRJbXBv
cnRJY29uVVJMRm9yUGFnZVVSTE9uTWFpblRocmVhZChjb25zdCBTdHJpbmcmIHBhZ2VVUkwpCit7
CisgICAgQVNTRVJUX0lDT05fU1lOQ19USFJFQUQoKTsKKyAgICArK21fbWFpblRocmVhZENhbGxi
YWNrQ291bnQ7CisKKyAgICBjYWxsT25NYWluVGhyZWFkKFt0aGlzLCBwYWdlVVJMID0gcGFnZVVS
TC5pc29sYXRlZENvcHkoKV0geworICAgICAgICBpZiAobV9jbGllbnQpCisgICAgICAgICAgICBt
X2NsaWVudC0+ZGlkSW1wb3J0SWNvblVSTEZvclBhZ2VVUkwocGFnZVVSTCk7CisgICAgICAgIGNo
ZWNrQ2xvc2VkQWZ0ZXJNYWluVGhyZWFkQ2FsbGJhY2soKTsKKyAgICB9KTsKK30KKwordm9pZCBJ
Y29uRGF0YWJhc2U6OmRpc3BhdGNoRGlkSW1wb3J0SWNvbkRhdGFGb3JQYWdlVVJMT25NYWluVGhy
ZWFkKGNvbnN0IFN0cmluZyYgcGFnZVVSTCkKK3sKKyAgICBBU1NFUlRfSUNPTl9TWU5DX1RIUkVB
RCgpOworICAgICsrbV9tYWluVGhyZWFkQ2FsbGJhY2tDb3VudDsKKworICAgIGNhbGxPbk1haW5U
aHJlYWQoW3RoaXMsIHBhZ2VVUkwgPSBwYWdlVVJMLmlzb2xhdGVkQ29weSgpXSB7CisgICAgICAg
IGlmIChtX2NsaWVudCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5kaWRJbXBvcnRJY29uRGF0YUZv
clBhZ2VVUkwocGFnZVVSTCk7CisgICAgICAgIGNoZWNrQ2xvc2VkQWZ0ZXJNYWluVGhyZWFkQ2Fs
bGJhY2soKTsKKyAgICB9KTsKK30KKwordm9pZCBJY29uRGF0YWJhc2U6OmRpc3BhdGNoRGlkUmVt
b3ZlQWxsSWNvbnNPbk1haW5UaHJlYWQoKQoreworICAgIEFTU0VSVF9JQ09OX1NZTkNfVEhSRUFE
KCk7CisgICAgKyttX21haW5UaHJlYWRDYWxsYmFja0NvdW50OworCisgICAgY2FsbE9uTWFpblRo
cmVhZChbdGhpc10geworICAgICAgICBpZiAobV9jbGllbnQpCisgICAgICAgICAgICBtX2NsaWVu
dC0+ZGlkUmVtb3ZlQWxsSWNvbnMoKTsKKyAgICAgICAgY2hlY2tDbG9zZWRBZnRlck1haW5UaHJl
YWRDYWxsYmFjaygpOworICAgIH0pOworfQorCit2b2lkIEljb25EYXRhYmFzZTo6ZGlzcGF0Y2hE
aWRGaW5pc2hVUkxJbXBvcnRPbk1haW5UaHJlYWQoKQoreworICAgIEFTU0VSVF9JQ09OX1NZTkNf
VEhSRUFEKCk7CisgICAgKyttX21haW5UaHJlYWRDYWxsYmFja0NvdW50OworCisgICAgY2FsbE9u
TWFpblRocmVhZChbdGhpc10geworICAgICAgICBpZiAobV9jbGllbnQpCisgICAgICAgICAgICBt
X2NsaWVudC0+ZGlkRmluaXNoVVJMSW1wb3J0KCk7CisgICAgICAgIGNoZWNrQ2xvc2VkQWZ0ZXJN
YWluVGhyZWFkQ2FsbGJhY2soKTsKKyAgICB9KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2dsaWIvSWNvbkRhdGFi
YXNlLmggYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2dsaWIvSWNvbkRhdGFiYXNlLmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjRkNDdkZTk1MGQxCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9nbGliL0ljb25EYXRh
YmFzZS5oCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3
LCAyMDA4LCAyMDA5LCAyMDE0IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgMjAwNyBKdXN0aW4gSGF5Z29vZCAoamhheWdvb2RAcmVha3RpeC5jb20pCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNwcmFnbWEgb25jZQor
CisjaW5jbHVkZSA8V2ViQ29yZS9OYXRpdmVJbWFnZS5oPgorI2luY2x1ZGUgPFdlYkNvcmUvU1FM
aXRlRGF0YWJhc2UuaD4KKyNpbmNsdWRlIDx3dGYvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8d3Rm
L0hhc2hDb3VudGVkU2V0Lmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3
dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9SdW5Mb29wLmg+CisjaW5jbHVkZSA8d3RmL3Rl
eHQvU3RyaW5nSGFzaC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CitjbGFzcyBJbWFnZTsKK2NsYXNzIFNoYXJlZEJ1ZmZlcjsKK30KKwor
bmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIEljb25EYXRhYmFzZUNsaWVudCB7CitwdWJsaWM6
CisgICAgdmlydHVhbCB+SWNvbkRhdGFiYXNlQ2xpZW50KCkgPSBkZWZhdWx0OworCisgICAgdmly
dHVhbCB2b2lkIGRpZEltcG9ydEljb25VUkxGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYpIHsgfQor
ICAgIHZpcnR1YWwgdm9pZCBkaWRJbXBvcnRJY29uRGF0YUZvclBhZ2VVUkwoY29uc3QgU3RyaW5n
JikgeyB9CisgICAgdmlydHVhbCB2b2lkIGRpZENoYW5nZUljb25Gb3JQYWdlVVJMKGNvbnN0IFN0
cmluZyYpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBkaWRSZW1vdmVBbGxJY29ucygpIHsgfQorICAg
IHZpcnR1YWwgdm9pZCBkaWRGaW5pc2hVUkxJbXBvcnQoKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQg
ZGlkQ2xvc2UoKSB7IH0KK307CisKK2NsYXNzIEljb25EYXRhYmFzZSB7CisgICAgV1RGX01BS0Vf
RkFTVF9BTExPQ0FURUQ7CisKK3ByaXZhdGU6CisgICAgZW51bSBJbWFnZURhdGFTdGF0dXMgewor
ICAgICAgICBJbWFnZURhdGFTdGF0dXNQcmVzZW50LCBJbWFnZURhdGFTdGF0dXNNaXNzaW5nLCBJ
bWFnZURhdGFTdGF0dXNVbmtub3duCisgICAgfTsKKworICAgIGNsYXNzIEljb25TbmFwc2hvdCB7
CisgICAgcHVibGljOgorICAgICAgICBJY29uU25hcHNob3QoKSA9IGRlZmF1bHQ7CisKKyAgICAg
ICAgSWNvblNuYXBzaG90KGNvbnN0IFN0cmluZyYgaWNvblVSTCwgaW50IHRpbWVzdGFtcCwgV2Vi
Q29yZTo6U2hhcmVkQnVmZmVyKiBkYXRhKQorICAgICAgICAgICAgOiBtX2ljb25VUkwoaWNvblVS
TCkKKyAgICAgICAgICAgICwgbV90aW1lc3RhbXAodGltZXN0YW1wKQorICAgICAgICAgICAgLCBt
X2RhdGEoZGF0YSkKKyAgICAgICAgeyB9CisKKyAgICAgICAgY29uc3QgU3RyaW5nJiBpY29uVVJM
KCkgY29uc3QgeyByZXR1cm4gbV9pY29uVVJMOyB9CisgICAgICAgIGludCB0aW1lc3RhbXAoKSBj
b25zdCB7IHJldHVybiBtX3RpbWVzdGFtcDsgfQorICAgICAgICBXZWJDb3JlOjpTaGFyZWRCdWZm
ZXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX2RhdGEuZ2V0KCk7IH0KKworICAgIHByaXZhdGU6
CisgICAgICAgIFN0cmluZyBtX2ljb25VUkw7CisgICAgICAgIGludCBtX3RpbWVzdGFtcCB7IDAg
fTsKKyAgICAgICAgUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gbV9kYXRhOworICAgIH07
CisKKyAgICBjbGFzcyBJY29uUmVjb3JkIDogcHVibGljIFJlZkNvdW50ZWQ8SWNvblJlY29yZD4g
eworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIFJlZjxJY29uUmVjb3JkPiBjcmVhdGUoY29u
c3QgU3RyaW5nJiB1cmwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZG9wdFJlZigq
bmV3IEljb25SZWNvcmQodXJsKSk7CisgICAgICAgIH0KKyAgICAgICAgfkljb25SZWNvcmQoKTsK
KworICAgICAgICB0aW1lX3QgZ2V0VGltZXN0YW1wKCkgeyByZXR1cm4gbV9zdGFtcDsgfQorICAg
ICAgICB2b2lkIHNldFRpbWVzdGFtcCh0aW1lX3Qgc3RhbXApIHsgbV9zdGFtcCA9IHN0YW1wOyB9
CisKKyAgICAgICAgdm9pZCBzZXRJbWFnZURhdGEoUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZl
cj4mJik7CisgICAgICAgIFdlYkNvcmU6OkltYWdlKiBpbWFnZShjb25zdCBXZWJDb3JlOjpJbnRT
aXplJik7CisKKyAgICAgICAgU3RyaW5nIGljb25VUkwoKSB7IHJldHVybiBtX2ljb25VUkw7IH0K
KworICAgICAgICB2b2lkIGxvYWRJbWFnZUZyb21SZXNvdXJjZShjb25zdCBjaGFyKik7CisKKyAg
ICAgICAgZW51bSBjbGFzcyBJbWFnZURhdGFTdGF0dXMgeyBQcmVzZW50LCBNaXNzaW5nLCBVbmtu
b3duIH07CisgICAgICAgIEltYWdlRGF0YVN0YXR1cyBpbWFnZURhdGFTdGF0dXMoKTsKKworICAg
ICAgICBIYXNoU2V0PFN0cmluZz4mIHJldGFpbmluZ1BhZ2VVUkxzKCkgeyByZXR1cm4gbV9yZXRh
aW5pbmdQYWdlVVJMczsgfQorCisgICAgICAgIEljb25TbmFwc2hvdCBzbmFwc2hvdChib29sIGZv
ckRlbGV0aW9uID0gZmFsc2UpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgSWNvblJl
Y29yZChjb25zdCBTdHJpbmcmIHVybCk7CisKKyAgICAgICAgU3RyaW5nIG1faWNvblVSTDsKKyAg
ICAgICAgdGltZV90IG1fc3RhbXAgeyAwIH07CisgICAgICAgIFJlZlB0cjxXZWJDb3JlOjpJbWFn
ZT4gbV9pbWFnZTsKKworICAgICAgICBIYXNoU2V0PFN0cmluZz4gbV9yZXRhaW5pbmdQYWdlVVJM
czsKKworICAgICAgICAvLyBUaGlzIGFsbG93cyB1cyB0byBjYWNoZSB3aGV0aGVyIG9yIG5vdCBh
IFNpdGVJY29uIGhhcyBoYWQgaXRzIGRhdGEgc2V0IHlldAorICAgICAgICAvLyBUaGlzIGhlbHBz
IHRoZSBJY29uRGF0YWJhc2Uga25vdyBpZiBpdCBoYXMgdG8gc2V0IHRoZSBkYXRhIG9uIGEgbmV3
IG9iamVjdCBvciBub3QsCisgICAgICAgIC8vIGFuZCBhbHNvIHRvIGRldGVybWluZSBpZiB0aGUg
aWNvbiBpcyBtaXNzaW5nIGRhdGEgb3IgaWYgaXQganVzdCBoYXNuJ3QgYmVlbiBicm91Z2h0Cisg
ICAgICAgIC8vIGluIGZyb20gdGhlIERCIHlldAorICAgICAgICBib29sIG1fZGF0YVNldCB7IGZh
bHNlIH07CisgICAgfTsKKworICAgIGNsYXNzIFBhZ2VVUkxTbmFwc2hvdCB7CisgICAgcHVibGlj
OgorICAgICAgICBQYWdlVVJMU25hcHNob3QoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgUGFnZVVS
TFNuYXBzaG90KGNvbnN0IFN0cmluZyYgcGFnZVVSTCwgY29uc3QgU3RyaW5nJiBpY29uVVJMKQor
ICAgICAgICAgICAgOiBtX3BhZ2VVUkwocGFnZVVSTCkKKyAgICAgICAgICAgICwgbV9pY29uVVJM
KGljb25VUkwpCisgICAgICAgIHsgfQorCisgICAgICAgIGNvbnN0IFN0cmluZyYgcGFnZVVSTCgp
IGNvbnN0IHsgcmV0dXJuIG1fcGFnZVVSTDsgfQorICAgICAgICBjb25zdCBTdHJpbmcmIGljb25V
UkwoKSBjb25zdCB7IHJldHVybiBtX2ljb25VUkw7IH0KKworICAgIHByaXZhdGU6CisgICAgICAg
IFN0cmluZyBtX3BhZ2VVUkw7CisgICAgICAgIFN0cmluZyBtX2ljb25VUkw7CisgICAgfTsKKwor
ICAgIGNsYXNzIFBhZ2VVUkxSZWNvcmQgeworICAgICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShQ
YWdlVVJMUmVjb3JkKTsgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CisgICAgcHVibGljOgorICAg
ICAgICBQYWdlVVJMUmVjb3JkKGNvbnN0IFN0cmluZyYgcGFnZVVSTCk7CisgICAgICAgIH5QYWdl
VVJMUmVjb3JkKCk7CisKKyAgICAgICAgaW5saW5lIFN0cmluZyB1cmwoKSBjb25zdCB7IHJldHVy
biBtX3BhZ2VVUkw7IH0KKworICAgICAgICB2b2lkIHNldEljb25SZWNvcmQoUmVmUHRyPEljb25S
ZWNvcmQ+JiYpOworICAgICAgICBJY29uUmVjb3JkKiBpY29uUmVjb3JkKCkgeyByZXR1cm4gbV9p
Y29uUmVjb3JkLmdldCgpOyB9CisKKyAgICAgICAgUGFnZVVSTFNuYXBzaG90IHNuYXBzaG90KGJv
b2wgZm9yRGVsZXRpb24gPSBmYWxzZSkgY29uc3Q7CisKKyAgICAgICAgLy8gUmV0dXJucyBmYWxz
ZSBpZiB0aGUgcGFnZSB3YXNuJ3QgcmV0YWluZWQgYmVmb3JlaGFuZCwgdHJ1ZSBpZiB0aGUgcmV0
YWluIGNvdW50IHdhcyBhbHJlYWR5IDEgb3IgaGlnaGVyLgorICAgICAgICBib29sIHJldGFpbihp
bnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgd2FzUmV0YWluZWQgPSBtX3Jl
dGFpbkNvdW50ID4gMDsKKyAgICAgICAgICAgIG1fcmV0YWluQ291bnQgKz0gY291bnQ7CisgICAg
ICAgICAgICByZXR1cm4gd2FzUmV0YWluZWQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1
cm5zIHRydWUgaWYgdGhlIHBhZ2UgaXMgc3RpbGwgcmV0YWluZWQgYWZ0ZXIgdGhlIGNhbGwuIEZh
bHNlIGlmIHRoZSByZXRhaW4gY291bnQganVzdCBkcm9wcGVkIHRvIDAuCisgICAgICAgIGJvb2wg
cmVsZWFzZShpbnQgY291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChtX3JldGFp
bkNvdW50ID49IGNvdW50KTsKKyAgICAgICAgICAgIG1fcmV0YWluQ291bnQgLT0gY291bnQ7Cisg
ICAgICAgICAgICByZXR1cm4gbV9yZXRhaW5Db3VudCA+IDA7CisgICAgICAgIH0KKworICAgICAg
ICBpbnQgcmV0YWluQ291bnQoKSBjb25zdCB7IHJldHVybiBtX3JldGFpbkNvdW50OyB9CisKKyAg
ICBwcml2YXRlOgorICAgICAgICBTdHJpbmcgbV9wYWdlVVJMOworICAgICAgICBSZWZQdHI8SWNv
blJlY29yZD4gbV9pY29uUmVjb3JkOworICAgICAgICBpbnQgbV9yZXRhaW5Db3VudCB7IDAgfTsK
KyAgICB9OworCisvLyAqKiogTWFpbiBUaHJlYWQgT25seSAqKioKK3B1YmxpYzoKKyAgICBJY29u
RGF0YWJhc2UoKTsKKyAgICB+SWNvbkRhdGFiYXNlKCk7CisKKyAgICBlbnVtIGNsYXNzIEljb25M
b2FkRGVjaXNpb24geyBZZXMsIE5vLCBVbmtub3duIH07CisKKyAgICB2b2lkIHNldENsaWVudChz
dGQ6OnVuaXF1ZV9wdHI8SWNvbkRhdGFiYXNlQ2xpZW50PiYmKTsKKworICAgIGJvb2wgb3Blbihj
b25zdCBTdHJpbmcmIGRpcmVjdG9yeSwgY29uc3QgU3RyaW5nJiBmaWxlbmFtZSk7CisgICAgdm9p
ZCBjbG9zZSgpOworCisgICAgdm9pZCByZW1vdmVBbGxJY29ucygpOworCisgICAgdm9pZCByZXRh
aW5JY29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIHJlbGVhc2VJY29uRm9y
UGFnZVVSTChjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIHNldEljb25EYXRhRm9ySWNvblVSTChS
ZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiYmLCBjb25zdCBTdHJpbmcmIGljb25VUkwpOwor
ICAgIHZvaWQgc2V0SWNvblVSTEZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJiBpY29uVVJMLCBjb25z
dCBTdHJpbmcmIHBhZ2VVUkwpOworCisgICAgV2ViQ29yZTo6SW1hZ2UqIHN5bmNocm9ub3VzSWNv
bkZvclBhZ2VVUkwoY29uc3QgU3RyaW5nJiwgY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYpOworICAg
IFN0cmluZyBzeW5jaHJvbm91c0ljb25VUkxGb3JQYWdlVVJMKGNvbnN0IFN0cmluZyYpOworICAg
IGJvb2wgc3luY2hyb25vdXNJY29uRGF0YUtub3duRm9ySWNvblVSTChjb25zdCBTdHJpbmcmKTsK
KyAgICBJY29uTG9hZERlY2lzaW9uIHN5bmNocm9ub3VzTG9hZERlY2lzaW9uRm9ySWNvblVSTChj
b25zdCBTdHJpbmcmKTsKKworICAgIHZvaWQgc2V0RW5hYmxlZChib29sKTsKKyAgICBib29sIGlz
RW5hYmxlZCgpIGNvbnN0OworCisgICAgdm9pZCBzZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKGJv
b2wgZmxhZyk7CisgICAgYm9vbCBpc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSBjb25zdDsKKwor
ICAgIHN0YXRpYyB2b2lkIGRlbGF5RGF0YWJhc2VDbGVhbnVwKCk7CisgICAgc3RhdGljIHZvaWQg
YWxsb3dEYXRhYmFzZUNsZWFudXAoKTsKKyAgICBzdGF0aWMgdm9pZCBjaGVja0ludGVncml0eUJl
Zm9yZU9wZW5pbmcoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHdha2VTeW5jVGhyZWFkKCk7Cisg
ICAgdm9pZCBzY2hlZHVsZU9yRGVmZXJTeW5jVGltZXIoKTsKKyAgICB2b2lkIHN5bmNUaW1lckZp
cmVkKCk7CisKKyAgICBSdW5Mb29wOjpUaW1lcjxJY29uRGF0YWJhc2U+IG1fc3luY1RpbWVyOwor
ICAgIFJlZlB0cjxUaHJlYWQ+IG1fc3luY1RocmVhZDsKKyAgICBib29sIG1fc3luY1RocmVhZFJ1
bm5pbmcgeyBmYWxzZSB9OworICAgIGJvb2wgbV9zY2hlZHVsZU9yRGVmZXJTeW5jVGltZXJSZXF1
ZXN0ZWQgeyBmYWxzZSB9OworCisvLyAqKiogQW55IFRocmVhZCAqKioKK3B1YmxpYzoKKyAgICBi
b29sIGlzT3BlbigpIGNvbnN0OworICAgIFN0cmluZyBkYXRhYmFzZVBhdGgoKSBjb25zdDsKKyAg
ICBzdGF0aWMgU3RyaW5nIGRlZmF1bHREYXRhYmFzZUZpbGVuYW1lKCk7CisKK3ByaXZhdGU6Cisg
ICAgUmVmPEljb25SZWNvcmQ+IGdldE9yQ3JlYXRlSWNvblJlY29yZChjb25zdCBTdHJpbmcmIGlj
b25VUkwpOworICAgIFBhZ2VVUkxSZWNvcmQqIGdldE9yQ3JlYXRlUGFnZVVSTFJlY29yZChjb25z
dCBTdHJpbmcmIHBhZ2VVUkwpOworCisgICAgYm9vbCBtX2lzRW5hYmxlZCB7ZmFsc2UgfTsKKyAg
ICBib29sIG1fcHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCB7IGZhbHNlIH07CisKKyAgICBtdXRhYmxl
IExvY2sgbV9zeW5jTG9jazsKKyAgICBDb25kaXRpb24gbV9zeW5jQ29uZGl0aW9uOworICAgIFN0
cmluZyBtX2RhdGFiYXNlRGlyZWN0b3J5OworICAgIC8vIEhvbGRpbmcgbV9zeW5jTG9jayBpcyBy
ZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyBtX2NvbXBsZXRlRGF0YWJhc2VQYXRoCisgICAgU3RyaW5n
IG1fY29tcGxldGVEYXRhYmFzZVBhdGg7CisKKyAgICBib29sIG1fdGhyZWFkVGVybWluYXRpb25S
ZXF1ZXN0ZWQgeyBmYWxzZSB9OworICAgIGJvb2wgbV9yZW1vdmVJY29uc1JlcXVlc3RlZCB7IGZh
bHNlIH07CisgICAgYm9vbCBtX2ljb25VUkxJbXBvcnRDb21wbGV0ZSB7IGZhbHNlIH07CisgICAg
Ym9vbCBtX3N5bmNUaHJlYWRIYXNXb3JrVG9EbyB7IGZhbHNlIH07CisKKyAgICBMb2NrIG1fdXJs
QW5kSWNvbkxvY2s7CisgICAgLy8gSG9sZGluZyBtX3VybEFuZEljb25Mb2NrIGlzIHJlcXVpcmVk
IHdoZW4gYWNjZXNzaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGRhdGEgc3RydWN0dXJlcyBvciB0
aGUgb2JqZWN0cyB0aGV5IGNvbnRhaW4KKyAgICBIYXNoTWFwPFN0cmluZywgSWNvblJlY29yZCo+
IG1faWNvblVSTFRvUmVjb3JkTWFwOworICAgIEhhc2hNYXA8U3RyaW5nLCBQYWdlVVJMUmVjb3Jk
Kj4gbV9wYWdlVVJMVG9SZWNvcmRNYXA7CisgICAgSGFzaFNldDxTdHJpbmc+IG1fcmV0YWluZWRQ
YWdlVVJMczsKKworICAgIExvY2sgbV9wZW5kaW5nU3luY0xvY2s7CisgICAgLy8gSG9sZGluZyBt
X3BlbmRpbmdTeW5jTG9jayBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyBhbnkgb2YgdGhlIGZv
bGxvd2luZyBkYXRhIHN0cnVjdHVyZXMKKyAgICBIYXNoTWFwPFN0cmluZywgUGFnZVVSTFNuYXBz
aG90PiBtX3BhZ2VVUkxzUGVuZGluZ1N5bmM7CisgICAgSGFzaE1hcDxTdHJpbmcsIEljb25TbmFw
c2hvdD4gbV9pY29uc1BlbmRpbmdTeW5jOworCisgICAgTG9jayBtX3BlbmRpbmdSZWFkaW5nTG9j
azsKKyAgICAvLyBIb2xkaW5nIG1fcGVuZGluZ1N5bmNMb2NrIGlzIHJlcXVpcmVkIHdoZW4gYWNj
ZXNzaW5nIGFueSBvZiB0aGUgZm9sbG93aW5nIGRhdGEgc3RydWN0dXJlcyAtIHdoZW4gZGVhbGlu
ZyB3aXRoIEljb25SZWNvcmQqcywgaG9sZGluZyBtX3VybEFuZEljb25Mb2NrIGlzIGFsc28gcmVx
dWlyZWQKKyAgICBIYXNoU2V0PFN0cmluZz4gbV9wYWdlVVJMc1BlbmRpbmdJbXBvcnQ7CisgICAg
SGFzaFNldDxTdHJpbmc+IG1fcGFnZVVSTHNJbnRlcmVzdGVkSW5JY29uczsKKyAgICBIYXNoU2V0
PEljb25SZWNvcmQqPiBtX2ljb25zUGVuZGluZ1JlYWRpbmc7CisKKyAgICBMb2NrIG1fdXJsc1Rv
UmV0YWluT3JSZWxlYXNlTG9jazsKKyAgICAvLyBIb2xkaW5nIG1fdXJsc1RvUmV0YWluT3JSZWxl
YXNlTG9jayBpcyByZXF1aXJlZCB3aGVuIGFjY2Vzc2luZyBhbnkgb2YgdGhlIGZvbGxvd2luZyBk
YXRhIHN0cnVjdHVyZXMuCisgICAgSGFzaENvdW50ZWRTZXQ8U3RyaW5nPiBtX3VybHNUb1JldGFp
bjsKKyAgICBIYXNoQ291bnRlZFNldDxTdHJpbmc+IG1fdXJsc1RvUmVsZWFzZTsKKyAgICBib29s
IG1fcmV0YWluT3JSZWxlYXNlSWNvblJlcXVlc3RlZCB7IGZhbHNlIH07CisKKy8vICoqKiBTeW5j
IFRocmVhZCBPbmx5ICoqKgorcHVibGljOgorICAgIGJvb2wgc2hvdWxkU3RvcFRocmVhZEFjdGl2
aXR5KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdm9pZCBpY29uRGF0YWJhc2VTeW5jVGhyZWFk
KCk7CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGJsb2NrIG9mIG1ldGhvZHMgYXJlIGNhbGxlZCBl
eGNsdXNpdmVseSBieSB0aGUgc3luYyB0aHJlYWQgdG8gbWFuYWdlIGkvbyB0byBhbmQgZnJvbSB0
aGUgZGF0YWJhc2UKKyAgICAvLyBFYWNoIG1ldGhvZCBzaG91bGQgcGVyaW9kaWNhbGx5IG1vbml0
b3IgbV90aHJlYWRUZXJtaW5hdGlvblJlcXVlc3RlZCB3aGVuIGl0IG1ha2VzIHNlbnNlIHRvIHJl
dHVybiBlYXJseSBvbiBzaHV0ZG93bgorICAgIHZvaWQgcGVyZm9ybU9wZW5Jbml0aWFsaXphdGlv
bigpOworICAgIGJvb2wgY2hlY2tJbnRlZ3JpdHkoKTsKKyAgICB2b2lkIHBlcmZvcm1VUkxJbXBv
cnQoKTsKKyAgICB2b2lkIHN5bmNUaHJlYWRNYWluTG9vcCgpOworICAgIGJvb2wgcmVhZEZyb21E
YXRhYmFzZSgpOworICAgIGJvb2wgd3JpdGVUb0RhdGFiYXNlKCk7CisgICAgdm9pZCBwcnVuZVVu
cmV0YWluZWRJY29ucygpOworICAgIHZvaWQgY2hlY2tGb3JEYW5nbGluZ1BhZ2VVUkxzKGJvb2wg
cHJ1bmVJZkZvdW5kKTsKKyAgICB2b2lkIHJlbW92ZUFsbEljb25zT25UaHJlYWQoKTsKKyAgICB2
b2lkIGRlbGV0ZUFsbFByZXBhcmVkU3RhdGVtZW50cygpOworICAgIHZvaWQqIGNsZWFudXBTeW5j
VGhyZWFkKCk7CisgICAgdm9pZCBwZXJmb3JtUmV0YWluSWNvbkZvclBhZ2VVUkwoY29uc3QgU3Ry
aW5nJiwgaW50IHJldGFpbkNvdW50KTsKKyAgICB2b2lkIHBlcmZvcm1SZWxlYXNlSWNvbkZvclBh
Z2VVUkwoY29uc3QgU3RyaW5nJiwgaW50IHJlbGVhc2VDb3VudCk7CisKKyAgICBib29sIGlzT3Bl
bkJlc2lkZXNNYWluVGhyZWFkQ2FsbGJhY2tzKCkgY29uc3Q7CisgICAgdm9pZCBjaGVja0Nsb3Nl
ZEFmdGVyTWFpblRocmVhZENhbGxiYWNrKCk7CisKKyAgICBib29sIG1faW5pdGlhbFBydW5pbmdD
b21wbGV0ZSB7IGZhbHNlIH07CisKKyAgICB2b2lkIHNldEljb25VUkxGb3JQYWdlVVJMSW5TUUxE
YXRhYmFzZShjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIHNldEljb25J
REZvclBhZ2VVUkxJblNRTERhdGFiYXNlKGludDY0X3QsIGNvbnN0IFN0cmluZyYpOworICAgIHZv
aWQgcmVtb3ZlUGFnZVVSTEZyb21TUUxEYXRhYmFzZShjb25zdCBTdHJpbmcmIHBhZ2VVUkwpOwor
ICAgIGludDY0X3QgZ2V0SWNvbklERm9ySWNvblVSTEZyb21TUUxEYXRhYmFzZShjb25zdCBTdHJp
bmcmIGljb25VUkwpOworICAgIGludDY0X3QgYWRkSWNvblVSTFRvU1FMRGF0YWJhc2UoY29uc3Qg
U3RyaW5nJik7CisgICAgUmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gZ2V0SW1hZ2VEYXRh
Rm9ySWNvblVSTEZyb21TUUxEYXRhYmFzZShjb25zdCBTdHJpbmcmIGljb25VUkwpOworICAgIHZv
aWQgcmVtb3ZlSWNvbkZyb21TUUxEYXRhYmFzZShjb25zdCBTdHJpbmcmIGljb25VUkwpOworICAg
IHZvaWQgd3JpdGVJY29uU25hcHNob3RUb1NRTERhdGFiYXNlKGNvbnN0IEljb25TbmFwc2hvdCYp
OworCisgICAgdm9pZCBwZXJmb3JtUGVuZGluZ1JldGFpbkFuZFJlbGVhc2VPcGVyYXRpb25zKCk7
CisKKyAgICAvLyBNZXRob2RzIHRvIGRpc3BhdGNoIGNsaWVudCBjYWxsYmFja3Mgb24gdGhlIG1h
aW4gdGhyZWFkCisgICAgdm9pZCBkaXNwYXRjaERpZEltcG9ydEljb25VUkxGb3JQYWdlVVJMT25N
YWluVGhyZWFkKGNvbnN0IFN0cmluZyYpOworICAgIHZvaWQgZGlzcGF0Y2hEaWRJbXBvcnRJY29u
RGF0YUZvclBhZ2VVUkxPbk1haW5UaHJlYWQoY29uc3QgU3RyaW5nJik7CisgICAgdm9pZCBkaXNw
YXRjaERpZFJlbW92ZUFsbEljb25zT25NYWluVGhyZWFkKCk7CisgICAgdm9pZCBkaXNwYXRjaERp
ZEZpbmlzaFVSTEltcG9ydE9uTWFpblRocmVhZCgpOworICAgIHN0ZDo6YXRvbWljPHVpbnQzMl90
PiBtX21haW5UaHJlYWRDYWxsYmFja0NvdW50OworCisgICAgLy8gVGhlIGNsaWVudCBpcyBzZXQg
YnkgdGhlIG1haW4gdGhyZWFkIGJlZm9yZSB0aGUgdGhyZWFkIHN0YXJ0cywgYW5kIGZyb20gdGhl
biBvbiBpcyBvbmx5IHVzZWQgYnkgdGhlIHN5bmMgdGhyZWFkCisgICAgc3RkOjp1bmlxdWVfcHRy
PEljb25EYXRhYmFzZUNsaWVudD4gbV9jbGllbnQ7CisKKyAgICBXZWJDb3JlOjpTUUxpdGVEYXRh
YmFzZSBtX3N5bmNEQjsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0
ZW1lbnQ+IG1fc2V0SWNvbklERm9yUGFnZVVSTFN0YXRlbWVudDsKKyAgICBzdGQ6OnVuaXF1ZV9w
dHI8V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX3JlbW92ZVBhZ2VVUkxTdGF0ZW1lbnQ7Cisg
ICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9nZXRJY29uSURG
b3JJY29uVVJMU3RhdGVtZW50OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVT
dGF0ZW1lbnQ+IG1fZ2V0SW1hZ2VEYXRhRm9ySWNvblVSTFN0YXRlbWVudDsKKyAgICBzdGQ6OnVu
aXF1ZV9wdHI8V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX2FkZEljb25Ub0ljb25JbmZvU3Rh
dGVtZW50OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1f
YWRkSWNvblRvSWNvbkRhdGFTdGF0ZW1lbnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6
OlNRTGl0ZVN0YXRlbWVudD4gbV9nZXRJbWFnZURhdGFTdGF0ZW1lbnQ7CisgICAgc3RkOjp1bmlx
dWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9kZWxldGVQYWdlVVJMc0Zvckljb25V
UkxTdGF0ZW1lbnQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVu
dD4gbV9kZWxldGVJY29uRnJvbUljb25JbmZvU3RhdGVtZW50OworICAgIHN0ZDo6dW5pcXVlX3B0
cjxXZWJDb3JlOjpTUUxpdGVTdGF0ZW1lbnQ+IG1fZGVsZXRlSWNvbkZyb21JY29uRGF0YVN0YXRl
bWVudDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX3Vw
ZGF0ZUljb25JbmZvU3RhdGVtZW50OworICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpTUUxp
dGVTdGF0ZW1lbnQ+IG1fdXBkYXRlSWNvbkRhdGFTdGF0ZW1lbnQ7CisgICAgc3RkOjp1bmlxdWVf
cHRyPFdlYkNvcmU6OlNRTGl0ZVN0YXRlbWVudD4gbV9zZXRJY29uSW5mb1N0YXRlbWVudDsKKyAg
ICBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6U1FMaXRlU3RhdGVtZW50PiBtX3NldEljb25EYXRh
U3RhdGVtZW50OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0RmF2aWNvbkRhdGFiYXNlLmNwcCBi
L1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRGYXZpY29uRGF0YWJhc2Uu
Y3BwCmluZGV4IDAxMGE3YzIxNWNiLi44YWFjZWVmYjBhZiAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZS5jcHAKKysrIGIv
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZS5j
cHAKQEAgLTIwLDcgKzIwLDkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJXZWJL
aXRGYXZpY29uRGF0YWJhc2UuaCIKIAorI2luY2x1ZGUgIkljb25EYXRhYmFzZS5oIgogI2luY2x1
ZGUgIldlYktpdEZhdmljb25EYXRhYmFzZVByaXZhdGUuaCIKKyNpbmNsdWRlICJXZWJQcmVmZXJl
bmNlcy5oIgogI2luY2x1ZGUgPFdlYkNvcmUvRmlsZVN5c3RlbS5oPgogI2luY2x1ZGUgPFdlYkNv
cmUvSW1hZ2UuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ludFNpemUuaD4KQEAgLTczLDkgKzc1LDEx
IEBAIHN0cnVjdCBfV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZSB7CiAgICAgICAgIGljb25E
YXRhYmFzZS0+c2V0Q2xpZW50KG51bGxwdHIpOwogICAgIH0KIAotICAgIFJlZlB0cjxXZWJJY29u
RGF0YWJhc2U+IGljb25EYXRhYmFzZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SWNvbkRhdGFiYXNl
PiBpY29uRGF0YWJhc2U7CisgICAgVmVjdG9yPHN0ZDo6cGFpcjxTdHJpbmcsIEZ1bmN0aW9uPHZv
aWQoYm9vbCk+Pj4gcGVuZGluZ0xvYWREZWNpc2lvbnM7CiAgICAgUGVuZGluZ0ljb25SZXF1ZXN0
TWFwIHBlbmRpbmdJY29uUmVxdWVzdHM7CiAgICAgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gcGFn
ZVVSTFRvSWNvblVSTE1hcDsKKyAgICBib29sIGlzVVJMSW1wb3J0Q29tcGxldGVkOwogfTsKIAog
V0VCS0lUX0RFRklORV9UWVBFKFdlYktpdEZhdmljb25EYXRhYmFzZSwgd2Via2l0X2Zhdmljb25f
ZGF0YWJhc2UsIEdfVFlQRV9PQkpFQ1QpCkBAIC0xNDEsNyArMTQ1LDcgQEAgc3RhdGljIFJlZlB0
cjxjYWlyb19zdXJmYWNlX3Q+IGdldEljb25TdXJmYWNlU3luY2hyb25vdXNseShXZWJLaXRGYXZp
Y29uRGF0YWJhc2UKIAogICAgIC8vIFRoZSBleGFjdCBzaXplIHdlIHBhc3MgaXMgaXJyZWxldmFu
dCB0byB0aGUgaWNvbkRhdGFiYXNlIGNvZGUuCiAgICAgLy8gV2UgbXVzdCBwYXNzIHNvbWV0aGlu
ZyBncmVhdGVyIHRoYW4gMHgwIHRvIGdldCBhbiBpY29uLgotICAgIFdlYkNvcmU6OkltYWdlKiBp
Y29uSW1hZ2UgPSBkYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNlLT5pbWFnZUZvclBhZ2VVUkwo
cGFnZVVSTCwgV2ViQ29yZTo6SW50U2l6ZSgxLCAxKSk7CisgICAgV2ViQ29yZTo6SW1hZ2UqIGlj
b25JbWFnZSA9IGRhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UtPnN5bmNocm9ub3VzSWNvbkZv
clBhZ2VVUkwocGFnZVVSTCwgV2ViQ29yZTo6SW50U2l6ZSgxLCAxKSk7CiAgICAgaWYgKCFpY29u
SW1hZ2UpIHsKICAgICAgICAgZ19zZXRfZXJyb3IoZXJyb3IsIFdFQktJVF9GQVZJQ09OX0RBVEFC
QVNFX0VSUk9SLCBXRUJLSVRfRkFWSUNPTl9EQVRBQkFTRV9FUlJPUl9GQVZJQ09OX1VOS05PV04s
IF8oIlVua25vd24gZmF2aWNvbiBmb3IgcGFnZSAlcyIpLCBwYWdlVVJMLnV0ZjgoKS5kYXRhKCkp
OwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTE4NSw3ICsxODksMjEgQEAgc3RhdGljIHZv
aWQgcHJvY2Vzc1BlbmRpbmdJY29uc0ZvclBhZ2VVUkwoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBk
YXRhYmFzZSwgY29uc3QKICAgICBkZWxldGVQZW5kaW5nSWNvblJlcXVlc3RzKGRhdGFiYXNlLCBw
ZW5kaW5nSWNvblJlcXVlc3RzLCBwYWdlVVJMKTsKIH0KIAotY2xhc3MgV2ViS2l0SWNvbkRhdGFi
YXNlQ2xpZW50IGZpbmFsIDogcHVibGljIEFQSTo6SWNvbkRhdGFiYXNlQ2xpZW50IHsKK3N0YXRp
YyB2b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldEljb25VUkxGb3JQYWdlVVJMKFdlYktpdEZh
dmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0IFN0cmluZyYgaWNvblVSTCwgY29uc3QgU3Ry
aW5nJiBwYWdlVVJMKQoreworICAgIFdlYktpdEZhdmljb25EYXRhYmFzZVByaXZhdGUqIHByaXYg
PSBkYXRhYmFzZS0+cHJpdjsKKyAgICBpZiAoIXByaXYtPmlzVVJMSW1wb3J0Q29tcGxldGVkKQor
ICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBTdHJpbmcmIGN1cnJlbnRJY29uVVJMID0gcHJp
di0+cGFnZVVSTFRvSWNvblVSTE1hcC5nZXQocGFnZVVSTCk7CisgICAgaWYgKGljb25VUkwgPT0g
Y3VycmVudEljb25VUkwpCisgICAgICAgIHJldHVybjsKKworICAgIHByaXYtPnBhZ2VVUkxUb0lj
b25VUkxNYXAuc2V0KHBhZ2VVUkwsIGljb25VUkwpOworICAgIGdfc2lnbmFsX2VtaXQoZGF0YWJh
c2UsIHNpZ25hbHNbRkFWSUNPTl9DSEFOR0VEXSwgMCwgcGFnZVVSTC51dGY4KCkuZGF0YSgpLCBp
Y29uVVJMLnV0ZjgoKS5kYXRhKCkpOworfQorCitjbGFzcyBXZWJLaXRJY29uRGF0YWJhc2VDbGll
bnQgZmluYWwgOiBwdWJsaWMgSWNvbkRhdGFiYXNlQ2xpZW50IHsKIHB1YmxpYzoKICAgICBleHBs
aWNpdCBXZWJLaXRJY29uRGF0YWJhc2VDbGllbnQoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRh
YmFzZSkKICAgICAgICAgOiBtX2RhdGFiYXNlKGRhdGFiYXNlKQpAQCAtMTkzLDQxICsyMTEsMTEy
IEBAIHB1YmxpYzoKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgdm9pZCBkaWRDaGFuZ2VJY29uRm9y
UGFnZVVSTChXZWJJY29uRGF0YWJhc2UmLCBjb25zdCBTdHJpbmcmIHBhZ2VVUkwpIG92ZXJyaWRl
CisgICAgdm9pZCBkaWRJbXBvcnRJY29uVVJMRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIHBhZ2VV
UkwpIG92ZXJyaWRlCisgICAgeworICAgICAgICBTdHJpbmcgaWNvblVSTCA9IG1fZGF0YWJhc2Ut
PnByaXYtPmljb25EYXRhYmFzZS0+c3luY2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTChwYWdlVVJM
KTsKKyAgICAgICAgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvblVSTEZvclBhZ2VVUkwobV9k
YXRhYmFzZSwgaWNvblVSTCwgcGFnZVVSTCk7CisgICAgfQorCisgICAgdm9pZCBkaWRDaGFuZ2VJ
Y29uRm9yUGFnZVVSTChjb25zdCBTdHJpbmcmIHBhZ2VVUkwpIG92ZXJyaWRlCiAgICAgewotICAg
ICAgICBpZiAoIW1fZGF0YWJhc2UtPnByaXYtPmljb25EYXRhYmFzZS0+aXNVcmxJbXBvcnRDb21w
bGV0ZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAvLyBXYWl0IHVudGlsIHRo
ZXJlJ3MgYW4gaWNvbiByZWNvcmQgaW4gdGhlIGRhdGFiYXNlIGZvciB0aGlzIHBhZ2UgVVJMLgot
ICAgICAgICBXZWJDb3JlOjpJbWFnZSogaWNvbkltYWdlID0gbV9kYXRhYmFzZS0+cHJpdi0+aWNv
bkRhdGFiYXNlLT5pbWFnZUZvclBhZ2VVUkwocGFnZVVSTCwgV2ViQ29yZTo6SW50U2l6ZSgxLCAx
KSk7Ci0gICAgICAgIGlmICghaWNvbkltYWdlIHx8IGljb25JbWFnZS0+aXNOdWxsKCkpCi0gICAg
ICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgU3RyaW5nIGN1cnJlbnRJY29uVVJMOwotICAgICAg
ICBtX2RhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UtPnN5bmNocm9ub3VzSWNvblVSTEZvclBh
Z2VVUkwocGFnZVVSTCwgY3VycmVudEljb25VUkwpOwotICAgICAgICBjb25zdCBTdHJpbmcmIGlj
b25VUkwgPSBtX2RhdGFiYXNlLT5wcml2LT5wYWdlVVJMVG9JY29uVVJMTWFwLmdldChwYWdlVVJM
KTsKLSAgICAgICAgaWYgKGljb25VUkwgPT0gY3VycmVudEljb25VUkwpCi0gICAgICAgICAgICBy
ZXR1cm47Ci0KLSAgICAgICAgbV9kYXRhYmFzZS0+cHJpdi0+cGFnZVVSTFRvSWNvblVSTE1hcC5z
ZXQocGFnZVVSTCwgY3VycmVudEljb25VUkwpOwotICAgICAgICBnX3NpZ25hbF9lbWl0KG1fZGF0
YWJhc2UsIHNpZ25hbHNbRkFWSUNPTl9DSEFOR0VEXSwgMCwgcGFnZVVSTC51dGY4KCkuZGF0YSgp
LCBjdXJyZW50SWNvblVSTC51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgU3RyaW5nIGljb25VUkwg
PSBtX2RhdGFiYXNlLT5wcml2LT5pY29uRGF0YWJhc2UtPnN5bmNocm9ub3VzSWNvblVSTEZvclBh
Z2VVUkwocGFnZVVSTCk7CisgICAgICAgIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldEljb25VUkxG
b3JQYWdlVVJMKG1fZGF0YWJhc2UsIGljb25VUkwsIHBhZ2VVUkwpOwogICAgIH0KIAotICAgIHZv
aWQgaWNvbkRhdGFSZWFkeUZvclBhZ2VVUkwoV2ViSWNvbkRhdGFiYXNlJiwgY29uc3QgU3RyaW5n
JiBwYWdlVVJMKSBvdmVycmlkZQorICAgIHZvaWQgZGlkSW1wb3J0SWNvbkRhdGFGb3JQYWdlVVJM
KGNvbnN0IFN0cmluZyYgcGFnZVVSTCkgb3ZlcnJpZGUKICAgICB7Ci0gICAgICAgIEFTU0VSVChS
dW5Mb29wOjppc01haW4oKSk7CiAgICAgICAgIHByb2Nlc3NQZW5kaW5nSWNvbnNGb3JQYWdlVVJM
KG1fZGF0YWJhc2UsIHBhZ2VVUkwpOworICAgICAgICBTdHJpbmcgaWNvblVSTCA9IG1fZGF0YWJh
c2UtPnByaXYtPmljb25EYXRhYmFzZS0+c3luY2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTChwYWdl
VVJMKTsKKyAgICAgICAgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvblVSTEZvclBhZ2VVUkwo
bV9kYXRhYmFzZSwgaWNvblVSTCwgcGFnZVVSTCk7CisgICAgfQorCisgICAgdm9pZCBkaWRGaW5p
c2hVUkxJbXBvcnQoKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgV2ViS2l0RmF2aWNvbkRhdGFi
YXNlUHJpdmF0ZSogcHJpdiA9IG1fZGF0YWJhc2UtPnByaXY7CisKKyAgICAgICAgd2hpbGUgKCFw
cml2LT5wZW5kaW5nTG9hZERlY2lzaW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGF1dG8g
aWNvblVSTEFuZENhbGxiYWNrID0gcHJpdi0+cGVuZGluZ0xvYWREZWNpc2lvbnMudGFrZUxhc3Qo
KTsKKyAgICAgICAgICAgIGF1dG8gZGVjaXNpb24gPSBwcml2LT5pY29uRGF0YWJhc2UtPnN5bmNo
cm9ub3VzTG9hZERlY2lzaW9uRm9ySWNvblVSTChpY29uVVJMQW5kQ2FsbGJhY2suZmlyc3QpOwor
ICAgICAgICAgICAgLy8gRGVjaXNpb25zIHNob3VsZCBuZXZlciBiZSB1bmtub3duIGFmdGVyIHRo
ZSBpbml0YWwgaW1wb3J0IGlzIGNvbXBsZXRlLgorICAgICAgICAgICAgQVNTRVJUKGRlY2lzaW9u
ICE9IEljb25EYXRhYmFzZTo6SWNvbkxvYWREZWNpc2lvbjo6VW5rbm93bik7CisgICAgICAgICAg
ICBpY29uVVJMQW5kQ2FsbGJhY2suc2Vjb25kKGRlY2lzaW9uID09IEljb25EYXRhYmFzZTo6SWNv
bkxvYWREZWNpc2lvbjo6WWVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXYtPmlzVVJMSW1w
b3J0Q29tcGxldGVkID0gdHJ1ZTsKICAgICB9CiAKICAgICBXZWJLaXRGYXZpY29uRGF0YWJhc2Uq
IG1fZGF0YWJhc2U7CiB9OwogCi1XZWJLaXRGYXZpY29uRGF0YWJhc2UqIHdlYmtpdEZhdmljb25E
YXRhYmFzZUNyZWF0ZShXZWJJY29uRGF0YWJhc2UqIGljb25EYXRhYmFzZSkKK1dlYktpdEZhdmlj
b25EYXRhYmFzZSogd2Via2l0RmF2aWNvbkRhdGFiYXNlQ3JlYXRlKCkKK3sKKyAgICByZXR1cm4g
V0VCS0lUX0ZBVklDT05fREFUQUJBU0UoZ19vYmplY3RfbmV3KFdFQktJVF9UWVBFX0ZBVklDT05f
REFUQUJBU0UsIG51bGxwdHIpKTsKK30KKwordm9pZCB3ZWJraXRGYXZpY29uRGF0YWJhc2VPcGVu
KFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0IFN0cmluZyYgcGF0aCkKK3sK
KyAgICBpZiAod2Via2l0RmF2aWNvbkRhdGFiYXNlSXNPcGVuKGRhdGFiYXNlKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZSogcHJpdiA9IGRhdGFi
YXNlLT5wcml2OworICAgIHByaXYtPmljb25EYXRhYmFzZSA9IHN0ZDo6bWFrZV91bmlxdWU8SWNv
bkRhdGFiYXNlPigpOworICAgIHByaXYtPmljb25EYXRhYmFzZS0+c2V0Q2xpZW50KHN0ZDo6bWFr
ZV91bmlxdWU8V2ViS2l0SWNvbkRhdGFiYXNlQ2xpZW50PihkYXRhYmFzZSkpOworICAgIEljb25E
YXRhYmFzZTo6ZGVsYXlEYXRhYmFzZUNsZWFudXAoKTsKKyAgICBwcml2LT5pY29uRGF0YWJhc2Ut
PnNldEVuYWJsZWQodHJ1ZSk7CisgICAgcHJpdi0+aWNvbkRhdGFiYXNlLT5zZXRQcml2YXRlQnJv
d3NpbmdFbmFibGVkKFdlYlByZWZlcmVuY2VzOjphbnlQYWdlc0FyZVVzaW5nUHJpdmF0ZUJyb3dz
aW5nKCkpOworCisgICAgaWYgKCFwcml2LT5pY29uRGF0YWJhc2UtPm9wZW4oV2ViQ29yZTo6ZGly
ZWN0b3J5TmFtZShwYXRoKSwgV2ViQ29yZTo6cGF0aEdldEZpbGVOYW1lKHBhdGgpKSkgeworICAg
ICAgICBwcml2LT5pY29uRGF0YWJhc2UgPSBudWxscHRyOworICAgICAgICBJY29uRGF0YWJhc2U6
OmFsbG93RGF0YWJhc2VDbGVhbnVwKCk7CisgICAgfQorfQorCitib29sIHdlYmtpdEZhdmljb25E
YXRhYmFzZUlzT3BlbihXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFiYXNlKQoreworICAgIHJl
dHVybiBkYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNlICYmIGRhdGFiYXNlLT5wcml2LT5pY29u
RGF0YWJhc2UtPmlzT3BlbigpOworfQorCit2b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldFBy
aXZhdGVCcm93c2luZ0VuYWJsZWQoV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgYm9v
bCBlbmFibGVkKQoreworICAgIGlmIChkYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNlKQorICAg
ICAgICBkYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNlLT5zZXRQcml2YXRlQnJvd3NpbmdFbmFi
bGVkKGVuYWJsZWQpOworfQorCit2b2lkIHdlYmtpdEZhdmljb25EYXRhYmFzZUdldExvYWREZWNp
c2lvbkZvckljb24oV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFzZSwgY29uc3QgTGlua0lj
b24mIGljb24sIGNvbnN0IFN0cmluZyYgcGFnZVVSTCwgRnVuY3Rpb248dm9pZChib29sKT4mJiBj
b21wbGV0aW9uSGFuZGxlcikKK3sKKyAgICBpZiAoIXdlYmtpdEZhdmljb25EYXRhYmFzZUlzT3Bl
bihkYXRhYmFzZSkpIHsKKyAgICAgICAgY29tcGxldGlvbkhhbmRsZXIoZmFsc2UpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZSogcHJp
diA9IGRhdGFiYXNlLT5wcml2OworICAgIGF1dG8gZGVjaXNpb24gPSBwcml2LT5pY29uRGF0YWJh
c2UtPnN5bmNocm9ub3VzTG9hZERlY2lzaW9uRm9ySWNvblVSTChpY29uLnVybC5zdHJpbmcoKSk7
CisgICAgc3dpdGNoIChkZWNpc2lvbikgeworICAgIGNhc2UgSWNvbkRhdGFiYXNlOjpJY29uTG9h
ZERlY2lzaW9uOjpVbmtub3duOgorICAgICAgICBwcml2LT5wZW5kaW5nTG9hZERlY2lzaW9ucy5h
cHBlbmQoc3RkOjptYWtlX3BhaXIoaWNvbi51cmwuc3RyaW5nKCksIFdURk1vdmUoY29tcGxldGlv
bkhhbmRsZXIpKSk7CisgICAgICAgIHByaXYtPmljb25EYXRhYmFzZS0+c2V0SWNvblVSTEZvclBh
Z2VVUkwoaWNvbi51cmwuc3RyaW5nKCksIHBhZ2VVUkwpOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIEljb25EYXRhYmFzZTo6SWNvbkxvYWREZWNpc2lvbjo6Tm86CisgICAgICAgIHByaXYtPmlj
b25EYXRhYmFzZS0+c2V0SWNvblVSTEZvclBhZ2VVUkwoaWNvbi51cmwuc3RyaW5nKCksIHBhZ2VV
UkwpOworICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihmYWxzZSk7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgSWNvbkRhdGFiYXNlOjpJY29uTG9hZERlY2lzaW9uOjpZZXM6CisgICAgICAgIGNv
bXBsZXRpb25IYW5kbGVyKHRydWUpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQg
d2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0SWNvbkZvclBhZ2VVUkwoV2ViS2l0RmF2aWNvbkRhdGFi
YXNlKiBkYXRhYmFzZSwgY29uc3QgTGlua0ljb24mIGljb24sIEFQSTo6RGF0YSYgaWNvbkRhdGEs
IGNvbnN0IFN0cmluZyYgcGFnZVVSTCkKIHsKLSAgICBXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGZh
dmljb25EYXRhYmFzZSA9IFdFQktJVF9GQVZJQ09OX0RBVEFCQVNFKGdfb2JqZWN0X25ldyhXRUJL
SVRfVFlQRV9GQVZJQ09OX0RBVEFCQVNFLCBOVUxMKSk7Ci0gICAgZmF2aWNvbkRhdGFiYXNlLT5w
cml2LT5pY29uRGF0YWJhc2UgPSBpY29uRGF0YWJhc2U7Ci0gICAgaWNvbkRhdGFiYXNlLT5zZXRD
bGllbnQoc3RkOjptYWtlX3VuaXF1ZTxXZWJLaXRJY29uRGF0YWJhc2VDbGllbnQ+KGZhdmljb25E
YXRhYmFzZSkpOwotICAgIHJldHVybiBmYXZpY29uRGF0YWJhc2U7CisgICAgaWYgKCF3ZWJraXRG
YXZpY29uRGF0YWJhc2VJc09wZW4oZGF0YWJhc2UpKQorICAgICAgICByZXR1cm47CisKKyAgICBX
ZWJLaXRGYXZpY29uRGF0YWJhc2VQcml2YXRlKiBwcml2ID0gZGF0YWJhc2UtPnByaXY7CisgICAg
cHJpdi0+aWNvbkRhdGFiYXNlLT5zZXRJY29uVVJMRm9yUGFnZVVSTChpY29uLnVybC5zdHJpbmco
KSwgcGFnZVVSTCk7CisgICAgcHJpdi0+aWNvbkRhdGFiYXNlLT5zZXRJY29uRGF0YUZvckljb25V
UkwoU2hhcmVkQnVmZmVyOjpjcmVhdGUoaWNvbkRhdGEuYnl0ZXMoKSwgaWNvbkRhdGEuc2l6ZSgp
KSwgaWNvbi51cmwuc3RyaW5nKCkpOworICAgIHdlYmtpdEZhdmljb25EYXRhYmFzZVNldEljb25V
UkxGb3JQYWdlVVJMKGRhdGFiYXNlLCBpY29uLnVybC5zdHJpbmcoKSwgcGFnZVVSTCk7CisgICAg
Z19zaWduYWxfZW1pdChkYXRhYmFzZSwgc2lnbmFsc1tGQVZJQ09OX0NIQU5HRURdLCAwLCBwYWdl
VVJMLnV0ZjgoKS5kYXRhKCksIGljb24udXJsLnN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAg
IHByb2Nlc3NQZW5kaW5nSWNvbnNGb3JQYWdlVVJMKGRhdGFiYXNlLCBwYWdlVVJMKTsKIH0KIAog
c3RhdGljIFBlbmRpbmdJY29uUmVxdWVzdFZlY3RvciogZ2V0T3JDcmVhdGVQZW5kaW5nSWNvblJl
cXVlc3RzKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0IFN0cmluZyYgcGFn
ZVVSTCkKQEAgLTI3NCw5ICszNjMsNyBAQCB2b2lkIHdlYmtpdF9mYXZpY29uX2RhdGFiYXNlX2dl
dF9mYXZpY29uKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0CiAgICAgZ19y
ZXR1cm5faWZfZmFpbChXRUJLSVRfSVNfRkFWSUNPTl9EQVRBQkFTRShkYXRhYmFzZSkpOwogICAg
IGdfcmV0dXJuX2lmX2ZhaWwocGFnZVVSSSk7CiAKLSAgICBXZWJLaXRGYXZpY29uRGF0YWJhc2VQ
cml2YXRlKiBwcml2ID0gZGF0YWJhc2UtPnByaXY7Ci0gICAgV2ViSWNvbkRhdGFiYXNlKiBpY29u
RGF0YWJhc2VJbXBsID0gcHJpdi0+aWNvbkRhdGFiYXNlLmdldCgpOwotICAgIGlmICghaWNvbkRh
dGFiYXNlSW1wbC0+aXNPcGVuKCkpIHsKKyAgICBpZiAoIXdlYmtpdEZhdmljb25EYXRhYmFzZUlz
T3BlbihkYXRhYmFzZSkpIHsKICAgICAgICAgZ190YXNrX3JlcG9ydF9uZXdfZXJyb3IoZGF0YWJh
c2UsIGNhbGxiYWNrLCB1c2VyRGF0YSwgMCwKICAgICAgICAgICAgIFdFQktJVF9GQVZJQ09OX0RB
VEFCQVNFX0VSUk9SLCBXRUJLSVRfRkFWSUNPTl9EQVRBQkFTRV9FUlJPUl9OT1RfSU5JVElBTEla
RUQsIF8oIkZhdmljb25zIGRhdGFiYXNlIG5vdCBpbml0aWFsaXplZCB5ZXQiKSk7CiAgICAgICAg
IHJldHVybjsKQEAgLTI5NSw2ICszODIsNyBAQCB2b2lkIHdlYmtpdF9mYXZpY29uX2RhdGFiYXNl
X2dldF9mYXZpY29uKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0CiAgICAg
ZGF0YS0+cGFnZVVSTCA9IFN0cmluZzo6ZnJvbVVURjgocGFnZVVSSSk7CiAgICAgZ190YXNrX3Nl
dF90YXNrX2RhdGEodGFzay5nZXQoKSwgZGF0YSwgcmVpbnRlcnByZXRfY2FzdDxHRGVzdHJveU5v
dGlmeT4oZGVzdHJveUdldEZhdmljb25TdXJmYWNlQXN5bmNEYXRhKSk7CiAKKyAgICBXZWJLaXRG
YXZpY29uRGF0YWJhc2VQcml2YXRlKiBwcml2ID0gZGF0YWJhc2UtPnByaXY7CiAgICAgcHJpdi0+
aWNvbkRhdGFiYXNlLT5yZXRhaW5JY29uRm9yUGFnZVVSTChkYXRhLT5wYWdlVVJMKTsKIAogICAg
IC8vIFdlIGFzayBmb3IgdGhlIGljb24gZGlyZWN0bHkuIElmIHdlIGRvbid0IGdldCB0aGUgaWNv
biBkYXRhIG5vdywKQEAgLTMxOCw5ICs0MDYsOCBAQCB2b2lkIHdlYmtpdF9mYXZpY29uX2RhdGFi
YXNlX2dldF9mYXZpY29uKFdlYktpdEZhdmljb25EYXRhYmFzZSogZGF0YWJhc2UsIGNvbnN0CiAg
ICAgLy8gb3IgaXQncyBzdGlsbCBub3QgcmVnaXN0ZXJlZCBidXQgdGhlIGltcG9ydCBwcm9jZXNz
IGhhc24ndAogICAgIC8vIGZpbmlzaGVkIHlldCwgd2UgbmVlZCB0byB3YWl0IGZvciBpY29uRGF0
YVJlYWR5Rm9yUGFnZSB0byBiZQogICAgIC8vIGNhbGxlZCBiZWZvcmUgbWFraW5nIGFuZCBpbmZv
cm1lZCBkZWNpc2lvbi4KLSAgICBTdHJpbmcgaWNvblVSTEZvclBhZ2VVUkw7Ci0gICAgaWNvbkRh
dGFiYXNlSW1wbC0+c3luY2hyb25vdXNJY29uVVJMRm9yUGFnZVVSTChkYXRhLT5wYWdlVVJMLCBp
Y29uVVJMRm9yUGFnZVVSTCk7Ci0gICAgaWYgKCFpY29uVVJMRm9yUGFnZVVSTC5pc0VtcHR5KCkg
fHwgIWljb25EYXRhYmFzZUltcGwtPmlzVXJsSW1wb3J0Q29tcGxldGVkKCkpIHsKKyAgICBTdHJp
bmcgaWNvblVSTEZvclBhZ2VVUkwgPSBwcml2LT5pY29uRGF0YWJhc2UtPnN5bmNocm9ub3VzSWNv
blVSTEZvclBhZ2VVUkwoZGF0YS0+cGFnZVVSTCk7CisgICAgaWYgKCFpY29uVVJMRm9yUGFnZVVS
TC5pc0VtcHR5KCkgfHwgIXByaXYtPmlzVVJMSW1wb3J0Q29tcGxldGVkKSB7CiAgICAgICAgIFBl
bmRpbmdJY29uUmVxdWVzdFZlY3RvciogaWNvblJlcXVlc3RzID0gZ2V0T3JDcmVhdGVQZW5kaW5n
SWNvblJlcXVlc3RzKGRhdGFiYXNlLCBkYXRhLT5wYWdlVVJMKTsKICAgICAgICAgQVNTRVJUKGlj
b25SZXF1ZXN0cyk7CiAgICAgICAgIGljb25SZXF1ZXN0cy0+YXBwZW5kKHRhc2spOwpAQCAtMzY3
LDE0ICs0NTQsMTMgQEAgY2Fpcm9fc3VyZmFjZV90KiB3ZWJraXRfZmF2aWNvbl9kYXRhYmFzZV9n
ZXRfZmF2aWNvbl9maW5pc2goV2ViS2l0RmF2aWNvbkRhdGFiYXMKICAqLwogZ2NoYXIqIHdlYmtp
dF9mYXZpY29uX2RhdGFiYXNlX2dldF9mYXZpY29uX3VyaShXZWJLaXRGYXZpY29uRGF0YWJhc2Uq
IGRhdGFiYXNlLCBjb25zdCBnY2hhciogcGFnZVVSTCkKIHsKLSAgICBnX3JldHVybl92YWxfaWZf
ZmFpbChXRUJLSVRfSVNfRkFWSUNPTl9EQVRBQkFTRShkYXRhYmFzZSksIDApOwotICAgIGdfcmV0
dXJuX3ZhbF9pZl9mYWlsKHBhZ2VVUkwsIDApOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdF
QktJVF9JU19GQVZJQ09OX0RBVEFCQVNFKGRhdGFiYXNlKSwgbnVsbHB0cik7CisgICAgZ19yZXR1
cm5fdmFsX2lmX2ZhaWwocGFnZVVSTCwgbnVsbHB0cik7CiAgICAgQVNTRVJUKFJ1bkxvb3A6Omlz
TWFpbigpKTsKIAotICAgIFN0cmluZyBpY29uVVJMRm9yUGFnZVVSTDsKLSAgICBkYXRhYmFzZS0+
cHJpdi0+aWNvbkRhdGFiYXNlLT5zeW5jaHJvbm91c0ljb25VUkxGb3JQYWdlVVJMKFN0cmluZzo6
ZnJvbVVURjgocGFnZVVSTCksIGljb25VUkxGb3JQYWdlVVJMKTsKKyAgICBTdHJpbmcgaWNvblVS
TEZvclBhZ2VVUkwgPSBkYXRhYmFzZS0+cHJpdi0+aWNvbkRhdGFiYXNlLT5zeW5jaHJvbm91c0lj
b25VUkxGb3JQYWdlVVJMKFN0cmluZzo6ZnJvbVVURjgocGFnZVVSTCkpOwogICAgIGlmIChpY29u
VVJMRm9yUGFnZVVSTC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1
cm4gbnVsbHB0cjsKIAogICAgIHJldHVybiBnX3N0cmR1cChpY29uVVJMRm9yUGFnZVVSTC51dGY4
KCkuZGF0YSgpKTsKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkv
Z2xpYi9XZWJLaXRGYXZpY29uRGF0YWJhc2VQcml2YXRlLmggYi9Tb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvQVBJL2dsaWIvV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZS5oCmluZGV4IDBhOTkz
MjFhMTFhLi4zZDhlYWMxNDFlMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9nbGliL1dlYktpdEZhdmljb25EYXRhYmFzZVByaXZhdGUuaAorKysgYi9Tb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZS5oCkBA
IC0xNywxMiArMTcsMTUgQEAKICAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgogICovCiAK
LSNpZm5kZWYgV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZV9oCi0jZGVmaW5lIFdlYktpdEZh
dmljb25EYXRhYmFzZVByaXZhdGVfaAorI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlICJXZWJJY29u
RGF0YWJhc2UuaCIKKyNpbmNsdWRlICJBUElEYXRhLmgiCiAjaW5jbHVkZSAiV2ViS2l0RmF2aWNv
bkRhdGFiYXNlLmgiCisjaW5jbHVkZSA8V2ViQ29yZS9MaW5rSWNvbi5oPgogCi1XZWJLaXRGYXZp
Y29uRGF0YWJhc2UqIHdlYmtpdEZhdmljb25EYXRhYmFzZUNyZWF0ZShXZWJLaXQ6OldlYkljb25E
YXRhYmFzZSopOwotCi0jZW5kaWYgLy8gV2ViS2l0RmF2aWNvbkRhdGFiYXNlUHJpdmF0ZV9oCitX
ZWJLaXRGYXZpY29uRGF0YWJhc2UqIHdlYmtpdEZhdmljb25EYXRhYmFzZUNyZWF0ZSgpOwordm9p
ZCB3ZWJraXRGYXZpY29uRGF0YWJhc2VPcGVuKFdlYktpdEZhdmljb25EYXRhYmFzZSosIGNvbnN0
IFN0cmluZyYgcGF0aCk7Citib29sIHdlYmtpdEZhdmljb25EYXRhYmFzZUlzT3BlbihXZWJLaXRG
YXZpY29uRGF0YWJhc2UqKTsKK3ZvaWQgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0UHJpdmF0ZUJy
b3dzaW5nRW5hYmxlZChXZWJLaXRGYXZpY29uRGF0YWJhc2UqLCBib29sKTsKK3ZvaWQgd2Via2l0
RmF2aWNvbkRhdGFiYXNlR2V0TG9hZERlY2lzaW9uRm9ySWNvbihXZWJLaXRGYXZpY29uRGF0YWJh
c2UqLCBjb25zdCBXZWJDb3JlOjpMaW5rSWNvbiYsIGNvbnN0IFN0cmluZyYsIEZ1bmN0aW9uPHZv
aWQoYm9vbCk+JiYpOwordm9pZCB3ZWJraXRGYXZpY29uRGF0YWJhc2VTZXRJY29uRm9yUGFnZVVS
TChXZWJLaXRGYXZpY29uRGF0YWJhc2UqLCBjb25zdCBXZWJDb3JlOjpMaW5rSWNvbiYsIEFQSTo6
RGF0YSYsIGNvbnN0IFN0cmluZyYpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9nbGliL1dlYktpdEljb25Mb2FkaW5nQ2xpZW50LmNwcCBiL1NvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRJY29uTG9hZGluZ0NsaWVudC5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjkyNWMwYjgzY2Y5Ci0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEljb25Mb2FkaW5n
Q2xpZW50LmNwcApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEln
YWxpYSBTLkwuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90
LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXZWJLaXRJY29uTG9hZGlu
Z0NsaWVudC5oIgorCisjaW5jbHVkZSAiQVBJSWNvbkxvYWRpbmdDbGllbnQuaCIKKyNpbmNsdWRl
ICJXZWJLaXRXZWJWaWV3UHJpdmF0ZS5oIgorCit1c2luZyBuYW1lc3BhY2UgV2ViS2l0OworCitj
bGFzcyBJY29uTG9hZGluZ0NsaWVudCA6IHB1YmxpYyBBUEk6Okljb25Mb2FkaW5nQ2xpZW50IHsK
K3B1YmxpYzoKKyAgICBleHBsaWNpdCBJY29uTG9hZGluZ0NsaWVudChXZWJLaXRXZWJWaWV3KiB3
ZWJWaWV3KQorICAgICAgICA6IG1fd2ViVmlldyh3ZWJWaWV3KQorICAgIHsKKyAgICB9CisKK3By
aXZhdGU6CisgICAgdm9pZCBnZXRMb2FkRGVjaXNpb25Gb3JJY29uKGNvbnN0IFdlYkNvcmU6Okxp
bmtJY29uJiBpY29uLCBGdW5jdGlvbjx2b2lkIChGdW5jdGlvbjx2b2lkIChBUEk6OkRhdGEqLCBD
YWxsYmFja0Jhc2U6OkVycm9yKT4mJik+JiYgY29tcGxldGlvbkhhbmRsZXIpIG92ZXJyaWRlCisg
ICAgeworICAgICAgICBXZWJDb3JlOjpMaW5rSWNvbiBjb3BpZWRJY29uID0gaWNvbjsKKyAgICAg
ICAgd2Via2l0V2ViVmlld0dldExvYWREZWNpc2lvbkZvckljb24obV93ZWJWaWV3LCBpY29uLCBb
cHJvdGVjdGVkV2ViVmlldyA9IEdSZWZQdHI8V2ViS2l0V2ViVmlldz4obV93ZWJWaWV3KSwgaWNv
biA9IFdURk1vdmUoY29waWVkSWNvbiksIGNvbXBsZXRpb25IYW5kbGVyID0gV1RGTW92ZShjb21w
bGV0aW9uSGFuZGxlcildIChib29sIGxvYWRJY29uKSBtdXRhYmxlIHsKKyAgICAgICAgICAgIGlm
ICghbG9hZEljb24pIHsKKyAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihudWxscHRy
KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IGNvbXBsZXRpb25IYW5kbGVyKFtwcm90ZWN0ZWRXZWJWaWV3ID0gV1RGTW92ZShwcm90ZWN0ZWRX
ZWJWaWV3KSwgaWNvbiA9IFdURk1vdmUoaWNvbildIChBUEk6OkRhdGEqIGljb25EYXRhLCBDYWxs
YmFja0Jhc2U6OkVycm9yIGVycm9yKSB7CisgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IENh
bGxiYWNrQmFzZTo6RXJyb3I6Ok5vbmUgfHwgIWljb25EYXRhKQorICAgICAgICAgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgICAgICAgICAgd2Via2l0V2ViVmlld1NldEljb24ocHJvdGVjdGVk
V2ViVmlldy5nZXQoKSwgaWNvbiwgKmljb25EYXRhKTsKKyAgICAgICAgICAgIH0pOworICAgICAg
ICB9KTsKKyAgICB9CisKKyAgICBXZWJLaXRXZWJWaWV3KiBtX3dlYlZpZXc7Cit9OworCit2b2lk
IGF0dGFjaEljb25Mb2FkaW5nQ2xpZW50VG9WaWV3KFdlYktpdFdlYlZpZXcqIHdlYlZpZXcpCit7
CisgICAgd2Via2l0V2ViVmlld0dldFBhZ2Uod2ViVmlldykuc2V0SWNvbkxvYWRpbmdDbGllbnQo
c3RkOjptYWtlX3VuaXF1ZTxJY29uTG9hZGluZ0NsaWVudD4od2ViVmlldykpOworfQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdEljb25Mb2FkaW5n
Q2xpZW50LmggYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0SWNvbkxv
YWRpbmdDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uM2Jl
MzZmNWY1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L2dsaWIvV2ViS2l0SWNvbkxvYWRpbmdDbGllbnQuaApAQCAtMCwwICsxLDI0IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IElnYWxpYSBTLkwuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAi
V2ViS2l0V2ViVmlldy5oIgorCit2b2lkIGF0dGFjaEljb25Mb2FkaW5nQ2xpZW50VG9WaWV3KFdl
YktpdFdlYlZpZXcqKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkv
Z2xpYi9XZWJLaXRXZWJDb250ZXh0LmNwcCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkv
Z2xpYi9XZWJLaXRXZWJDb250ZXh0LmNwcAppbmRleCA1NTY3OTM5NmUwNC4uMzhiNzVhYWJlZDcg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRXZWJD
b250ZXh0LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0
V2ViQ29udGV4dC5jcHAKQEAgLTg0Myw3ICs4NDMsNyBAQCBzdGF0aWMgdm9pZCBlbnN1cmVGYXZp
Y29uRGF0YWJhc2UoV2ViS2l0V2ViQ29udGV4dCogY29udGV4dCkKICAgICBpZiAocHJpdi0+ZmF2
aWNvbkRhdGFiYXNlKQogICAgICAgICByZXR1cm47CiAKLSAgICBwcml2LT5mYXZpY29uRGF0YWJh
c2UgPSBhZG9wdEdSZWYod2Via2l0RmF2aWNvbkRhdGFiYXNlQ3JlYXRlKHByaXYtPnByb2Nlc3NQ
b29sLT5pY29uRGF0YWJhc2UoKSkpOworICAgIHByaXYtPmZhdmljb25EYXRhYmFzZSA9IGFkb3B0
R1JlZih3ZWJraXRGYXZpY29uRGF0YWJhc2VDcmVhdGUoKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHdl
YmtpdFdlYkNvbnRleHRFbmFibGVJY29uRGF0YWJhc2VQcml2YXRlQnJvd3NpbmdJZk5lZWRlZChX
ZWJLaXRXZWJDb250ZXh0KiBjb250ZXh0LCBXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3KQpAQCAtODUz
LDggKzg1Myw4IEBAIHN0YXRpYyB2b2lkIHdlYmtpdFdlYkNvbnRleHRFbmFibGVJY29uRGF0YWJh
c2VQcml2YXRlQnJvd3NpbmdJZk5lZWRlZChXZWJLaXRXZWJDCiAgICAgaWYgKCF3ZWJraXRfd2Vi
X3ZpZXdfaXNfZXBoZW1lcmFsKHdlYlZpZXcpKQogICAgICAgICByZXR1cm47CiAKLSAgICBpZiAo
IWNvbnRleHQtPnByaXYtPmVwaGVtZXJhbFBhZ2VDb3VudCkKLSAgICAgICAgY29udGV4dC0+cHJp
di0+cHJvY2Vzc1Bvb2wtPmljb25EYXRhYmFzZSgpLT5zZXRQcml2YXRlQnJvd3NpbmdFbmFibGVk
KHRydWUpOworICAgIGlmICghY29udGV4dC0+cHJpdi0+ZXBoZW1lcmFsUGFnZUNvdW50ICYmIGNv
bnRleHQtPnByaXYtPmZhdmljb25EYXRhYmFzZSkKKyAgICAgICAgd2Via2l0RmF2aWNvbkRhdGFi
YXNlU2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZChjb250ZXh0LT5wcml2LT5mYXZpY29uRGF0YWJh
c2UuZ2V0KCksIHRydWUpOwogICAgIGNvbnRleHQtPnByaXYtPmVwaGVtZXJhbFBhZ2VDb3VudCsr
OwogfQogCkBAIC04NjcsOCArODY3LDggQEAgc3RhdGljIHZvaWQgd2Via2l0V2ViQ29udGV4dERp
c2FibGVJY29uRGF0YWJhc2VQcml2YXRlQnJvd3NpbmdJZk5lZWRlZChXZWJLaXRXZWIKIAogICAg
IEFTU0VSVChjb250ZXh0LT5wcml2LT5lcGhlbWVyYWxQYWdlQ291bnQpOwogICAgIGNvbnRleHQt
PnByaXYtPmVwaGVtZXJhbFBhZ2VDb3VudC0tOwotICAgIGlmICghY29udGV4dC0+cHJpdi0+ZXBo
ZW1lcmFsUGFnZUNvdW50KQotICAgICAgICBjb250ZXh0LT5wcml2LT5wcm9jZXNzUG9vbC0+aWNv
bkRhdGFiYXNlKCktPnNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQoZmFsc2UpOworICAgIGlmICgh
Y29udGV4dC0+cHJpdi0+ZXBoZW1lcmFsUGFnZUNvdW50ICYmIGNvbnRleHQtPnByaXYtPmZhdmlj
b25EYXRhYmFzZSkKKyAgICAgICAgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0UHJpdmF0ZUJyb3dz
aW5nRW5hYmxlZChjb250ZXh0LT5wcml2LT5mYXZpY29uRGF0YWJhc2UuZ2V0KCksIGZhbHNlKTsK
IH0KIAogLyoqCkBAIC04OTEsMTAgKzg5MSw2IEBAIHZvaWQgd2Via2l0X3dlYl9jb250ZXh0X3Nl
dF9mYXZpY29uX2RhdGFiYXNlX2RpcmVjdG9yeShXZWJLaXRXZWJDb250ZXh0KiBjb250ZXh0CiAg
ICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfSVNfV0VCX0NPTlRFWFQoY29udGV4dCkpOwogCiAg
ICAgV2ViS2l0V2ViQ29udGV4dFByaXZhdGUqIHByaXYgPSBjb250ZXh0LT5wcml2OwotICAgIFdl
Ykljb25EYXRhYmFzZSogaWNvbkRhdGFiYXNlID0gcHJpdi0+cHJvY2Vzc1Bvb2wtPmljb25EYXRh
YmFzZSgpOwotICAgIGlmIChpY29uRGF0YWJhc2UtPmlzT3BlbigpKQotICAgICAgICByZXR1cm47
Ci0KICAgICBlbnN1cmVGYXZpY29uRGF0YWJhc2UoY29udGV4dCk7CiAKICAgICAvLyBVc2UgZGVm
YXVsdCBpZiAwIGlzIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCkBAIC05MDgsMTAgKzkwNCwxMCBAQCB2
b2lkIHdlYmtpdF93ZWJfY29udGV4dF9zZXRfZmF2aWNvbl9kYXRhYmFzZV9kaXJlY3RvcnkoV2Vi
S2l0V2ViQ29udGV4dCogY29udGV4dAogICAgICAgICBXZWJDb3JlOjpJY29uRGF0YWJhc2U6OmRl
ZmF1bHREYXRhYmFzZUZpbGVuYW1lKCkudXRmOCgpLmRhdGEoKSwgbnVsbHB0cikpOwogCiAgICAg
Ly8gU2V0dGluZyB0aGUgcGF0aCB3aWxsIGNhdXNlIHRoZSBpY29uIGRhdGFiYXNlIHRvIGJlIG9w
ZW5lZC4KLSAgICBwcml2LT5wcm9jZXNzUG9vbC0+c2V0SWNvbkRhdGFiYXNlUGF0aChXZWJDb3Jl
OjpzdHJpbmdGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKGZhdmljb25EYXRhYmFzZVBhdGgu
Z2V0KCkpKTsKKyAgICB3ZWJraXRGYXZpY29uRGF0YWJhc2VPcGVuKHByaXYtPmZhdmljb25EYXRh
YmFzZS5nZXQoKSwgV2ViQ29yZTo6c3RyaW5nRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihm
YXZpY29uRGF0YWJhc2VQYXRoLmdldCgpKSk7CiAKICAgICBpZiAod2Via2l0X3dlYl9jb250ZXh0
X2lzX2VwaGVtZXJhbChjb250ZXh0KSkKLSAgICAgICAgcHJpdi0+cHJvY2Vzc1Bvb2wtPmljb25E
YXRhYmFzZSgpLT5zZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKHRydWUpOworICAgICAgICB3ZWJr
aXRGYXZpY29uRGF0YWJhc2VTZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKHByaXYtPmZhdmljb25E
YXRhYmFzZS5nZXQoKSwgdHJ1ZSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdlYlZpZXcuY3BwIGIvU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdlYlZpZXcuY3BwCmluZGV4IDBjYTIzZDM4YWZkLi43
YjkzODJkZGY3ZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9nbGli
L1dlYktpdFdlYlZpZXcuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xp
Yi9XZWJLaXRXZWJWaWV3LmNwcApAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgIldlYktpdEZh
dmljb25EYXRhYmFzZVByaXZhdGUuaCIKICNpbmNsdWRlICJXZWJLaXRGb3JtQ2xpZW50LmgiCiAj
aW5jbHVkZSAiV2ViS2l0SGl0VGVzdFJlc3VsdFByaXZhdGUuaCIKKyNpbmNsdWRlICJXZWJLaXRJ
Y29uTG9hZGluZ0NsaWVudC5oIgogI2luY2x1ZGUgIldlYktpdEluc3RhbGxNaXNzaW5nTWVkaWFQ
bHVnaW5zUGVybWlzc2lvblJlcXVlc3RQcml2YXRlLmgiCiAjaW5jbHVkZSAiV2ViS2l0SmF2YXNj
cmlwdFJlc3VsdFByaXZhdGUuaCIKICNpbmNsdWRlICJXZWJLaXRMb2FkZXJDbGllbnQuaCIKQEAg
LTYzNiw2ICs2MzcsNyBAQCBzdGF0aWMgdm9pZCB3ZWJraXRXZWJWaWV3Q29uc3RydWN0ZWQoR09i
amVjdCogb2JqZWN0KQogICAgIGF0dGFjaFBvbGljeUNsaWVudFRvVmlldyh3ZWJWaWV3KTsKICAg
ICBhdHRhY2hDb250ZXh0TWVudUNsaWVudFRvVmlldyh3ZWJWaWV3KTsKICAgICBhdHRhY2hGb3Jt
Q2xpZW50VG9WaWV3KHdlYlZpZXcpOworICAgIGF0dGFjaEljb25Mb2FkaW5nQ2xpZW50VG9WaWV3
KHdlYlZpZXcpOwogCiAjaWYgUExBVEZPUk0oV1BFKQogICAgIHByaXYtPnZpZXctPnNldENsaWVu
dChzdGQ6Om1ha2VfdW5pcXVlPFdlYlZpZXdDbGllbnQ+KHdlYlZpZXcpKTsKQEAgLTE5NDcsNiAr
MTk0OSwxOCBAQCB2b2lkIHdlYmtpdFdlYlZpZXdMb2FkRmFpbGVkV2l0aFRMU0Vycm9ycyhXZWJL
aXRXZWJWaWV3KiB3ZWJWaWV3LCBjb25zdCBjaGFyKiBmYQogICAgIGdfc2lnbmFsX2VtaXQod2Vi
Vmlldywgc2lnbmFsc1tMT0FEX0NIQU5HRURdLCAwLCBXRUJLSVRfTE9BRF9GSU5JU0hFRCk7CiB9
CiAKK3ZvaWQgd2Via2l0V2ViVmlld0dldExvYWREZWNpc2lvbkZvckljb24oV2ViS2l0V2ViVmll
dyogd2ViVmlldywgY29uc3QgTGlua0ljb24mIGljb24sIEZ1bmN0aW9uPHZvaWQoYm9vbCk+JiYg
Y29tcGxldGlvbkhhbmRsZXIpCit7CisgICAgV2ViS2l0RmF2aWNvbkRhdGFiYXNlKiBkYXRhYmFz
ZSA9IHdlYmtpdF93ZWJfY29udGV4dF9nZXRfZmF2aWNvbl9kYXRhYmFzZSh3ZWJWaWV3LT5wcml2
LT5jb250ZXh0LmdldCgpKTsKKyAgICB3ZWJraXRGYXZpY29uRGF0YWJhc2VHZXRMb2FkRGVjaXNp
b25Gb3JJY29uKGRhdGFiYXNlLCBpY29uLCBnZXRQYWdlKHdlYlZpZXcpLnBhZ2VMb2FkU3RhdGUo
KS5hY3RpdmVVUkwoKSwgV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcikpOworfQorCit2b2lkIHdl
YmtpdFdlYlZpZXdTZXRJY29uKFdlYktpdFdlYlZpZXcqIHdlYlZpZXcsIGNvbnN0IExpbmtJY29u
JiBpY29uLCBBUEk6OkRhdGEmIGljb25EYXRhKQoreworICAgIFdlYktpdEZhdmljb25EYXRhYmFz
ZSogZGF0YWJhc2UgPSB3ZWJraXRfd2ViX2NvbnRleHRfZ2V0X2Zhdmljb25fZGF0YWJhc2Uod2Vi
Vmlldy0+cHJpdi0+Y29udGV4dC5nZXQoKSk7CisgICAgd2Via2l0RmF2aWNvbkRhdGFiYXNlU2V0
SWNvbkZvclBhZ2VVUkwoZGF0YWJhc2UsIGljb24sIGljb25EYXRhLCBnZXRQYWdlKHdlYlZpZXcp
LnBhZ2VMb2FkU3RhdGUoKS5hY3RpdmVVUkwoKSk7Cit9CisKIFdlYlBhZ2VQcm94eSogd2Via2l0
V2ViVmlld0NyZWF0ZU5ld1BhZ2UoV2ViS2l0V2ViVmlldyogd2ViVmlldywgY29uc3QgV2luZG93
RmVhdHVyZXMmIHdpbmRvd0ZlYXR1cmVzLCBXZWJLaXROYXZpZ2F0aW9uQWN0aW9uKiBuYXZpZ2F0
aW9uQWN0aW9uKQogewogICAgIFdlYktpdFdlYlZpZXcqIG5ld1dlYlZpZXc7CmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL2dsaWIvV2ViS2l0V2ViVmlld1ByaXZhdGUu
aCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvZ2xpYi9XZWJLaXRXZWJWaWV3UHJpdmF0
ZS5oCmluZGV4IDUzYmE5NTQwOGM2Li5hZmI4M2JmMzU2NSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdlYlZpZXdQcml2YXRlLmgKKysrIGIvU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9nbGliL1dlYktpdFdlYlZpZXdQcml2YXRlLmgKQEAg
LTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlICJXZWJLaXRXZWJWaWV3LmgiCiAjaW5jbHVkZSAiV2Vi
UGFnZVByb3h5LmgiCiAjaW5jbHVkZSA8V2ViQ29yZS9JbnRSZWN0Lmg+CisjaW5jbHVkZSA8V2Vi
Q29yZS9MaW5rSWNvbi5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAogdm9pZCB3
ZWJraXRXZWJWaWV3Q3JlYXRlUGFnZShXZWJLaXRXZWJWaWV3KiwgUmVmPEFQSTo6UGFnZUNvbmZp
Z3VyYXRpb24+JiYpOwpAQCAtNDIsNiArNDMsOCBAQCBXZWJLaXQ6OldlYlBhZ2VQcm94eSYgd2Vi
a2l0V2ViVmlld0dldFBhZ2UoV2ViS2l0V2ViVmlldyopOwogdm9pZCB3ZWJraXRXZWJWaWV3TG9h
ZENoYW5nZWQoV2ViS2l0V2ViVmlldyosIFdlYktpdExvYWRFdmVudCk7CiB2b2lkIHdlYmtpdFdl
YlZpZXdMb2FkRmFpbGVkKFdlYktpdFdlYlZpZXcqLCBXZWJLaXRMb2FkRXZlbnQsIGNvbnN0IGNo
YXIqIGZhaWxpbmdVUkksIEdFcnJvciopOwogdm9pZCB3ZWJraXRXZWJWaWV3TG9hZEZhaWxlZFdp
dGhUTFNFcnJvcnMoV2ViS2l0V2ViVmlldyosIGNvbnN0IGNoYXIqIGZhaWxpbmdVUkksIEdFcnJv
ciosIEdUbHNDZXJ0aWZpY2F0ZUZsYWdzLCBHVGxzQ2VydGlmaWNhdGUqKTsKK3ZvaWQgd2Via2l0
V2ViVmlld0dldExvYWREZWNpc2lvbkZvckljb24oV2ViS2l0V2ViVmlldyosIGNvbnN0IFdlYkNv
cmU6OkxpbmtJY29uJiwgRnVuY3Rpb248dm9pZChib29sKT4mJik7Cit2b2lkIHdlYmtpdFdlYlZp
ZXdTZXRJY29uKFdlYktpdFdlYlZpZXcqLCBjb25zdCBXZWJDb3JlOjpMaW5rSWNvbiYsIEFQSTo6
RGF0YSYpOwogV2ViS2l0OjpXZWJQYWdlUHJveHkqIHdlYmtpdFdlYlZpZXdDcmVhdGVOZXdQYWdl
KFdlYktpdFdlYlZpZXcqLCBjb25zdCBXZWJDb3JlOjpXaW5kb3dGZWF0dXJlcyYsIFdlYktpdE5h
dmlnYXRpb25BY3Rpb24qKTsKIHZvaWQgd2Via2l0V2ViVmlld1JlYWR5VG9TaG93UGFnZShXZWJL
aXRXZWJWaWV3Kik7CiB2b2lkIHdlYmtpdFdlYlZpZXdSdW5Bc01vZGFsKFdlYktpdFdlYlZpZXcq
KTsKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCAw
MWFiOTU4OWNhMi4uY2IwZTI2YWE2MWQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0NoYW5nZUxvZworKysg
Yi9Ub29scy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAxNy0wNi0yNyAgQ2FybG9zIEdh
cmNpYSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5jb20+CisKKyAgICAgICAgW0dUS11bV1BFXSBJ
bXBsZW1lbnQgQVBJOjpJY29uTG9hZGluZ0NsaWVudCBhbmQgcmV3b3JrIFdlYktpdEZhdmljb25E
YXRhYmFzZSB0byB1c2UgSWNvbkRhdGFiYXNlIGRpcmVjdGx5CisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzM4NzcKKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBVcGRhdGUgZmF2aWNvbnMgdW5pdCB0ZXN0IHRv
IGVuc3VyZSB3ZSB3YWl0IHVudGlsIHRoZSBkYXRhYmFzZSBpcyB1cGRhdGVkIGluIHRlc3RHZXRG
YXZpY29uKCkgYmVmb3JlIHN0YXJ0aW5nCisgICAgICAgIHRoZSBuZXh0IHRlc3RzLgorCisgICAg
ICAgICogVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXRHTGliL1Rlc3RXZWJLaXRGYXZpY29uRGF0
YWJhc2UuY3BwOgorICAgICAgICAodGVzdEdldEZhdmljb24pOgorCiAyMDE3LTA2LTI2ICBKb25h
dGhhbiBCZWRhcmQgIDxqYmVkYXJkQGFwcGxlLmNvbT4KIAogICAgICAgICBVbnJldmlld2VkLCBy
b2xsaW5nIG91dCByMjE4NzgzLgpkaWZmIC0tZ2l0IGEvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0
cy9XZWJLaXRHTGliL1Rlc3RXZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwIGIvVG9vbHMvVGVzdFdl
YktpdEFQSS9UZXN0cy9XZWJLaXRHTGliL1Rlc3RXZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwCmlu
ZGV4IDAwMDA3MWRhNGY5Li4wMDBjZjY3NjJmYyAxMDA2NDQKLS0tIGEvVG9vbHMvVGVzdFdlYktp
dEFQSS9UZXN0cy9XZWJLaXRHTGliL1Rlc3RXZWJLaXRGYXZpY29uRGF0YWJhc2UuY3BwCisrKyBi
L1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0R0xpYi9UZXN0V2ViS2l0RmF2aWNvbkRh
dGFiYXNlLmNwcApAQCAtNTAsOCArNTAsMTEgQEAgcHVibGljOgogCiAgICAgc3RhdGljIHZvaWQg
ZmF2aWNvbkNoYW5nZWRDYWxsYmFjayhXZWJLaXRGYXZpY29uRGF0YWJhc2UqIGRhdGFiYXNlLCBj
b25zdCBjaGFyKiBwYWdlVVJJLCBjb25zdCBjaGFyKiBmYXZpY29uVVJJLCBGYXZpY29uRGF0YWJh
c2VUZXN0KiB0ZXN0KQogICAgIHsKLSAgICAgICAgaWYgKCFnX3N0cmNtcDAod2Via2l0X3dlYl92
aWV3X2dldF91cmkodGVzdC0+bV93ZWJWaWV3KSwgcGFnZVVSSSkpCisgICAgICAgIGlmICghZ19z
dHJjbXAwKHdlYmtpdF93ZWJfdmlld19nZXRfdXJpKHRlc3QtPm1fd2ViVmlldyksIHBhZ2VVUkkp
KSB7CiAgICAgICAgICAgICB0ZXN0LT5tX2Zhdmljb25VUkkgPSBmYXZpY29uVVJJOworICAgICAg
ICAgICAgaWYgKHRlc3QtPm1fd2FpdGluZ0ZvckZhdmljb25VUkkpCisgICAgICAgICAgICAgICAg
dGVzdC0+cXVpdE1haW5Mb29wKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBzdGF0aWMgdm9p
ZCB2aWV3RmF2aWNvbkNoYW5nZWRDYWxsYmFjayhXZWJLaXRXZWJWaWV3KiB3ZWJWaWV3LCBHUGFy
YW1TcGVjKiBwc3BlYywgZ3BvaW50ZXIgZGF0YSkKQEAgLTkwLDEwICs5MywyMCBAQCBwdWJsaWM6
CiAgICAgICAgIGdfbWFpbl9sb29wX3J1bihtX21haW5Mb29wKTsKICAgICB9CiAKKyAgICB2b2lk
IHdhaXRVbnRpbEZhdmljb25VUklDaGFuZ2VkKCkKKyAgICB7CisgICAgICAgIGdfYXNzZXJ0KCFt
X3dhaXRpbmdGb3JGYXZpY29uVVJJKTsKKyAgICAgICAgbV9mYXZpY29uVVJJID0gQ1N0cmluZygp
OworICAgICAgICBtX3dhaXRpbmdGb3JGYXZpY29uVVJJID0gdHJ1ZTsKKyAgICAgICAgZ19tYWlu
X2xvb3BfcnVuKG1fbWFpbkxvb3ApOworICAgICAgICBtX3dhaXRpbmdGb3JGYXZpY29uVVJJID0g
ZmFsc2U7CisgICAgfQorCiAgICAgY2Fpcm9fc3VyZmFjZV90KiBtX2Zhdmljb247CiAgICAgQ1N0
cmluZyBtX2Zhdmljb25VUkk7CiAgICAgR1VuaXF1ZU91dFB0cjxHRXJyb3I+IG1fZXJyb3I7CiAg
ICAgYm9vbCBtX2Zhdmljb25Ob3RpZmljYXRpb25SZWNlaXZlZDsKKyAgICBib29sIG1fd2FpdGlu
Z0ZvckZhdmljb25VUkkgeyBmYWxzZSB9OwogfTsKIAogc3RhdGljIHZvaWQKQEAgLTIwOCw5ICsy
MjEsMTEgQEAgc3RhdGljIHZvaWQgdGVzdEdldEZhdmljb24oRmF2aWNvbkRhdGFiYXNlVGVzdCog
dGVzdCkKICAgICBnX2Fzc2VydCghdGVzdC0+bV9lcnJvcik7CiAgICAgY2Fpcm9fc3VyZmFjZV9k
ZXN0cm95KGZhdmljb24pOwogCi0gICAgLy8gQ2hlY2sgdGhlIEFQSSByZXRyaWV2aW5nIGFuIGlu
dmFsaWQgZmF2aWNvbi4KKyAgICAvLyBDaGVjayB0aGUgQVBJIHJldHJpZXZpbmcgYW4gaW52YWxp
ZCBmYXZpY29uLiBGYXZpY29uIGNoYW5nZXMgb25seSBvbmNlIHRvIHJlc2V0IGl0LCB0aGVuCisg
ICAgLy8gdGhlIGRhdGFiYXNlIGlzIHVwZGF0ZWQgd2l0aCB0aGUgZmF2aWNvbiBVUkksIGJ1dCBu
b3Qgd2l0aCBmYXZpY29uIGltYWdlIGRhdGEuCiAgICAgdGVzdC0+bG9hZFVSSShrU2VydmVyLT5n
ZXRVUklGb3JQYXRoKCIvbm9mYXZpY29uIikuZGF0YSgpKTsKICAgICB0ZXN0LT53YWl0VW50aWxG
YXZpY29uQ2hhbmdlZCgpOworICAgIHRlc3QtPndhaXRVbnRpbEZhdmljb25VUklDaGFuZ2VkKCk7
CiAKICAgICB0ZXN0LT5nZXRGYXZpY29uRm9yUGFnZVVSSUFuZFdhaXRVbnRpbFJlYWR5KGtTZXJ2
ZXItPmdldFVSSUZvclBhdGgoIi9ub2Zhdmljb24iKS5kYXRhKCkpOwogICAgIGdfYXNzZXJ0KCF0
ZXN0LT5tX2Zhdmljb24pOwo=
</data>
<flag name="review"
          id="334803"
          type_id="1"
          status="+"
          setter="beidson"
    />
          </attachment>
      

    </bug>

</bugzilla>