<?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>175713</bug_id>
          
          <creation_ts>2017-08-17 22:58:38 -0700</creation_ts>
          <short_desc>[Curl] Improve multi-threaded networking</short_desc>
          <delta_ts>2017-08-18 16:04:00 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Daewoong Jang">daewoong.jang</reporter>
          <assigned_to name="Daewoong Jang">daewoong.jang</assigned_to>
          <cc>achristensen</cc>
    
    <cc>bfulgham</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>don.olmstead</cc>
    
    <cc>pvollan</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1339976</commentid>
    <comment_count>0</comment_count>
    <who name="Daewoong Jang">daewoong.jang</who>
    <bug_when>2017-08-17 22:58:38 -0700</bug_when>
    <thetext>Another part of patch which fixes bug: https://bugs.webkit.org/show_bug.cgi?id=175253</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1339977</commentid>
    <comment_count>1</comment_count>
      <attachid>318477</attachid>
    <who name="Daewoong Jang">daewoong.jang</who>
    <bug_when>2017-08-17 23:01:57 -0700</bug_when>
    <thetext>Created attachment 318477
patch part 2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1340206</commentid>
    <comment_count>2</comment_count>
      <attachid>318477</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2017-08-18 13:18:14 -0700</bug_when>
    <thetext>Comment on attachment 318477
patch part 2

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

&gt; Source/WebCore/platform/network/curl/CurlDownload.cpp:62
&gt; -    m_url = url;
&gt; +    m_url = url.isolatedCopy();

I don&apos;t think this is necessary.  This is not the point at which we are moving to another thread.

&gt; Source/WebCore/platform/network/curl/CurlJobManager.cpp:86
&gt; +        default:
&gt; +            ASSERT_NOT_REACHED();

This should be removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1340236</commentid>
    <comment_count>3</comment_count>
      <attachid>318542</attachid>
    <who name="Daewoong Jang">daewoong.jang</who>
    <bug_when>2017-08-18 14:27:39 -0700</bug_when>
    <thetext>Created attachment 318542
patch part 2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1340239</commentid>
    <comment_count>4</comment_count>
    <who name="Daewoong Jang">daewoong.jang</who>
    <bug_when>2017-08-18 14:30:34 -0700</bug_when>
    <thetext>(In reply to Alex Christensen from comment #2)
&gt; Comment on attachment 318477 [details]
&gt; patch part 2
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=318477&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlDownload.cpp:62
&gt; &gt; -    m_url = url;
&gt; &gt; +    m_url = url.isolatedCopy();
&gt; 
&gt; I don&apos;t think this is necessary.  This is not the point at which we are
&gt; moving to another thread.
&gt; 
&gt; &gt; Source/WebCore/platform/network/curl/CurlJobManager.cpp:86
&gt; &gt; +        default:
&gt; &gt; +            ASSERT_NOT_REACHED();
&gt; 
&gt; This should be removed.

I have updated my patch. Thanks for review!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1340279</commentid>
    <comment_count>5</comment_count>
      <attachid>318542</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-08-18 16:02:55 -0700</bug_when>
    <thetext>Comment on attachment 318542
patch part 2

Clearing flags on attachment: 318542

Committed r220939: &lt;http://trac.webkit.org/changeset/220939&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1340280</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-08-18 16:02:57 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1340281</commentid>
    <comment_count>7</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2017-08-18 16:04:00 -0700</bug_when>
    <thetext>&lt;rdar://problem/33972311&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>318477</attachid>
            <date>2017-08-17 23:01:57 -0700</date>
            <delta_ts>2017-08-18 14:27:39 -0700</delta_ts>
            <desc>patch part 2</desc>
            <filename>bug175713-2.diff</filename>
            <type>text/plain</type>
            <size>98990</size>
            <attacher name="Daewoong Jang">daewoong.jang</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDIyMDkwMSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzNyBAQAorMjAxNy0wOC0xNyAgRGFld29v
bmcgSmFuZyAgPGRhZXdvb25nLmphbmdAbmF2ZXJjb3JwLmNvbT4KKworICAgICAgICBbQ3VybF0g
SW1wcm92ZSBtdWx0aS10aHJlYWRlZCBuZXR3b3JraW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzU3MTMKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHBsYXRmb3JtL0N1cmwuY21ha2U6CisgICAgICAg
ICogcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZUludGVybmFsLmg6CisgICAgICAgIChX
ZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUludGVybmFsOjpSZXNvdXJjZUhhbmRsZUludGVybmFsKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlSW50ZXJuYWw6Om1fZmFpbHVyZVRpbWVy
KTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENhY2hlTWFu
YWdlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDdXJsQ2FjaGVNYW5hZ2VyOjpkaWRSZWNlaXZl
UmVzcG9uc2UpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsRG93bmxvYWQu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6Q3VybERvd25sb2FkOjppbml0KToKKyAgICAgICAgKFdl
YkNvcmU6OkN1cmxEb3dubG9hZDo6c3RhcnQpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybERvd25s
b2FkOjpjYW5jZWwpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybERvd25sb2FkOjpyZXRhaW4pOgor
ICAgICAgICAoV2ViQ29yZTo6Q3VybERvd25sb2FkOjpyZWxlYXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OkN1cmxEb3dubG9hZDo6c2V0dXBSZXF1ZXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxE
b3dubG9hZDo6bm90aWZ5RmluaXNoKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxEb3dubG9hZDo6
bm90aWZ5RmFpbCk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxEb3dubG9h
ZC5oOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsSm9iTWFuYWdlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpDdXJsSm9iTGlzdDo6aXNFbXB0eSBjb25zdCk6CisgICAgICAg
IChXZWJDb3JlOjpDdXJsSm9iTGlzdDo6c3RhcnRKb2JzKToKKyAgICAgICAgKFdlYkNvcmU6OkN1
cmxKb2JMaXN0OjpmaW5pc2hKb2JzKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxKb2JMaXN0Ojpu
b3RpZnlSZXN1bHQpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybEpvYk1hbmFnZXI6OmFkZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpDdXJsSm9iTWFuYWdlcjo6Y2FuY2VsKToKKyAgICAgICAgKFdlYkNv
cmU6OkN1cmxKb2JNYW5hZ2VyOjpjYWxsT25Kb2JUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6
Q3VybEpvYk1hbmFnZXI6OnN0YXJ0VGhyZWFkSWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6
Q3VybEpvYk1hbmFnZXI6OnVwZGF0ZUpvYkxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybEpv
Yk1hbmFnZXI6OndvcmtlclRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsSm9iTGlzdDo6
YXBwZW5kKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkN1cmxKb2JMaXN0OjpjYW5jZWwp
OiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6Q3VybEpvYkxpc3Q6OmNvbXBsZXRlKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkN1cmxKb2JMaXN0Ojp3aXRoSm9iKTogRGVsZXRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OkN1cmxKb2JMaXN0Ojp3aXRoQ3VybEhhbmRsZSk6IERlbGV0ZWQu
CisgICAgICAgIChXZWJDb3JlOjpDdXJsSm9iOjppbnZva2UpOiBEZWxldGVkLgorICAgICAgICAo
V2ViQ29yZTo6Q3VybEpvYk1hbmFnZXI6OnVwZGF0ZUpvYnMpOiBEZWxldGVkLgorICAgICAgICAq
IHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsSm9iTWFuYWdlci5oOgorICAgICAgICAoV2ViQ29y
ZTo6Q3VybEpvYjo6Q3VybEpvYik6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpDdXJsSm9i
Ojp+Q3VybEpvYik6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpDdXJsSm9iOjpvcGVyYXRv
cj0pOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6Q3VybEpvYjo6Y3VybEhhbmRsZSBjb25z
dCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpDdXJsSm9iOjp0aWNrZXQgY29uc3QpOiBE
ZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6Q3VybEpvYjo6ZmluaXNoZWQpOiBEZWxldGVkLgor
ICAgICAgICAoV2ViQ29yZTo6Q3VybEpvYjo6ZXJyb3IpOiBEZWxldGVkLgorICAgICAgICAoV2Vi
Q29yZTo6Q3VybEpvYjo6Y2FuY2VsKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkN1cmxK
b2JNYW5hZ2VyOjppc0FjdGl2ZUpvYiBjb25zdCk6IERlbGV0ZWQuCisgICAgICAgICogcGxhdGZv
cm0vbmV0d29yay9jdXJsL011bHRpcGFydEhhbmRsZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpN
dWx0aXBhcnRIYW5kbGU6OmRpZFJlY2VpdmVEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlc291
cmNlSGFuZGxlSW50ZXJuYWw6On5SZXNvdXJjZUhhbmRsZUludGVybmFsKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlc291cmNlSGFuZGxlOjpzdGFydCk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJj
ZUhhbmRsZTo6Y2FuY2VsKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlOjpwbGF0
Zm9ybVNldERlZmVyc0xvYWRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGU6
OmRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpS
ZXNvdXJjZUhhbmRsZTo6cmVjZWl2ZWRDcmVkZW50aWFsKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
c291cmNlSGFuZGxlOjpyZWNlaXZlZFJlcXVlc3RUb0NvbnRpbnVlV2l0aG91dENyZWRlbnRpYWwp
OgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGU6OnBsYXRmb3JtTG9hZFJlc291cmNl
U3luY2hyb25vdXNseSk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUludGVybmFs
Ojppbml0aWFsaXplKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxl
SW50ZXJuYWw6OmFwcGx5QXV0aGVudGljYXRpb24pOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29y
ZTo6Z2V0Rm9ybUVsZW1lbnRzQ291bnQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVz
b3VyY2VIYW5kbGVJbnRlcm5hbDo6c2V0dXBQVVQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29y
ZTo6UmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6c2V0dXBQT1NUKTogRGVsZXRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlJlc291cmNlSGFuZGxlSW50ZXJuYWw6OnNldHVwRm9ybURhdGEpOiBEZWxldGVk
LgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6ZGlkRmluaXNoKTog
RGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlSW50ZXJuYWw6OmRpZEZh
aWwpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6
Y2FsY3VsYXRlV2ViVGltaW5nSW5mb3JtYXRpb25zKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OlJlc291cmNlSGFuZGxlSW50ZXJuYWw6OmhhbmRsZUxvY2FsUmVjZWl2ZVJlc3BvbnNlKTog
RGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmlzSHR0cEluZm8pOiBEZWxldGVkLgorICAgICAg
ICAoV2ViQ29yZTo6aXNIdHRwUmVkaXJlY3QpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6
aXNIdHRwQXV0aGVudGljYXRpb24pOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6aXNIdHRw
Tm90TW9kaWZpZWQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6aXNBcHBlbmRhYmxlSGVh
ZGVyKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OnJlbW92ZUxlYWRpbmdBbmRUcmFpbGlu
Z1F1b3Rlcyk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpnZXRQcm90ZWN0aW9uU3BhY2Up
OiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6d2ls
bFByZXBhcmVTZW5kRGF0YSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhh
bmRsZUludGVybmFsOjpkaWRSZWNlaXZlSGVhZGVyTGluZSk6IERlbGV0ZWQuCisgICAgICAgIChX
ZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUludGVybmFsOjpkaWRSZWNlaXZlQWxsSGVhZGVycyk6IERl
bGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUludGVybmFsOjpkaWRSZWNl
aXZlQ29udGVudERhdGEpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5k
bGVJbnRlcm5hbDo6cmVhZENhbGxiYWNrKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJl
c291cmNlSGFuZGxlSW50ZXJuYWw6OmhlYWRlckNhbGxiYWNrKTogRGVsZXRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlJlc291cmNlSGFuZGxlSW50ZXJuYWw6OndyaXRlQ2FsbGJhY2spOiBEZWxldGVk
LgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6ZGlzcGF0Y2hTeW5j
aHJvbm91c0pvYik6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUlu
dGVybmFsOjpoYW5kbGVEYXRhVVJMKTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGUuY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpSZXNvdXJjZUhhbmRsZUN1cmxE
ZWxlZ2F0ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6
flJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNl
SGFuZGxlQ3VybERlbGVnYXRlOjpoYXNIYW5kbGUgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6
UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnJlbGVhc2VIYW5kbGUpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnN0YXJ0KToKKyAgICAgICAgKFdlYkNv
cmU6OlJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpjYW5jZWwpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldERlZmVyc0xvYWRpbmcpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldEF1dGhlbnRpY2F0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpkaXNwYXRj
aFN5bmNocm9ub3VzSm9iKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlQ3VybERl
bGVnYXRlOjpyZXRhaW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVs
ZWdhdGU6OnJlbGVhc2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVs
ZWdhdGU6OnNldHVwUmVxdWVzdCk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1
cmxEZWxlZ2F0ZTo6bm90aWZ5RmluaXNoKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFu
ZGxlQ3VybERlbGVnYXRlOjpub3RpZnlGYWlsKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNl
SGFuZGxlQ3VybERlbGVnYXRlOjpyZXNwb25zZSk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJj
ZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6c2V0dXBBdXRoZW50aWNhdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpyZW1vdmVMZWFkaW5nQW5kVHJhaWxpbmdRdW90ZXMpOgorICAgICAgICAoV2ViQ29yZTo6
UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OmdldFByb3RlY3Rpb25TcGFjZSk6CisgICAgICAg
IChXZWJDb3JlOjppc0h0dHBJbmZvKToKKyAgICAgICAgKFdlYkNvcmU6OmlzSHR0cFJlZGlyZWN0
KToKKyAgICAgICAgKFdlYkNvcmU6OmlzSHR0cEF1dGhlbnRpY2F0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OmlzSHR0cE5vdE1vZGlmaWVkKToKKyAgICAgICAgKFdlYkNvcmU6OmlzQXBwZW5kYWJs
ZUhlYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6
ZGlkUmVjZWl2ZUhlYWRlckxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVD
dXJsRGVsZWdhdGU6OmRpZFJlY2VpdmVBbGxIZWFkZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
c291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpkaWRSZWNlaXZlQ29udGVudERhdGEpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OmhhbmRsZUxvY2FsUmVjZWl2
ZVJlc3BvbnNlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRl
OjpwcmVwYXJlU2VuZERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJs
RGVsZWdhdGU6OmRpZEZpbmlzaCk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1
cmxEZWxlZ2F0ZTo6ZGlkRmFpbCk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1
cmxEZWxlZ2F0ZTo6aGFuZGxlRGF0YVVSTCk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhh
bmRsZUN1cmxEZWxlZ2F0ZTo6c2V0dXBQT1NUKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNl
SGFuZGxlQ3VybERlbGVnYXRlOjpzZXR1cFBVVCk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJj
ZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6Z2V0Rm9ybUVsZW1lbnRzQ291bnQpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldHVwRm9ybURhdGEpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OmFwcGx5QXV0aGVudGljYXRp
b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldFdl
YlRpbWluZ3MpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6
OmRpZFJlY2VpdmVIZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJs
RGVsZWdhdGU6OmRpZFJlY2VpdmVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFu
ZGxlQ3VybERlbGVnYXRlOjp3aWxsU2VuZERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3Vy
Y2VIYW5kbGVDdXJsRGVsZWdhdGU6OmRpZFJlY2VpdmVIZWFkZXJDYWxsYmFjayk6CisgICAgICAg
IChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6ZGlkUmVjZWl2ZURhdGFDYWxs
YmFjayk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6d2ls
bFNlbmREYXRhQ2FsbGJhY2spOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNv
dXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZS5oOiBBZGRlZC4KKwogMjAxNy0wOC0xNyAgV2Vuc29uIEhz
aWVoICA8d2Vuc29uX2hzaWVoQGFwcGxlLmNvbT4KIAogICAgICAgICBbSW5wdXQgRXZlbnRzXSBS
ZW5hbWUgaW5wdXRUeXBlICJmb3JtYXRGb3JlQ29sb3IiIHRvICJmb3JtYXRGb250Q29sb3IiCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1cmwuY21ha2UJKHJldmlzaW9uIDIyMDg5NykKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL0N1cmwuY21ha2UJKHdvcmtpbmcgY29weSkKQEAgLTE1LDYg
KzE1LDcgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9TT1VSQ0VTCiAgICAgcGxhdGZvcm0vbmV0d29y
ay9jdXJsL011bHRpcGFydEhhbmRsZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUHJv
eHlTZXJ2ZXJDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRs
ZUN1cmwuY3BwCisgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybERl
bGVnYXRlLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9TU0xIYW5kbGUuY3BwCiAgICAg
cGxhdGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUltcGxDdXJsLmNwcAogICAg
IHBsYXRmb3JtL25ldHdvcmsvY3VybC9TeW5jaHJvbm91c0xvYWRlckNsaWVudEN1cmwuY3BwCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlSW50ZXJu
YWwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291
cmNlSGFuZGxlSW50ZXJuYWwuaAkocmV2aXNpb24gMjIwODk3KQorKysgU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZUludGVybmFsLmgJKHdvcmtpbmcgY29weSkK
QEAgLTQzLDExICs0Myw3IEBACiAjZW5kaWYKIAogI2lmIFVTRShDVVJMKQotI2luY2x1ZGUgIkN1
cmxDb250ZXh0LmgiCi0jaW5jbHVkZSAiQ3VybEpvYk1hbmFnZXIuaCIKLSNpbmNsdWRlICJGb3Jt
RGF0YVN0cmVhbUN1cmwuaCIKLSNpbmNsdWRlICJNdWx0aXBhcnRIYW5kbGUuaCIKLSNpbmNsdWRl
IDx3dGYvTG9jay5oPgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlLmgiCiAj
ZW5kaWYKIAogI2lmIFVTRShTT1VQKQpAQCAtODgsMTAgKzg0LDYgQEAgcHVibGljOgogI2lmIFVT
RShDRlVSTENPTk5FQ1RJT04pCiAgICAgICAgICwgbV9jdXJyZW50UmVxdWVzdChyZXF1ZXN0KQog
I2VuZGlmCi0jaWYgVVNFKENVUkwpCi0gICAgICAgICwgbV9oYW5kbGUgeyBsb2FkZXIgfQotICAg
ICAgICAsIG1fZm9ybURhdGFTdHJlYW0geyBsb2FkZXIgfQotI2VuZGlmCiAjaWYgVVNFKFNPVVAp
CiAgICAgICAgICwgbV90aW1lb3V0U291cmNlKFJ1bkxvb3A6Om1haW4oKSwgbG9hZGVyLCAmUmVz
b3VyY2VIYW5kbGU6OnRpbWVvdXRGaXJlZCkKICNlbmRpZgpAQCAtMTQwLDQ5ICsxMzIsOCBAQCBw
dWJsaWM6CiAgICAgUmV0YWluUHRyPENGVVJMU3RvcmFnZVNlc3Npb25SZWY+IG1fc3RvcmFnZVNl
c3Npb247CiAjZW5kaWYKICNpZiBVU0UoQ1VSTCkKLSAgICBSZXNvdXJjZUhhbmRsZSogbV9oYW5k
bGU7Ci0gICAgQ3VybEhhbmRsZSBtX2N1cmxIYW5kbGU7Ci0KKyAgICBSZWZQdHI8UmVzb3VyY2VI
YW5kbGVDdXJsRGVsZWdhdGU+IG1fZGVsZWdhdGU7CiAgICAgUmVzb3VyY2VSZXNwb25zZSBtX3Jl
c3BvbnNlOwotICAgIGJvb2wgbV9jYW5jZWxsZWQgeyBmYWxzZSB9OwotICAgIHVuc2lnbmVkIHNo
b3J0IG1fYXV0aEZhaWx1cmVDb3VudCB7IDAgfTsKLQotICAgIEZvcm1EYXRhU3RyZWFtIG1fZm9y
bURhdGFTdHJlYW07Ci0gICAgdW5zaWduZWQgbV9zc2xFcnJvcnMgeyAwIH07Ci0gICAgVmVjdG9y
PGNoYXI+IG1fcG9zdEJ5dGVzOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPE11bHRpcGFydEhhbmRs
ZT4gbV9tdWx0aXBhcnRIYW5kbGU7Ci0gICAgYm9vbCBtX2FkZGVkQ2FjaGVWYWxpZGF0aW9uSGVh
ZGVycyB7IGZhbHNlIH07Ci0gICAgQ3VybEpvYlRpY2tldCBtX2pvYiB7IG51bGxwdHIgfTsKLQot
ICAgIFZlY3RvcjxjaGFyPiBtX3JlY2VpdmVkQnVmZmVyOwotICAgIExvY2sgbV9yZWNlaXZlZEJ1
ZmZlck11dGV4OwotCi0gICAgdm9pZCBpbml0aWFsaXplKCk7Ci0gICAgdm9pZCBhcHBseUF1dGhl
bnRpY2F0aW9uKCk7Ci0gICAgdm9pZCBzZXR1cFBPU1QoKTsKLSAgICB2b2lkIHNldHVwUFVUKCk7
Ci0gICAgdm9pZCBzZXR1cEZvcm1EYXRhKGJvb2wgaXNQb3N0UmVxdWVzdCk7Ci0KLSAgICB2b2lk
IGRpZEZpbmlzaCgpOwotICAgIHZvaWQgZGlkRmFpbCgpOwotCi0gICAgc2l6ZV90IHdpbGxQcmVw
YXJlU2VuZERhdGEoY2hhciogcHRyLCBzaXplX3QgYmxvY2tTaXplLCBzaXplX3QgbnVtYmVyT2ZC
bG9ja3MpOwotICAgIHZvaWQgZGlkUmVjZWl2ZUhlYWRlckxpbmUoY29uc3QgU3RyaW5nJiBoZWFk
ZXIpOwotICAgIHZvaWQgZGlkUmVjZWl2ZUFsbEhlYWRlcnMobG9uZyBodHRwQ29kZSwgbG9uZyBs
b25nIGNvbnRlbnRMZW5ndGgpOwotICAgIHZvaWQgZGlkUmVjZWl2ZUNvbnRlbnREYXRhKCk7Ci0K
LSAgICB2b2lkIGhhbmRsZUxvY2FsUmVjZWl2ZVJlc3BvbnNlKCk7Ci0KLSAgICBzdGF0aWMgc2l6
ZV90IHJlYWRDYWxsYmFjayhjaGFyKiBwdHIsIHNpemVfdCBibG9ja1NpemUsIHNpemVfdCBudW1i
ZXJPZkJsb2Nrcywgdm9pZCogZGF0YSk7Ci0gICAgc3RhdGljIHNpemVfdCBoZWFkZXJDYWxsYmFj
ayhjaGFyKiBwdHIsIHNpemVfdCBibG9ja1NpemUsIHNpemVfdCBudW1iZXJPZkJsb2Nrcywgdm9p
ZCogZGF0YSk7Ci0gICAgc3RhdGljIHNpemVfdCB3cml0ZUNhbGxiYWNrKGNoYXIqIHB0ciwgc2l6
ZV90IGJsb2NrU2l6ZSwgc2l6ZV90IG51bWJlck9mQmxvY2tzLCB2b2lkKiBkYXRhKTsKLQotICAg
IHZvaWQgZGlzcGF0Y2hTeW5jaHJvbm91c0pvYigpOwotICAgIHZvaWQgaGFuZGxlRGF0YVVSTCgp
OwotCi0gICAgdm9pZCBjYWxjdWxhdGVXZWJUaW1pbmdJbmZvcm1hdGlvbnMoKTsKLQogI2VuZGlm
CiAKICNpZiBVU0UoU09VUCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y3VybC9DdXJsQ2FjaGVNYW5hZ2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENhY2hlTWFuYWdlci5jcHAJKHJldmlzaW9uIDIyMDg5
NykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ2FjaGVNYW5h
Z2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTk5LDcgKzE5OSw3IEBAIHZvaWQgQ3VybENhY2hl
TWFuYWdlcjo6ZGlkUmVjZWl2ZVJlc3BvbnMKICAgICAgICAgcmV0dXJuOwogCiAgICAgUmVzb3Vy
Y2VIYW5kbGVJbnRlcm5hbCogZCA9IGpvYi5nZXRJbnRlcm5hbCgpOwotICAgIGlmIChkLT5tX2Nh
bmNlbGxlZCkKKyAgICBpZiAoIWQtPm1fZGVsZWdhdGUtPmhhc0hhbmRsZSgpKQogICAgICAgICBy
ZXR1cm47CiAKICAgICBjb25zdCBTdHJpbmcmIHVybCA9IGpvYi5maXJzdFJlcXVlc3QoKS51cmwo
KS5zdHJpbmcoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9D
dXJsRG93bmxvYWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9DdXJsRG93bmxvYWQuY3BwCShyZXZpc2lvbiAyMjA4OTcpCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybERvd25sb2FkLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNTgsMTAgKzU4LDggQEAgdm9pZCBDdXJsRG93bmxvYWQ6OmluaXQoQ3VybERvd25s
b2FkTGlzdAogCiAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9tdXRleCk7CiAKLSAgICBzZXR1cFJl
cXVlc3QoKTsKLQogICAgIG1fbGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICBtX3VybCA9IHVybDsK
KyAgICBtX3VybCA9IHVybC5pc29sYXRlZENvcHkoKTsKIH0KIAogdm9pZCBDdXJsRG93bmxvYWQ6
OmluaXQoQ3VybERvd25sb2FkTGlzdGVuZXIqIGxpc3RlbmVyLCBSZXNvdXJjZUhhbmRsZSosIGNv
bnN0IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgY29uc3QgUmVzb3VyY2VSZXNwb25zZSYpCkBA
IC03OCwyNiArNzYsMTUgQEAgdm9pZCBDdXJsRG93bmxvYWQ6OmluaXQoQ3VybERvd25sb2FkTGlz
dAogCiBib29sIEN1cmxEb3dubG9hZDo6c3RhcnQoKQogewotICAgIG1fam9iID0gQ3VybEpvYk1h
bmFnZXI6OnNpbmdsZXRvbigpLmFkZChtX2N1cmxIYW5kbGUsIFt0aGlzLCBwcm90ZWN0ZWRUaGlz
ID0gbWFrZVJlZigqdGhpcyldKEN1cmxKb2JSZXN1bHQgcmVzdWx0KSBtdXRhYmxlIHsKLSAgICAg
ICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBDdXJsSm9iUmVzdWx0OjpEb25lOgot
ICAgICAgICAgICAgZGlkRmluaXNoKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBj
YXNlIEN1cmxKb2JSZXN1bHQ6OkVycm9yOgotICAgICAgICAgICAgZGlkRmFpbCgpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDdXJsSm9iUmVzdWx0OjpDYW5jZWxsZWQ6Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0pOwotICAgIHJldHVybiB0cnVlOwor
ICAgIG1fam9iID0gQ3VybEpvYk1hbmFnZXI6OnNpbmdsZXRvbigpLmFkZChtX2N1cmxIYW5kbGUs
ICp0aGlzKTsKKyAgICByZXR1cm4gISFtX2pvYjsKIH0KIAogYm9vbCBDdXJsRG93bmxvYWQ6OmNh
bmNlbCgpCiB7Ci0gICAgQ3VybEpvYk1hbmFnZXI6OnNpbmdsZXRvbigpLmNhbmNlbChtX2pvYik7
CisgICAgQ3VybEpvYlRpY2tldCBqb2IgPSBtX2pvYjsKKyAgICBtX2pvYiA9IG51bGxwdHI7Cisg
ICAgQ3VybEpvYk1hbmFnZXI6OnNpbmdsZXRvbigpLmNhbmNlbChqb2IpOwogICAgIHJldHVybiB0
cnVlOwogfQogCkBAIC0xMDksNiArOTYsMTYgQEAgUmVzb3VyY2VSZXNwb25zZSBDdXJsRG93bmxv
YWQ6OmdldFJlc3BvbgogICAgIHJldHVybiByZXNwb25zZTsKIH0KIAordm9pZCBDdXJsRG93bmxv
YWQ6OnJldGFpbigpCit7CisgICAgcmVmKCk7Cit9CisKK3ZvaWQgQ3VybERvd25sb2FkOjpyZWxl
YXNlKCkKK3sKKyAgICBkZXJlZigpOworfQorCiB2b2lkIEN1cmxEb3dubG9hZDo6c2V0dXBSZXF1
ZXN0KCkKIHsKICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX211dGV4KTsKQEAgLTEyNSw2ICsxMjIs
MjQgQEAgdm9pZCBDdXJsRG93bmxvYWQ6OnNldHVwUmVxdWVzdCgpCiAgICAgbV9jdXJsSGFuZGxl
LmVuYWJsZUNBSW5mb0lmRXhpc3RzKCk7CiB9CiAKK3ZvaWQgQ3VybERvd25sb2FkOjpub3RpZnlG
aW5pc2goKQoreworICAgIGNhbGxPbk1haW5UaHJlYWQoW3Byb3RlY3RlZFRoaXMgPSBtYWtlUmVm
KCp0aGlzKV0geworICAgICAgICBpZiAoIXByb3RlY3RlZFRoaXMtPm1fam9iKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICBwcm90ZWN0ZWRUaGlzLT5kaWRGaW5pc2goKTsKKyAgICB9KTsK
K30KKwordm9pZCBDdXJsRG93bmxvYWQ6Om5vdGlmeUZhaWwoKQoreworICAgIGNhbGxPbk1haW5U
aHJlYWQoW3Byb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKV0geworICAgICAgICBpZiAoIXBy
b3RlY3RlZFRoaXMtPm1fam9iKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBwcm90ZWN0
ZWRUaGlzLT5kaWRGYWlsKCk7CisgICAgfSk7Cit9CisKIHZvaWQgQ3VybERvd25sb2FkOjpjbG9z
ZUZpbGUoKQogewogICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fbXV0ZXgpOwpJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxEb3dubG9hZC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsRG93bmxvYWQuaAko
cmV2aXNpb24gMjIwODk3KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJs
L0N1cmxEb3dubG9hZC5oCSh3b3JraW5nIGNvcHkpCkBAIC00NCw3ICs0NCw3IEBAIHB1YmxpYzoK
ICAgICB2aXJ0dWFsIHZvaWQgZGlkRmFpbCgpIHsgfQogfTsKIAotY2xhc3MgQ3VybERvd25sb2Fk
IDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPEN1cmxEb3dubG9hZD4geworY2xhc3MgQ3Vy
bERvd25sb2FkIDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPEN1cmxEb3dubG9hZD4sIHB1
YmxpYyBDdXJsSm9iQ2xpZW50IHsKIHB1YmxpYzoKICAgICBDdXJsRG93bmxvYWQoKTsKICAgICB+
Q3VybERvd25sb2FkKCk7CkBAIC02NSw3ICs2NSwxMiBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRE
ZXN0aW5hdGlvbihjb25zdCBTdHJpbmcmIGRlc3RpbmF0aW9uKSB7IG1fZGVzdGluYXRpb24gPSBk
ZXN0aW5hdGlvbjsgfQogCiBwcml2YXRlOgotICAgIHZvaWQgc2V0dXBSZXF1ZXN0KCk7CisgICAg
dm9pZCByZXRhaW4oKSBvdmVycmlkZTsKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZTsKKwor
ICAgIHZvaWQgc2V0dXBSZXF1ZXN0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBub3RpZnlGaW5pc2go
KSBvdmVycmlkZTsKKyAgICB2b2lkIG5vdGlmeUZhaWwoKSBvdmVycmlkZTsKIAogICAgIHZvaWQg
Y2xvc2VGaWxlKCk7CiAgICAgdm9pZCBtb3ZlRmlsZVRvRGVzdGluYXRpb24oKTsKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsSm9iTWFuYWdlci5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxKb2JN
YW5hZ2VyLmNwcAkocmV2aXNpb24gMjIwODk3KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9jdXJsL0N1cmxKb2JNYW5hZ2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsx
LDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAxNyBTb255IEludGVyYWN0aXZlIEVudGVydGFp
bm1lbnQgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE3IE5BVkVSIENvcnAuCiAgKgogICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI1LDEwICsyNiwxMSBAQAogICovCiAKICNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJDdXJsSm9iTWFuYWdlci5oIgogCiAjaWYgVVNFKENVUkwp
Ci0jaW5jbHVkZSAiQ3VybEpvYk1hbmFnZXIuaCIKIAorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxl
Q3VybERlbGVnYXRlLmgiCiAjaW5jbHVkZSA8aXRlcmF0b3I+CiAjaW5jbHVkZSA8d3RmL01haW5U
aHJlYWQuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CkBAIC0zNyw4OCArMzksNzEg
QEAgdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorZW51
bSBjbGFzcyBDdXJsSm9iUmVzdWx0IHsgRG9uZSwgRXJyb3IsIENhbmNlbGxlZCB9OworCiAvKgog
ICogQ3VybEpvYkxpc3QgaXMgdXNlZCBvbmx5IGluIGJhY2tncm91bmQgc28gdGhhdCBubyBuZWVk
IHRvIG1hbmFnZSBtdXRleAogICovCiBjbGFzcyBDdXJsSm9iTGlzdCA6IHB1YmxpYyBDdXJsTXVs
dGlIYW5kbGUgewotICAgIHVzaW5nIFByZWRpY2F0ZSA9IFdURjo6RnVuY3Rpb248Ym9vbChjb25z
dCBDdXJsSm9iJik+OwotICAgIHVzaW5nIEFjdGlvbiA9IFdURjo6RnVuY3Rpb248dm9pZChDdXJs
Sm9iJik+OwotICAgIHVzaW5nIEpvYk1hcCA9IEhhc2hNYXA8Q3VybEpvYlRpY2tldCwgQ3VybEpv
Yj47Ci0KIHB1YmxpYzoKLSAgICB2b2lkIGFwcGVuZChDdXJsSm9iJiBqb2IpCi0gICAgewotICAg
ICAgICBDdXJsSGFuZGxlKiBjdXJsID0gam9iLmN1cmxIYW5kbGUoKTsKKyAgICBib29sIGlzRW1w
dHkoKSBjb25zdCB7IHJldHVybiBtX2FjdGl2ZUpvYnMuaXNFbXB0eSgpOyB9CiAKLSAgICAgICAg
Q1VSTE1jb2RlIHJldHZhbCA9IGFkZEhhbmRsZShjdXJsLT5oYW5kbGUoKSk7Ci0gICAgICAgICAg
ICAvLyBARklYTUUgZXJyb3IgbG9nZ2luZwotICAgICAgICBpZiAocmV0dmFsID09IENVUkxNX09L
KQotICAgICAgICAgICAgbV9qb2JzLnNldChqb2IudGlja2V0KCksIFdURk1vdmUoam9iKSk7Ci0g
ICAgfQotCi0gICAgdm9pZCBjYW5jZWwoQ3VybEpvYlRpY2tldCB0aWNrZXQpCisgICAgdm9pZCBz
dGFydEpvYnMoSGFzaE1hcDxDdXJsSm9iVGlja2V0LCBDdXJsSm9iQ2xpZW50Kj4mJiBqb2JzKQog
ICAgIHsKLSAgICAgICAgY29tcGxldGUodGlja2V0LCBbXShhdXRvJiYgam9iKSB7IGpvYi5jYW5j
ZWwoKTsgfSk7CisgICAgICAgIGF1dG8gbG9jYWxKb2JzID0gV1RGTW92ZShqb2JzKTsKKyAgICAg
ICAgZm9yIChhdXRvJiBqb2IgOiBsb2NhbEpvYnMpIHsKKyAgICAgICAgICAgIGpvYi52YWx1ZS0+
c2V0dXBSZXF1ZXN0KCk7CisgICAgICAgICAgICBtX2FjdGl2ZUpvYnMuYWRkKGpvYi5rZXksIGpv
Yi52YWx1ZSk7CisgICAgICAgICAgICBhZGRIYW5kbGUoam9iLmtleSk7CisgICAgICAgIH0KICAg
ICB9CiAKLSAgICB2b2lkIGNvbXBsZXRlKEN1cmxKb2JUaWNrZXQgdGlja2V0LCBBY3Rpb24gYWN0
aW9uKQorICAgIHZvaWQgZmluaXNoSm9icyhIYXNoU2V0PEN1cmxKb2JUaWNrZXQ+JiYgdGlja2V0
cywgQ3VybEpvYlJlc3VsdCByZXN1bHQpCiAgICAgewotICAgICAgICBhdXRvIGZvdW5kID0gbV9q
b2JzLmZpbmQodGlja2V0KTsKLSAgICAgICAgaWYgKGZvdW5kICE9IG1fam9icy5lbmQoKSkgewot
ICAgICAgICAgICAgYXV0byBqb2IgPSBXVEZNb3ZlKGZvdW5kLT52YWx1ZSk7Ci0KLSAgICAgICAg
ICAgIHJlbW92ZUhhbmRsZShqb2IuY3VybEhhbmRsZSgpLT5oYW5kbGUoKSk7Ci0gICAgICAgICAg
ICBhY3Rpb24oam9iKTsKLQotICAgICAgICAgICAgbV9qb2JzLnJlbW92ZShmb3VuZCk7CisgICAg
ICAgIGF1dG8gbG9jYWxUaWNrZXRzID0gV1RGTW92ZSh0aWNrZXRzKTsKKyAgICAgICAgZm9yIChh
dXRvJiB0aWNrZXQgOiBsb2NhbFRpY2tldHMpIHsKKyAgICAgICAgICAgIGlmICghbV9hY3RpdmVK
b2JzLmNvbnRhaW5zKHRpY2tldCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICByZW1vdmVIYW5kbGUodGlja2V0KTsKKyAgICAgICAgICAgIG5vdGlmeVJlc3VsdChtX2Fj
dGl2ZUpvYnMuZmFzdEdldCh0aWNrZXQpLCByZXN1bHQpOworICAgICAgICAgICAgbV9hY3RpdmVK
b2JzLnJlbW92ZSh0aWNrZXQpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgYm9vbCBpc0VtcHR5
KCkgY29uc3QgeyByZXR1cm4gbV9qb2JzLmlzRW1wdHkoKTsgfQotCi0gICAgYm9vbCB3aXRoSm9i
KEN1cmxKb2JUaWNrZXQgdGlja2V0LCBXVEY6OkZ1bmN0aW9uPHZvaWQoSm9iTWFwOjppdGVyYXRv
cik+IGNhbGxiYWNrKQorcHJpdmF0ZToKKyAgICB2b2lkIG5vdGlmeVJlc3VsdChDdXJsSm9iQ2xp
ZW50KiBjbGllbnQsIEN1cmxKb2JSZXN1bHQgcmVzdWx0KQogICAgIHsKLSAgICAgICAgYXV0byBm
b3VuZCA9IG1fam9icy5maW5kKHRpY2tldCk7Ci0gICAgICAgIGlmIChmb3VuZCA9PSBtX2pvYnMu
ZW5kKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIAotICAgICAgICBjYWxs
YmFjayhmb3VuZCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KKyAgICAgICAgc3dpdGNo
IChyZXN1bHQpIHsKKyAgICAgICAgY2FzZSBDdXJsSm9iUmVzdWx0OjpEb25lOgorICAgICAgICAg
ICAgY2xpZW50LT5ub3RpZnlGaW5pc2goKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEN1cmxKb2JSZXN1bHQ6OkVycm9yOgorICAgICAgICAgICAgY2xpZW50LT5ub3RpZnlGYWls
KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDdXJsSm9iUmVzdWx0OjpDYW5j
ZWxsZWQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICB9CiAKLSAgICBib29sIHdpdGhDdXJsSGFu
ZGxlKEN1cmxKb2JUaWNrZXQgdGlja2V0LCBXVEY6OkZ1bmN0aW9uPHZvaWQoQ3VybEhhbmRsZSYp
PiBjYWxsYmFjaykKLSAgICB7Ci0gICAgICAgIHJldHVybiB3aXRoSm9iKHRpY2tldCwgWyZjYWxs
YmFja10oSm9iTWFwOjppdGVyYXRvciBpdCkgewotICAgICAgICAgICAgY2FsbGJhY2soKml0LT52
YWx1ZS5jdXJsSGFuZGxlKCkpOwotICAgICAgICB9KTsKKyAgICAgICAgY2xpZW50LT5yZWxlYXNl
KCk7CiAgICAgfQogCi1wcml2YXRlOgotICAgIEpvYk1hcCBtX2pvYnM7CisgICAgSGFzaE1hcDxD
dXJsSm9iVGlja2V0LCBDdXJsSm9iQ2xpZW50Kj4gbV9hY3RpdmVKb2JzOwogfTsKIAotdm9pZCBD
dXJsSm9iOjppbnZva2UoQ3VybEpvYlJlc3VsdCByZXN1bHQpCi17Ci0gICAgY2FsbE9uTWFpblRo
cmVhZChbam9iID0gV1RGTW92ZShtX2pvYiksIHJlc3VsdF0gewotICAgICAgICBqb2IocmVzdWx0
KTsKLSAgICB9KTsKLX0KLQotQ3VybEpvYlRpY2tldCBDdXJsSm9iTWFuYWdlcjo6YWRkKEN1cmxI
YW5kbGUmIGN1cmwsIENhbGxiYWNrIGNhbGxiYWNrKQorQ3VybEpvYlRpY2tldCBDdXJsSm9iTWFu
YWdlcjo6YWRkKEN1cmxIYW5kbGUmIGN1cmwsIEN1cmxKb2JDbGllbnQmIGNsaWVudCkKIHsKICAg
ICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwogCisgICAgY2xpZW50LnJldGFpbigpOworCiAgICAg
Q3VybEpvYlRpY2tldCB0aWNrZXQgPSBzdGF0aWNfY2FzdDxDdXJsSm9iVGlja2V0PihjdXJsLmhh
bmRsZSgpKTsKIAogICAgIHsKICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9tdXRleCk7Ci0K
LSAgICAgICAgaWYgKGlzQWN0aXZlSm9iKHRpY2tldCkpCi0gICAgICAgICAgICByZXR1cm4gdGlj
a2V0OwotCi0KLSAgICAgICAgbV9wZW5kaW5nSm9icy5hcHBlbmQoQ3VybEpvYiB7ICZjdXJsLCBX
VEZNb3ZlKGNhbGxiYWNrKSB9KTsKLSAgICAgICAgbV9hY3RpdmVKb2JzLmFkZCh0aWNrZXQpOwor
ICAgICAgICBtX2NhbmNlbGxlZFRpY2tldHMucmVtb3ZlKHRpY2tldCk7CisgICAgICAgIG1fcGVu
ZGluZ0pvYnMuYWRkKHRpY2tldCwgJmNsaWVudCk7CiAgICAgfQogCiAgICAgc3RhcnRUaHJlYWRJ
Zk5lZWRlZCgpOwpAQCAtMTI2LDI4ICsxMTEsMTggQEAgQ3VybEpvYlRpY2tldCBDdXJsSm9iTWFu
YWdlcjo6YWRkKEN1cmxIYQogICAgIHJldHVybiB0aWNrZXQ7CiB9CiAKLWJvb2wgQ3VybEpvYk1h
bmFnZXI6OmNhbmNlbChDdXJsSm9iVGlja2V0IGpvYikKK3ZvaWQgQ3VybEpvYk1hbmFnZXI6OmNh
bmNlbChDdXJsSm9iVGlja2V0IGpvYikKIHsKICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwog
Ci0gICAgaWYgKG1fcnVuVGhyZWFkKSB7Ci0gICAgICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fbXV0
ZXgpOwotCi0gICAgICAgIGlmICghaXNBY3RpdmVKb2Ioam9iKSkKLSAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAgICAgCi0gICAgICAgIG1fY2FuY2VsbGVkVGlja2V0cy5hcHBlbmQoam9i
KTsKLSAgICAgICAgbV9hY3RpdmVKb2JzLnJlbW92ZShqb2IpOwotICAgIH0KLQotICAgIHJldHVy
biB0cnVlOworICAgIExvY2tIb2xkZXIgbG9ja2VyKG1fbXV0ZXgpOworICAgIG1fY2FuY2VsbGVk
VGlja2V0cy5hZGQoam9iKTsKIH0KIAotdm9pZCBDdXJsSm9iTWFuYWdlcjo6Y2FsbE9uSm9iVGhy
ZWFkKFdURjo6RnVuY3Rpb248dm9pZCgpPiYmIGNhbGxiYWNrKQordm9pZCBDdXJsSm9iTWFuYWdl
cjo6Y2FsbE9uSm9iVGhyZWFkKFdURjo6RnVuY3Rpb248dm9pZCgpPiYmIHRhc2spCiB7Ci0gICAg
TG9ja0hvbGRlciBsb2NrZXIgeyBtX211dGV4IH07Ci0KLSAgICBtX3Rhc2tRdWV1ZS5hcHBlbmQo
c3RkOjptYWtlX3VuaXF1ZTxXVEY6OkZ1bmN0aW9uPHZvaWQoKT4+KFdURk1vdmUoY2FsbGJhY2sp
KSk7CisgICAgTG9ja0hvbGRlciBsb2NrZXIobV9tdXRleCk7CisgICAgbV90YXNrUXVldWUuYXBw
ZW5kKFdURk1vdmUodGFzaykpOwogfQogCiB2b2lkIEN1cmxKb2JNYW5hZ2VyOjpzdGFydFRocmVh
ZElmTmVlZGVkKCkKQEAgLTE2Miw2ICsxMzcsNyBAQCB2b2lkIEN1cmxKb2JNYW5hZ2VyOjpzdGFy
dFRocmVhZElmTmVlZGVkCiAgICAgICAgIG1fcnVuVGhyZWFkID0gdHJ1ZTsKICAgICAgICAgbV90
aHJlYWQgPSBUaHJlYWQ6OmNyZWF0ZSgiY3VybFRocmVhZCIsIFt0aGlzXSB7CiAgICAgICAgICAg
ICB3b3JrZXJUaHJlYWQoKTsKKyAgICAgICAgICAgIG1fcnVuVGhyZWFkID0gZmFsc2U7CiAgICAg
ICAgIH0pOwogICAgIH0KIH0KQEAgLTE4NiwzMiArMTYyLDI5IEBAIHZvaWQgQ3VybEpvYk1hbmFn
ZXI6OnN0b3BUaHJlYWQoKQogICAgIH0KIH0KIAotYm9vbCBDdXJsSm9iTWFuYWdlcjo6dXBkYXRl
Sm9icyhDdXJsSm9iTGlzdCYgam9icykKK3ZvaWQgQ3VybEpvYk1hbmFnZXI6OnVwZGF0ZUpvYkxp
c3QoQ3VybEpvYkxpc3QmIGpvYnMpCiB7CiAgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CiAK
LSAgICBWZWN0b3I8Q3VybEpvYj4gcGVuZGluZ0pvYnM7Ci0gICAgVmVjdG9yPEN1cmxKb2JUaWNr
ZXQ+IGNhbmNlbGxlZFRpY2tldHM7CisgICAgSGFzaE1hcDxDdXJsSm9iVGlja2V0LCBDdXJsSm9i
Q2xpZW50Kj4gcGVuZGluZ0pvYnM7CisgICAgSGFzaFNldDxDdXJsSm9iVGlja2V0PiBjYW5jZWxs
ZWRUaWNrZXRzOworICAgIFZlY3RvcjxXVEY6OkZ1bmN0aW9uPHZvaWQoKT4+IHRhc2tRdWV1ZTsK
KwogICAgIHsKICAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9tdXRleCk7Ci0gICAgICAgIGlm
ICghbV9ydW5UaHJlYWQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgcGVu
ZGluZ0pvYnMgPSBXVEZNb3ZlKG1fcGVuZGluZ0pvYnMpOwogICAgICAgICBjYW5jZWxsZWRUaWNr
ZXRzID0gV1RGTW92ZShtX2NhbmNlbGxlZFRpY2tldHMpOworICAgICAgICB0YXNrUXVldWUgPSBX
VEZNb3ZlKG1fdGFza1F1ZXVlKTsKICAgICB9CiAKLSAgICBmb3IgKGF1dG8mIGpvYiA6IHBlbmRp
bmdKb2JzKQotICAgICAgICBqb2JzLmFwcGVuZChqb2IpOworICAgIGpvYnMuc3RhcnRKb2JzKFdU
Rk1vdmUocGVuZGluZ0pvYnMpKTsKKyAgICBqb2JzLmZpbmlzaEpvYnMoV1RGTW92ZShjYW5jZWxs
ZWRUaWNrZXRzKSwgQ3VybEpvYlJlc3VsdDo6Q2FuY2VsbGVkKTsKKyAgICBqb2JzLmZpbmlzaEpv
YnMoV1RGTW92ZShtX2ZpbmlzaGVkVGlja2V0cyksIEN1cmxKb2JSZXN1bHQ6OkRvbmUpOworICAg
IGpvYnMuZmluaXNoSm9icyhXVEZNb3ZlKG1fZmFpbGVkVGlja2V0cyksIEN1cmxKb2JSZXN1bHQ6
OkVycm9yKTsKIAotICAgIGZvciAoYXV0byYgdGlja2V0IDogY2FuY2VsbGVkVGlja2V0cykKLSAg
ICAgICAgam9icy5jYW5jZWwodGlja2V0KTsKLQotICAgIGZvciAoYXV0byYgY2FsbGJhY2sgOiBt
X3Rhc2tRdWV1ZS50YWtlQWxsTWVzc2FnZXMoKSkgewotICAgICAgICAoKmNhbGxiYWNrKSgpOwot
ICAgIH0KLQotICAgIHJldHVybiB0cnVlOworICAgIGZvciAoYXV0byYgdGFzayA6IHRhc2tRdWV1
ZSkKKyAgICAgICAgdGFzaygpOwogfQogCiB2b2lkIEN1cmxKb2JNYW5hZ2VyOjp3b3JrZXJUaHJl
YWQoKQpAQCAtMjIwLDcgKzE5Myw5IEBAIHZvaWQgQ3VybEpvYk1hbmFnZXI6OndvcmtlclRocmVh
ZCgpCiAKICAgICBDdXJsSm9iTGlzdCBqb2JzOwogCi0gICAgd2hpbGUgKHVwZGF0ZUpvYnMoam9i
cykpIHsKKyAgICB3aGlsZSAobV9ydW5UaHJlYWQpIHsKKyAgICAgICAgdXBkYXRlSm9iTGlzdChq
b2JzKTsKKwogICAgICAgICAvLyBSZXRyeSAnc2VsZWN0JyBpZiBpdCB3YXMgaW50ZXJydXB0ZWQg
YnkgYSBwcm9jZXNzIHNpZ25hbC4KICAgICAgICAgaW50IHJjID0gMDsKICAgICAgICAgZG8gewpA
QCAtMjU1LDM4ICsyMzAsMTYgQEAgdm9pZCBDdXJsSm9iTWFuYWdlcjo6d29ya2VyVGhyZWFkKCkK
ICAgICAgICAgICAgIGlmICghbXNnKQogICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAg
ICAgICBpZiAobXNnLT5tc2cgPT0gQ1VSTE1TR19ET05FKSB7Ci0gICAgICAgICAgICAgICAgYXV0
byB0aWNrZXQgPSBzdGF0aWNfY2FzdDxDdXJsSm9iVGlja2V0Pihtc2ctPmVhc3lfaGFuZGxlKTsK
LSAgICAgICAgICAgICAgICBDVVJMY29kZSByZXN1bHQgPSBtc2ctPmRhdGEucmVzdWx0OwotCi0g
ICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBMb2NrSG9sZGVyIGxvY2tlciht
X211dGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbV9hY3RpdmVKb2JzLnJlbW92ZSh0aWNrZXQp
OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGpvYnMuY29tcGxldGUodGlj
a2V0LCBbcmVzdWx0XShhdXRvJiBqb2IpIHsKLSAgICAgICAgICAgICAgICAgICAgam9iLmN1cmxI
YW5kbGUoKS0+c2V0RXJyb3JDb2RlKHJlc3VsdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYm9v
bCBkb25lID0gcmVzdWx0ID09IENVUkxFX09LOwotICAgICAgICAgICAgICAgICAgICBpZiAoZG9u
ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGpvYi5maW5pc2hlZCgpOwotICAgICAgICAgICAg
ICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBqb2IuY3Vy
bEhhbmRsZSgpLT5nZXRFZmZlY3RpdmVVUkwoKTsKLSNpZm5kZWYgTkRFQlVHCi0gICAgICAgICAg
ICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkN1cmwgRVJST1IgZm9yIHVybD0nJXMnLCBl
cnJvcjogJyVzJ1xuIiwgdXJsLnN0cmluZygpLnV0ZjgoKS5kYXRhKCksIGpvYi5jdXJsSGFuZGxl
KCktPmVycm9yRGVzY3JpcHRpb24oKS51dGY4KCkuZGF0YSgpKTsKLSNlbmRpZgotICAgICAgICAg
ICAgICAgICAgICAgICAgam9iLmVycm9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgQVNTRVJUKG1zZy0+bXNnID09IENVUkxNU0df
RE9ORSk7CisgICAgICAgICAgICBhdXRvIHRpY2tldCA9IHN0YXRpY19jYXN0PEN1cmxKb2JUaWNr
ZXQ+KG1zZy0+ZWFzeV9oYW5kbGUpOworICAgICAgICAgICAgaWYgKG1zZy0+ZGF0YS5yZXN1bHQg
PT0gQ1VSTEVfT0spCisgICAgICAgICAgICAgICAgbV9maW5pc2hlZFRpY2tldHMuYWRkKHRpY2tl
dCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9mYWlsZWRUaWNrZXRzLmFk
ZCh0aWNrZXQpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGpvYnMuaXNFbXB0eSgpKSB7Cisg
ICAgICAgIGlmIChqb2JzLmlzRW1wdHkoKSkKICAgICAgICAgICAgIHN0b3BUaHJlYWRJZk5vTW9y
ZUpvYlJ1bm5pbmcoKTsKLSAgICAgICAgICAgIGlmICghbV9ydW5UaHJlYWQpCi0gICAgICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIH0KICAgICB9CiB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsSm9iTWFuYWdlci5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsSm9iTWFuYWdlci5oCShyZXZp
c2lvbiAyMjA4OTcpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3Vy
bEpvYk1hbmFnZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5
cmlnaHQgKEMpIDIwMTMgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHly
aWdodCAoQykgMjAxNyBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IE5BVkVSIENvcnAuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKQEAgLTI3LDc0ICsyOCwzMCBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlICJDdXJsQ29u
dGV4dC5oIgotCi0jaW5jbHVkZSA8d3RmL0Z1bmN0aW9uLmg+CiAjaW5jbHVkZSA8d3RmL0hhc2hN
YXAuaD4KICNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgogI2luY2x1ZGUgPHd0Zi9Mb2NrLmg+Ci0j
aW5jbHVkZSA8d3RmL01lc3NhZ2VRdWV1ZS5oPgogI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5o
PgogI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KLSNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+Ci0K
LSNpZiBPUyhXSU5ET1dTKQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDx3aW5zb2Nr
Mi5oPgotI2VuZGlmCi0KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1lbnVtIGNsYXNzIEN1cmxK
b2JSZXN1bHQgeyBEb25lLCBFcnJvciwgQ2FuY2VsbGVkIH07Ci11c2luZyBDdXJsSm9iVGlja2V0
ID0gdm9pZCo7Ci11c2luZyBDdXJsSm9iQ2FsbGJhY2sgPSBXVEY6OkZ1bmN0aW9uPHZvaWQoQ3Vy
bEpvYlJlc3VsdCk+OwotdXNpbmcgQ3VybEpvYlRhc2sgPSBXVEY6OkZ1bmN0aW9uPHZvaWQoQ3Vy
bEhhbmRsZSYpPjsKLQogY2xhc3MgQ3VybEpvYkxpc3Q7Cit1c2luZyBDdXJsSm9iVGlja2V0ID0g
dm9pZCo7CiAKLWNsYXNzIEN1cmxKb2IgewotICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxK
b2IpOworY2xhc3MgQ3VybEpvYkNsaWVudCB7CiBwdWJsaWM6Ci0gICAgQ3VybEpvYigpIHsgfQot
ICAgIEN1cmxKb2IoQ3VybEhhbmRsZSogY3VybCwgQ3VybEpvYkNhbGxiYWNrIGpvYikKLSAgICAg
ICAgOiBtX2N1cmwgeyBjdXJsIH0sIG1fam9iIHsgV1RGTW92ZShqb2IpIH0geyB9Ci0gICAgQ3Vy
bEpvYihDdXJsSm9iJiYgb3RoZXIpCi0gICAgewotICAgICAgICBtX2N1cmwgPSBvdGhlci5tX2N1
cmw7Ci0gICAgICAgIG90aGVyLm1fY3VybCA9IG51bGxwdHI7Ci0gICAgICAgIG1fam9iID0gV1RG
TW92ZShvdGhlci5tX2pvYik7Ci0gICAgfQotICAgIH5DdXJsSm9iKCkgeyB9CisgICAgdmlydHVh
bCB2b2lkIHJldGFpbigpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKIAot
ICAgIEN1cmxKb2ImIG9wZXJhdG9yPShDdXJsSm9iJiYgb3RoZXIpCi0gICAgewotICAgICAgICBt
X2N1cmwgPSBvdGhlci5tX2N1cmw7Ci0gICAgICAgIG90aGVyLm1fY3VybCA9IG51bGxwdHI7Ci0g
ICAgICAgIG1fam9iID0gV1RGTW92ZShvdGhlci5tX2pvYik7Ci0gICAgICAgIHJldHVybiAqdGhp
czsKLSAgICB9Ci0KLSAgICBDdXJsSGFuZGxlKiBjdXJsSGFuZGxlKCkgY29uc3QgeyByZXR1cm4g
bV9jdXJsOyB9Ci0gICAgQ3VybEpvYlRpY2tldCB0aWNrZXQoKSBjb25zdCB7IHJldHVybiBzdGF0
aWNfY2FzdDxDdXJsSm9iVGlja2V0PihtX2N1cmwtPmhhbmRsZSgpKTsgfQotCi0gICAgdm9pZCBm
aW5pc2hlZCgpIHsgaW52b2tlKEN1cmxKb2JSZXN1bHQ6OkRvbmUpOyB9Ci0gICAgdm9pZCBlcnJv
cigpIHsgaW52b2tlKEN1cmxKb2JSZXN1bHQ6OkVycm9yKTsgfQotICAgIHZvaWQgY2FuY2VsKCkg
eyBpbnZva2UoQ3VybEpvYlJlc3VsdDo6Q2FuY2VsbGVkKTsgfQotCi1wcml2YXRlOgotICAgIEN1
cmxIYW5kbGUqIG1fY3VybDsKLSAgICBDdXJsSm9iQ2FsbGJhY2sgbV9qb2I7Ci0KLSAgICB2b2lk
IGludm9rZShDdXJsSm9iUmVzdWx0KTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0dXBSZXF1ZXN0KCkg
PSAwOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlGaW5pc2goKSA9IDA7CisgICAgdmlydHVhbCB2
b2lkIG5vdGlmeUZhaWwoKSA9IDA7CiB9OwogCi0KIGNsYXNzIEN1cmxKb2JNYW5hZ2VyIHsKICAg
ICBXVEZfTUFLRV9OT05DT1BZQUJMRShDdXJsSm9iTWFuYWdlcik7Ci0gICAgdXNpbmcgQ2FsbGJh
Y2sgPSBDdXJsSm9iQ2FsbGJhY2s7Ci0KIHB1YmxpYzoKLQogICAgIHN0YXRpYyBDdXJsSm9iTWFu
YWdlciYgc2luZ2xldG9uKCkKICAgICB7CiAgICAgICAgIHN0YXRpYyBDdXJsSm9iTWFuYWdlciBz
aGFyZWQ7CkBAIC0xMDQsOCArNjEsOSBAQCBwdWJsaWM6CiAgICAgQ3VybEpvYk1hbmFnZXIoKSA9
IGRlZmF1bHQ7CiAgICAgfkN1cmxKb2JNYW5hZ2VyKCkgeyBzdG9wVGhyZWFkKCk7IH0KIAotICAg
IEN1cmxKb2JUaWNrZXQgYWRkKEN1cmxIYW5kbGUmLCBDYWxsYmFjayk7Ci0gICAgYm9vbCBjYW5j
ZWwoQ3VybEpvYlRpY2tldCk7CisgICAgQ3VybEpvYlRpY2tldCBhZGQoQ3VybEhhbmRsZSYsIEN1
cmxKb2JDbGllbnQmKTsKKyAgICB2b2lkIGNhbmNlbChDdXJsSm9iVGlja2V0KTsKKwogICAgIHZv
aWQgY2FsbE9uSm9iVGhyZWFkKFdURjo6RnVuY3Rpb248dm9pZCgpPiYmKTsKIAogcHJpdmF0ZToK
QEAgLTExMywxOCArNzEsMTggQEAgcHJpdmF0ZToKICAgICB2b2lkIHN0b3BUaHJlYWRJZk5vTW9y
ZUpvYlJ1bm5pbmcoKTsKICAgICB2b2lkIHN0b3BUaHJlYWQoKTsKIAotICAgIGJvb2wgdXBkYXRl
Sm9icyhDdXJsSm9iTGlzdCYgam9icyk7Ci0gICAgYm9vbCBpc0FjdGl2ZUpvYihDdXJsSm9iVGlj
a2V0IGpvYikgY29uc3QgeyByZXR1cm4gbV9hY3RpdmVKb2JzLmNvbnRhaW5zKGpvYik7IH0KKyAg
ICB2b2lkIHVwZGF0ZUpvYkxpc3QoQ3VybEpvYkxpc3QmKTsKIAogICAgIHZvaWQgd29ya2VyVGhy
ZWFkKCk7CiAKICAgICBSZWZQdHI8VGhyZWFkPiBtX3RocmVhZDsKLSAgICBWZWN0b3I8Q3VybEpv
Yj4gbV9wZW5kaW5nSm9iczsKLSAgICBIYXNoU2V0PEN1cmxKb2JUaWNrZXQ+IG1fYWN0aXZlSm9i
czsKLSAgICBWZWN0b3I8Q3VybEpvYlRpY2tldD4gbV9jYW5jZWxsZWRUaWNrZXRzOwotICAgIE1l
c3NhZ2VRdWV1ZTxXVEY6OkZ1bmN0aW9uPHZvaWQoKT4+IG1fdGFza1F1ZXVlOworICAgIEhhc2hN
YXA8Q3VybEpvYlRpY2tldCwgQ3VybEpvYkNsaWVudCo+IG1fcGVuZGluZ0pvYnM7CisgICAgSGFz
aFNldDxDdXJsSm9iVGlja2V0PiBtX2NhbmNlbGxlZFRpY2tldHM7CisgICAgSGFzaFNldDxDdXJs
Sm9iVGlja2V0PiBtX2ZpbmlzaGVkVGlja2V0czsKKyAgICBIYXNoU2V0PEN1cmxKb2JUaWNrZXQ+
IG1fZmFpbGVkVGlja2V0czsKKyAgICBWZWN0b3I8V1RGOjpGdW5jdGlvbjx2b2lkKCk+PiBtX3Rh
c2tRdWV1ZTsKICAgICBtdXRhYmxlIExvY2sgbV9tdXRleDsKLSAgICBib29sIG1fcnVuVGhyZWFk
IHsgfTsKKyAgICBib29sIG1fcnVuVGhyZWFkIHsgZmFsc2UgfTsKIH07CiAKIH0KSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9NdWx0aXBhcnRIYW5kbGUuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9NdWx0aXBh
cnRIYW5kbGUuY3BwCShyZXZpc2lvbiAyMjA4OTcpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvTXVsdGlwYXJ0SGFuZGxlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIx
LDcgKzMyMSw3IEBAIHZvaWQgTXVsdGlwYXJ0SGFuZGxlOjpkaWRSZWNlaXZlRGF0YShzaXoKIHsK
ICAgICBSZXNvdXJjZUhhbmRsZUludGVybmFsKiBkID0gbV9yZXNvdXJjZUhhbmRsZS0+Z2V0SW50
ZXJuYWwoKTsKIAotICAgIGlmIChkLT5tX2NhbmNlbGxlZCkgeworICAgIGlmICghZC0+bV9kZWxl
Z2F0ZS0+aGFzSGFuZGxlKCkpIHsKICAgICAgICAgLy8gUmVxdWVzdCBoYXMgYmVlbiBjYW5jZWxl
ZCwgc28gd2UnbGwgZ28gdG8gdGhlIGVuZCBzdGF0ZS4KICAgICAgICAgbV9zdGF0ZSA9IEVuZDsK
ICAgICAgICAgcmV0dXJuOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9j
dXJsL1Jlc291cmNlSGFuZGxlQ3VybC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybC5jcHAJKHJldmlzaW9uIDIy
MDg5NykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhh
bmRsZUN1cmwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zLDYgKzMsNyBAQAogICogQ29weXJpZ2h0
IChDKSAyMDA1LCAyMDA2IE1pY2hhZWwgRW1tZWwgbWlrZS5lbW1lbEBnbWFpbC5jb20KICAqIENv
cHlyaWdodCAoQykgMjAxNyBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgogICog
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBOQVZFUiBDb3JwLgog
ICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC00OSw2ICs1MCw4IEBAIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAogUmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6flJlc291cmNlSGFuZGxlSW50
ZXJuYWwoKQogeworICAgIGlmIChtX2RlbGVnYXRlKQorICAgICAgICBtX2RlbGVnYXRlLT5yZWxl
YXNlSGFuZGxlKCk7CiB9CiAKIFJlc291cmNlSGFuZGxlOjp+UmVzb3VyY2VIYW5kbGUoKQpAQCAt
NTksNiArNjIsOCBAQCBib29sIFJlc291cmNlSGFuZGxlOjpzdGFydCgpCiB7CiAgICAgQVNTRVJU
KGlzTWFpblRocmVhZCgpKTsKIAorICAgIEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKTsKKwogICAg
IC8vIFRoZSBmcmFtZSBjb3VsZCBiZSBudWxsIGlmIHRoZSBSZXNvdXJjZUhhbmRsZSBpcyBub3Qg
YXNzb2NpYXRlZCB0byBhbnkKICAgICAvLyBGcmFtZSwgZS5nLiBpZiB3ZSBhcmUgZG93bmxvYWRp
bmcgYSBmaWxlLgogICAgIC8vIElmIHRoZSBmcmFtZSBpcyBub3QgbnVsbCBidXQgdGhlIHBhZ2Ug
aXMgbnVsbCB0aGlzIG11c3QgYmUgYW4gYXR0ZW1wdGVkCkBAIC02NywyNjEgKzcyLDEzIEBAIGJv
b2wgUmVzb3VyY2VIYW5kbGU6OnN0YXJ0KCkKICAgICBpZiAoZC0+bV9jb250ZXh0ICYmICFkLT5t
X2NvbnRleHQtPmlzVmFsaWQoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgZC0+aW5p
dGlhbGl6ZSgpOwotCi0gICAgZC0+bV9qb2IgPSBDdXJsSm9iTWFuYWdlcjo6c2luZ2xldG9uKCku
YWRkKGQtPm1fY3VybEhhbmRsZSwgW3RoaXMsIHByb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlz
KV0oQ3VybEpvYlJlc3VsdCByZXN1bHQpIHsKLSAgICAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgp
KTsKLQotICAgICAgICBzd2l0Y2ggKHJlc3VsdCkgewotICAgICAgICBjYXNlIEN1cmxKb2JSZXN1
bHQ6OkRvbmU6Ci0gICAgICAgICAgICBkLT5kaWRGaW5pc2goKTsKLSAgICAgICAgICAgIGJyZWFr
OwotCi0gICAgICAgIGNhc2UgQ3VybEpvYlJlc3VsdDo6RXJyb3I6Ci0gICAgICAgICAgICBkLT5k
aWRGYWlsKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEN1cmxKb2JSZXN1
bHQ6OkNhbmNlbGxlZDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfSk7Ci0g
ICAgQVNTRVJUKGQtPm1fam9iKTsKLQotICAgIHJldHVybiB0cnVlOworICAgIGQtPm1fZGVsZWdh
dGUgPSBhZG9wdFJlZihuZXcgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGUodGhpcykpOworICAg
IHJldHVybiBkLT5tX2RlbGVnYXRlLT5zdGFydCgpOwogfQogCiB2b2lkIFJlc291cmNlSGFuZGxl
OjpjYW5jZWwoKQogewotICAgIGQtPm1fY2FuY2VsbGVkID0gdHJ1ZTsKLSAgICBDdXJsSm9iTWFu
YWdlcjo6c2luZ2xldG9uKCkuY2FuY2VsKGQtPm1fam9iKTsKLX0KLQotdm9pZCBSZXNvdXJjZUhh
bmRsZUludGVybmFsOjppbml0aWFsaXplKCkKLXsKLSAgICBDdXJsQ29udGV4dCYgY29udGV4dCA9
IEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKTsKLQotICAgIFVSTCB1cmwgPSBtX2ZpcnN0UmVxdWVz
dC51cmwoKTsKLQotICAgIC8vIFJlbW92ZSBhbnkgZnJhZ21lbnQgcGFydCwgb3RoZXJ3aXNlIGN1
cmwgd2lsbCBzZW5kIGl0IGFzIHBhcnQgb2YgdGhlIHJlcXVlc3QuCi0gICAgdXJsLnJlbW92ZUZy
YWdtZW50SWRlbnRpZmllcigpOwotCi0gICAgU3RyaW5nIHVybFN0cmluZyA9IHVybC5zdHJpbmco
KTsKLQotICAgIGlmICh1cmwuaXNMb2NhbEZpbGUoKSkgewotICAgICAgICAvLyBSZW1vdmUgYW55
IHF1ZXJ5IHBhcnQgc2VudCB0byBhIGxvY2FsIGZpbGUuCi0gICAgICAgIGlmICghdXJsLnF1ZXJ5
KCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAvLyBCeSBzZXR0aW5nIHRoZSBxdWVyeSB0byBh
IG51bGwgc3RyaW5nIGl0J2xsIGJlIHJlbW92ZWQuCi0gICAgICAgICAgICB1cmwuc2V0UXVlcnko
U3RyaW5nKCkpOwotICAgICAgICAgICAgdXJsU3RyaW5nID0gdXJsLnN0cmluZygpOwotICAgICAg
ICB9Ci0gICAgICAgIC8vIERldGVybWluZSB0aGUgTUlNRSB0eXBlIGJhc2VkIG9uIHRoZSBwYXRo
LgotICAgICAgICBtX3Jlc3BvbnNlLnNldE1pbWVUeXBlKE1JTUVUeXBlUmVnaXN0cnk6OmdldE1J
TUVUeXBlRm9yUGF0aCh1cmwpKTsKLSAgICB9Ci0KLSAgICBpZiAobV9kZWZlcnNMb2FkaW5nKSB7
Ci0gICAgICAgIENVUkxjb2RlIGVycm9yID0gbV9jdXJsSGFuZGxlLnBhdXNlKENVUkxQQVVTRV9B
TEwpOwotICAgICAgICAvLyBJZiB3ZSBkaWQgbm90IHBhdXNlIHRoZSBoYW5kbGUsIHdlIHdvdWxk
IEFTU0VSVCBpbiB0aGUKLSAgICAgICAgLy8gaGVhZGVyIGNhbGxiYWNrLiBTbyBqdXN0IGFzc2Vy
dCBoZXJlLgotICAgICAgICBBU1NFUlRfVU5VU0VEKGVycm9yLCBlcnJvciA9PSBDVVJMRV9PSyk7
Ci0gICAgfQotCi0jaWZuZGVmIE5ERUJVRwotICAgIG1fY3VybEhhbmRsZS5lbmFibGVWZXJib3Nl
SWZVc2VkKCk7Ci0gICAgbV9jdXJsSGFuZGxlLmVuYWJsZVN0ZEVycklmVXNlZCgpOwotI2VuZGlm
Ci0KLSAgICBtX2N1cmxIYW5kbGUuaW5pdGlhbGl6ZSgpOwotICAgIG1fY3VybEhhbmRsZS5zZXRT
c2xWZXJpZnlQZWVyKEN1cmxIYW5kbGU6OlZlcmlmeVBlZXJFbmFibGUpOwotICAgIG1fY3VybEhh
bmRsZS5zZXRTc2xWZXJpZnlIb3N0KEN1cmxIYW5kbGU6OlZlcmlmeUhvc3RTdHJpY3ROYW1lQ2hl
Y2spOwotICAgIG1fY3VybEhhbmRsZS5zZXRQcml2YXRlRGF0YSh0aGlzKTsKLSAgICBtX2N1cmxI
YW5kbGUuc2V0V3JpdGVDYWxsYmFja0Z1bmN0aW9uKHdyaXRlQ2FsbGJhY2ssIHRoaXMpOwotICAg
IG1fY3VybEhhbmRsZS5zZXRIZWFkZXJDYWxsYmFja0Z1bmN0aW9uKGhlYWRlckNhbGxiYWNrLCB0
aGlzKTsKLSAgICBtX2N1cmxIYW5kbGUuZW5hYmxlQXV0b1JlZmVyZXIoKTsKLSAgICBtX2N1cmxI
YW5kbGUuZW5hYmxlRm9sbG93TG9jYXRpb24oKTsKLSAgICBtX2N1cmxIYW5kbGUuZW5hYmxlSHR0
cEF1dGhlbnRpY2F0aW9uKENVUkxBVVRIX0FOWSk7Ci0gICAgbV9jdXJsSGFuZGxlLmVuYWJsZVNo
YXJlSGFuZGxlKCk7Ci0gICAgbV9jdXJsSGFuZGxlLmVuYWJsZVRpbWVvdXQoKTsKLSAgICBtX2N1
cmxIYW5kbGUuZW5hYmxlQWxsb3dlZFByb3RvY29scygpOwotICAgIGF1dG8gY2VydGlmaWNhdGUg
PSBnZXRTU0xDbGllbnRDZXJ0aWZpY2F0ZShtX2ZpcnN0UmVxdWVzdC51cmwoKS5ob3N0KCkpOwot
ICAgIGlmIChjZXJ0aWZpY2F0ZSkgewotICAgICAgICBtX2N1cmxIYW5kbGUuc2V0U3NsQ2VydCgo
KmNlcnRpZmljYXRlKS5maXJzdC51dGY4KCkuZGF0YSgpKTsKLSAgICAgICAgbV9jdXJsSGFuZGxl
LnNldFNzbENlcnRUeXBlKCJQMTIiKTsKLSAgICAgICAgbV9jdXJsSGFuZGxlLnNldFNzbEtleVBh
c3N3b3JkKCgqY2VydGlmaWNhdGUpLnNlY29uZC51dGY4KCkuZGF0YSgpKTsKLSAgICB9Ci0KLSAg
ICBpZiAoQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpLnNob3VsZElnbm9yZVNTTEVycm9ycygpKQot
ICAgICAgICBtX2N1cmxIYW5kbGUuc2V0U3NsVmVyaWZ5UGVlcihDdXJsSGFuZGxlOjpWZXJpZnlQ
ZWVyRGlzYWJsZSk7Ci0gICAgZWxzZQotICAgICAgICBzZXRTU0xWZXJpZnlPcHRpb25zKG1fY3Vy
bEhhbmRsZSk7Ci0KLSAgICBtX2N1cmxIYW5kbGUuZW5hYmxlQ0FJbmZvSWZFeGlzdHMoKTsKLQot
ICAgIG1fY3VybEhhbmRsZS5lbmFibGVBY2NlcHRFbmNvZGluZygpOwotICAgIG1fY3VybEhhbmRs
ZS5zZXRVcmwodXJsU3RyaW5nKTsKLSAgICBtX2N1cmxIYW5kbGUuZW5hYmxlQ29va2llSmFySWZF
eGlzdHMoKTsKLQotICAgIGlmIChtX2ZpcnN0UmVxdWVzdC5odHRwSGVhZGVyRmllbGRzKCkuc2l6
ZSgpKSB7Ci0gICAgICAgIGF1dG8gY3VzdG9tSGVhZGVycyA9IG1fZmlyc3RSZXF1ZXN0Lmh0dHBI
ZWFkZXJGaWVsZHMoKTsKLSAgICAgICAgYXV0byYgY2FjaGUgPSBDdXJsQ2FjaGVNYW5hZ2VyOjpn
ZXRJbnN0YW5jZSgpOwotCi0gICAgICAgIGJvb2wgaGFzQ2FjaGVIZWFkZXJzID0gY3VzdG9tSGVh
ZGVycy5jb250YWlucyhIVFRQSGVhZGVyTmFtZTo6SWZNb2RpZmllZFNpbmNlKSB8fCBjdXN0b21I
ZWFkZXJzLmNvbnRhaW5zKEhUVFBIZWFkZXJOYW1lOjpJZk5vbmVNYXRjaCk7Ci0gICAgICAgIGlm
ICghaGFzQ2FjaGVIZWFkZXJzICYmIGNhY2hlLmlzQ2FjaGVkKHVybCkpIHsKLSAgICAgICAgICAg
IGNhY2hlLmFkZENhY2hlRW50cnlDbGllbnQodXJsLCBtX2hhbmRsZSk7Ci0KLSAgICAgICAgICAg
IC8vIGFwcGVuZCBhZGRpdGlvbmFsIGNhY2hlIGluZm9ybWF0aW9uCi0gICAgICAgICAgICBmb3Ig
KGF1dG8gZW50cnkgOiBjYWNoZS5yZXF1ZXN0SGVhZGVycyh1cmwpKQotICAgICAgICAgICAgICAg
IGN1c3RvbUhlYWRlcnMuc2V0KGVudHJ5LmtleSwgZW50cnkudmFsdWUpOwotCi0gICAgICAgICAg
ICBtX2FkZGVkQ2FjaGVWYWxpZGF0aW9uSGVhZGVycyA9IHRydWU7Ci0gICAgICAgIH0KLQotICAg
ICAgICBtX2N1cmxIYW5kbGUuYXBwZW5kUmVxdWVzdEhlYWRlcnMoY3VzdG9tSGVhZGVycyk7Ci0g
ICAgfQotCi0gICAgU3RyaW5nIG1ldGhvZCA9IG1fZmlyc3RSZXF1ZXN0Lmh0dHBNZXRob2QoKTsK
LSAgICBpZiAoIkdFVCIgPT0gbWV0aG9kKQotICAgICAgICBtX2N1cmxIYW5kbGUuZW5hYmxlSHR0
cEdldFJlcXVlc3QoKTsKLSAgICBlbHNlIGlmICgiUE9TVCIgPT0gbWV0aG9kKQotICAgICAgICBz
ZXR1cFBPU1QoKTsKLSAgICBlbHNlIGlmICgiUFVUIiA9PSBtZXRob2QpCi0gICAgICAgIHNldHVw
UFVUKCk7Ci0gICAgZWxzZSBpZiAoIkhFQUQiID09IG1ldGhvZCkKLSAgICAgICAgbV9jdXJsSGFu
ZGxlLmVuYWJsZUh0dHBIZWFkUmVxdWVzdCgpOwotICAgIGVsc2UgewotICAgICAgICBtX2N1cmxI
YW5kbGUuc2V0SHR0cEN1c3RvbVJlcXVlc3QobWV0aG9kKTsKLSAgICAgICAgc2V0dXBQVVQoKTsK
LSAgICB9Ci0KLSAgICBtX2N1cmxIYW5kbGUuZW5hYmxlUmVxdWVzdEhlYWRlcnMoKTsKLQotICAg
IGFwcGx5QXV0aGVudGljYXRpb24oKTsKLQotICAgIG1fY3VybEhhbmRsZS5lbmFibGVQcm94eUlm
RXhpc3RzKCk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6YXBwbHlBdXRoZW50
aWNhdGlvbigpCi17Ci0gICAgLy8gbV91c2VyL21fcGFzcyBhcmUgY3JlZGVudGlhbHMgZ2l2ZW4g
bWFudWFsbHksIGZvciBpbnN0YW5jZSwgYnkgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gWE1MSHR0
cFJlcXVlc3Qub3BlbigpLgotICAgIFN0cmluZyBwYXJ0aXRpb24gPSBtX2ZpcnN0UmVxdWVzdC5j
YWNoZVBhcnRpdGlvbigpOwotCi0gICAgaWYgKG1faGFuZGxlLT5zaG91bGRVc2VDcmVkZW50aWFs
U3RvcmFnZSgpKSB7Ci0gICAgICAgIGlmIChtX3VzZXIuaXNFbXB0eSgpICYmIG1fcGFzcy5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgICAgIC8vIDxyZGFyOi8vcHJvYmxlbS83MTc0MDUwPiAtIEZvciBV
UkxzIHRoYXQgbWF0Y2ggdGhlIHBhdGhzIG9mIHRob3NlIHByZXZpb3VzbHkgY2hhbGxlbmdlZCBm
b3IgSFRUUCBCYXNpYyBhdXRoZW50aWNhdGlvbiwgCi0gICAgICAgICAgICAvLyB0cnkgYW5kIHJl
dXNlIHRoZSBjcmVkZW50aWFsIHByZWVtcHRpdmVseSwgYXMgYWxsb3dlZCBieSBSRkMgMjYxNy4K
LSAgICAgICAgICAgIG1faW5pdGlhbENyZWRlbnRpYWwgPSBDcmVkZW50aWFsU3RvcmFnZTo6ZGVm
YXVsdENyZWRlbnRpYWxTdG9yYWdlKCkuZ2V0KHBhcnRpdGlvbiwgbV9maXJzdFJlcXVlc3QudXJs
KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFk
eSBhIHByb3RlY3Rpb24gc3BhY2Uga25vd24gZm9yIHRoZSBVUkwsIHVwZGF0ZSBzdG9yZWQgY3Jl
ZGVudGlhbHMKLSAgICAgICAgICAgIC8vIGJlZm9yZSBzZW5kaW5nIGEgcmVxdWVzdC4gVGhpcyBt
YWtlcyBpdCBwb3NzaWJsZSB0byBpbXBsZW1lbnQgbG9nb3V0IGJ5IHNlbmRpbmcgYW4KLSAgICAg
ICAgICAgIC8vIFhNTEh0dHBSZXF1ZXN0IHdpdGgga25vd24gaW5jb3JyZWN0IGNyZWRlbnRpYWxz
LCBhbmQgYWJvcnRpbmcgaXQgaW1tZWRpYXRlbHkgKHNvIHRoYXQKLSAgICAgICAgICAgIC8vIGFu
IGF1dGhlbnRpY2F0aW9uIGRpYWxvZyBkb2Vzbid0IHBvcCB1cCkuCi0gICAgICAgICAgICBDcmVk
ZW50aWFsU3RvcmFnZTo6ZGVmYXVsdENyZWRlbnRpYWxTdG9yYWdlKCkuc2V0KHBhcnRpdGlvbiwg
Q3JlZGVudGlhbChtX3VzZXIsIG1fcGFzcywgQ3JlZGVudGlhbFBlcnNpc3RlbmNlTm9uZSksIG1f
Zmlyc3RSZXF1ZXN0LnVybCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFN0cmluZyB1c2Vy
ID0gbV91c2VyOwotICAgIFN0cmluZyBwYXNzd29yZCA9IG1fcGFzczsKLQotICAgIGlmICghbV9p
bml0aWFsQ3JlZGVudGlhbC5pc0VtcHR5KCkpIHsKLSAgICAgICAgdXNlciA9IG1faW5pdGlhbENy
ZWRlbnRpYWwudXNlcigpOwotICAgICAgICBwYXNzd29yZCA9IG1faW5pdGlhbENyZWRlbnRpYWwu
cGFzc3dvcmQoKTsKLSAgICAgICAgbV9jdXJsSGFuZGxlLmVuYWJsZUh0dHBBdXRoZW50aWNhdGlv
bihDVVJMQVVUSF9CQVNJQyk7Ci0gICAgfQotCi0gICAgLy8gSXQgc2VlbXMgd2UgbmVlZCB0byBz
ZXQgQ1VSTE9QVF9VU0VSUFdEIGV2ZW4gaWYgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGlzIGVtcHR5
LgotICAgIC8vIE90aGVyd2lzZSBjVVJMIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgY29udGludWUg
d2l0aCBhIG5ldyByZXF1ZXN0IGFmdGVyIGEgNDAxIHJlc3BvbnNlLgotCi0gICAgLy8gY3VybCBD
VVJMT1BUX1VTRVJQV0QgZXhwZWN0cyB1c2VybmFtZTpwYXNzd29yZAotICAgIG1fY3VybEhhbmRs
ZS5zZXRIdHRwQXV0aFVzZXJQYXNzKHVzZXIsIHBhc3N3b3JkKTsKLX0KLQotc3RhdGljIGlubGlu
ZSBzaXplX3QgZ2V0Rm9ybUVsZW1lbnRzQ291bnQoUmVzb3VyY2VIYW5kbGUqIGpvYikKLXsKLSAg
ICBSZWZQdHI8Rm9ybURhdGE+IGZvcm1EYXRhID0gam9iLT5maXJzdFJlcXVlc3QoKS5odHRwQm9k
eSgpOwotCi0gICAgaWYgKCFmb3JtRGF0YSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBS
ZXNvbHZlIHRoZSBibG9iIGVsZW1lbnRzIHNvIHRoZSBmb3JtRGF0YSBjYW4gY29ycmVjdGx5IHJl
cG9ydCBpdCdzIHNpemUuCi0gICAgZm9ybURhdGEgPSBmb3JtRGF0YS0+cmVzb2x2ZUJsb2JSZWZl
cmVuY2VzKCk7Ci0gICAgc2l6ZV90IHNpemUgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7
Ci0gICAgam9iLT5maXJzdFJlcXVlc3QoKS5zZXRIVFRQQm9keShXVEZNb3ZlKGZvcm1EYXRhKSk7
Ci0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotdm9pZCBSZXNvdXJjZUhhbmRsZUludGVybmFsOjpz
ZXR1cFBVVCgpCi17Ci0gICAgbV9jdXJsSGFuZGxlLmVuYWJsZUh0dHBQdXRSZXF1ZXN0KCk7Ci0K
LSAgICAvLyBEaXNhYmxlIHRoZSBFeHBlY3Q6IDEwMCBjb250aW51ZSBoZWFkZXIKLSAgICBtX2N1
cmxIYW5kbGUuYXBwZW5kUmVxdWVzdEhlYWRlcigiRXhwZWN0OiIpOwotCi0gICAgc2l6ZV90IG51
bUVsZW1lbnRzID0gZ2V0Rm9ybUVsZW1lbnRzQ291bnQobV9oYW5kbGUpOwotICAgIGlmICghbnVt
RWxlbWVudHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIHNldHVwRm9ybURhdGEoZmFsc2UpOwot
fQotCi12b2lkIFJlc291cmNlSGFuZGxlSW50ZXJuYWw6OnNldHVwUE9TVCgpCi17Ci0gICAgbV9j
dXJsSGFuZGxlLmVuYWJsZUh0dHBQb3N0UmVxdWVzdCgpOwotCi0gICAgc2l6ZV90IG51bUVsZW1l
bnRzID0gZ2V0Rm9ybUVsZW1lbnRzQ291bnQobV9oYW5kbGUpOwotICAgIGlmICghbnVtRWxlbWVu
dHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIERvIG5vdCBzdHJlYW0gZm9yIHNpbXBsZSBQ
T1NUIGRhdGEKLSAgICBpZiAobnVtRWxlbWVudHMgPT0gMSkgewotICAgICAgICBtX2ZpcnN0UmVx
dWVzdC5odHRwQm9keSgpLT5mbGF0dGVuKG1fcG9zdEJ5dGVzKTsKLSAgICAgICAgaWYgKG1fcG9z
dEJ5dGVzLnNpemUoKSkKLSAgICAgICAgICAgIG1fY3VybEhhbmRsZS5zZXRQb3N0RmllbGRzKG1f
cG9zdEJ5dGVzLmRhdGEoKSwgbV9wb3N0Qnl0ZXMuc2l6ZSgpKTsKLSAgICAgICAgcmV0dXJuOwot
ICAgIH0KLQotICAgIHNldHVwRm9ybURhdGEodHJ1ZSk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VIYW5k
bGVJbnRlcm5hbDo6c2V0dXBGb3JtRGF0YShib29sIGlzUG9zdFJlcXVlc3QpCi17Ci0gICAgVmVj
dG9yPEZvcm1EYXRhRWxlbWVudD4gZWxlbWVudHMgPSBtX2ZpcnN0UmVxdWVzdC5odHRwQm9keSgp
LT5lbGVtZW50cygpOwotICAgIHNpemVfdCBudW1FbGVtZW50cyA9IGVsZW1lbnRzLnNpemUoKTsK
LQotICAgIHN0YXRpYyBjb25zdCBsb25nIGxvbmcgbWF4Q3VybE9mZlQgPSBtX2N1cmxIYW5kbGUu
bWF4Q3VybE9mZlQoKTsKLQotICAgIC8vIE9idGFpbiB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZm9y
bSBkYXRhCi0gICAgY3VybF9vZmZfdCBzaXplID0gMDsKLSAgICBib29sIGNodW5rZWRUcmFuc2Zl
ciA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRWxlbWVudHM7IGkrKykg
ewotICAgICAgICBGb3JtRGF0YUVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotICAgICAg
ICBpZiAoZWxlbWVudC5tX3R5cGUgPT0gRm9ybURhdGFFbGVtZW50OjpUeXBlOjpFbmNvZGVkRmls
ZSkgewotICAgICAgICAgICAgbG9uZyBsb25nIGZpbGVTaXplUmVzdWx0OwotICAgICAgICAgICAg
aWYgKGdldEZpbGVTaXplKGVsZW1lbnQubV9maWxlbmFtZSwgZmlsZVNpemVSZXN1bHQpKSB7Ci0g
ICAgICAgICAgICAgICAgaWYgKGZpbGVTaXplUmVzdWx0ID4gbWF4Q3VybE9mZlQpIHsKLSAgICAg
ICAgICAgICAgICAgICAgLy8gRmlsZSBzaXplIGlzIHRvbyBiaWcgZm9yIHNwZWNpZnlpbmcgaXQg
dG8gY1VSTAotICAgICAgICAgICAgICAgICAgICBjaHVua2VkVHJhbnNmZXIgPSB0cnVlOwotICAg
ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgc2l6ZSArPSBmaWxlU2l6ZVJlc3VsdDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAg
ICAgICAgICAgY2h1bmtlZFRyYW5zZmVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBzaXplICs9IGVsZW1l
bnRzW2ldLm1fZGF0YS5zaXplKCk7Ci0gICAgfQotCi0gICAgLy8gY1VSTCBndWVzc2VzIHRoYXQg
d2Ugd2FudCBjaHVua2VkIGVuY29kaW5nIGFzIGxvbmcgYXMgd2Ugc3BlY2lmeSB0aGUgaGVhZGVy
Ci0gICAgaWYgKGNodW5rZWRUcmFuc2ZlcikKLSAgICAgICAgbV9jdXJsSGFuZGxlLmFwcGVuZFJl
cXVlc3RIZWFkZXIoIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIik7Ci0gICAgZWxzZSB7Ci0g
ICAgICAgIGlmIChpc1Bvc3RSZXF1ZXN0KQotICAgICAgICAgICAgbV9jdXJsSGFuZGxlLnNldFBv
c3RGaWVsZExhcmdlKHNpemUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX2N1cmxIYW5k
bGUuc2V0SW5GaWxlU2l6ZUxhcmdlKHNpemUpOwotICAgIH0KLQotICAgIG1fY3VybEhhbmRsZS5z
ZXRSZWFkQ2FsbGJhY2tGdW5jdGlvbihyZWFkQ2FsbGJhY2ssIHRoaXMpOworICAgIGQtPm1fZGVs
ZWdhdGUtPmNhbmNlbCgpOwogfQogCiAjaWYgT1MoV0lORE9XUykKQEAgLTM1Nyw1OSArMTE0LDcg
QEAgdm9pZCBSZXNvdXJjZUhhbmRsZTo6cGxhdGZvcm1TZXREZWZlcnNMbwogewogICAgIEFTU0VS
VChpc01haW5UaHJlYWQoKSk7CiAKLSAgICBhdXRvIGFjdGlvbiA9IFtkZWZlcnMsIHRoaXMsIHBy
b3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKV0oKSB7Ci0gICAgICAgIGlmIChkZWZlcnMpIHsK
LSAgICAgICAgICAgIENVUkxjb2RlIGVycm9yID0gZC0+bV9jdXJsSGFuZGxlLnBhdXNlKENVUkxQ
QVVTRV9BTEwpOwotICAgICAgICAgICAgLy8gSWYgd2UgY291bGQgbm90IGRlZmVyIHRoZSBoYW5k
bGUsIHNvIGRvbid0IGRvIGl0LgotICAgICAgICAgICAgaWYgKGVycm9yICE9IENVUkxFX09LKQot
ICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENV
Ukxjb2RlIGVycm9yID0gZC0+bV9jdXJsSGFuZGxlLnBhdXNlKENVUkxQQVVTRV9DT05UKTsKLSAg
ICAgICAgICAgIGlmIChlcnJvciAhPSBDVVJMRV9PSykgewotICAgICAgICAgICAgICAgIC8vIFJl
c3RhcnRpbmcgdGhlIGhhbmRsZSBoYXMgZmFpbGVkIHNvIGp1c3QgY2FuY2VsIGl0LgotICAgICAg
ICAgICAgICAgIGNhbmNlbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQot
ICAgIGlmIChkLT5tX2pvYikgewotICAgICAgICBDdXJsSm9iTWFuYWdlcjo6c2luZ2xldG9uKCku
Y2FsbE9uSm9iVGhyZWFkKFdURk1vdmUoYWN0aW9uKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg
YWN0aW9uKCk7Ci0gICAgfQotfQotCi12b2lkIFJlc291cmNlSGFuZGxlSW50ZXJuYWw6OmRpZEZp
bmlzaCgpCi17Ci0gICAgY2FsY3VsYXRlV2ViVGltaW5nSW5mb3JtYXRpb25zKCk7Ci0KLSAgICBp
ZiAobV9jYW5jZWxsZWQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICghbV9yZXNwb25zZS5y
ZXNwb25zZUZpcmVkKCkpIHsKLSAgICAgICAgaGFuZGxlTG9jYWxSZWNlaXZlUmVzcG9uc2UoKTsK
LSAgICAgICAgaWYgKG1fY2FuY2VsbGVkKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIGlmIChtX211bHRpcGFydEhhbmRsZSkKLSAgICAgICAgbV9tdWx0aXBhcnRIYW5kbGUtPmNv
bnRlbnRFbmRlZCgpOwotCi0gICAgaWYgKGNsaWVudCgpKSB7Ci0gICAgICAgIGNsaWVudCgpLT5k
aWRGaW5pc2hMb2FkaW5nKG1faGFuZGxlKTsKLSAgICAgICAgQ3VybENhY2hlTWFuYWdlcjo6Z2V0
SW5zdGFuY2UoKS5kaWRGaW5pc2hMb2FkaW5nKCptX2hhbmRsZSk7Ci0gICAgfQotfQotCi12b2lk
IFJlc291cmNlSGFuZGxlSW50ZXJuYWw6OmRpZEZhaWwoKQotewotICAgIGlmIChtX2NhbmNlbGxl
ZCkKLSAgICAgICAgcmV0dXJuOwotICAgIFVSTCB1cmwgPSBtX2N1cmxIYW5kbGUuZ2V0RWZmZWN0
aXZlVVJMKCk7Ci0gICAgaWYgKGNsaWVudCgpKSB7Ci0gICAgICAgIGNsaWVudCgpLT5kaWRGYWls
KG1faGFuZGxlLCBSZXNvdXJjZUVycm9yKEN1cmxDb250ZXh0OjplcnJvckRvbWFpbiwgbV9jdXJs
SGFuZGxlLmVycm9yQ29kZSgpLCBtX2N1cmxIYW5kbGUuZ2V0RWZmZWN0aXZlVVJMKCksIG1fY3Vy
bEhhbmRsZS5lcnJvckRlc2NyaXB0aW9uKCksIG1fY3VybEhhbmRsZS5nZXRTc2xFcnJvcnMoKSkp
OwotICAgICAgICBDdXJsQ2FjaGVNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpLmRpZEZhaWwoKm1faGFu
ZGxlKTsKLSAgICB9CisgICAgZC0+bV9kZWxlZ2F0ZS0+c2V0RGVmZXJzTG9hZGluZyhkZWZlcnMp
OwogfQogCiBib29sIFJlc291cmNlSGFuZGxlOjpzaG91bGRVc2VDcmVkZW50aWFsU3RvcmFnZSgp
CkBAIC00MzEsNyArMTM2LDcgQEAgdm9pZCBSZXNvdXJjZUhhbmRsZTo6ZGlkUmVjZWl2ZUF1dGhl
bnRpYwogICAgICAgICAgICAgdXJsVG9TdG9yZSA9IGNoYWxsZW5nZS5mYWlsdXJlUmVzcG9uc2Uo
KS51cmwoKTsKICAgICAgICAgQ3JlZGVudGlhbFN0b3JhZ2U6OmRlZmF1bHRDcmVkZW50aWFsU3Rv
cmFnZSgpLnNldChwYXJ0aXRpb24sIGNyZWRlbnRpYWwsIGNoYWxsZW5nZS5wcm90ZWN0aW9uU3Bh
Y2UoKSwgdXJsVG9TdG9yZSk7CiAgICAgICAgIAotICAgICAgICBkLT5tX2N1cmxIYW5kbGUuc2V0
SHR0cEF1dGhVc2VyUGFzcyhjcmVkZW50aWFsLnVzZXIoKSwgY3JlZGVudGlhbC5wYXNzd29yZCgp
KTsKKyAgICAgICAgZC0+bV9kZWxlZ2F0ZS0+c2V0QXV0aGVudGljYXRpb24oY3JlZGVudGlhbC51
c2VyKCksIGNyZWRlbnRpYWwucGFzc3dvcmQoKSk7CiAKICAgICAgICAgZC0+bV91c2VyID0gU3Ry
aW5nKCk7CiAgICAgICAgIGQtPm1fcGFzcyA9IFN0cmluZygpOwpAQCAtNDU2LDcgKzE2MSw3IEBA
IHZvaWQgUmVzb3VyY2VIYW5kbGU6OmRpZFJlY2VpdmVBdXRoZW50aWMKICAgICAgICAgICAgICAg
ICAgICAgQ3JlZGVudGlhbFN0b3JhZ2U6OmRlZmF1bHRDcmVkZW50aWFsU3RvcmFnZSgpLnNldChw
YXJ0aXRpb24sIGNyZWRlbnRpYWwsIGNoYWxsZW5nZS5wcm90ZWN0aW9uU3BhY2UoKSwgY2hhbGxl
bmdlLmZhaWx1cmVSZXNwb25zZSgpLnVybCgpKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAg
ICAgICAgICAgICBkLT5tX2N1cmxIYW5kbGUuc2V0SHR0cEF1dGhVc2VyUGFzcyhjcmVkZW50aWFs
LnVzZXIoKSwgY3JlZGVudGlhbC5wYXNzd29yZCgpKTsKKyAgICAgICAgICAgICAgICBkLT5tX2Rl
bGVnYXRlLT5zZXRBdXRoZW50aWNhdGlvbihjcmVkZW50aWFsLnVzZXIoKSwgY3JlZGVudGlhbC5w
YXNzd29yZCgpKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0KQEAgLTQ4OSw3ICsxOTQsNyBAQCB2b2lkIFJlc291cmNlSGFuZGxlOjpyZWNlaXZlZENy
ZWRlbnRpYWwoCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBkLT5tX2N1cmxIYW5kbGUuc2V0SHR0
cEF1dGhVc2VyUGFzcyhjcmVkZW50aWFsLnVzZXIoKSwgY3JlZGVudGlhbC5wYXNzd29yZCgpKTsK
KyAgICBkLT5tX2RlbGVnYXRlLT5zZXRBdXRoZW50aWNhdGlvbihjcmVkZW50aWFsLnVzZXIoKSwg
Y3JlZGVudGlhbC5wYXNzd29yZCgpKTsKICAgICBjbGVhckF1dGhlbnRpY2F0aW9uKCk7CiB9CiAK
QEAgLTUwMCw3ICsyMDUsNyBAQCB2b2lkIFJlc291cmNlSGFuZGxlOjpyZWNlaXZlZFJlcXVlc3RU
b0NvCiAgICAgaWYgKGNoYWxsZW5nZSAhPSBkLT5tX2N1cnJlbnRXZWJDaGFsbGVuZ2UpCiAgICAg
ICAgIHJldHVybjsKIAotICAgIGQtPm1fY3VybEhhbmRsZS5zZXRIdHRwQXV0aFVzZXJQYXNzKCIi
LCAiIik7CisgICAgZC0+bV9kZWxlZ2F0ZS0+c2V0QXV0aGVudGljYXRpb24oIiIsICIiKTsKICAg
ICBjbGVhckF1dGhlbnRpY2F0aW9uKCk7CiB9CiAKQEAgLTUyNSw0MzggKzIzMCw2IEBAIHZvaWQg
UmVzb3VyY2VIYW5kbGU6OnJlY2VpdmVkQ2hhbGxlbmdlUmUKICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKIH0KIAotdm9pZCBSZXNvdXJjZUhhbmRsZUludGVybmFsOjpjYWxjdWxhdGVXZWJUaW1p
bmdJbmZvcm1hdGlvbnMoKQotewotICAgIGRvdWJsZSBwcmVUcmFuc2ZlclRpbWUgPSAwOwotICAg
IGRvdWJsZSBkbnNsb29rdXBUaW1lID0gMDsKLSAgICBkb3VibGUgY29ubmVjdFRpbWUgPSAwOwot
ICAgIGRvdWJsZSBhcHBDb25uZWN0VGltZSA9IDA7Ci0KLSAgICBtX2N1cmxIYW5kbGUuZ2V0VGlt
ZXMocHJlVHJhbnNmZXJUaW1lLCBkbnNsb29rdXBUaW1lLCBjb25uZWN0VGltZSwgYXBwQ29ubmVj
dFRpbWUpOwotCi0gICAgbV9yZXNwb25zZS5kZXByZWNhdGVkTmV0d29ya0xvYWRNZXRyaWNzKCku
ZG9tYWluTG9va3VwU3RhcnQgPSBTZWNvbmRzKDApOwotICAgIG1fcmVzcG9uc2UuZGVwcmVjYXRl
ZE5ldHdvcmtMb2FkTWV0cmljcygpLmRvbWFpbkxvb2t1cEVuZCA9IFNlY29uZHMoZG5zbG9va3Vw
VGltZSk7Ci0KLSAgICBtX3Jlc3BvbnNlLmRlcHJlY2F0ZWROZXR3b3JrTG9hZE1ldHJpY3MoKS5j
b25uZWN0U3RhcnQgPSBTZWNvbmRzKGRuc2xvb2t1cFRpbWUpOwotICAgIG1fcmVzcG9uc2UuZGVw
cmVjYXRlZE5ldHdvcmtMb2FkTWV0cmljcygpLmNvbm5lY3RFbmQgPSBTZWNvbmRzKGNvbm5lY3RU
aW1lKTsKLQotICAgIG1fcmVzcG9uc2UuZGVwcmVjYXRlZE5ldHdvcmtMb2FkTWV0cmljcygpLnJl
cXVlc3RTdGFydCA9IFNlY29uZHMoY29ubmVjdFRpbWUpOwotICAgIG1fcmVzcG9uc2UuZGVwcmVj
YXRlZE5ldHdvcmtMb2FkTWV0cmljcygpLnJlc3BvbnNlU3RhcnQgPSBTZWNvbmRzKHByZVRyYW5z
ZmVyVGltZSk7Ci0KLSAgICBpZiAoYXBwQ29ubmVjdFRpbWUpCi0gICAgICAgIG1fcmVzcG9uc2Uu
ZGVwcmVjYXRlZE5ldHdvcmtMb2FkTWV0cmljcygpLnNlY3VyZUNvbm5lY3Rpb25TdGFydCA9IFNl
Y29uZHMoY29ubmVjdFRpbWUpOwotfQotCi12b2lkIFJlc291cmNlSGFuZGxlSW50ZXJuYWw6Omhh
bmRsZUxvY2FsUmVjZWl2ZVJlc3BvbnNlKCkKLXsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OwotCi0gICAgLy8gc2luY2UgdGhlIGNvZGUgaW4gaGVhZGVyQ2FsbGJhY2sgd2lsbCBub3QgaGF2
ZSBydW4gZm9yIGxvY2FsIGZpbGVzCi0gICAgLy8gdGhlIGNvZGUgdG8gc2V0IHRoZSBVUkwgYW5k
IGZpcmUgZGlkUmVjZWl2ZVJlc3BvbnNlIGlzIG5ldmVyIHJ1biwKLSAgICAvLyB3aGljaCBtZWFu
cyB0aGUgUmVzb3VyY2VMb2FkZXIncyByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIHRoZSBVUkwu
Ci0gICAgLy8gUnVuIHRoZSBjb2RlIGhlcmUgZm9yIGxvY2FsIGZpbGVzIHRvIHJlc29sdmUgdGhl
IGlzc3VlLgotICAgIC8vIFRPRE86IFNlZSBpZiB0aGVyZSBpcyBhIGJldHRlciBhcHByb2FjaCBm
b3IgaGFuZGxpbmcgdGhpcy4KLSAgICBVUkwgdXJsID0gbV9jdXJsSGFuZGxlLmdldEVmZmVjdGl2
ZVVSTCgpOwotICAgIEFTU0VSVCh1cmwuaXNWYWxpZCgpKTsKLSAgICBtX3Jlc3BvbnNlLnNldFVS
TCh1cmwpOwotICAgIGlmIChjbGllbnQoKSkKLSAgICAgICAgY2xpZW50KCktPmRpZFJlY2VpdmVS
ZXNwb25zZShtX2hhbmRsZSwgUmVzb3VyY2VSZXNwb25zZShtX3Jlc3BvbnNlKSk7Ci0gICAgbV9y
ZXNwb25zZS5zZXRSZXNwb25zZUZpcmVkKHRydWUpOwotfQotCi1pbmxpbmUgc3RhdGljIGJvb2wg
aXNIdHRwSW5mbyhpbnQgc3RhdHVzQ29kZSkKLXsKLSAgICByZXR1cm4gMTAwIDw9IHN0YXR1c0Nv
ZGUgJiYgc3RhdHVzQ29kZSA8IDIwMDsKLX0KLQotaW5saW5lIHN0YXRpYyBib29sIGlzSHR0cFJl
ZGlyZWN0KGludCBzdGF0dXNDb2RlKQotewotICAgIHJldHVybiAzMDAgPD0gc3RhdHVzQ29kZSAm
JiBzdGF0dXNDb2RlIDwgNDAwICYmIHN0YXR1c0NvZGUgIT0gMzA0OwotfQotCi1pbmxpbmUgc3Rh
dGljIGJvb2wgaXNIdHRwQXV0aGVudGljYXRpb24oaW50IHN0YXR1c0NvZGUpCi17Ci0gICAgcmV0
dXJuIHN0YXR1c0NvZGUgPT0gNDAxOwotfQotCi1pbmxpbmUgc3RhdGljIGJvb2wgaXNIdHRwTm90
TW9kaWZpZWQoaW50IHN0YXR1c0NvZGUpCi17Ci0gICAgcmV0dXJuIHN0YXR1c0NvZGUgPT0gMzA0
OwotfQotCi1zdGF0aWMgYm9vbCBpc0FwcGVuZGFibGVIZWFkZXIoY29uc3QgU3RyaW5nICZrZXkp
Ci17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGFwcGVuZGFibGVIZWFkZXJzW10gPSB7Ci0gICAg
ICAgICJhY2Nlc3MtY29udHJvbC1hbGxvdy1oZWFkZXJzIiwKLSAgICAgICAgImFjY2Vzcy1jb250
cm9sLWFsbG93LW1ldGhvZHMiLAotICAgICAgICAiYWNjZXNzLWNvbnRyb2wtYWxsb3ctb3JpZ2lu
IiwKLSAgICAgICAgImFjY2Vzcy1jb250cm9sLWV4cG9zZS1oZWFkZXJzIiwKLSAgICAgICAgImFs
bG93IiwKLSAgICAgICAgImNhY2hlLWNvbnRyb2wiLAotICAgICAgICAiY29ubmVjdGlvbiIsCi0g
ICAgICAgICJjb250ZW50LWVuY29kaW5nIiwKLSAgICAgICAgImNvbnRlbnQtbGFuZ3VhZ2UiLAot
ICAgICAgICAiaWYtbWF0Y2giLAotICAgICAgICAiaWYtbm9uZS1tYXRjaCIsCi0gICAgICAgICJr
ZWVwLWFsaXZlIiwKLSAgICAgICAgInByYWdtYSIsCi0gICAgICAgICJwcm94eS1hdXRoZW50aWNh
dGUiLAotICAgICAgICAicHVibGljIiwKLSAgICAgICAgInNlcnZlciIsCi0gICAgICAgICJzZXQt
Y29va2llIiwKLSAgICAgICAgInRlIiwKLSAgICAgICAgInRyYWlsZXIiLAotICAgICAgICAidHJh
bnNmZXItZW5jb2RpbmciLAotICAgICAgICAidXBncmFkZSIsCi0gICAgICAgICJ1c2VyLWFnZW50
IiwKLSAgICAgICAgInZhcnkiLAotICAgICAgICAidmlhIiwKLSAgICAgICAgIndhcm5pbmciLAot
ICAgICAgICAid3d3LWF1dGhlbnRpY2F0ZSIKLSAgICB9OwotCi0gICAgLy8gQ3VzdG9tIGhlYWRl
cnMgc3RhcnQgd2l0aCAnWC0nLCBhbmQgbmVlZCBubyBmdXJ0aGVyIGNoZWNraW5nLgotICAgIGlm
IChrZXkuc3RhcnRzV2l0aCgieC0iLCAvKiBjYXNlU2Vuc2l0aXZlICovIGZhbHNlKSkKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0KLSAgICBmb3IgKGF1dG8mIGhlYWRlciA6IGFwcGVuZGFibGVIZWFk
ZXJzKSB7Ci0gICAgICAgIGlmIChlcXVhbElnbm9yaW5nQVNDSUlDYXNlKGtleSwgaGVhZGVyKSkK
LSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotc3RhdGljIHZvaWQgcmVtb3ZlTGVhZGluZ0FuZFRyYWlsaW5nUXVvdGVzKFN0cmluZyYgdmFs
dWUpCi17Ci0gICAgdW5zaWduZWQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0gICAgaWYgKHZh
bHVlLnN0YXJ0c1dpdGgoJyInKSAmJiB2YWx1ZS5lbmRzV2l0aCgnIicpICYmIGxlbmd0aCA+IDEp
Ci0gICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEsIGxlbmd0aCAtIDIpOwotfQotCi1z
dGF0aWMgYm9vbCBnZXRQcm90ZWN0aW9uU3BhY2UoUmVzb3VyY2VIYW5kbGUqIGpvYiwgY29uc3Qg
UmVzb3VyY2VSZXNwb25zZSYgcmVzcG9uc2UsIFByb3RlY3Rpb25TcGFjZSYgcHJvdGVjdGlvblNw
YWNlKQotewotICAgIFJlc291cmNlSGFuZGxlSW50ZXJuYWwqIGQgPSBqb2ItPmdldEludGVybmFs
KCk7Ci0KLSAgICBDVVJMY29kZSBlcnI7Ci0KLSAgICBsb25nIHBvcnQgPSAwOwotICAgIGVyciA9
IGQtPm1fY3VybEhhbmRsZS5nZXRQcmltYXJ5UG9ydChwb3J0KTsKLSAgICBpZiAoZXJyICE9IENV
UkxFX09LKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBsb25nIGF2YWlsYWJsZUF1dGgg
PSBDVVJMQVVUSF9OT05FOwotICAgIGVyciA9IGQtPm1fY3VybEhhbmRsZS5nZXRIdHRwQXV0aEF2
YWlsKGF2YWlsYWJsZUF1dGgpOwotICAgIGlmIChlcnIgIT0gQ1VSTEVfT0spCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIFVSTCB1cmwgPSBkLT5tX2N1cmxIYW5kbGUuZ2V0RWZmZWN0aXZl
VVJMKCk7Ci0gICAgaWYgKCF1cmwuaXNWYWxpZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICBTdHJpbmcgaG9zdCA9IHVybC5ob3N0KCk7Ci0gICAgU3RyaW5nVmlldyBwcm90b2NvbCA9
IHVybC5wcm90b2NvbCgpOwotCi0gICAgU3RyaW5nIHJlYWxtOwotCi0gICAgY29uc3QgU3RyaW5n
IGF1dGhIZWFkZXIgPSByZXNwb25zZS5odHRwSGVhZGVyRmllbGQoSFRUUEhlYWRlck5hbWU6OkF1
dGhvcml6YXRpb24pOwotICAgIGNvbnN0IFN0cmluZyByZWFsbVN0cmluZyA9ICJyZWFsbT0iOwot
ICAgIGludCByZWFsbVBvcyA9IGF1dGhIZWFkZXIuZmluZChyZWFsbVN0cmluZyk7Ci0gICAgaWYg
KHJlYWxtUG9zID4gMCkgewotICAgICAgICByZWFsbSA9IGF1dGhIZWFkZXIuc3Vic3RyaW5nKHJl
YWxtUG9zICsgcmVhbG1TdHJpbmcubGVuZ3RoKCkpOwotICAgICAgICByZWFsbSA9IHJlYWxtLmxl
ZnQocmVhbG0uZmluZCgnLCcpKTsKLSAgICAgICAgcmVtb3ZlTGVhZGluZ0FuZFRyYWlsaW5nUXVv
dGVzKHJlYWxtKTsKLSAgICB9Ci0KLSAgICBQcm90ZWN0aW9uU3BhY2VTZXJ2ZXJUeXBlIHNlcnZl
clR5cGUgPSBQcm90ZWN0aW9uU3BhY2VTZXJ2ZXJIVFRQOwotICAgIGlmIChwcm90b2NvbCA9PSAi
aHR0cHMiKQotICAgICAgICBzZXJ2ZXJUeXBlID0gUHJvdGVjdGlvblNwYWNlU2VydmVySFRUUFM7
Ci0KLSAgICBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZSBhdXRoU2NoZW1lID0g
UHJvdGVjdGlvblNwYWNlQXV0aGVudGljYXRpb25TY2hlbWVVbmtub3duOwotCi0gICAgaWYgKGF2
YWlsYWJsZUF1dGggJiBDVVJMQVVUSF9CQVNJQykKLSAgICAgICAgYXV0aFNjaGVtZSA9IFByb3Rl
Y3Rpb25TcGFjZUF1dGhlbnRpY2F0aW9uU2NoZW1lSFRUUEJhc2ljOwotICAgIGlmIChhdmFpbGFi
bGVBdXRoICYgQ1VSTEFVVEhfRElHRVNUKQotICAgICAgICBhdXRoU2NoZW1lID0gUHJvdGVjdGlv
blNwYWNlQXV0aGVudGljYXRpb25TY2hlbWVIVFRQRGlnZXN0OwotICAgIGlmIChhdmFpbGFibGVB
dXRoICYgQ1VSTEFVVEhfR1NTTkVHT1RJQVRFKQotICAgICAgICBhdXRoU2NoZW1lID0gUHJvdGVj
dGlvblNwYWNlQXV0aGVudGljYXRpb25TY2hlbWVOZWdvdGlhdGU7Ci0gICAgaWYgKGF2YWlsYWJs
ZUF1dGggJiBDVVJMQVVUSF9OVExNKQotICAgICAgICBhdXRoU2NoZW1lID0gUHJvdGVjdGlvblNw
YWNlQXV0aGVudGljYXRpb25TY2hlbWVOVExNOwotCi0gICAgcHJvdGVjdGlvblNwYWNlID0gUHJv
dGVjdGlvblNwYWNlKGhvc3QsIHBvcnQsIHNlcnZlclR5cGUsIHJlYWxtLCBhdXRoU2NoZW1lKTsK
LQotICAgIHJldHVybiB0cnVlOwotfQotCi1zaXplX3QgUmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6
d2lsbFByZXBhcmVTZW5kRGF0YShjaGFyKiBwdHIsIHNpemVfdCBibG9ja1NpemUsIHNpemVfdCBu
dW1iZXJPZkJsb2NrcykKLXsKLSAgICBpZiAoIW1fZm9ybURhdGFTdHJlYW0uaGFzTW9yZUVsZW1l
bnRzKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgc2l6ZV90IHNpemUgPSBtX2Zvcm1EYXRh
U3RyZWFtLnJlYWQocHRyLCBibG9ja1NpemUsIG51bWJlck9mQmxvY2tzKTsKLQotICAgIC8vIFNv
bWV0aGluZyB3ZW50IHdyb25nIHNvIGNhbmNlbCB0aGUgam9iLgotICAgIGlmICghc2l6ZSkgewot
ICAgICAgICBtX2hhbmRsZS0+Y2FuY2VsKCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQot
ICAgIHJldHVybiBzaXplOwotCi19Ci0KLXZvaWQgUmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6ZGlk
UmVjZWl2ZUhlYWRlckxpbmUoY29uc3QgU3RyaW5nJiBoZWFkZXIpCi17Ci0gICAgQVNTRVJUKGlz
TWFpblRocmVhZCgpKTsKLQotICAgIGF1dG8gc3BsaXRQb3NpdGlvbiA9IGhlYWRlci5maW5kKCI6
Iik7Ci0gICAgaWYgKHNwbGl0UG9zaXRpb24gIT0gbm90Rm91bmQpIHsKLSAgICAgICAgU3RyaW5n
IGtleSA9IGhlYWRlci5sZWZ0KHNwbGl0UG9zaXRpb24pLnN0cmlwV2hpdGVTcGFjZSgpOwotICAg
ICAgICBTdHJpbmcgdmFsdWUgPSBoZWFkZXIuc3Vic3RyaW5nKHNwbGl0UG9zaXRpb24gKyAxKS5z
dHJpcFdoaXRlU3BhY2UoKTsKLQotICAgICAgICBpZiAoaXNBcHBlbmRhYmxlSGVhZGVyKGtleSkp
Ci0gICAgICAgICAgICBtX3Jlc3BvbnNlLmFkZEhUVFBIZWFkZXJGaWVsZChrZXksIHZhbHVlKTsK
LSAgICAgICAgZWxzZQotICAgICAgICAgICAgbV9yZXNwb25zZS5zZXRIVFRQSGVhZGVyRmllbGQo
a2V5LCB2YWx1ZSk7Ci0gICAgfSBlbHNlIGlmIChoZWFkZXIuc3RhcnRzV2l0aCgiSFRUUCIsIGZh
bHNlKSkgewotICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSByZXNwb25z
ZS4KLSAgICAgICAgLy8gRXh0cmFjdCB0aGUgaHR0cCBzdGF0dXMgdGV4dCBmcm9tIHRoaXMuCi0g
ICAgICAgIC8vCi0gICAgICAgIC8vIElmIHRoZSBGT0xMT1dMT0NBVElPTiBvcHRpb24gaXMgZW5h
YmxlZCBmb3IgdGhlIGN1cmwgaGFuZGxlIHRoZW4KLSAgICAgICAgLy8gY3VybCB3aWxsIGZvbGxv
dyB0aGUgcmVkaXJlY3Rpb25zIGludGVybmFsbHkuIFRodXMgdGhpcyBoZWFkZXIgY2FsbGJhY2sK
LSAgICAgICAgLy8gd2lsbCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uZSB0aW1lIHdpdGggdGhlIGxp
bmUgc3RhcnRpbmcgIkhUVFAiIGZvciBvbmUgam9iLgotICAgICAgICBsb25nIGh0dHBDb2RlID0g
MDsKLSAgICAgICAgbV9jdXJsSGFuZGxlLmdldFJlc3BvbnNlQ29kZShodHRwQ29kZSk7Ci0KLSAg
ICAgICAgU3RyaW5nIGh0dHBDb2RlU3RyaW5nID0gU3RyaW5nOjpudW1iZXIoaHR0cENvZGUpOwot
ICAgICAgICBpbnQgc3RhdHVzQ29kZVBvcyA9IGhlYWRlci5maW5kKGh0dHBDb2RlU3RyaW5nKTsK
LQotICAgICAgICBpZiAoc3RhdHVzQ29kZVBvcyAhPSBub3RGb3VuZCkgewotICAgICAgICAgICAg
Ly8gVGhlIHN0YXR1cyB0ZXh0IGlzIGFmdGVyIHRoZSBzdGF0dXMgY29kZS4KLSAgICAgICAgICAg
IFN0cmluZyBzdGF0dXMgPSBoZWFkZXIuc3Vic3RyaW5nKHN0YXR1c0NvZGVQb3MgKyBodHRwQ29k
ZVN0cmluZy5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBtX3Jlc3BvbnNlLnNldEhUVFBTdGF0dXNU
ZXh0KHN0YXR1cy5zdHJpcFdoaXRlU3BhY2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZv
aWQgUmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6ZGlkUmVjZWl2ZUFsbEhlYWRlcnMobG9uZyBodHRw
Q29kZSwgbG9uZyBsb25nIGNvbnRlbnRMZW5ndGgpCi17Ci0gICAgQVNTRVJUKGlzTWFpblRocmVh
ZCgpKTsKLQotICAgIG1fcmVzcG9uc2Uuc2V0RXhwZWN0ZWRDb250ZW50TGVuZ3RoKGNvbnRlbnRM
ZW5ndGgpOwotCi0gICAgbV9yZXNwb25zZS5zZXRVUkwobV9jdXJsSGFuZGxlLmdldEVmZmVjdGl2
ZVVSTCgpKTsKLQotICAgIG1fcmVzcG9uc2Uuc2V0SFRUUFN0YXR1c0NvZGUoaHR0cENvZGUpOwot
ICAgIG1fcmVzcG9uc2Uuc2V0TWltZVR5cGUoZXh0cmFjdE1JTUVUeXBlRnJvbU1lZGlhVHlwZSht
X3Jlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZChIVFRQSGVhZGVyTmFtZTo6Q29udGVudFR5cGUpKS5j
b252ZXJ0VG9BU0NJSUxvd2VyY2FzZSgpKTsKLSAgICBtX3Jlc3BvbnNlLnNldFRleHRFbmNvZGlu
Z05hbWUoZXh0cmFjdENoYXJzZXRGcm9tTWVkaWFUeXBlKG1fcmVzcG9uc2UuaHR0cEhlYWRlckZp
ZWxkKEhUVFBIZWFkZXJOYW1lOjpDb250ZW50VHlwZSkpKTsKLQotICAgIGlmIChtX3Jlc3BvbnNl
LmlzTXVsdGlwYXJ0KCkpIHsKLSAgICAgICAgU3RyaW5nIGJvdW5kYXJ5OwotICAgICAgICBib29s
IHBhcnNlZCA9IE11bHRpcGFydEhhbmRsZTo6ZXh0cmFjdEJvdW5kYXJ5KG1fcmVzcG9uc2UuaHR0
cEhlYWRlckZpZWxkKEhUVFBIZWFkZXJOYW1lOjpDb250ZW50VHlwZSksIGJvdW5kYXJ5KTsKLSAg
ICAgICAgaWYgKHBhcnNlZCkKLSAgICAgICAgICAgIG1fbXVsdGlwYXJ0SGFuZGxlID0gc3RkOjpt
YWtlX3VuaXF1ZTxNdWx0aXBhcnRIYW5kbGU+KG1faGFuZGxlLCBib3VuZGFyeSk7Ci0gICAgfQot
Ci0gICAgLy8gSFRUUCByZWRpcmVjdGlvbgotICAgIGlmIChpc0h0dHBSZWRpcmVjdChodHRwQ29k
ZSkpIHsKLSAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gbV9yZXNwb25zZS5odHRwSGVhZGVyRmll
bGQoSFRUUEhlYWRlck5hbWU6OkxvY2F0aW9uKTsKLSAgICAgICAgaWYgKCFsb2NhdGlvbi5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgICAgIFVSTCBuZXdVUkwgPSBVUkwobV9maXJzdFJlcXVlc3QudXJs
KCksIGxvY2F0aW9uKTsKLQotICAgICAgICAgICAgUmVzb3VyY2VSZXF1ZXN0IHJlZGlyZWN0ZWRS
ZXF1ZXN0ID0gbV9maXJzdFJlcXVlc3Q7Ci0gICAgICAgICAgICByZWRpcmVjdGVkUmVxdWVzdC5z
ZXRVUkwobmV3VVJMKTsKLSAgICAgICAgICAgIFJlc291cmNlUmVzcG9uc2UgcmVzcG9uc2UgPSBt
X3Jlc3BvbnNlOwotICAgICAgICAgICAgaWYgKGNsaWVudCgpKQotICAgICAgICAgICAgICAgIGNs
aWVudCgpLT53aWxsU2VuZFJlcXVlc3QobV9oYW5kbGUsIFdURk1vdmUocmVkaXJlY3RlZFJlcXVl
c3QpLCBXVEZNb3ZlKHJlc3BvbnNlKSk7Ci0KLSAgICAgICAgICAgIG1fZmlyc3RSZXF1ZXN0LnNl
dFVSTChuZXdVUkwpOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9IGVs
c2UgaWYgKGlzSHR0cEF1dGhlbnRpY2F0aW9uKGh0dHBDb2RlKSkgewotICAgICAgICBQcm90ZWN0
aW9uU3BhY2UgcHJvdGVjdGlvblNwYWNlOwotICAgICAgICBpZiAoZ2V0UHJvdGVjdGlvblNwYWNl
KG1faGFuZGxlLCBtX3Jlc3BvbnNlLCBwcm90ZWN0aW9uU3BhY2UpKSB7Ci0gICAgICAgICAgICBD
cmVkZW50aWFsIGNyZWRlbnRpYWw7Ci0gICAgICAgICAgICBBdXRoZW50aWNhdGlvbkNoYWxsZW5n
ZSBjaGFsbGVuZ2UocHJvdGVjdGlvblNwYWNlLCBjcmVkZW50aWFsLCBtX2F1dGhGYWlsdXJlQ291
bnQsIG1fcmVzcG9uc2UsIFJlc291cmNlRXJyb3IoKSk7Ci0gICAgICAgICAgICBjaGFsbGVuZ2Uu
c2V0QXV0aGVudGljYXRpb25DbGllbnQobV9oYW5kbGUpOwotICAgICAgICAgICAgbV9oYW5kbGUt
PmRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShjaGFsbGVuZ2UpOwotICAgICAgICAg
ICAgbV9hdXRoRmFpbHVyZUNvdW50Kys7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICBpZiAoY2xpZW50KCkpIHsKLSAgICAgICAgaWYgKGlzSHR0cE5vdE1vZGlm
aWVkKGh0dHBDb2RlKSkgewotICAgICAgICAgICAgY29uc3QgU3RyaW5nJiB1cmwgPSBtX2ZpcnN0
UmVxdWVzdC51cmwoKS5zdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChDdXJsQ2FjaGVNYW5hZ2Vy
OjpnZXRJbnN0YW5jZSgpLmdldENhY2hlZFJlc3BvbnNlKHVybCwgbV9yZXNwb25zZSkpIHsKLSAg
ICAgICAgICAgICAgICBpZiAobV9hZGRlZENhY2hlVmFsaWRhdGlvbkhlYWRlcnMpIHsKLSAgICAg
ICAgICAgICAgICAgICAgbV9yZXNwb25zZS5zZXRIVFRQU3RhdHVzQ29kZSgyMDApOwotICAgICAg
ICAgICAgICAgICAgICBtX3Jlc3BvbnNlLnNldEhUVFBTdGF0dXNUZXh0KCJPSyIpOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjbGllbnQoKS0+
ZGlkUmVjZWl2ZVJlc3BvbnNlKG1faGFuZGxlLCBSZXNvdXJjZVJlc3BvbnNlKG1fcmVzcG9uc2Up
KTsKLSAgICAgICAgQ3VybENhY2hlTWFuYWdlcjo6Z2V0SW5zdGFuY2UoKS5kaWRSZWNlaXZlUmVz
cG9uc2UoKm1faGFuZGxlLCBtX3Jlc3BvbnNlKTsKLSAgICB9Ci0KLSAgICBtX3Jlc3BvbnNlLnNl
dFJlc3BvbnNlRmlyZWQodHJ1ZSk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6
ZGlkUmVjZWl2ZUNvbnRlbnREYXRhKCkKLXsKLSAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwot
Ci0gICAgaWYgKCFtX3Jlc3BvbnNlLnJlc3BvbnNlRmlyZWQoKSkKLSAgICAgICAgaGFuZGxlTG9j
YWxSZWNlaXZlUmVzcG9uc2UoKTsKLQotICAgIFZlY3RvcjxjaGFyPiBidWZmZXI7Ci0gICAgewot
ICAgICAgICBMb2NrSG9sZGVyIGxvY2tlciB7IG1fcmVjZWl2ZWRCdWZmZXJNdXRleCB9OwotICAg
ICAgICBidWZmZXIgPSBXVEZNb3ZlKG1fcmVjZWl2ZWRCdWZmZXIpOwotICAgIH0KLQotICAgIGNo
YXIqIHB0ciA9IGJ1ZmZlci5iZWdpbigpOwotICAgIHNpemVfdCBzaXplID0gYnVmZmVyLnNpemUo
KTsKLQotICAgIGlmIChtX211bHRpcGFydEhhbmRsZSkKLSAgICAgICAgbV9tdWx0aXBhcnRIYW5k
bGUtPmNvbnRlbnRSZWNlaXZlZChzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4ocHRyKSwgc2l6ZSk7
Ci0gICAgZWxzZSBpZiAoY2xpZW50KCkpIHsKLSAgICAgICAgY2xpZW50KCktPmRpZFJlY2VpdmVE
YXRhKG1faGFuZGxlLCBwdHIsIHNpemUsIDApOwotICAgICAgICBDdXJsQ2FjaGVNYW5hZ2VyOjpn
ZXRJbnN0YW5jZSgpLmRpZFJlY2VpdmVEYXRhKCptX2hhbmRsZSwgcHRyLCBzaXplKTsKLSAgICB9
Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIG9idGFpbiBIVFRQIFBPU1Qgb3IgUFVUIGRhdGEu
Ci1JdGVyYXRlIHRocm91Z2ggRm9ybURhdGEgZWxlbWVudHMgYW5kIHVwbG9hZCBmaWxlcy4KLUNh
cmVmdWxseSByZXNwZWN0IHRoZSBnaXZlbiBidWZmZXIgc2l6ZSBhbmQgZmlsbCB0aGUgcmVzdCBv
ZiB0aGUgZGF0YSBhdCB0aGUgbmV4dCBjYWxscy4KLSovCi1zaXplX3QgUmVzb3VyY2VIYW5kbGVJ
bnRlcm5hbDo6cmVhZENhbGxiYWNrKGNoYXIqIHB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBubWVt
Yiwgdm9pZCogZGF0YSkKLXsKLSAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKLQotICAgIFJl
c291cmNlSGFuZGxlSW50ZXJuYWwqIGQgPSBzdGF0aWNfY2FzdDxSZXNvdXJjZUhhbmRsZUludGVy
bmFsKj4oZGF0YSk7Ci0KLSAgICBpZiAoZC0+bV9jYW5jZWxsZWQpCi0gICAgICAgIHJldHVybiAw
OwotCi0gICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB3aGVuIGRlZmVycmVkIGxvYWRp
bmcgaXMgYWN0aXZhdGVkLgotICAgIEFTU0VSVCghZC0+bV9kZWZlcnNMb2FkaW5nKTsKLQotICAg
IGlmICghc2l6ZSB8fCAhbm1lbWIpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGQt
PndpbGxQcmVwYXJlU2VuZERhdGEocHRyLCBzaXplLCBubWVtYik7Ci19Ci0KLS8qCi0qIFRoaXMg
aXMgYmVpbmcgY2FsbGVkIGZvciBlYWNoIEhUVFAgaGVhZGVyIGluIHRoZSByZXNwb25zZS4gVGhp
cyBpbmNsdWRlcyAnXHJcbicKLSogZm9yIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGhlYWRlci4KLSoK
LSogV2Ugd2lsbCBhZGQgZWFjaCBIVFRQIEhlYWRlciB0byB0aGUgUmVzb3VyY2VSZXNwb25zZSBh
bmQgb24gdGhlIHRlcm1pbmF0aW9uCi0qIG9mIHRoZSBoZWFkZXIgKFxyXG4pIHdlIHdpbGwgcGFy
c2UgQ29udGVudC1UeXBlIGFuZCBDb250ZW50LURpc3Bvc2l0aW9uIGFuZAotKiB1cGRhdGUgdGhl
IFJlc291cmNlUmVzcG9uc2UgYW5kIHRoZW4gc2VuZCBpdCBhd2F5LgotKgotKi8KLXNpemVfdCBS
ZXNvdXJjZUhhbmRsZUludGVybmFsOjpoZWFkZXJDYWxsYmFjayhjaGFyKiBwdHIsIHNpemVfdCBz
aXplLCBzaXplX3Qgbm1lbWIsIHZvaWQqIGRhdGEpCi17Ci0gICAgQVNTRVJUKCFpc01haW5UaHJl
YWQoKSk7Ci0KLSAgICBSZXNvdXJjZUhhbmRsZUludGVybmFsKiBkID0gc3RhdGljX2Nhc3Q8UmVz
b3VyY2VIYW5kbGVJbnRlcm5hbCo+KGRhdGEpOwotICAgIFJlc291cmNlSGFuZGxlKiBqb2IgPSBk
LT5tX2hhbmRsZTsKLQotICAgIGlmIChkLT5tX2NhbmNlbGxlZCkKLSAgICAgICAgcmV0dXJuIDA7
Ci0KLSAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdoZW4gZGVmZXJyZWQgbG9hZGlu
ZyBpcyBhY3RpdmF0ZWQuCi0gICAgQVNTRVJUKCFkLT5tX2RlZmVyc0xvYWRpbmcpOwotCi0gICAg
c2l6ZV90IHRvdGFsU2l6ZSA9IHNpemUgKiBubWVtYjsKLQotICAgIFN0cmluZyBoZWFkZXIoc3Rh
dGljX2Nhc3Q8Y29uc3QgY2hhcio+KHB0ciksIHRvdGFsU2l6ZSk7Ci0KLSAgICAvKgotICAgICog
YSkgV2UgY2FuIGZpbmlzaCBhbmQgc2VuZCB0aGUgUmVzb3VyY2VSZXNwb25zZQotICAgICogYikg
V2Ugd2lsbCBhZGQgdGhlIGN1cnJlbnQgaGVhZGVyIHRvIHRoZSBIVFRQSGVhZGVyTWFwIG9mIHRo
ZSBSZXNvdXJjZVJlc3BvbnNlCi0gICAgKgotICAgICogVGhlIEhUVFAgc3RhbmRhcmQgcmVxdWly
ZXMgdG8gdXNlIFxyXG4gYnV0IGZvciBjb21wYXRpYmlsaXR5IGl0IHJlY29tbWVuZHMgdG8KLSAg
ICAqIGFjY2VwdCBhbHNvIFxuLgotICAgICovCi0gICAgaWYgKGhlYWRlciA9PSBBdG9taWNTdHJp
bmcoIlxyXG4iKSB8fCBoZWFkZXIgPT0gQXRvbWljU3RyaW5nKCJcbiIpKSB7Ci0gICAgICAgIGxv
bmcgaHR0cENvZGUgPSAwOwotICAgICAgICBkLT5tX2N1cmxIYW5kbGUuZ2V0UmVzcG9uc2VDb2Rl
KGh0dHBDb2RlKTsKLQotICAgICAgICBpZiAoIWh0dHBDb2RlKSB7Ci0gICAgICAgICAgICAvLyBD
b21lcyBoZXJlIHdoZW4gcmVjZWl2aW5nIDIwMCBDb25uZWN0aW9uIEVzdGFibGlzaGVkLiBKdXN0
IHJldHVybi4KLSAgICAgICAgICAgIHJldHVybiB0b3RhbFNpemU7Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKGlzSHR0cEluZm8oaHR0cENvZGUpKSB7Ci0gICAgICAgICAgICAvLyBKdXN0IHJldHVy
biB3aGVuIHJlY2VpdmluZyBodHRwIGluZm8sIGUuZy4gSFRUUC8xLjEgMTAwIENvbnRpbnVlLgot
ICAgICAgICAgICAgLy8gSWYgbm90LCB0aGUgcmVxdWVzdCBtaWdodCBiZSBjYW5jZWxsZWQsIGJl
Y2F1c2UgdGhlIE1JTUUgdHlwZSB3aWxsIGJlIGVtcHR5IGZvciB0aGlzIHJlc3BvbnNlLgotICAg
ICAgICAgICAgcmV0dXJuIHRvdGFsU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvbmcgbG9u
ZyBjb250ZW50TGVuZ3RoID0gMDsKLSAgICAgICAgZC0+bV9jdXJsSGFuZGxlLmdldENvbnRlbnRM
ZW5naHREb3dubG9hZChjb250ZW50TGVuZ3RoKTsKLQotICAgICAgICBjYWxsT25NYWluVGhyZWFk
KFtqb2IgPSBSZWZQdHI8UmVzb3VyY2VIYW5kbGU+KGpvYiksIGQsIGh0dHBDb2RlLCBjb250ZW50
TGVuZ3RoXSB7Ci0gICAgICAgICAgICBpZiAoIWQtPm1fY2FuY2VsbGVkKQotICAgICAgICAgICAg
ICAgIGQtPmRpZFJlY2VpdmVBbGxIZWFkZXJzKGh0dHBDb2RlLCBjb250ZW50TGVuZ3RoKTsKLSAg
ICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2FsbE9uTWFpblRocmVhZChbam9iID0g
UmVmUHRyPFJlc291cmNlSGFuZGxlPihqb2IpLCBkLCBoZWFkZXJdIHsKLSAgICAgICAgICAgIGlm
ICghZC0+bV9jYW5jZWxsZWQpCi0gICAgICAgICAgICAgICAgZC0+ZGlkUmVjZWl2ZUhlYWRlckxp
bmUoaGVhZGVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRvdGFsU2l6ZTsK
LX0KLQotLy8gY2FsbGVkIHdpdGggZGF0YSBhZnRlciBhbGwgaGVhZGVycyBoYXZlIGJlZW4gcHJv
Y2Vzc2VkIHZpYSBoZWFkZXJDYWxsYmFjawotc2l6ZV90IFJlc291cmNlSGFuZGxlSW50ZXJuYWw6
OndyaXRlQ2FsbGJhY2soY2hhciogcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5tZW1iLCB2b2lk
KiBkYXRhKQotewotICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwotCi0gICAgUmVzb3VyY2VI
YW5kbGVJbnRlcm5hbCogZCA9IHN0YXRpY19jYXN0PFJlc291cmNlSGFuZGxlSW50ZXJuYWwqPihk
YXRhKTsKLSAgICBSZXNvdXJjZUhhbmRsZSogam9iID0gZC0+bV9oYW5kbGU7Ci0KLSAgICBpZiAo
ZC0+bV9jYW5jZWxsZWQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gV2Ugc2hvdWxkIG5l
dmVyIGJlIGNhbGxlZCB3aGVuIGRlZmVycmVkIGxvYWRpbmcgaXMgYWN0aXZhdGVkLgotICAgIEFT
U0VSVCghZC0+bV9kZWZlcnNMb2FkaW5nKTsKLQotICAgIHNpemVfdCB0b3RhbFNpemUgPSBzaXpl
ICogbm1lbWI7Ci0KLSAgICAvLyB0aGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgYnV0IGFwcGFy
ZW50bHkgaXMuIENVUkwgd3JpdGVzIHRoZSBkYXRhCi0gICAgLy8gb2YgaHRtbCBwYWdlIGV2ZW4g
aWYgaXQgaXMgYSByZWRpcmVjdCB0aGF0IHdhcyBoYW5kbGVkIGludGVybmFsbHkKLSAgICAvLyBj
YW4gYmUgb2JzZXJ2ZWQgZS5nLiBvbiBnbWFpbC5jb20KLSAgICBsb25nIGh0dHBDb2RlID0gMDsK
LSAgICBDVVJMY29kZSBlcnJDZCA9IGQtPm1fY3VybEhhbmRsZS5nZXRSZXNwb25zZUNvZGUoaHR0
cENvZGUpOwotICAgIGlmIChDVVJMRV9PSyA9PSBlcnJDZCAmJiBodHRwQ29kZSA+PSAzMDAgJiYg
aHR0cENvZGUgPCA0MDApCi0gICAgICAgIHJldHVybiB0b3RhbFNpemU7Ci0KLSAgICBib29sIHNo
b3VsZENhbGwgeyBmYWxzZSB9OwotICAgIHsKLSAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIoZC0+
bV9yZWNlaXZlZEJ1ZmZlck11dGV4KTsKLSAgICAgICAgCi0gICAgICAgIGlmIChkLT5tX3JlY2Vp
dmVkQnVmZmVyLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHNob3VsZENhbGwgPSB0cnVlOwotICAg
ICAgICAKLSAgICAgICAgZC0+bV9yZWNlaXZlZEJ1ZmZlci5hcHBlbmQocHRyLCB0b3RhbFNpemUp
OwotICAgIH0KLQotICAgIGlmIChzaG91bGRDYWxsKSB7Ci0gICAgICAgIGNhbGxPbk1haW5UaHJl
YWQoW2pvYiA9IFJlZlB0cjxSZXNvdXJjZUhhbmRsZT4oam9iKSwgZF0gewotICAgICAgICAgICAg
aWYgKCFkLT5tX2NhbmNlbGxlZCkKLSAgICAgICAgICAgICAgICBkLT5kaWRSZWNlaXZlQ29udGVu
dERhdGEoKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRvdGFsU2l6ZTsKLX0K
LQogLy8gc3luYyBsb2FkZXIKIAogdm9pZCBSZXNvdXJjZUhhbmRsZTo6cGxhdGZvcm1Mb2FkUmVz
b3VyY2VTeW5jaHJvbm91c2x5KE5ldHdvcmtpbmdDb250ZXh0KiBjb250ZXh0LCBjb25zdCBSZXNv
dXJjZVJlcXVlc3QmIHJlcXVlc3QsIFN0b3JlZENyZWRlbnRpYWxzLCBSZXNvdXJjZUVycm9yJiBl
cnJvciwgUmVzb3VyY2VSZXNwb25zZSYgcmVzcG9uc2UsIFZlY3RvcjxjaGFyPiYgZGF0YSkKQEAg
LTk2NiwxMDMgKzIzOSwxMyBAQCB2b2lkIFJlc291cmNlSGFuZGxlOjpwbGF0Zm9ybUxvYWRSZXNv
dXJjCiAgICAgU3luY2hyb25vdXNMb2FkZXJDbGllbnQgY2xpZW50OwogICAgIFJlZlB0cjxSZXNv
dXJjZUhhbmRsZT4gaGFuZGxlID0gYWRvcHRSZWYobmV3IFJlc291cmNlSGFuZGxlKGNvbnRleHQs
IHJlcXVlc3QsICZjbGllbnQsIGZhbHNlLCBmYWxzZSkpOwogCi0gICAgaGFuZGxlLT5kLT5kaXNw
YXRjaFN5bmNocm9ub3VzSm9iKCk7CisgICAgaGFuZGxlLT5kLT5tX2RlbGVnYXRlLT5kaXNwYXRj
aFN5bmNocm9ub3VzSm9iKCk7CiAKICAgICBlcnJvciA9IGNsaWVudC5lcnJvcigpOwogICAgIGRh
dGEuc3dhcChjbGllbnQubXV0YWJsZURhdGEoKSk7CiAgICAgcmVzcG9uc2UgPSBjbGllbnQucmVz
cG9uc2UoKTsKIH0KIAotdm9pZCBSZXNvdXJjZUhhbmRsZUludGVybmFsOjpkaXNwYXRjaFN5bmNo
cm9ub3VzSm9iKCkKLXsKLSAgICBVUkwga3VybCA9IG1fZmlyc3RSZXF1ZXN0LnVybCgpOwotCi0g
ICAgaWYgKGt1cmwucHJvdG9jb2xJc0RhdGEoKSkgewotICAgICAgICBoYW5kbGVEYXRhVVJMKCk7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBJZiBkZWZlcnNMb2FkaW5nIGlzIHRy
dWUgYW5kIHdlIGNhbGwgY3VybF9lYXN5X3BlcmZvcm0KLSAgICAvLyBvbiBhIHBhdXNlZCBoYW5k
bGUsIGxpYmNVUkwgd291bGQgZG8gdGhlIHRyYW5zZmVydCBhbnl3YXkKLSAgICAvLyBhbmQgd2Ug
d291bGQgYXNzZXJ0IHNvIGZvcmNlIGRlZmVyc0xvYWRpbmcgdG8gYmUgZmFsc2UuCi0gICAgbV9k
ZWZlcnNMb2FkaW5nID0gZmFsc2U7Ci0KLSAgICBpbml0aWFsaXplKCk7Ci0KLSAgICAvLyBjdXJs
X2Vhc3lfcGVyZm9ybSBibG9ja3MgdW50aWwgdGhlIHRyYW5zZmVydCBpcyBmaW5pc2hlZC4KLSAg
ICBDVVJMY29kZSByZXQgPSBtX2N1cmxIYW5kbGUucGVyZm9ybSgpOwotCi0gICAgY2FsY3VsYXRl
V2ViVGltaW5nSW5mb3JtYXRpb25zKCk7Ci0KLSAgICBpZiAoY2xpZW50KCkpIHsKLSAgICAgICAg
aWYgKHJldCAhPSBDVVJMRV9PSykKLSAgICAgICAgICAgIGNsaWVudCgpLT5kaWRGYWlsKG1faGFu
ZGxlLCBSZXNvdXJjZUVycm9yKEN1cmxDb250ZXh0OjplcnJvckRvbWFpbiwgbV9jdXJsSGFuZGxl
LmVycm9yQ29kZSgpLCBtX2N1cmxIYW5kbGUuZ2V0RWZmZWN0aXZlVVJMKCksIG1fY3VybEhhbmRs
ZS5lcnJvckRlc2NyaXB0aW9uKCksIG1fY3VybEhhbmRsZS5nZXRTc2xFcnJvcnMoKSkpOwotICAg
ICAgICBlbHNlCi0gICAgICAgICAgICBjbGllbnQoKS0+ZGlkUmVjZWl2ZVJlc3BvbnNlKG1faGFu
ZGxlLCBSZXNvdXJjZVJlc3BvbnNlKG1fcmVzcG9uc2UpKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVz
b3VyY2VIYW5kbGVJbnRlcm5hbDo6aGFuZGxlRGF0YVVSTCgpCi17Ci0gICAgQVNTRVJUKG1fZmly
c3RSZXF1ZXN0LnVybCgpLnByb3RvY29sSXNEYXRhKCkpOwotICAgIFN0cmluZyB1cmwgPSBtX2Zp
cnN0UmVxdWVzdC51cmwoKS5zdHJpbmcoKTsKLQotICAgIEFTU0VSVChjbGllbnQoKSk7Ci0KLSAg
ICBpbnQgaW5kZXggPSB1cmwuZmluZCgnLCcpOwotICAgIGlmIChpbmRleCA9PSAtMSkgewotICAg
ICAgICBjbGllbnQoKS0+Y2Fubm90U2hvd1VSTChtX2hhbmRsZSk7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBTdHJpbmcgbWVkaWFUeXBlID0gdXJsLnN1YnN0cmluZyg1LCBpbmRleCAt
IDUpOwotICAgIFN0cmluZyBkYXRhID0gdXJsLnN1YnN0cmluZyhpbmRleCArIDEpOwotCi0gICAg
Ym9vbCBiYXNlNjQgPSBtZWRpYVR5cGUuZW5kc1dpdGgoIjtiYXNlNjQiLCBmYWxzZSk7Ci0gICAg
aWYgKGJhc2U2NCkKLSAgICAgICAgbWVkaWFUeXBlID0gbWVkaWFUeXBlLmxlZnQobWVkaWFUeXBl
Lmxlbmd0aCgpIC0gNyk7Ci0KLSAgICBpZiAobWVkaWFUeXBlLmlzRW1wdHkoKSkKLSAgICAgICAg
bWVkaWFUeXBlID0gInRleHQvcGxhaW4iOwotCi0gICAgU3RyaW5nIG1pbWVUeXBlID0gZXh0cmFj
dE1JTUVUeXBlRnJvbU1lZGlhVHlwZShtZWRpYVR5cGUpOwotICAgIFN0cmluZyBjaGFyc2V0ID0g
ZXh0cmFjdENoYXJzZXRGcm9tTWVkaWFUeXBlKG1lZGlhVHlwZSk7Ci0KLSAgICBpZiAoY2hhcnNl
dC5pc0VtcHR5KCkpCi0gICAgICAgIGNoYXJzZXQgPSAiVVMtQVNDSUkiOwotCi0gICAgUmVzb3Vy
Y2VSZXNwb25zZSByZXNwb25zZTsKLSAgICByZXNwb25zZS5zZXRNaW1lVHlwZShtaW1lVHlwZSk7
Ci0gICAgcmVzcG9uc2Uuc2V0VGV4dEVuY29kaW5nTmFtZShjaGFyc2V0KTsKLSAgICByZXNwb25z
ZS5zZXRVUkwobV9maXJzdFJlcXVlc3QudXJsKCkpOwotCi0gICAgaWYgKGJhc2U2NCkgewotICAg
ICAgICBkYXRhID0gZGVjb2RlVVJMRXNjYXBlU2VxdWVuY2VzKGRhdGEpOwotICAgICAgICBjbGll
bnQoKS0+ZGlkUmVjZWl2ZVJlc3BvbnNlKG1faGFuZGxlLCBXVEZNb3ZlKHJlc3BvbnNlKSk7Ci0K
LSAgICAgICAgLy8gZGlkUmVjZWl2ZVJlc3BvbnNlIG1pZ2h0IGNhdXNlIHRoZSBjbGllbnQgdG8g
YmUgZGVsZXRlZC4KLSAgICAgICAgaWYgKGNsaWVudCgpKSB7Ci0gICAgICAgICAgICBWZWN0b3I8
Y2hhcj4gb3V0OwotICAgICAgICAgICAgaWYgKGJhc2U2NERlY29kZShkYXRhLCBvdXQsIEJhc2U2
NElnbm9yZVNwYWNlc0FuZE5ld0xpbmVzKSAmJiBvdXQuc2l6ZSgpID4gMCkKLSAgICAgICAgICAg
ICAgICBjbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEobV9oYW5kbGUsIG91dC5kYXRhKCksIG91dC5z
aXplKCksIDApOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVGV4dEVuY29kaW5n
IGVuY29kaW5nKGNoYXJzZXQpOwotICAgICAgICBkYXRhID0gZGVjb2RlVVJMRXNjYXBlU2VxdWVu
Y2VzKGRhdGEsIGVuY29kaW5nKTsKLSAgICAgICAgY2xpZW50KCktPmRpZFJlY2VpdmVSZXNwb25z
ZShtX2hhbmRsZSwgV1RGTW92ZShyZXNwb25zZSkpOwotCi0gICAgICAgIC8vIGRpZFJlY2VpdmVS
ZXNwb25zZSBtaWdodCBjYXVzZSB0aGUgY2xpZW50IHRvIGJlIGRlbGV0ZWQuCi0gICAgICAgIGlm
IChjbGllbnQoKSkgewotICAgICAgICAgICAgQ1N0cmluZyBlbmNvZGVkRGF0YSA9IGVuY29kaW5n
LmVuY29kZShkYXRhLCBVUkxFbmNvZGVkRW50aXRpZXNGb3JVbmVuY29kYWJsZXMpOwotICAgICAg
ICAgICAgaWYgKGVuY29kZWREYXRhLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgIGNsaWVudCgp
LT5kaWRSZWNlaXZlRGF0YShtX2hhbmRsZSwgZW5jb2RlZERhdGEuZGF0YSgpLCBlbmNvZGVkRGF0
YS5sZW5ndGgoKSwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY2xpZW50KCkpCi0g
ICAgICAgIGNsaWVudCgpLT5kaWRGaW5pc2hMb2FkaW5nKG1faGFuZGxlKTsKLX0KLQogfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQogCiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3Vy
bERlbGVnYXRlLmNwcAkocmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw5NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDYgQXBwbGUg
SW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBN
aWNoYWVsIEVtbWVsIG1pa2UuZW1tZWxAZ21haWwuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
U29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRhaW5tZW50IEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgTkFWRVIgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlLmgiCisKKyNp
ZiBVU0UoQ1VSTCkKKworI2luY2x1ZGUgIkNyZWRlbnRpYWxTdG9yYWdlLmgiCisjaW5jbHVkZSAi
Q3VybENhY2hlTWFuYWdlci5oIgorI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKKyNpbmNs
dWRlICJNdWx0aXBhcnRIYW5kbGUuaCIKKyNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZS5oIgorI2lu
Y2x1ZGUgIlJlc291cmNlSGFuZGxlSW50ZXJuYWwuaCIKKyNpbmNsdWRlICJTU0xIYW5kbGUuaCIK
KyNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKKyNpbmNsdWRlICJUaHJlYWRTYWZlRGF0YUJ1ZmZl
ci5oIgorI2luY2x1ZGUgIlVSTC5oIgorI2luY2x1ZGUgPHd0Zi9NYWluVGhyZWFkLmg+CisjaW5j
bHVkZSA8d3RmL3RleHQvQmFzZTY0Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUmVzb3Vy
Y2VIYW5kbGVDdXJsRGVsZWdhdGU6OlJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlKFJlc291cmNl
SGFuZGxlKiBoYW5kbGUpCisgICAgOiBtX2hhbmRsZShoYW5kbGUpCisgICAgLCBtX2Zvcm1EYXRh
U3RyZWFtKGhhbmRsZSkKKyAgICAsIG1fZmlyc3RSZXF1ZXN0KGhhbmRsZS0+Zmlyc3RSZXF1ZXN0
KCkuaXNvbGF0ZWRDb3B5KCkpCisgICAgLCBtX2N1c3RvbUhUVFBIZWFkZXJGaWVsZHMobV9maXJz
dFJlcXVlc3QuaHR0cEhlYWRlckZpZWxkcygpLmlzb2xhdGVkQ29weSgpKQorICAgICwgbV9zaG91
bGRVc2VDcmVkZW50aWFsU3RvcmFnZShoYW5kbGUtPnNob3VsZFVzZUNyZWRlbnRpYWxTdG9yYWdl
KCkpCisgICAgLCBtX3VzZXIoaGFuZGxlLT5nZXRJbnRlcm5hbCgpLT5tX3VzZXIuaXNvbGF0ZWRD
b3B5KCkpCisgICAgLCBtX3Bhc3MoaGFuZGxlLT5nZXRJbnRlcm5hbCgpLT5tX3Bhc3MuaXNvbGF0
ZWRDb3B5KCkpCisgICAgLCBtX2luaXRpYWxDcmVkZW50aWFsKGhhbmRsZS0+Z2V0SW50ZXJuYWwo
KS0+bV9pbml0aWFsQ3JlZGVudGlhbCkKKyAgICAsIG1fZGVmZXJzTG9hZGluZyhoYW5kbGUtPmdl
dEludGVybmFsKCktPm1fZGVmZXJzTG9hZGluZykKK3sKKyAgICBjb25zdCBVUkwmIHVybCA9IG1f
Zmlyc3RSZXF1ZXN0LnVybCgpOworCisgICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7CisgICAg
ICAgIC8vIERldGVybWluZSB0aGUgTUlNRSB0eXBlIGJhc2VkIG9uIHRoZSBwYXRoLgorICAgICAg
ICByZXNwb25zZSgpLnNldE1pbWVUeXBlKE1JTUVUeXBlUmVnaXN0cnk6OmdldE1JTUVUeXBlRm9y
UGF0aCh1cmwpKTsKKyAgICB9CisKKyAgICBpZiAobV9jdXN0b21IVFRQSGVhZGVyRmllbGRzLnNp
emUoKSkgeworICAgICAgICBhdXRvJiBjYWNoZSA9IEN1cmxDYWNoZU1hbmFnZXI6OmdldEluc3Rh
bmNlKCk7CisgICAgICAgIGJvb2wgaGFzQ2FjaGVIZWFkZXJzID0gbV9jdXN0b21IVFRQSGVhZGVy
RmllbGRzLmNvbnRhaW5zKEhUVFBIZWFkZXJOYW1lOjpJZk1vZGlmaWVkU2luY2UpIHx8IG1fY3Vz
dG9tSFRUUEhlYWRlckZpZWxkcy5jb250YWlucyhIVFRQSGVhZGVyTmFtZTo6SWZOb25lTWF0Y2gp
OworICAgICAgICBpZiAoIWhhc0NhY2hlSGVhZGVycyAmJiBjYWNoZS5pc0NhY2hlZCh1cmwpKSB7
CisgICAgICAgICAgICBjYWNoZS5hZGRDYWNoZUVudHJ5Q2xpZW50KHVybCwgbV9oYW5kbGUpOwor
ICAgICAgICAgICAgLy8gYXBwZW5kIGFkZGl0aW9uYWwgY2FjaGUgaW5mb3JtYXRpb24KKyAgICAg
ICAgICAgIGZvciAoYXV0byBlbnRyeSA6IGNhY2hlLnJlcXVlc3RIZWFkZXJzKHVybCkpCisgICAg
ICAgICAgICAgICAgbV9jdXN0b21IVFRQSGVhZGVyRmllbGRzLnNldChlbnRyeS5rZXksIGVudHJ5
LnZhbHVlKTsKKyAgICAgICAgICAgIG1fYWRkZWRDYWNoZVZhbGlkYXRpb25IZWFkZXJzID0gdHJ1
ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fc3NsQ2xpZW50Q2VydGlmaWNhdGUgPSBnZXRT
U0xDbGllbnRDZXJ0aWZpY2F0ZSh1cmwuaG9zdCgpKTsKKworICAgIHNldHVwQXV0aGVudGljYXRp
b24oKTsKK30KKworUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6On5SZXNvdXJjZUhhbmRsZUN1
cmxEZWxlZ2F0ZSgpCit7Cit9CisKK2Jvb2wgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6Omhh
c0hhbmRsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuICEhbV9oYW5kbGU7Cit9CisKK3ZvaWQgUmVz
b3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnJlbGVhc2VIYW5kbGUoKQoreworICAgIG1faGFuZGxl
ID0gbnVsbHB0cjsKK30KKworYm9vbCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6c3RhcnQo
KQoreworICAgIG1fam9iID0gQ3VybEpvYk1hbmFnZXI6OnNpbmdsZXRvbigpLmFkZChtX2N1cmxI
YW5kbGUsICp0aGlzKTsKKyAgICByZXR1cm4gISFtX2pvYjsKK30KKwordm9pZCBSZXNvdXJjZUhh
bmRsZUN1cmxEZWxlZ2F0ZTo6Y2FuY2VsKCkKK3sKKyAgICByZWxlYXNlSGFuZGxlKCk7CisgICAg
Q3VybEpvYk1hbmFnZXI6OnNpbmdsZXRvbigpLmNhbmNlbChtX2pvYik7Cit9CisKK3ZvaWQgUmVz
b3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldERlZmVyc0xvYWRpbmcoYm9vbCBkZWZlcnMpCit7
CisgICAgaWYgKGRlZmVycyA9PSBtX2RlZmVyc0xvYWRpbmcpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG1fZGVmZXJzTG9hZGluZyA9IGRlZmVyczsKKworICAgIGF1dG8gYWN0aW9uID0gW3Byb3Rl
Y3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKV0oKSB7CisgICAgICAgIGlmIChwcm90ZWN0ZWRUaGlz
LT5tX2RlZmVyc0xvYWRpbmcpIHsKKyAgICAgICAgICAgIENVUkxjb2RlIGVycm9yID0gcHJvdGVj
dGVkVGhpcy0+bV9jdXJsSGFuZGxlLnBhdXNlKENVUkxQQVVTRV9BTEwpOworICAgICAgICAgICAg
Ly8gSWYgd2UgY291bGQgbm90IGRlZmVyIHRoZSBoYW5kbGUsIHNvIGRvbid0IGRvIGl0LgorICAg
ICAgICAgICAgaWYgKGVycm9yICE9IENVUkxFX09LKQorICAgICAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENVUkxjb2RlIGVycm9yID0gcHJvdGVjdGVk
VGhpcy0+bV9jdXJsSGFuZGxlLnBhdXNlKENVUkxQQVVTRV9DT05UKTsKKyAgICAgICAgICAgIGlm
IChlcnJvciAhPSBDVVJMRV9PSykgeworICAgICAgICAgICAgICAgIC8vIFJlc3RhcnRpbmcgdGhl
IGhhbmRsZSBoYXMgZmFpbGVkIHNvIGp1c3QgY2FuY2VsIGl0LgorICAgICAgICAgICAgICAgIHBy
b3RlY3RlZFRoaXMtPm1faGFuZGxlLT5jYW5jZWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH07CisKKyAgICBDdXJsSm9iTWFuYWdlcjo6c2luZ2xldG9uKCkuY2FsbE9uSm9iVGhy
ZWFkKFdURk1vdmUoYWN0aW9uKSk7Cit9CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdh
dGU6OnNldEF1dGhlbnRpY2F0aW9uKGNvbnN0IFN0cmluZyYgdXNlciwgY29uc3QgU3RyaW5nJiBw
YXNzKQoreworICAgIGF1dG8gYWN0aW9uID0gW3Byb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlz
KSwgdXNlciA9IHVzZXIuaXNvbGF0ZWRDb3B5KCksIHBhc3MgPSBwYXNzLmlzb2xhdGVkQ29weSgp
XSgpIHsKKyAgICAgICAgcHJvdGVjdGVkVGhpcy0+bV91c2VyID0gdXNlcjsKKyAgICAgICAgcHJv
dGVjdGVkVGhpcy0+bV9wYXNzID0gcGFzczsKKyAgICAgICAgcHJvdGVjdGVkVGhpcy0+bV9jdXJs
SGFuZGxlLnNldEh0dHBBdXRoVXNlclBhc3ModXNlciwgcGFzcyk7CisgICAgfTsKKworICAgIEN1
cmxKb2JNYW5hZ2VyOjpzaW5nbGV0b24oKS5jYWxsT25Kb2JUaHJlYWQoV1RGTW92ZShhY3Rpb24p
KTsKK30KKwordm9pZCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6ZGlzcGF0Y2hTeW5jaHJv
bm91c0pvYigpCit7CisgICAgVVJMIGt1cmwgPSBtX2ZpcnN0UmVxdWVzdC51cmwoKTsKKworICAg
IGlmIChrdXJsLnByb3RvY29sSXNEYXRhKCkpIHsKKyAgICAgICAgaGFuZGxlRGF0YVVSTCgpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgZGVmZXJzTG9hZGluZyBpcyB0cnVl
IGFuZCB3ZSBjYWxsIGN1cmxfZWFzeV9wZXJmb3JtCisgICAgLy8gb24gYSBwYXVzZWQgaGFuZGxl
LCBsaWJjVVJMIHdvdWxkIGRvIHRoZSB0cmFuc2ZlcnQgYW55d2F5CisgICAgLy8gYW5kIHdlIHdv
dWxkIGFzc2VydCBzbyBmb3JjZSBkZWZlcnNMb2FkaW5nIHRvIGJlIGZhbHNlLgorICAgIG1fZGVm
ZXJzTG9hZGluZyA9IGZhbHNlOworCisgICAgc2V0dXBSZXF1ZXN0KCk7CisKKyAgICAvLyBjdXJs
X2Vhc3lfcGVyZm9ybSBibG9ja3MgdW50aWwgdGhlIHRyYW5zZmVyIGlzIGZpbmlzaGVkLgorICAg
IENVUkxjb2RlIHJldCA9IG1fY3VybEhhbmRsZS5wZXJmb3JtKCk7CisKKyAgICBkb3VibGUgcHJl
dHJhbnNmZXJUaW1lID0gMDsKKyAgICBkb3VibGUgZG5zTG9va3VwVGltZSA9IDA7CisgICAgZG91
YmxlIGNvbm5lY3RUaW1lID0gMDsKKyAgICBkb3VibGUgYXBwQ29ubmVjdFRpbWUgPSAwOworCisg
ICAgbV9jdXJsSGFuZGxlLmdldFRpbWVzKHByZXRyYW5zZmVyVGltZSwgZG5zTG9va3VwVGltZSwg
Y29ubmVjdFRpbWUsIGFwcENvbm5lY3RUaW1lKTsKKyAgICBzZXRXZWJUaW1pbmdzKHByZXRyYW5z
ZmVyVGltZSwgZG5zTG9va3VwVGltZSwgY29ubmVjdFRpbWUsIGFwcENvbm5lY3RUaW1lKTsKKwor
ICAgIGlmIChtX2hhbmRsZS0+Y2xpZW50KCkpIHsKKyAgICAgICAgaWYgKHJldCAhPSBDVVJMRV9P
SykgeworICAgICAgICAgICAgU3RyaW5nIGRvbWFpbiA9IEN1cmxDb250ZXh0OjplcnJvckRvbWFp
bjsKKyAgICAgICAgICAgIGludCBlcnJvckNvZGUgPSBtX2N1cmxIYW5kbGUuZXJyb3JDb2RlKCk7
CisgICAgICAgICAgICBVUkwgZmFpbGluZ1VSTCA9IG1fY3VybEhhbmRsZS5nZXRFZmZlY3RpdmVV
UkwoKTsKKyAgICAgICAgICAgIFN0cmluZyBlcnJvckRlc2NyaXB0aW9uID0gbV9jdXJsSGFuZGxl
LmVycm9yRGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNzbEVycm9ycyA9IG1f
Y3VybEhhbmRsZS5nZXRTc2xFcnJvcnMoKTsKKworICAgICAgICAgICAgbV9oYW5kbGUtPmNsaWVu
dCgpLT5kaWRGYWlsKG1faGFuZGxlLCBSZXNvdXJjZUVycm9yKGRvbWFpbiwgZXJyb3JDb2RlLCBm
YWlsaW5nVVJMLCBlcnJvckRlc2NyaXB0aW9uLCBzc2xFcnJvcnMpKTsKKyAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICBtX2hhbmRsZS0+Y2xpZW50KCktPmRpZFJlY2VpdmVSZXNwb25zZShtX2hh
bmRsZSwgUmVzb3VyY2VSZXNwb25zZShyZXNwb25zZSgpKSk7CisgICAgfQorfQorCit2b2lkIFJl
c291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpyZXRhaW4oKQoreworICAgIHJlZigpOworfQorCit2
b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpyZWxlYXNlKCkKK3sKKyAgICBkZXJlZigp
OworfQorCit2b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpzZXR1cFJlcXVlc3QoKQor
eworICAgIEN1cmxDb250ZXh0JiBjb250ZXh0ID0gQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpOwor
CisgICAgVVJMIHVybCA9IG1fZmlyc3RSZXF1ZXN0LnVybCgpOworCisgICAgLy8gUmVtb3ZlIGFu
eSBmcmFnbWVudCBwYXJ0LCBvdGhlcndpc2UgY3VybCB3aWxsIHNlbmQgaXQgYXMgcGFydCBvZiB0
aGUgcmVxdWVzdC4KKyAgICB1cmwucmVtb3ZlRnJhZ21lbnRJZGVudGlmaWVyKCk7CisKKyAgICBT
dHJpbmcgdXJsU3RyaW5nID0gdXJsLnN0cmluZygpOworCisgICAgbV9jdXJsSGFuZGxlLmluaXRp
YWxpemUoKTsKKworICAgIGlmICh1cmwuaXNMb2NhbEZpbGUoKSkgeworICAgICAgICAvLyBSZW1v
dmUgYW55IHF1ZXJ5IHBhcnQgc2VudCB0byBhIGxvY2FsIGZpbGUuCisgICAgICAgIGlmICghdXJs
LnF1ZXJ5KCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBCeSBzZXR0aW5nIHRoZSBxdWVy
eSB0byBhIG51bGwgc3RyaW5nIGl0J2xsIGJlIHJlbW92ZWQuCisgICAgICAgICAgICB1cmwuc2V0
UXVlcnkoU3RyaW5nKCkpOworICAgICAgICAgICAgdXJsU3RyaW5nID0gdXJsLnN0cmluZygpOwor
ICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fZGVmZXJzTG9hZGluZykgeworICAgICAgICBD
VVJMY29kZSBlcnJvciA9IG1fY3VybEhhbmRsZS5wYXVzZShDVVJMUEFVU0VfQUxMKTsKKyAgICAg
ICAgLy8gSWYgd2UgZGlkIG5vdCBwYXVzZSB0aGUgaGFuZGxlLCB3ZSB3b3VsZCBBU1NFUlQgaW4g
dGhlCisgICAgICAgIC8vIGhlYWRlciBjYWxsYmFjay4gU28ganVzdCBhc3NlcnQgaGVyZS4KKyAg
ICAgICAgQVNTRVJUX1VOVVNFRChlcnJvciwgZXJyb3IgPT0gQ1VSTEVfT0spOworICAgIH0KKwor
I2lmbmRlZiBOREVCVUcKKyAgICBtX2N1cmxIYW5kbGUuZW5hYmxlVmVyYm9zZUlmVXNlZCgpOwor
ICAgIG1fY3VybEhhbmRsZS5lbmFibGVTdGRFcnJJZlVzZWQoKTsKKyNlbmRpZgorCisgICAgbV9j
dXJsSGFuZGxlLnNldFNzbFZlcmlmeVBlZXIoQ3VybEhhbmRsZTo6VmVyaWZ5UGVlckVuYWJsZSk7
CisgICAgbV9jdXJsSGFuZGxlLnNldFNzbFZlcmlmeUhvc3QoQ3VybEhhbmRsZTo6VmVyaWZ5SG9z
dFN0cmljdE5hbWVDaGVjayk7CisgICAgbV9jdXJsSGFuZGxlLnNldFByaXZhdGVEYXRhKHRoaXMp
OworICAgIG1fY3VybEhhbmRsZS5zZXRXcml0ZUNhbGxiYWNrRnVuY3Rpb24oZGlkUmVjZWl2ZURh
dGFDYWxsYmFjaywgdGhpcyk7CisgICAgbV9jdXJsSGFuZGxlLnNldEhlYWRlckNhbGxiYWNrRnVu
Y3Rpb24oZGlkUmVjZWl2ZUhlYWRlckNhbGxiYWNrLCB0aGlzKTsKKyAgICBtX2N1cmxIYW5kbGUu
ZW5hYmxlQXV0b1JlZmVyZXIoKTsKKyAgICBtX2N1cmxIYW5kbGUuZW5hYmxlRm9sbG93TG9jYXRp
b24oKTsKKyAgICBtX2N1cmxIYW5kbGUuZW5hYmxlSHR0cEF1dGhlbnRpY2F0aW9uKENVUkxBVVRI
X0FOWSk7CisgICAgbV9jdXJsSGFuZGxlLmVuYWJsZVNoYXJlSGFuZGxlKCk7CisgICAgbV9jdXJs
SGFuZGxlLmVuYWJsZVRpbWVvdXQoKTsKKyAgICBtX2N1cmxIYW5kbGUuZW5hYmxlQWxsb3dlZFBy
b3RvY29scygpOworCisgICAgaWYgKG1fc3NsQ2xpZW50Q2VydGlmaWNhdGUpIHsKKyAgICAgICAg
bV9jdXJsSGFuZGxlLnNldFNzbENlcnQoKCptX3NzbENsaWVudENlcnRpZmljYXRlKS5maXJzdC51
dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgbV9jdXJsSGFuZGxlLnNldFNzbENlcnRUeXBlKCJQMTIi
KTsKKyAgICAgICAgbV9jdXJsSGFuZGxlLnNldFNzbEtleVBhc3N3b3JkKCgqbV9zc2xDbGllbnRD
ZXJ0aWZpY2F0ZSkuc2Vjb25kLnV0ZjgoKS5kYXRhKCkpOworICAgIH0KKworICAgIGlmIChDdXJs
Q29udGV4dDo6c2luZ2xldG9uKCkuc2hvdWxkSWdub3JlU1NMRXJyb3JzKCkpCisgICAgICAgIG1f
Y3VybEhhbmRsZS5zZXRTc2xWZXJpZnlQZWVyKEN1cmxIYW5kbGU6OlZlcmlmeVBlZXJEaXNhYmxl
KTsKKyAgICBlbHNlCisgICAgICAgIHNldFNTTFZlcmlmeU9wdGlvbnMobV9jdXJsSGFuZGxlKTsK
KworICAgIG1fY3VybEhhbmRsZS5lbmFibGVDQUluZm9JZkV4aXN0cygpOworCisgICAgbV9jdXJs
SGFuZGxlLmVuYWJsZUFjY2VwdEVuY29kaW5nKCk7CisgICAgbV9jdXJsSGFuZGxlLnNldFVybCh1
cmxTdHJpbmcpOworICAgIG1fY3VybEhhbmRsZS5lbmFibGVDb29raWVKYXJJZkV4aXN0cygpOwor
CisgICAgaWYgKG1fY3VzdG9tSFRUUEhlYWRlckZpZWxkcy5zaXplKCkpCisgICAgICAgIG1fY3Vy
bEhhbmRsZS5hcHBlbmRSZXF1ZXN0SGVhZGVycyhtX2N1c3RvbUhUVFBIZWFkZXJGaWVsZHMpOwor
CisgICAgU3RyaW5nIG1ldGhvZCA9IG1fZmlyc3RSZXF1ZXN0Lmh0dHBNZXRob2QoKTsKKyAgICBp
ZiAoIkdFVCIgPT0gbWV0aG9kKQorICAgICAgICBtX2N1cmxIYW5kbGUuZW5hYmxlSHR0cEdldFJl
cXVlc3QoKTsKKyAgICBlbHNlIGlmICgiUE9TVCIgPT0gbWV0aG9kKQorICAgICAgICBzZXR1cFBP
U1QoKTsKKyAgICBlbHNlIGlmICgiUFVUIiA9PSBtZXRob2QpCisgICAgICAgIHNldHVwUFVUKCk7
CisgICAgZWxzZSBpZiAoIkhFQUQiID09IG1ldGhvZCkKKyAgICAgICAgbV9jdXJsSGFuZGxlLmVu
YWJsZUh0dHBIZWFkUmVxdWVzdCgpOworICAgIGVsc2UgeworICAgICAgICBtX2N1cmxIYW5kbGUu
c2V0SHR0cEN1c3RvbVJlcXVlc3QobWV0aG9kKTsKKyAgICAgICAgc2V0dXBQVVQoKTsKKyAgICB9
CisKKyAgICBtX2N1cmxIYW5kbGUuZW5hYmxlUmVxdWVzdEhlYWRlcnMoKTsKKworICAgIGFwcGx5
QXV0aGVudGljYXRpb24oKTsKKworICAgIG1fY3VybEhhbmRsZS5lbmFibGVQcm94eUlmRXhpc3Rz
KCk7Cit9CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6Om5vdGlmeUZpbmlzaCgp
Cit7CisgICAgZG91YmxlIHByZXRyYW5zZmVyVGltZSA9IDA7CisgICAgZG91YmxlIGRuc0xvb2t1
cFRpbWUgPSAwOworICAgIGRvdWJsZSBjb25uZWN0VGltZSA9IDA7CisgICAgZG91YmxlIGFwcENv
bm5lY3RUaW1lID0gMDsKKworICAgIG1fY3VybEhhbmRsZS5nZXRUaW1lcyhwcmV0cmFuc2ZlclRp
bWUsIGRuc0xvb2t1cFRpbWUsIGNvbm5lY3RUaW1lLCBhcHBDb25uZWN0VGltZSk7CisKKyAgICBj
YWxsT25NYWluVGhyZWFkKFtwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIHByZXRyYW5z
ZmVyVGltZSwgZG5zTG9va3VwVGltZSwgY29ubmVjdFRpbWUsIGFwcENvbm5lY3RUaW1lXSB7Cisg
ICAgICAgIGlmICghcHJvdGVjdGVkVGhpcy0+bV9oYW5kbGUpCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIHByb3RlY3RlZFRoaXMtPmRpZEZpbmlzaChwcmV0cmFuc2ZlclRpbWUsIGRuc0xv
b2t1cFRpbWUsIGNvbm5lY3RUaW1lLCBhcHBDb25uZWN0VGltZSk7CisgICAgfSk7Cit9CisKK3Zv
aWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6Om5vdGlmeUZhaWwoKQoreworICAgIFN0cmlu
ZyBkb21haW4gPSBDdXJsQ29udGV4dDo6ZXJyb3JEb21haW47CisgICAgaW50IGVycm9yQ29kZSA9
IG1fY3VybEhhbmRsZS5lcnJvckNvZGUoKTsKKyAgICBVUkwgZmFpbGluZ1VSTCA9IG1fY3VybEhh
bmRsZS5nZXRFZmZlY3RpdmVVUkwoKTsKKyAgICBTdHJpbmcgZXJyb3JEZXNjcmlwdGlvbiA9IG1f
Y3VybEhhbmRsZS5lcnJvckRlc2NyaXB0aW9uKCk7CisgICAgdW5zaWduZWQgc3NsRXJyb3JzID0g
bV9jdXJsSGFuZGxlLmdldFNzbEVycm9ycygpOworCisgICAgY2FsbE9uTWFpblRocmVhZChbcHJv
dGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBkb21haW4gPSBkb21haW4uaXNvbGF0ZWRDb3B5
KCksIGVycm9yQ29kZSwgZmFpbGluZ1VSTCA9IGZhaWxpbmdVUkwuaXNvbGF0ZWRDb3B5KCksIGVy
cm9yRGVzY3JpcHRpb24gPSBlcnJvckRlc2NyaXB0aW9uLmlzb2xhdGVkQ29weSgpLCBzc2xFcnJv
cnNdIHsKKyAgICAgICAgaWYgKCFwcm90ZWN0ZWRUaGlzLT5tX2hhbmRsZSkKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgcHJvdGVjdGVkVGhpcy0+ZGlkRmFpbChkb21haW4sIGVycm9yQ29k
ZSwgZmFpbGluZ1VSTCwgZXJyb3JEZXNjcmlwdGlvbiwgc3NsRXJyb3JzKTsKKyAgICB9KTsKK30K
KworUmVzb3VyY2VSZXNwb25zZSYgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnJlc3BvbnNl
KCkKK3sKKyAgICByZXR1cm4gbV9oYW5kbGUtPmdldEludGVybmFsKCktPm1fcmVzcG9uc2U7Cit9
CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldHVwQXV0aGVudGljYXRpb24o
KQoreworICAgIC8vIG1fdXNlci9tX3Bhc3MgYXJlIGNyZWRlbnRpYWxzIGdpdmVuIG1hbnVhbGx5
LCBmb3IgaW5zdGFuY2UsIGJ5IHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIFhNTEh0dHBSZXF1ZXN0
Lm9wZW4oKS4KKyAgICBTdHJpbmcgcGFydGl0aW9uID0gbV9maXJzdFJlcXVlc3QuY2FjaGVQYXJ0
aXRpb24oKTsKKworICAgIGlmIChtX3Nob3VsZFVzZUNyZWRlbnRpYWxTdG9yYWdlKSB7CisgICAg
ICAgIGlmIChtX3VzZXIuaXNFbXB0eSgpICYmIG1fcGFzcy5pc0VtcHR5KCkpIHsKKyAgICAgICAg
ICAgIC8vIDxyZGFyOi8vcHJvYmxlbS83MTc0MDUwPiAtIEZvciBVUkxzIHRoYXQgbWF0Y2ggdGhl
IHBhdGhzIG9mIHRob3NlIHByZXZpb3VzbHkgY2hhbGxlbmdlZCBmb3IgSFRUUCBCYXNpYyBhdXRo
ZW50aWNhdGlvbiwgCisgICAgICAgICAgICAvLyB0cnkgYW5kIHJldXNlIHRoZSBjcmVkZW50aWFs
IHByZWVtcHRpdmVseSwgYXMgYWxsb3dlZCBieSBSRkMgMjYxNy4KKyAgICAgICAgICAgIG1faW5p
dGlhbENyZWRlbnRpYWwgPSBDcmVkZW50aWFsU3RvcmFnZTo6ZGVmYXVsdENyZWRlbnRpYWxTdG9y
YWdlKCkuZ2V0KHBhcnRpdGlvbiwgbV9maXJzdFJlcXVlc3QudXJsKCkpOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHByb3RlY3Rpb24gc3Bh
Y2Uga25vd24gZm9yIHRoZSBVUkwsIHVwZGF0ZSBzdG9yZWQgY3JlZGVudGlhbHMKKyAgICAgICAg
ICAgIC8vIGJlZm9yZSBzZW5kaW5nIGEgcmVxdWVzdC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0
byBpbXBsZW1lbnQgbG9nb3V0IGJ5IHNlbmRpbmcgYW4KKyAgICAgICAgICAgIC8vIFhNTEh0dHBS
ZXF1ZXN0IHdpdGgga25vd24gaW5jb3JyZWN0IGNyZWRlbnRpYWxzLCBhbmQgYWJvcnRpbmcgaXQg
aW1tZWRpYXRlbHkgKHNvIHRoYXQKKyAgICAgICAgICAgIC8vIGFuIGF1dGhlbnRpY2F0aW9uIGRp
YWxvZyBkb2Vzbid0IHBvcCB1cCkuCisgICAgICAgICAgICBDcmVkZW50aWFsU3RvcmFnZTo6ZGVm
YXVsdENyZWRlbnRpYWxTdG9yYWdlKCkuc2V0KHBhcnRpdGlvbiwgQ3JlZGVudGlhbChtX3VzZXIs
IG1fcGFzcywgQ3JlZGVudGlhbFBlcnNpc3RlbmNlTm9uZSksIG1fZmlyc3RSZXF1ZXN0LnVybCgp
KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVtb3ZlTGVhZGluZ0FuZFRy
YWlsaW5nUXVvdGVzKFN0cmluZyYgdmFsdWUpCit7CisgICAgdW5zaWduZWQgbGVuZ3RoID0gdmFs
dWUubGVuZ3RoKCk7CisgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJyInKSAmJiB2YWx1ZS5lbmRz
V2l0aCgnIicpICYmIGxlbmd0aCA+IDEpCisgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5n
KDEsIGxlbmd0aCAtIDIpOworfQorCitib29sIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpn
ZXRQcm90ZWN0aW9uU3BhY2UoY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgcmVzcG9uc2UsIFByb3Rl
Y3Rpb25TcGFjZSYgcHJvdGVjdGlvblNwYWNlKQoreworICAgIENVUkxjb2RlIGVycjsKKworICAg
IGxvbmcgcG9ydCA9IDA7CisgICAgZXJyID0gbV9jdXJsSGFuZGxlLmdldFByaW1hcnlQb3J0KHBv
cnQpOworICAgIGlmIChlcnIgIT0gQ1VSTEVfT0spCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGxvbmcgYXZhaWxhYmxlQXV0aCA9IENVUkxBVVRIX05PTkU7CisgICAgZXJyID0gbV9jdXJs
SGFuZGxlLmdldEh0dHBBdXRoQXZhaWwoYXZhaWxhYmxlQXV0aCk7CisgICAgaWYgKGVyciAhPSBD
VVJMRV9PSykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgVVJMIHVybCA9IG1fY3VybEhh
bmRsZS5nZXRFZmZlY3RpdmVVUkwoKTsKKyAgICBpZiAoIXVybC5pc1ZhbGlkKCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIFN0cmluZyBob3N0ID0gdXJsLmhvc3QoKTsKKyAgICBTdHJp
bmdWaWV3IHByb3RvY29sID0gdXJsLnByb3RvY29sKCk7CisKKyAgICBTdHJpbmcgcmVhbG07CisK
KyAgICBjb25zdCBTdHJpbmcgYXV0aEhlYWRlciA9IHJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZChI
VFRQSGVhZGVyTmFtZTo6QXV0aG9yaXphdGlvbik7CisgICAgY29uc3QgU3RyaW5nIHJlYWxtU3Ry
aW5nID0gInJlYWxtPSI7CisgICAgaW50IHJlYWxtUG9zID0gYXV0aEhlYWRlci5maW5kKHJlYWxt
U3RyaW5nKTsKKyAgICBpZiAocmVhbG1Qb3MgPiAwKSB7CisgICAgICAgIHJlYWxtID0gYXV0aEhl
YWRlci5zdWJzdHJpbmcocmVhbG1Qb3MgKyByZWFsbVN0cmluZy5sZW5ndGgoKSk7CisgICAgICAg
IHJlYWxtID0gcmVhbG0ubGVmdChyZWFsbS5maW5kKCcsJykpOworICAgICAgICByZW1vdmVMZWFk
aW5nQW5kVHJhaWxpbmdRdW90ZXMocmVhbG0pOworICAgIH0KKworICAgIFByb3RlY3Rpb25TcGFj
ZVNlcnZlclR5cGUgc2VydmVyVHlwZSA9IFByb3RlY3Rpb25TcGFjZVNlcnZlckhUVFA7CisgICAg
aWYgKHByb3RvY29sID09ICJodHRwcyIpCisgICAgICAgIHNlcnZlclR5cGUgPSBQcm90ZWN0aW9u
U3BhY2VTZXJ2ZXJIVFRQUzsKKworICAgIFByb3RlY3Rpb25TcGFjZUF1dGhlbnRpY2F0aW9uU2No
ZW1lIGF1dGhTY2hlbWUgPSBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZVVua25v
d247CisKKyAgICBpZiAoYXZhaWxhYmxlQXV0aCAmIENVUkxBVVRIX0JBU0lDKQorICAgICAgICBh
dXRoU2NoZW1lID0gUHJvdGVjdGlvblNwYWNlQXV0aGVudGljYXRpb25TY2hlbWVIVFRQQmFzaWM7
CisgICAgaWYgKGF2YWlsYWJsZUF1dGggJiBDVVJMQVVUSF9ESUdFU1QpCisgICAgICAgIGF1dGhT
Y2hlbWUgPSBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZUhUVFBEaWdlc3Q7Cisg
ICAgaWYgKGF2YWlsYWJsZUF1dGggJiBDVVJMQVVUSF9HU1NORUdPVElBVEUpCisgICAgICAgIGF1
dGhTY2hlbWUgPSBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZU5lZ290aWF0ZTsK
KyAgICBpZiAoYXZhaWxhYmxlQXV0aCAmIENVUkxBVVRIX05UTE0pCisgICAgICAgIGF1dGhTY2hl
bWUgPSBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZU5UTE07CisKKyAgICBwcm90
ZWN0aW9uU3BhY2UgPSBQcm90ZWN0aW9uU3BhY2UoaG9zdCwgcG9ydCwgc2VydmVyVHlwZSwgcmVh
bG0sIGF1dGhTY2hlbWUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSBzdGF0aWMg
Ym9vbCBpc0h0dHBJbmZvKGludCBzdGF0dXNDb2RlKQoreworICAgIHJldHVybiAxMDAgPD0gc3Rh
dHVzQ29kZSAmJiBzdGF0dXNDb2RlIDwgMjAwOworfQorCitpbmxpbmUgc3RhdGljIGJvb2wgaXNI
dHRwUmVkaXJlY3QoaW50IHN0YXR1c0NvZGUpCit7CisgICAgcmV0dXJuIDMwMCA8PSBzdGF0dXND
b2RlICYmIHN0YXR1c0NvZGUgPCA0MDAgJiYgc3RhdHVzQ29kZSAhPSAzMDQ7Cit9CisKK2lubGlu
ZSBzdGF0aWMgYm9vbCBpc0h0dHBBdXRoZW50aWNhdGlvbihpbnQgc3RhdHVzQ29kZSkKK3sKKyAg
ICByZXR1cm4gc3RhdHVzQ29kZSA9PSA0MDE7Cit9CisKK2lubGluZSBzdGF0aWMgYm9vbCBpc0h0
dHBOb3RNb2RpZmllZChpbnQgc3RhdHVzQ29kZSkKK3sKKyAgICByZXR1cm4gc3RhdHVzQ29kZSA9
PSAzMDQ7Cit9CisKK3N0YXRpYyBib29sIGlzQXBwZW5kYWJsZUhlYWRlcihjb25zdCBTdHJpbmcg
JmtleSkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciogYXBwZW5kYWJsZUhlYWRlcnNbXSA9IHsK
KyAgICAgICAgImFjY2Vzcy1jb250cm9sLWFsbG93LWhlYWRlcnMiLAorICAgICAgICAiYWNjZXNz
LWNvbnRyb2wtYWxsb3ctbWV0aG9kcyIsCisgICAgICAgICJhY2Nlc3MtY29udHJvbC1hbGxvdy1v
cmlnaW4iLAorICAgICAgICAiYWNjZXNzLWNvbnRyb2wtZXhwb3NlLWhlYWRlcnMiLAorICAgICAg
ICAiYWxsb3ciLAorICAgICAgICAiY2FjaGUtY29udHJvbCIsCisgICAgICAgICJjb25uZWN0aW9u
IiwKKyAgICAgICAgImNvbnRlbnQtZW5jb2RpbmciLAorICAgICAgICAiY29udGVudC1sYW5ndWFn
ZSIsCisgICAgICAgICJpZi1tYXRjaCIsCisgICAgICAgICJpZi1ub25lLW1hdGNoIiwKKyAgICAg
ICAgImtlZXAtYWxpdmUiLAorICAgICAgICAicHJhZ21hIiwKKyAgICAgICAgInByb3h5LWF1dGhl
bnRpY2F0ZSIsCisgICAgICAgICJwdWJsaWMiLAorICAgICAgICAic2VydmVyIiwKKyAgICAgICAg
InNldC1jb29raWUiLAorICAgICAgICAidGUiLAorICAgICAgICAidHJhaWxlciIsCisgICAgICAg
ICJ0cmFuc2Zlci1lbmNvZGluZyIsCisgICAgICAgICJ1cGdyYWRlIiwKKyAgICAgICAgInVzZXIt
YWdlbnQiLAorICAgICAgICAidmFyeSIsCisgICAgICAgICJ2aWEiLAorICAgICAgICAid2Fybmlu
ZyIsCisgICAgICAgICJ3d3ctYXV0aGVudGljYXRlIgorICAgIH07CisKKyAgICAvLyBDdXN0b20g
aGVhZGVycyBzdGFydCB3aXRoICdYLScsIGFuZCBuZWVkIG5vIGZ1cnRoZXIgY2hlY2tpbmcuCisg
ICAgaWYgKGtleS5zdGFydHNXaXRoKCJ4LSIsIC8qIGNhc2VTZW5zaXRpdmUgKi8gZmFsc2UpKQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGZvciAoYXV0byYgaGVhZGVyIDogYXBwZW5kYWJs
ZUhlYWRlcnMpIHsKKyAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdBU0NJSUNhc2Uoa2V5LCBoZWFk
ZXIpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNl
OworfQorCit2b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpkaWRSZWNlaXZlSGVhZGVy
TGluZShjb25zdCBTdHJpbmcmIGhlYWRlcikKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OworCisgICAgYXV0byBzcGxpdFBvc2l0aW9uID0gaGVhZGVyLmZpbmQoIjoiKTsKKyAgICBpZiAo
c3BsaXRQb3NpdGlvbiAhPSBub3RGb3VuZCkgeworICAgICAgICBTdHJpbmcga2V5ID0gaGVhZGVy
LmxlZnQoc3BsaXRQb3NpdGlvbikuc3RyaXBXaGl0ZVNwYWNlKCk7CisgICAgICAgIFN0cmluZyB2
YWx1ZSA9IGhlYWRlci5zdWJzdHJpbmcoc3BsaXRQb3NpdGlvbiArIDEpLnN0cmlwV2hpdGVTcGFj
ZSgpOworCisgICAgICAgIGlmIChpc0FwcGVuZGFibGVIZWFkZXIoa2V5KSkKKyAgICAgICAgICAg
IHJlc3BvbnNlKCkuYWRkSFRUUEhlYWRlckZpZWxkKGtleSwgdmFsdWUpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICByZXNwb25zZSgpLnNldEhUVFBIZWFkZXJGaWVsZChrZXksIHZhbHVlKTsK
KyAgICB9IGVsc2UgaWYgKGhlYWRlci5zdGFydHNXaXRoKCJIVFRQIiwgZmFsc2UpKSB7CisgICAg
ICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHJlc3BvbnNlLgorICAgICAgICAv
LyBFeHRyYWN0IHRoZSBodHRwIHN0YXR1cyB0ZXh0IGZyb20gdGhpcy4KKyAgICAgICAgLy8KKyAg
ICAgICAgLy8gSWYgdGhlIEZPTExPV0xPQ0FUSU9OIG9wdGlvbiBpcyBlbmFibGVkIGZvciB0aGUg
Y3VybCBoYW5kbGUgdGhlbgorICAgICAgICAvLyBjdXJsIHdpbGwgZm9sbG93IHRoZSByZWRpcmVj
dGlvbnMgaW50ZXJuYWxseS4gVGh1cyB0aGlzIGhlYWRlciBjYWxsYmFjaworICAgICAgICAvLyB3
aWxsIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25lIHRpbWUgd2l0aCB0aGUgbGluZSBzdGFydGluZyAi
SFRUUCIgZm9yIG9uZSBqb2IuCisgICAgICAgIGxvbmcgaHR0cENvZGUgPSAwOworICAgICAgICBt
X2N1cmxIYW5kbGUuZ2V0UmVzcG9uc2VDb2RlKGh0dHBDb2RlKTsKKworICAgICAgICBTdHJpbmcg
aHR0cENvZGVTdHJpbmcgPSBTdHJpbmc6Om51bWJlcihodHRwQ29kZSk7CisgICAgICAgIGludCBz
dGF0dXNDb2RlUG9zID0gaGVhZGVyLmZpbmQoaHR0cENvZGVTdHJpbmcpOworCisgICAgICAgIGlm
IChzdGF0dXNDb2RlUG9zICE9IG5vdEZvdW5kKSB7CisgICAgICAgICAgICAvLyBUaGUgc3RhdHVz
IHRleHQgaXMgYWZ0ZXIgdGhlIHN0YXR1cyBjb2RlLgorICAgICAgICAgICAgU3RyaW5nIHN0YXR1
cyA9IGhlYWRlci5zdWJzdHJpbmcoc3RhdHVzQ29kZVBvcyArIGh0dHBDb2RlU3RyaW5nLmxlbmd0
aCgpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlKCkuc2V0SFRUUFN0YXR1c1RleHQoc3RhdHVzLnN0
cmlwV2hpdGVTcGFjZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBSZXNvdXJjZUhh
bmRsZUN1cmxEZWxlZ2F0ZTo6ZGlkUmVjZWl2ZUFsbEhlYWRlcnMobG9uZyBodHRwQ29kZSwgbG9u
ZyBsb25nIGNvbnRlbnRMZW5ndGgpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKwor
ICAgIHJlc3BvbnNlKCkuc2V0RXhwZWN0ZWRDb250ZW50TGVuZ3RoKGNvbnRlbnRMZW5ndGgpOwor
ICAgIHJlc3BvbnNlKCkuc2V0VVJMKG1fY3VybEhhbmRsZS5nZXRFZmZlY3RpdmVVUkwoKSk7Cisg
ICAgcmVzcG9uc2UoKS5zZXRIVFRQU3RhdHVzQ29kZShodHRwQ29kZSk7CisgICAgcmVzcG9uc2Uo
KS5zZXRNaW1lVHlwZShleHRyYWN0TUlNRVR5cGVGcm9tTWVkaWFUeXBlKHJlc3BvbnNlKCkuaHR0
cEhlYWRlckZpZWxkKEhUVFBIZWFkZXJOYW1lOjpDb250ZW50VHlwZSkpLmNvbnZlcnRUb0FTQ0lJ
TG93ZXJjYXNlKCkpOworICAgIHJlc3BvbnNlKCkuc2V0VGV4dEVuY29kaW5nTmFtZShleHRyYWN0
Q2hhcnNldEZyb21NZWRpYVR5cGUocmVzcG9uc2UoKS5odHRwSGVhZGVyRmllbGQoSFRUUEhlYWRl
ck5hbWU6OkNvbnRlbnRUeXBlKSkpOworCisgICAgaWYgKHJlc3BvbnNlKCkuaXNNdWx0aXBhcnQo
KSkgeworICAgICAgICBTdHJpbmcgYm91bmRhcnk7CisgICAgICAgIGJvb2wgcGFyc2VkID0gTXVs
dGlwYXJ0SGFuZGxlOjpleHRyYWN0Qm91bmRhcnkocmVzcG9uc2UoKS5odHRwSGVhZGVyRmllbGQo
SFRUUEhlYWRlck5hbWU6OkNvbnRlbnRUeXBlKSwgYm91bmRhcnkpOworICAgICAgICBpZiAocGFy
c2VkKQorICAgICAgICAgICAgbV9tdWx0aXBhcnRIYW5kbGUgPSBzdGQ6Om1ha2VfdW5pcXVlPE11
bHRpcGFydEhhbmRsZT4obV9oYW5kbGUsIGJvdW5kYXJ5KTsKKyAgICB9CisKKyAgICAvLyBIVFRQ
IHJlZGlyZWN0aW9uCisgICAgaWYgKGlzSHR0cFJlZGlyZWN0KGh0dHBDb2RlKSkgeworICAgICAg
ICBTdHJpbmcgbG9jYXRpb24gPSByZXNwb25zZSgpLmh0dHBIZWFkZXJGaWVsZChIVFRQSGVhZGVy
TmFtZTo6TG9jYXRpb24pOworICAgICAgICBpZiAoIWxvY2F0aW9uLmlzRW1wdHkoKSkgeworICAg
ICAgICAgICAgVVJMIG5ld1VSTCA9IFVSTChtX2ZpcnN0UmVxdWVzdC51cmwoKSwgbG9jYXRpb24p
OworCisgICAgICAgICAgICBSZXNvdXJjZVJlcXVlc3QgcmVkaXJlY3RlZFJlcXVlc3QgPSBtX2Zp
cnN0UmVxdWVzdDsKKyAgICAgICAgICAgIHJlZGlyZWN0ZWRSZXF1ZXN0LnNldFVSTChuZXdVUkwp
OworICAgICAgICAgICAgUmVzb3VyY2VSZXNwb25zZSBsb2NhbFJlc3BvbnNlID0gcmVzcG9uc2Uo
KTsKKyAgICAgICAgICAgIGlmIChtX2hhbmRsZS0+Y2xpZW50KCkpCisgICAgICAgICAgICAgICAg
bV9oYW5kbGUtPmNsaWVudCgpLT53aWxsU2VuZFJlcXVlc3QobV9oYW5kbGUsIFdURk1vdmUocmVk
aXJlY3RlZFJlcXVlc3QpLCBXVEZNb3ZlKGxvY2FsUmVzcG9uc2UpKTsKKworICAgICAgICAgICAg
bV9maXJzdFJlcXVlc3Quc2V0VVJMKG5ld1VSTCk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNIdHRwQXV0aGVudGljYXRpb24oaHR0cENvZGUpKSB7
CisgICAgICAgIFByb3RlY3Rpb25TcGFjZSBwcm90ZWN0aW9uU3BhY2U7CisgICAgICAgIGlmIChn
ZXRQcm90ZWN0aW9uU3BhY2UocmVzcG9uc2UoKSwgcHJvdGVjdGlvblNwYWNlKSkgeworICAgICAg
ICAgICAgQ3JlZGVudGlhbCBjcmVkZW50aWFsOworICAgICAgICAgICAgQXV0aGVudGljYXRpb25D
aGFsbGVuZ2UgY2hhbGxlbmdlKHByb3RlY3Rpb25TcGFjZSwgY3JlZGVudGlhbCwgbV9hdXRoRmFp
bHVyZUNvdW50LCByZXNwb25zZSgpLCBSZXNvdXJjZUVycm9yKCkpOworICAgICAgICAgICAgY2hh
bGxlbmdlLnNldEF1dGhlbnRpY2F0aW9uQ2xpZW50KG1faGFuZGxlKTsKKyAgICAgICAgICAgIG1f
aGFuZGxlLT5kaWRSZWNlaXZlQXV0aGVudGljYXRpb25DaGFsbGVuZ2UoY2hhbGxlbmdlKTsKKyAg
ICAgICAgICAgIG1fYXV0aEZhaWx1cmVDb3VudCsrOworICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICB9CisgICAgfQorCisgICAgcmVzcG9uc2UoKS5zZXRSZXNwb25zZUZpcmVkKHRydWUpOwor
CisgICAgaWYgKG1faGFuZGxlLT5jbGllbnQoKSkgeworICAgICAgICBpZiAoaXNIdHRwTm90TW9k
aWZpZWQoaHR0cENvZGUpKSB7CisgICAgICAgICAgICBjb25zdCBTdHJpbmcmIHVybCA9IG1fZmly
c3RSZXF1ZXN0LnVybCgpLnN0cmluZygpOworICAgICAgICAgICAgaWYgKEN1cmxDYWNoZU1hbmFn
ZXI6OmdldEluc3RhbmNlKCkuZ2V0Q2FjaGVkUmVzcG9uc2UodXJsLCByZXNwb25zZSgpKSkgewor
ICAgICAgICAgICAgICAgIGlmIChtX2FkZGVkQ2FjaGVWYWxpZGF0aW9uSGVhZGVycykgeworICAg
ICAgICAgICAgICAgICAgICByZXNwb25zZSgpLnNldEhUVFBTdGF0dXNDb2RlKDIwMCk7CisgICAg
ICAgICAgICAgICAgICAgIHJlc3BvbnNlKCkuc2V0SFRUUFN0YXR1c1RleHQoIk9LIik7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEN1cmxDYWNo
ZU1hbmFnZXI6OmdldEluc3RhbmNlKCkuZGlkUmVjZWl2ZVJlc3BvbnNlKCptX2hhbmRsZSwgcmVz
cG9uc2UoKSk7CisgICAgICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZVJlc3BvbnNl
KG1faGFuZGxlLCBSZXNvdXJjZVJlc3BvbnNlKHJlc3BvbnNlKCkpKTsKKyAgICB9Cit9CisKK3Zv
aWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OmRpZFJlY2VpdmVDb250ZW50RGF0YShUaHJl
YWRTYWZlRGF0YUJ1ZmZlciBidWZmZXIpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsK
KworICAgIGlmICghcmVzcG9uc2UoKS5yZXNwb25zZUZpcmVkKCkpCisgICAgICAgIGhhbmRsZUxv
Y2FsUmVjZWl2ZVJlc3BvbnNlKCk7CisKKyAgICBjb25zdCBjaGFyKiBwdHIgPSByZWludGVycHJl
dF9jYXN0PGNvbnN0IGNoYXIqPihidWZmZXIuZGF0YSgpLT5iZWdpbigpKTsKKyAgICBzaXplX3Qg
c2l6ZSA9IGJ1ZmZlci5zaXplKCk7CisKKyAgICBpZiAobV9tdWx0aXBhcnRIYW5kbGUpCisgICAg
ICAgIG1fbXVsdGlwYXJ0SGFuZGxlLT5jb250ZW50UmVjZWl2ZWQocHRyLCBzaXplKTsKKyAgICBl
bHNlIGlmIChtX2hhbmRsZS0+Y2xpZW50KCkpIHsKKyAgICAgICAgQ3VybENhY2hlTWFuYWdlcjo6
Z2V0SW5zdGFuY2UoKS5kaWRSZWNlaXZlRGF0YSgqbV9oYW5kbGUsIHB0ciwgc2l6ZSk7CisgICAg
ICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEobV9oYW5kbGUsIHB0ciwgc2l6
ZSwgMCk7CisgICAgfQorfQorCit2b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpoYW5k
bGVMb2NhbFJlY2VpdmVSZXNwb25zZSgpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsK
KworICAgIC8vIHNpbmNlIHRoZSBjb2RlIGluIGhlYWRlckNhbGxiYWNrIHdpbGwgbm90IGhhdmUg
cnVuIGZvciBsb2NhbCBmaWxlcworICAgIC8vIHRoZSBjb2RlIHRvIHNldCB0aGUgVVJMIGFuZCBm
aXJlIGRpZFJlY2VpdmVSZXNwb25zZSBpcyBuZXZlciBydW4sCisgICAgLy8gd2hpY2ggbWVhbnMg
dGhlIFJlc291cmNlTG9hZGVyJ3MgcmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiB0aGUgVVJMLgor
ICAgIC8vIFJ1biB0aGUgY29kZSBoZXJlIGZvciBsb2NhbCBmaWxlcyB0byByZXNvbHZlIHRoZSBp
c3N1ZS4KKyAgICAvLyBUT0RPOiBTZWUgaWYgdGhlcmUgaXMgYSBiZXR0ZXIgYXBwcm9hY2ggZm9y
IGhhbmRsaW5nIHRoaXMuCisgICAgVVJMIHVybCA9IG1fY3VybEhhbmRsZS5nZXRFZmZlY3RpdmVV
UkwoKTsKKyAgICBBU1NFUlQodXJsLmlzVmFsaWQoKSk7CisgICAgcmVzcG9uc2UoKS5zZXRVUkwo
dXJsKTsKKyAgICByZXNwb25zZSgpLnNldFJlc3BvbnNlRmlyZWQodHJ1ZSk7CisgICAgaWYgKG1f
aGFuZGxlLT5jbGllbnQoKSkKKyAgICAgICAgbV9oYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZl
UmVzcG9uc2UobV9oYW5kbGUsIFJlc291cmNlUmVzcG9uc2UocmVzcG9uc2UoKSkpOworfQorCit2
b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpwcmVwYXJlU2VuZERhdGEoY2hhciogYnVm
ZmVyLCBzaXplX3QgYmxvY2tTaXplLCBzaXplX3QgbnVtYmVyT2ZCbG9ja3MpCit7CisgICAgQVNT
RVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBBU1NFUlQoIW1fc2VuZEJ5dGVzKTsKKworICAgIHN0
ZDo6dW5pcXVlX2xvY2s8TG9jaz4gbG9jayhtX3dvcmtlclRocmVhZE11dGV4KTsKKworICAgIGlm
ICghbV9mb3JtRGF0YVN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgc2l6ZV90IHNpemUgPSBtX2Zvcm1EYXRhU3RyZWFtLnJlYWQoYnVmZmVyLCBibG9ja1Np
emUsIG51bWJlck9mQmxvY2tzKTsKKyAgICBpZiAoIXNpemUpIHsKKyAgICAgICAgLy8gU29tZXRo
aW5nIHdlbnQgd3Jvbmcgc28gY2FuY2VsIHRoZSBqb2IuCisgICAgICAgIG1faGFuZGxlLT5jYW5j
ZWwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1fc2VuZEJ5dGVzID0gc2l6ZTsK
KyAgICBtX3dvcmtlclRocmVhZENvbmRpdGlvblZhcmlhYmxlLm5vdGlmeU9uZSgpOworfQorCit2
b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpkaWRGaW5pc2goZG91YmxlIHByZXRyYW5z
ZmVyVGltZSwgZG91YmxlIGRuc0xvb2t1cFRpbWUsIGRvdWJsZSBjb25uZWN0VGltZSwgZG91Ymxl
IGFwcENvbm5lY3RUaW1lKQoreworICAgIHNldFdlYlRpbWluZ3MocHJldHJhbnNmZXJUaW1lLCBk
bnNMb29rdXBUaW1lLCBjb25uZWN0VGltZSwgYXBwQ29ubmVjdFRpbWUpOworCisgICAgaWYgKCFt
X2hhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFyZXNwb25zZSgpLnJlc3BvbnNl
RmlyZWQoKSkgeworICAgICAgICBoYW5kbGVMb2NhbFJlY2VpdmVSZXNwb25zZSgpOworICAgICAg
ICBpZiAoIW1faGFuZGxlKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICht
X211bHRpcGFydEhhbmRsZSkKKyAgICAgICAgbV9tdWx0aXBhcnRIYW5kbGUtPmNvbnRlbnRFbmRl
ZCgpOworCisgICAgaWYgKG1faGFuZGxlLT5jbGllbnQoKSkgeworICAgICAgICBDdXJsQ2FjaGVN
YW5hZ2VyOjpnZXRJbnN0YW5jZSgpLmRpZEZpbmlzaExvYWRpbmcoKm1faGFuZGxlKTsKKyAgICAg
ICAgbV9oYW5kbGUtPmNsaWVudCgpLT5kaWRGaW5pc2hMb2FkaW5nKG1faGFuZGxlKTsKKyAgICB9
Cit9CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OmRpZEZhaWwoY29uc3QgU3Ry
aW5nJiBkb21haW4sIGludCBlcnJvckNvZGUsIGNvbnN0IFVSTCYgZmFpbGluZ1VSTCwgY29uc3Qg
U3RyaW5nJiBsb2NhbGl6ZWREZXNjcmlwdGlvbiwgdW5zaWduZWQgc3NsRXJyb3JzKQoreworICAg
IGlmICghbV9oYW5kbGUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2hhbmRsZS0+Y2xp
ZW50KCkpIHsKKyAgICAgICAgQ3VybENhY2hlTWFuYWdlcjo6Z2V0SW5zdGFuY2UoKS5kaWRGYWls
KCptX2hhbmRsZSk7CisgICAgICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkRmFpbChtX2hhbmRs
ZSwgUmVzb3VyY2VFcnJvcihkb21haW4sIGVycm9yQ29kZSwgZmFpbGluZ1VSTCwgbG9jYWxpemVk
RGVzY3JpcHRpb24sIHNzbEVycm9ycykpOworICAgIH0KK30KKwordm9pZCBSZXNvdXJjZUhhbmRs
ZUN1cmxEZWxlZ2F0ZTo6aGFuZGxlRGF0YVVSTCgpCit7CisgICAgQVNTRVJUKG1fZmlyc3RSZXF1
ZXN0LnVybCgpLnByb3RvY29sSXNEYXRhKCkpOworICAgIFN0cmluZyB1cmwgPSBtX2ZpcnN0UmVx
dWVzdC51cmwoKS5zdHJpbmcoKTsKKworICAgIEFTU0VSVChtX2hhbmRsZS0+Y2xpZW50KCkpOwor
CisgICAgaW50IGluZGV4ID0gdXJsLmZpbmQoJywnKTsKKyAgICBpZiAoaW5kZXggPT0gLTEpIHsK
KyAgICAgICAgbV9oYW5kbGUtPmNsaWVudCgpLT5jYW5ub3RTaG93VVJMKG1faGFuZGxlKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFN0cmluZyBtZWRpYVR5cGUgPSB1cmwuc3Vic3Ry
aW5nKDUsIGluZGV4IC0gNSk7CisgICAgU3RyaW5nIGRhdGEgPSB1cmwuc3Vic3RyaW5nKGluZGV4
ICsgMSk7CisKKyAgICBib29sIGJhc2U2NCA9IG1lZGlhVHlwZS5lbmRzV2l0aCgiO2Jhc2U2NCIs
IGZhbHNlKTsKKyAgICBpZiAoYmFzZTY0KQorICAgICAgICBtZWRpYVR5cGUgPSBtZWRpYVR5cGUu
bGVmdChtZWRpYVR5cGUubGVuZ3RoKCkgLSA3KTsKKworICAgIGlmIChtZWRpYVR5cGUuaXNFbXB0
eSgpKQorICAgICAgICBtZWRpYVR5cGUgPSAidGV4dC9wbGFpbiI7CisKKyAgICBTdHJpbmcgbWlt
ZVR5cGUgPSBleHRyYWN0TUlNRVR5cGVGcm9tTWVkaWFUeXBlKG1lZGlhVHlwZSk7CisgICAgU3Ry
aW5nIGNoYXJzZXQgPSBleHRyYWN0Q2hhcnNldEZyb21NZWRpYVR5cGUobWVkaWFUeXBlKTsKKwor
ICAgIGlmIChjaGFyc2V0LmlzRW1wdHkoKSkKKyAgICAgICAgY2hhcnNldCA9ICJVUy1BU0NJSSI7
CisKKyAgICBSZXNvdXJjZVJlc3BvbnNlIHJlc3BvbnNlOworICAgIHJlc3BvbnNlLnNldE1pbWVU
eXBlKG1pbWVUeXBlKTsKKyAgICByZXNwb25zZS5zZXRUZXh0RW5jb2RpbmdOYW1lKGNoYXJzZXQp
OworICAgIHJlc3BvbnNlLnNldFVSTChtX2ZpcnN0UmVxdWVzdC51cmwoKSk7CisKKyAgICBpZiAo
YmFzZTY0KSB7CisgICAgICAgIGRhdGEgPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXMoZGF0YSk7
CisgICAgICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZVJlc3BvbnNlKG1faGFuZGxl
LCBXVEZNb3ZlKHJlc3BvbnNlKSk7CisKKyAgICAgICAgLy8gZGlkUmVjZWl2ZVJlc3BvbnNlIG1p
Z2h0IGNhdXNlIHRoZSBjbGllbnQgdG8gYmUgZGVsZXRlZC4KKyAgICAgICAgaWYgKG1faGFuZGxl
LT5jbGllbnQoKSkgeworICAgICAgICAgICAgVmVjdG9yPGNoYXI+IG91dDsKKyAgICAgICAgICAg
IGlmIChiYXNlNjREZWNvZGUoZGF0YSwgb3V0LCBCYXNlNjRJZ25vcmVTcGFjZXNBbmROZXdMaW5l
cykgJiYgb3V0LnNpemUoKSA+IDApCisgICAgICAgICAgICAgICAgbV9oYW5kbGUtPmNsaWVudCgp
LT5kaWRSZWNlaXZlRGF0YShtX2hhbmRsZSwgb3V0LmRhdGEoKSwgb3V0LnNpemUoKSwgMCk7Cisg
ICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBUZXh0RW5jb2RpbmcgZW5jb2RpbmcoY2hh
cnNldCk7CisgICAgICAgIGRhdGEgPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXMoZGF0YSwgZW5j
b2RpbmcpOworICAgICAgICBtX2hhbmRsZS0+Y2xpZW50KCktPmRpZFJlY2VpdmVSZXNwb25zZSht
X2hhbmRsZSwgV1RGTW92ZShyZXNwb25zZSkpOworCisgICAgICAgIC8vIGRpZFJlY2VpdmVSZXNw
b25zZSBtaWdodCBjYXVzZSB0aGUgY2xpZW50IHRvIGJlIGRlbGV0ZWQuCisgICAgICAgIGlmICht
X2hhbmRsZS0+Y2xpZW50KCkpIHsKKyAgICAgICAgICAgIENTdHJpbmcgZW5jb2RlZERhdGEgPSBl
bmNvZGluZy5lbmNvZGUoZGF0YSwgVVJMRW5jb2RlZEVudGl0aWVzRm9yVW5lbmNvZGFibGVzKTsK
KyAgICAgICAgICAgIGlmIChlbmNvZGVkRGF0YS5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICBt
X2hhbmRsZS0+Y2xpZW50KCktPmRpZFJlY2VpdmVEYXRhKG1faGFuZGxlLCBlbmNvZGVkRGF0YS5k
YXRhKCksIGVuY29kZWREYXRhLmxlbmd0aCgpLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGlmIChtX2hhbmRsZS0+Y2xpZW50KCkpCisgICAgICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlk
RmluaXNoTG9hZGluZyhtX2hhbmRsZSk7Cit9CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVs
ZWdhdGU6OnNldHVwUE9TVCgpCit7CisgICAgbV9jdXJsSGFuZGxlLmVuYWJsZUh0dHBQb3N0UmVx
dWVzdCgpOworCisgICAgc2l6ZV90IG51bUVsZW1lbnRzID0gZ2V0Rm9ybUVsZW1lbnRzQ291bnQo
KTsKKyAgICBpZiAoIW51bUVsZW1lbnRzKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBEbyBu
b3Qgc3RyZWFtIGZvciBzaW1wbGUgUE9TVCBkYXRhCisgICAgaWYgKG51bUVsZW1lbnRzID09IDEp
IHsKKyAgICAgICAgbV9maXJzdFJlcXVlc3QuaHR0cEJvZHkoKS0+ZmxhdHRlbihtX3Bvc3RCeXRl
cyk7CisgICAgICAgIGlmIChtX3Bvc3RCeXRlcy5zaXplKCkpCisgICAgICAgICAgICBtX2N1cmxI
YW5kbGUuc2V0UG9zdEZpZWxkcyhtX3Bvc3RCeXRlcy5kYXRhKCksIG1fcG9zdEJ5dGVzLnNpemUo
KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzZXR1cEZvcm1EYXRhKHRydWUpOwor
fQorCit2b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpzZXR1cFBVVCgpCit7CisgICAg
bV9jdXJsSGFuZGxlLmVuYWJsZUh0dHBQdXRSZXF1ZXN0KCk7CisKKyAgICAvLyBEaXNhYmxlIHRo
ZSBFeHBlY3Q6IDEwMCBjb250aW51ZSBoZWFkZXIKKyAgICBtX2N1cmxIYW5kbGUuYXBwZW5kUmVx
dWVzdEhlYWRlcigiRXhwZWN0OiIpOworCisgICAgc2l6ZV90IG51bUVsZW1lbnRzID0gZ2V0Rm9y
bUVsZW1lbnRzQ291bnQoKTsKKyAgICBpZiAoIW51bUVsZW1lbnRzKQorICAgICAgICByZXR1cm47
CisKKyAgICBzZXR1cEZvcm1EYXRhKGZhbHNlKTsKK30KKworc2l6ZV90IFJlc291cmNlSGFuZGxl
Q3VybERlbGVnYXRlOjpnZXRGb3JtRWxlbWVudHNDb3VudCgpCit7CisgICAgUmVmUHRyPEZvcm1E
YXRhPiBmb3JtRGF0YSA9IG1fZmlyc3RSZXF1ZXN0Lmh0dHBCb2R5KCk7CisgICAgaWYgKCFmb3Jt
RGF0YSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBSZXNvbHZlIHRoZSBibG9iIGVsZW1l
bnRzIHNvIHRoZSBmb3JtRGF0YSBjYW4gY29ycmVjdGx5IHJlcG9ydCBpdCdzIHNpemUuCisgICAg
Zm9ybURhdGEgPSBmb3JtRGF0YS0+cmVzb2x2ZUJsb2JSZWZlcmVuY2VzKCk7CisgICAgc2l6ZV90
IHNpemUgPSBmb3JtRGF0YS0+ZWxlbWVudHMoKS5zaXplKCk7CisgICAgbV9maXJzdFJlcXVlc3Qu
c2V0SFRUUEJvZHkoV1RGTW92ZShmb3JtRGF0YSkpOworICAgIHJldHVybiBzaXplOworfQorCit2
b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpzZXR1cEZvcm1EYXRhKGJvb2wgaXNQb3N0
UmVxdWVzdCkKK3sKKyAgICBWZWN0b3I8Rm9ybURhdGFFbGVtZW50PiBlbGVtZW50cyA9IG1fZmly
c3RSZXF1ZXN0Lmh0dHBCb2R5KCktPmVsZW1lbnRzKCk7CisgICAgc2l6ZV90IG51bUVsZW1lbnRz
ID0gZWxlbWVudHMuc2l6ZSgpOworCisgICAgc3RhdGljIGNvbnN0IGxvbmcgbG9uZyBtYXhDdXJs
T2ZmVCA9IG1fY3VybEhhbmRsZS5tYXhDdXJsT2ZmVCgpOworCisgICAgLy8gT2J0YWluIHRoZSB0
b3RhbCBzaXplIG9mIHRoZSBmb3JtIGRhdGEKKyAgICBjdXJsX29mZl90IHNpemUgPSAwOworICAg
IGJvb2wgY2h1bmtlZFRyYW5zZmVyID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBudW1FbGVtZW50czsgaSsrKSB7CisgICAgICAgIEZvcm1EYXRhRWxlbWVudCBlbGVtZW50ID0g
ZWxlbWVudHNbaV07CisgICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1l
bnQ6OlR5cGU6OkVuY29kZWRGaWxlKSB7CisgICAgICAgICAgICBsb25nIGxvbmcgZmlsZVNpemVS
ZXN1bHQ7CisgICAgICAgICAgICBpZiAoZ2V0RmlsZVNpemUoZWxlbWVudC5tX2ZpbGVuYW1lLCBm
aWxlU2l6ZVJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZVNpemVSZXN1bHQgPiBt
YXhDdXJsT2ZmVCkgeworICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIHNpemUgaXMgdG9vIGJp
ZyBmb3Igc3BlY2lmeWluZyBpdCB0byBjVVJMCisgICAgICAgICAgICAgICAgICAgIGNodW5rZWRU
cmFuc2ZlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICBzaXplICs9IGZpbGVTaXplUmVzdWx0OworICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaHVua2VkVHJhbnNmZXIgPSB0cnVlOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAg
ICAgICAgIHNpemUgKz0gZWxlbWVudHNbaV0ubV9kYXRhLnNpemUoKTsKKyAgICB9CisKKyAgICAv
LyBjVVJMIGd1ZXNzZXMgdGhhdCB3ZSB3YW50IGNodW5rZWQgZW5jb2RpbmcgYXMgbG9uZyBhcyB3
ZSBzcGVjaWZ5IHRoZSBoZWFkZXIKKyAgICBpZiAoY2h1bmtlZFRyYW5zZmVyKQorICAgICAgICBt
X2N1cmxIYW5kbGUuYXBwZW5kUmVxdWVzdEhlYWRlcigiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5r
ZWQiKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGlzUG9zdFJlcXVlc3QpCisgICAgICAgICAg
ICBtX2N1cmxIYW5kbGUuc2V0UG9zdEZpZWxkTGFyZ2Uoc2l6ZSk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIG1fY3VybEhhbmRsZS5zZXRJbkZpbGVTaXplTGFyZ2Uoc2l6ZSk7CisgICAgfQor
CisgICAgbV9jdXJsSGFuZGxlLnNldFJlYWRDYWxsYmFja0Z1bmN0aW9uKHdpbGxTZW5kRGF0YUNh
bGxiYWNrLCB0aGlzKTsKK30KKwordm9pZCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6YXBw
bHlBdXRoZW50aWNhdGlvbigpCit7CisgICAgU3RyaW5nIHVzZXIgPSBtX3VzZXI7CisgICAgU3Ry
aW5nIHBhc3N3b3JkID0gbV9wYXNzOworCisgICAgaWYgKCFtX2luaXRpYWxDcmVkZW50aWFsLmlz
RW1wdHkoKSkgeworICAgICAgICB1c2VyID0gbV9pbml0aWFsQ3JlZGVudGlhbC51c2VyKCk7Cisg
ICAgICAgIHBhc3N3b3JkID0gbV9pbml0aWFsQ3JlZGVudGlhbC5wYXNzd29yZCgpOworICAgICAg
ICBtX2N1cmxIYW5kbGUuZW5hYmxlSHR0cEF1dGhlbnRpY2F0aW9uKENVUkxBVVRIX0JBU0lDKTsK
KyAgICB9CisKKyAgICAvLyBJdCBzZWVtcyB3ZSBuZWVkIHRvIHNldCBDVVJMT1BUX1VTRVJQV0Qg
ZXZlbiBpZiB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaXMgZW1wdHkuCisgICAgLy8gT3RoZXJ3aXNl
IGNVUkwgd2lsbCBub3QgYXV0b21hdGljYWxseSBjb250aW51ZSB3aXRoIGEgbmV3IHJlcXVlc3Qg
YWZ0ZXIgYSA0MDEgcmVzcG9uc2UuCisKKyAgICAvLyBjdXJsIENVUkxPUFRfVVNFUlBXRCBleHBl
Y3RzIHVzZXJuYW1lOnBhc3N3b3JkCisgICAgbV9jdXJsSGFuZGxlLnNldEh0dHBBdXRoVXNlclBh
c3ModXNlciwgcGFzc3dvcmQpOworfQorCit2b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRl
OjpzZXRXZWJUaW1pbmdzKGRvdWJsZSBwcmV0cmFuc2ZlclRpbWUsIGRvdWJsZSBkbnNMb29rdXBU
aW1lLCBkb3VibGUgY29ubmVjdFRpbWUsIGRvdWJsZSBhcHBDb25uZWN0VGltZSkKK3sKKyAgICBy
ZXNwb25zZSgpLmRlcHJlY2F0ZWROZXR3b3JrTG9hZE1ldHJpY3MoKS5kb21haW5Mb29rdXBTdGFy
dCA9IFNlY29uZHMoMCk7CisgICAgcmVzcG9uc2UoKS5kZXByZWNhdGVkTmV0d29ya0xvYWRNZXRy
aWNzKCkuZG9tYWluTG9va3VwRW5kID0gU2Vjb25kcyhkbnNMb29rdXBUaW1lKTsKKworICAgIHJl
c3BvbnNlKCkuZGVwcmVjYXRlZE5ldHdvcmtMb2FkTWV0cmljcygpLmNvbm5lY3RTdGFydCA9IFNl
Y29uZHMoZG5zTG9va3VwVGltZSk7CisgICAgcmVzcG9uc2UoKS5kZXByZWNhdGVkTmV0d29ya0xv
YWRNZXRyaWNzKCkuY29ubmVjdEVuZCA9IFNlY29uZHMoY29ubmVjdFRpbWUpOworCisgICAgcmVz
cG9uc2UoKS5kZXByZWNhdGVkTmV0d29ya0xvYWRNZXRyaWNzKCkucmVxdWVzdFN0YXJ0ID0gU2Vj
b25kcyhjb25uZWN0VGltZSk7CisgICAgcmVzcG9uc2UoKS5kZXByZWNhdGVkTmV0d29ya0xvYWRN
ZXRyaWNzKCkucmVzcG9uc2VTdGFydCA9IFNlY29uZHMocHJldHJhbnNmZXJUaW1lKTsKKworICAg
IGlmIChhcHBDb25uZWN0VGltZSkKKyAgICAgICAgcmVzcG9uc2UoKS5kZXByZWNhdGVkTmV0d29y
a0xvYWRNZXRyaWNzKCkuc2VjdXJlQ29ubmVjdGlvblN0YXJ0ID0gU2Vjb25kcyhjb25uZWN0VGlt
ZSk7Cit9CisKKy8qCisqIFRoaXMgaXMgYmVpbmcgY2FsbGVkIGZvciBlYWNoIEhUVFAgaGVhZGVy
IGluIHRoZSByZXNwb25zZS4gVGhpcyBpbmNsdWRlcyAnXHJcbicKKyogZm9yIHRoZSBsYXN0IGxp
bmUgb2YgdGhlIGhlYWRlci4KKyoKKyogV2Ugd2lsbCBhZGQgZWFjaCBIVFRQIEhlYWRlciB0byB0
aGUgUmVzb3VyY2VSZXNwb25zZSBhbmQgb24gdGhlIHRlcm1pbmF0aW9uCisqIG9mIHRoZSBoZWFk
ZXIgKFxyXG4pIHdlIHdpbGwgcGFyc2UgQ29udGVudC1UeXBlIGFuZCBDb250ZW50LURpc3Bvc2l0
aW9uIGFuZAorKiB1cGRhdGUgdGhlIFJlc291cmNlUmVzcG9uc2UgYW5kIHRoZW4gc2VuZCBpdCBh
d2F5LgorKgorKi8KK3NpemVfdCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6ZGlkUmVjZWl2
ZUhlYWRlcihTdHJpbmcmJiBoZWFkZXIpCit7CisgICAgaWYgKCFtX2hhbmRsZSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBpZiAobV9kZWZlcnNMb2FkaW5nKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIC8qCisgICAgKiBhKSBXZSBjYW4gZmluaXNoIGFuZCBzZW5kIHRoZSBSZXNvdXJjZVJl
c3BvbnNlCisgICAgKiBiKSBXZSB3aWxsIGFkZCB0aGUgY3VycmVudCBoZWFkZXIgdG8gdGhlIEhU
VFBIZWFkZXJNYXAgb2YgdGhlIFJlc291cmNlUmVzcG9uc2UKKyAgICAqCisgICAgKiBUaGUgSFRU
UCBzdGFuZGFyZCByZXF1aXJlcyB0byB1c2UgXHJcbiBidXQgZm9yIGNvbXBhdGliaWxpdHkgaXQg
cmVjb21tZW5kcyB0bworICAgICogYWNjZXB0IGFsc28gXG4uCisgICAgKi8KKyAgICBpZiAoaGVh
ZGVyID09IEF0b21pY1N0cmluZygiXHJcbiIpIHx8IGhlYWRlciA9PSBBdG9taWNTdHJpbmcoIlxu
IikpIHsKKyAgICAgICAgbG9uZyBodHRwQ29kZSA9IDA7CisgICAgICAgIG1fY3VybEhhbmRsZS5n
ZXRSZXNwb25zZUNvZGUoaHR0cENvZGUpOworCisgICAgICAgIGlmICghaHR0cENvZGUpIHsKKyAg
ICAgICAgICAgIC8vIENvbWVzIGhlcmUgd2hlbiByZWNlaXZpbmcgMjAwIENvbm5lY3Rpb24gRXN0
YWJsaXNoZWQuIEp1c3QgcmV0dXJuLgorICAgICAgICAgICAgcmV0dXJuIGhlYWRlci5sZW5ndGgo
KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNIdHRwSW5mbyhodHRwQ29kZSkpIHsKKyAgICAg
ICAgICAgIC8vIEp1c3QgcmV0dXJuIHdoZW4gcmVjZWl2aW5nIGh0dHAgaW5mbywgZS5nLiBIVFRQ
LzEuMSAxMDAgQ29udGludWUuCisgICAgICAgICAgICAvLyBJZiBub3QsIHRoZSByZXF1ZXN0IG1p
Z2h0IGJlIGNhbmNlbGxlZCwgYmVjYXVzZSB0aGUgTUlNRSB0eXBlIHdpbGwgYmUgZW1wdHkgZm9y
IHRoaXMgcmVzcG9uc2UuCisgICAgICAgICAgICByZXR1cm4gaGVhZGVyLmxlbmd0aCgpOworICAg
ICAgICB9CisKKyAgICAgICAgbG9uZyBsb25nIGNvbnRlbnRMZW5ndGggPSAwOworICAgICAgICBt
X2N1cmxIYW5kbGUuZ2V0Q29udGVudExlbmdodERvd25sb2FkKGNvbnRlbnRMZW5ndGgpOworCisg
ICAgICAgIGNhbGxPbk1haW5UaHJlYWQoW3Byb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwg
aHR0cENvZGUsIGNvbnRlbnRMZW5ndGhdIHsKKyAgICAgICAgICAgIGlmICghcHJvdGVjdGVkVGhp
cy0+bV9oYW5kbGUpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgcHJvdGVj
dGVkVGhpcy0+ZGlkUmVjZWl2ZUFsbEhlYWRlcnMoaHR0cENvZGUsIGNvbnRlbnRMZW5ndGgpOwor
ICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYWxsT25NYWluVGhyZWFkKFtwcm90
ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGhlYWRlciA9IGhlYWRlci5pc29sYXRlZENvcHko
KSBdIHsKKyAgICAgICAgICAgIGlmICghcHJvdGVjdGVkVGhpcy0+bV9oYW5kbGUpCisgICAgICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgcHJvdGVjdGVkVGhpcy0+ZGlkUmVjZWl2ZUhl
YWRlckxpbmUoaGVhZGVyKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIGhlYWRl
ci5sZW5ndGgoKTsKK30KKworLy8gY2FsbGVkIHdpdGggZGF0YSBhZnRlciBhbGwgaGVhZGVycyBo
YXZlIGJlZW4gcHJvY2Vzc2VkIHZpYSBoZWFkZXJDYWxsYmFjaworc2l6ZV90IFJlc291cmNlSGFu
ZGxlQ3VybERlbGVnYXRlOjpkaWRSZWNlaXZlRGF0YShUaHJlYWRTYWZlRGF0YUJ1ZmZlciBkYXRh
KQoreworICAgIGlmICghbV9oYW5kbGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKG1f
ZGVmZXJzTG9hZGluZykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyB0aGlzIHNob3VsZG4n
dCBiZSBuZWNlc3NhcnkgYnV0IGFwcGFyZW50bHkgaXMuIENVUkwgd3JpdGVzIHRoZSBkYXRhCisg
ICAgLy8gb2YgaHRtbCBwYWdlIGV2ZW4gaWYgaXQgaXMgYSByZWRpcmVjdCB0aGF0IHdhcyBoYW5k
bGVkIGludGVybmFsbHkKKyAgICAvLyBjYW4gYmUgb2JzZXJ2ZWQgZS5nLiBvbiBnbWFpbC5jb20K
KyAgICBsb25nIGh0dHBDb2RlID0gMDsKKyAgICBDVVJMY29kZSBlcnJDZCA9IG1fY3VybEhhbmRs
ZS5nZXRSZXNwb25zZUNvZGUoaHR0cENvZGUpOworICAgIGlmIChDVVJMRV9PSyA9PSBlcnJDZCAm
JiBodHRwQ29kZSA+PSAzMDAgJiYgaHR0cENvZGUgPCA0MDApCisgICAgICAgIHJldHVybiBkYXRh
LnNpemUoKTsKKworICAgIGlmICghZGF0YS5zaXplKCkpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgY2FsbE9uTWFpblRocmVhZChbcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpLCBkYXRh
XSB7CisgICAgICAgIGlmICghcHJvdGVjdGVkVGhpcy0+bV9oYW5kbGUpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIHByb3RlY3RlZFRoaXMtPmRpZFJlY2VpdmVDb250ZW50RGF0YShkYXRh
KTsKKyAgICB9KTsKKworICAgIHJldHVybiBkYXRhLnNpemUoKTsKK30KKworLyogVGhpcyBpcyBj
YWxsZWQgdG8gb2J0YWluIEhUVFAgUE9TVCBvciBQVVQgZGF0YS4KK0l0ZXJhdGUgdGhyb3VnaCBG
b3JtRGF0YSBlbGVtZW50cyBhbmQgdXBsb2FkIGZpbGVzLgorQ2FyZWZ1bGx5IHJlc3BlY3QgdGhl
IGdpdmVuIGJ1ZmZlciBibG9ja1NpemUgYW5kIGZpbGwgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgYXQg
dGhlIG5leHQgY2FsbHMuCisqLworc2l6ZV90IFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjp3
aWxsU2VuZERhdGEoY2hhciogYnVmZmVyLCBzaXplX3QgYmxvY2tTaXplLCBzaXplX3QgbnVtYmVy
T2ZCbG9ja3MpCit7CisgICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7CisKKyAgICBpZiAoIW1f
aGFuZGxlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChtX2RlZmVyc0xvYWRpbmcpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFibG9ja1NpemUgfHwgIW51bWJlck9mQmxvY2tz
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxM
b2NrPiBsb2NrKG1fd29ya2VyVGhyZWFkTXV0ZXgpOworCisgICAgICAgIG1fc2VuZEJ5dGVzID0g
MDsKKworICAgICAgICBjYWxsT25NYWluVGhyZWFkKFtwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigq
dGhpcyksIGJ1ZmZlciwgYmxvY2tTaXplLCBudW1iZXJPZkJsb2Nrc10geworICAgICAgICAgICAg
aWYgKCFwcm90ZWN0ZWRUaGlzLT5tX2hhbmRsZSkKKyAgICAgICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgICAgICBwcm90ZWN0ZWRUaGlzLT5wcmVwYXJlU2VuZERhdGEoYnVmZmVyLCBibG9ja1Np
emUsIG51bWJlck9mQmxvY2tzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgbV93b3JrZXJUaHJl
YWRDb25kaXRpb25WYXJpYWJsZS53YWl0KGxvY2ssIFt0aGlzXSB7CisgICAgICAgICAgICByZXR1
cm4gbV9zZW5kQnl0ZXM7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHJldHVybiBtX3NlbmRC
eXRlczsKK30KKworc2l6ZV90IFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpkaWRSZWNlaXZl
SGVhZGVyQ2FsbGJhY2soY2hhciogcHRyLCBzaXplX3QgYmxvY2tTaXplLCBzaXplX3QgbnVtYmVy
T2ZCbG9ja3MsIHZvaWQqIGRhdGEpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc291cmNl
SGFuZGxlQ3VybERlbGVnYXRlKj4oY29uc3RfY2FzdDx2b2lkKj4oZGF0YSkpLT5kaWRSZWNlaXZl
SGVhZGVyKFN0cmluZyhzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4ocHRyKSwgYmxvY2tTaXplICog
bnVtYmVyT2ZCbG9ja3MpKTsKK30KKworc2l6ZV90IFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRl
OjpkaWRSZWNlaXZlRGF0YUNhbGxiYWNrKGNoYXIqIHB0ciwgc2l6ZV90IGJsb2NrU2l6ZSwgc2l6
ZV90IG51bWJlck9mQmxvY2tzLCB2b2lkKiBkYXRhKQoreworICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZSo+KGNvbnN0X2Nhc3Q8dm9pZCo+KGRhdGEpKS0+
ZGlkUmVjZWl2ZURhdGEoVGhyZWFkU2FmZURhdGFCdWZmZXI6OmNvcHlEYXRhKHN0YXRpY19jYXN0
PGNvbnN0IGNoYXIqPihwdHIpLCBibG9ja1NpemUgKiBudW1iZXJPZkJsb2NrcykpOworfQorCitz
aXplX3QgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OndpbGxTZW5kRGF0YUNhbGxiYWNrKGNo
YXIqIHB0ciwgc2l6ZV90IGJsb2NrU2l6ZSwgc2l6ZV90IG51bWJlck9mQmxvY2tzLCB2b2lkKiBk
YXRhKQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0
ZSo+KGNvbnN0X2Nhc3Q8dm9pZCo+KGRhdGEpKS0+d2lsbFNlbmREYXRhKHB0ciwgYmxvY2tTaXpl
LCBudW1iZXJPZkJsb2Nrcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlm
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5k
bGVDdXJsRGVsZWdhdGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGUuaAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1cmxE
ZWxlZ2F0ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IE5BVkVSIENvcnAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI3By
YWdtYSBvbmNlCisKKyNpZiBVU0UoQ1VSTCkKKworI2luY2x1ZGUgIkNyZWRlbnRpYWwuaCIKKyNp
bmNsdWRlICJDdXJsQ29udGV4dC5oIgorI2luY2x1ZGUgIkN1cmxKb2JNYW5hZ2VyLmgiCisjaW5j
bHVkZSAiRm9ybURhdGFTdHJlYW1DdXJsLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VSZXF1ZXN0Lmgi
CisjaW5jbHVkZSAiUmVzb3VyY2VSZXNwb25zZS5oIgorI2luY2x1ZGUgIlNTTEhhbmRsZS5oIgor
I2luY2x1ZGUgPHd0Zi9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNv
dW50ZWQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBNdWx0aXBhcnRIYW5kbGU7
CitjbGFzcyBQcm90ZWN0aW9uU3BhY2U7CitjbGFzcyBSZXNvdXJjZUhhbmRsZTsKK2NsYXNzIFRo
cmVhZFNhZmVEYXRhQnVmZmVyOworCitjbGFzcyBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZSBm
aW5hbCA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxSZXNvdXJjZUhhbmRsZUN1cmxEZWxl
Z2F0ZT4sIHB1YmxpYyBDdXJsSm9iQ2xpZW50IHsKK3B1YmxpYzoKKyAgICBSZXNvdXJjZUhhbmRs
ZUN1cmxEZWxlZ2F0ZShSZXNvdXJjZUhhbmRsZSopOworICAgIH5SZXNvdXJjZUhhbmRsZUN1cmxE
ZWxlZ2F0ZSgpOworCisgICAgYm9vbCBoYXNIYW5kbGUoKSBjb25zdDsKKyAgICB2b2lkIHJlbGVh
c2VIYW5kbGUoKTsKKworICAgIGJvb2wgc3RhcnQoKTsKKyAgICB2b2lkIGNhbmNlbCgpOworCisg
ICAgdm9pZCBzZXREZWZlcnNMb2FkaW5nKGJvb2wpOworICAgIHZvaWQgc2V0QXV0aGVudGljYXRp
b24oY29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5nJik7CisKKyAgICB2b2lkIGRpc3BhdGNoU3lu
Y2hyb25vdXNKb2IoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHJldGFpbigpIG92ZXJyaWRlOwor
ICAgIHZvaWQgcmVsZWFzZSgpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXR1cFJlcXVlc3QoKSBv
dmVycmlkZTsKKyAgICB2b2lkIG5vdGlmeUZpbmlzaCgpIG92ZXJyaWRlOworICAgIHZvaWQgbm90
aWZ5RmFpbCgpIG92ZXJyaWRlOworCisgICAgLy8gQ2FsbGVkIGZyb20gbWFpbiB0aHJlYWQuCisg
ICAgUmVzb3VyY2VSZXNwb25zZSYgcmVzcG9uc2UoKTsKKworICAgIHZvaWQgc2V0dXBBdXRoZW50
aWNhdGlvbigpOworICAgIGJvb2wgZ2V0UHJvdGVjdGlvblNwYWNlKGNvbnN0IFJlc291cmNlUmVz
cG9uc2UmLCBQcm90ZWN0aW9uU3BhY2UmKTsKKworICAgIHZvaWQgZGlkUmVjZWl2ZUhlYWRlckxp
bmUoY29uc3QgU3RyaW5nJik7CisgICAgdm9pZCBkaWRSZWNlaXZlQWxsSGVhZGVycyhsb25nIGh0
dHBDb2RlLCBsb25nIGxvbmcgY29udGVudExlbmd0aCk7CisgICAgdm9pZCBkaWRSZWNlaXZlQ29u
dGVudERhdGEoVGhyZWFkU2FmZURhdGFCdWZmZXIpOworICAgIHZvaWQgaGFuZGxlTG9jYWxSZWNl
aXZlUmVzcG9uc2UoKTsKKyAgICB2b2lkIHByZXBhcmVTZW5kRGF0YShjaGFyKiwgc2l6ZV90IGJs
b2NrU2l6ZSwgc2l6ZV90IG51bWJlck9mQmxvY2tzKTsKKworICAgIHZvaWQgZGlkRmluaXNoKGRv
dWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSk7CisgICAgdm9pZCBkaWRGYWlsKGNvbnN0IFN0
cmluZyYgZG9tYWluLCBpbnQgZXJyb3JDb2RlLCBjb25zdCBVUkwmIGZhaWxpbmdVUkwsIGNvbnN0
IFN0cmluZyYgbG9jYWxpemVkRGVzY3JpcHRpb24sIHVuc2lnbmVkIHNzbEVycm9ycyk7CisKKyAg
ICB2b2lkIGhhbmRsZURhdGFVUkwoKTsKKworICAgIC8vIENhbGxlZCBmcm9tIHdvcmtlciB0aHJl
YWQuCisgICAgdm9pZCBzZXR1cFBPU1QoKTsKKyAgICB2b2lkIHNldHVwUFVUKCk7CisgICAgc2l6
ZV90IGdldEZvcm1FbGVtZW50c0NvdW50KCk7CisgICAgdm9pZCBzZXR1cEZvcm1EYXRhKGJvb2wp
OworICAgIHZvaWQgYXBwbHlBdXRoZW50aWNhdGlvbigpOworICAgIHZvaWQgc2V0V2ViVGltaW5n
cyhkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUpOworCisgICAgc2l6ZV90IGRpZFJlY2Vp
dmVIZWFkZXIoU3RyaW5nJiYpOworICAgIHNpemVfdCBkaWRSZWNlaXZlRGF0YShUaHJlYWRTYWZl
RGF0YUJ1ZmZlcik7CisgICAgc2l6ZV90IHdpbGxTZW5kRGF0YShjaGFyKiwgc2l6ZV90IGJsb2Nr
U2l6ZSwgc2l6ZV90IG51bWJlck9mQmxvY2tzKTsKKworICAgIHN0YXRpYyBzaXplX3QgZGlkUmVj
ZWl2ZUhlYWRlckNhbGxiYWNrKGNoYXIqLCBzaXplX3QgYmxvY2tTaXplLCBzaXplX3QgbnVtYmVy
T2ZCbG9ja3MsIHZvaWQqKTsKKyAgICBzdGF0aWMgc2l6ZV90IGRpZFJlY2VpdmVEYXRhQ2FsbGJh
Y2soY2hhciosIHNpemVfdCBibG9ja1NpemUsIHNpemVfdCBudW1iZXJPZkJsb2Nrcywgdm9pZCop
OworICAgIHN0YXRpYyBzaXplX3Qgd2lsbFNlbmREYXRhQ2FsbGJhY2soY2hhciosIHNpemVfdCBi
bG9ja1NpemUsIHNpemVfdCBudW1iZXJPZkJsb2Nrcywgdm9pZCopOworCisgICAgLy8gVXNlZCBi
eSBtYWluIHRocmVhZC4KKyAgICBSZXNvdXJjZUhhbmRsZSogbV9oYW5kbGU7CisgICAgRm9ybURh
dGFTdHJlYW0gbV9mb3JtRGF0YVN0cmVhbTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TXVsdGlwYXJ0
SGFuZGxlPiBtX211bHRpcGFydEhhbmRsZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBtX2F1dGhGYWls
dXJlQ291bnQgeyAwIH07CisgICAgQ3VybEpvYlRpY2tldCBtX2pvYiB7IG51bGxwdHIgfTsKKyAg
ICAvLyBVc2VkIGJ5IHdvcmtlciB0aHJlYWQuCisgICAgUmVzb3VyY2VSZXF1ZXN0IG1fZmlyc3RS
ZXF1ZXN0OworICAgIEhUVFBIZWFkZXJNYXAgbV9jdXN0b21IVFRQSGVhZGVyRmllbGRzOworICAg
IGJvb2wgbV9zaG91bGRVc2VDcmVkZW50aWFsU3RvcmFnZTsKKyAgICBTdHJpbmcgbV91c2VyOwor
ICAgIFN0cmluZyBtX3Bhc3M7CisgICAgQ3JlZGVudGlhbCBtX2luaXRpYWxDcmVkZW50aWFsOwor
ICAgIHN0ZDo6b3B0aW9uYWw8Q2xpZW50Q2VydGlmaWNhdGU+IG1fc3NsQ2xpZW50Q2VydGlmaWNh
dGU7CisgICAgYm9vbCBtX2RlZmVyc0xvYWRpbmc7CisgICAgYm9vbCBtX2FkZGVkQ2FjaGVWYWxp
ZGF0aW9uSGVhZGVycyB7IGZhbHNlIH07CisgICAgVmVjdG9yPGNoYXI+IG1fcG9zdEJ5dGVzOwor
ICAgIEN1cmxIYW5kbGUgbV9jdXJsSGFuZGxlOworICAgIC8vIFVzZWQgYnkgYm90aCB0aHJlYWRz
LgorICAgIENvbmRpdGlvbiBtX3dvcmtlclRocmVhZENvbmRpdGlvblZhcmlhYmxlOworICAgIExv
Y2sgbV93b3JrZXJUaHJlYWRNdXRleDsKKyAgICBzaXplX3QgbV9zZW5kQnl0ZXMgeyAwIH07Cit9
OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgo=
</data>
<flag name="review"
          id="338875"
          type_id="1"
          status="+"
          setter="achristensen"
    />
    <flag name="commit-queue"
          id="338876"
          type_id="3"
          status="-"
          setter="achristensen"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>318542</attachid>
            <date>2017-08-18 14:27:39 -0700</date>
            <delta_ts>2017-08-18 16:02:55 -0700</delta_ts>
            <desc>patch part 2</desc>
            <filename>bug175713-2.diff</filename>
            <type>text/plain</type>
            <size>98767</size>
            <attacher name="Daewoong Jang">daewoong.jang</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDIyMDkzMikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzNyBAQAorMjAxNy0wOC0xOCAgRGFld29v
bmcgSmFuZyAgPGRhZXdvb25nLmphbmdAbmF2ZXJjb3JwLmNvbT4KKworICAgICAgICBbQ3VybF0g
SW1wcm92ZSBtdWx0aS10aHJlYWRlZCBuZXR3b3JraW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNzU3MTMKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHBsYXRmb3JtL0N1cmwuY21ha2U6CisgICAgICAg
ICogcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZUludGVybmFsLmg6CisgICAgICAgIChX
ZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUludGVybmFsOjpSZXNvdXJjZUhhbmRsZUludGVybmFsKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlSW50ZXJuYWw6Om1fZmFpbHVyZVRpbWVy
KTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENhY2hlTWFu
YWdlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDdXJsQ2FjaGVNYW5hZ2VyOjpkaWRSZWNlaXZl
UmVzcG9uc2UpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsRG93bmxvYWQu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6Q3VybERvd25sb2FkOjppbml0KToKKyAgICAgICAgKFdl
YkNvcmU6OkN1cmxEb3dubG9hZDo6c3RhcnQpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybERvd25s
b2FkOjpjYW5jZWwpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybERvd25sb2FkOjpyZXRhaW4pOgor
ICAgICAgICAoV2ViQ29yZTo6Q3VybERvd25sb2FkOjpyZWxlYXNlKToKKyAgICAgICAgKFdlYkNv
cmU6OkN1cmxEb3dubG9hZDo6c2V0dXBSZXF1ZXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxE
b3dubG9hZDo6bm90aWZ5RmluaXNoKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxEb3dubG9hZDo6
bm90aWZ5RmFpbCk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxEb3dubG9h
ZC5oOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsSm9iTWFuYWdlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpDdXJsSm9iTGlzdDo6aXNFbXB0eSBjb25zdCk6CisgICAgICAg
IChXZWJDb3JlOjpDdXJsSm9iTGlzdDo6c3RhcnRKb2JzKToKKyAgICAgICAgKFdlYkNvcmU6OkN1
cmxKb2JMaXN0OjpmaW5pc2hKb2JzKToKKyAgICAgICAgKFdlYkNvcmU6OkN1cmxKb2JMaXN0Ojpu
b3RpZnlSZXN1bHQpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybEpvYk1hbmFnZXI6OmFkZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpDdXJsSm9iTWFuYWdlcjo6Y2FuY2VsKToKKyAgICAgICAgKFdlYkNv
cmU6OkN1cmxKb2JNYW5hZ2VyOjpjYWxsT25Kb2JUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6
Q3VybEpvYk1hbmFnZXI6OnN0YXJ0VGhyZWFkSWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6
Q3VybEpvYk1hbmFnZXI6OnVwZGF0ZUpvYkxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6Q3VybEpv
Yk1hbmFnZXI6OndvcmtlclRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpDdXJsSm9iTGlzdDo6
YXBwZW5kKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkN1cmxKb2JMaXN0OjpjYW5jZWwp
OiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6Q3VybEpvYkxpc3Q6OmNvbXBsZXRlKTogRGVs
ZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkN1cmxKb2JMaXN0Ojp3aXRoSm9iKTogRGVsZXRlZC4K
KyAgICAgICAgKFdlYkNvcmU6OkN1cmxKb2JMaXN0Ojp3aXRoQ3VybEhhbmRsZSk6IERlbGV0ZWQu
CisgICAgICAgIChXZWJDb3JlOjpDdXJsSm9iOjppbnZva2UpOiBEZWxldGVkLgorICAgICAgICAo
V2ViQ29yZTo6Q3VybEpvYk1hbmFnZXI6OnVwZGF0ZUpvYnMpOiBEZWxldGVkLgorICAgICAgICAq
IHBsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsSm9iTWFuYWdlci5oOgorICAgICAgICAoV2ViQ29y
ZTo6Q3VybEpvYjo6Q3VybEpvYik6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpDdXJsSm9i
Ojp+Q3VybEpvYik6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpDdXJsSm9iOjpvcGVyYXRv
cj0pOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6Q3VybEpvYjo6Y3VybEhhbmRsZSBjb25z
dCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpDdXJsSm9iOjp0aWNrZXQgY29uc3QpOiBE
ZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6Q3VybEpvYjo6ZmluaXNoZWQpOiBEZWxldGVkLgor
ICAgICAgICAoV2ViQ29yZTo6Q3VybEpvYjo6ZXJyb3IpOiBEZWxldGVkLgorICAgICAgICAoV2Vi
Q29yZTo6Q3VybEpvYjo6Y2FuY2VsKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkN1cmxK
b2JNYW5hZ2VyOjppc0FjdGl2ZUpvYiBjb25zdCk6IERlbGV0ZWQuCisgICAgICAgICogcGxhdGZv
cm0vbmV0d29yay9jdXJsL011bHRpcGFydEhhbmRsZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpN
dWx0aXBhcnRIYW5kbGU6OmRpZFJlY2VpdmVEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlc291
cmNlSGFuZGxlSW50ZXJuYWw6On5SZXNvdXJjZUhhbmRsZUludGVybmFsKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlc291cmNlSGFuZGxlOjpzdGFydCk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJj
ZUhhbmRsZTo6Y2FuY2VsKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlOjpwbGF0
Zm9ybVNldERlZmVyc0xvYWRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGU6
OmRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpS
ZXNvdXJjZUhhbmRsZTo6cmVjZWl2ZWRDcmVkZW50aWFsKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
c291cmNlSGFuZGxlOjpyZWNlaXZlZFJlcXVlc3RUb0NvbnRpbnVlV2l0aG91dENyZWRlbnRpYWwp
OgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGU6OnBsYXRmb3JtTG9hZFJlc291cmNl
U3luY2hyb25vdXNseSk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUludGVybmFs
Ojppbml0aWFsaXplKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxl
SW50ZXJuYWw6OmFwcGx5QXV0aGVudGljYXRpb24pOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29y
ZTo6Z2V0Rm9ybUVsZW1lbnRzQ291bnQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVz
b3VyY2VIYW5kbGVJbnRlcm5hbDo6c2V0dXBQVVQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29y
ZTo6UmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6c2V0dXBQT1NUKTogRGVsZXRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlJlc291cmNlSGFuZGxlSW50ZXJuYWw6OnNldHVwRm9ybURhdGEpOiBEZWxldGVk
LgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6ZGlkRmluaXNoKTog
RGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlSW50ZXJuYWw6OmRpZEZh
aWwpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6
Y2FsY3VsYXRlV2ViVGltaW5nSW5mb3JtYXRpb25zKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OlJlc291cmNlSGFuZGxlSW50ZXJuYWw6OmhhbmRsZUxvY2FsUmVjZWl2ZVJlc3BvbnNlKTog
RGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmlzSHR0cEluZm8pOiBEZWxldGVkLgorICAgICAg
ICAoV2ViQ29yZTo6aXNIdHRwUmVkaXJlY3QpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6
aXNIdHRwQXV0aGVudGljYXRpb24pOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6aXNIdHRw
Tm90TW9kaWZpZWQpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6aXNBcHBlbmRhYmxlSGVh
ZGVyKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OnJlbW92ZUxlYWRpbmdBbmRUcmFpbGlu
Z1F1b3Rlcyk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpnZXRQcm90ZWN0aW9uU3BhY2Up
OiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6d2ls
bFByZXBhcmVTZW5kRGF0YSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhh
bmRsZUludGVybmFsOjpkaWRSZWNlaXZlSGVhZGVyTGluZSk6IERlbGV0ZWQuCisgICAgICAgIChX
ZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUludGVybmFsOjpkaWRSZWNlaXZlQWxsSGVhZGVycyk6IERl
bGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUludGVybmFsOjpkaWRSZWNl
aXZlQ29udGVudERhdGEpOiBEZWxldGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5k
bGVJbnRlcm5hbDo6cmVhZENhbGxiYWNrKTogRGVsZXRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJl
c291cmNlSGFuZGxlSW50ZXJuYWw6OmhlYWRlckNhbGxiYWNrKTogRGVsZXRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlJlc291cmNlSGFuZGxlSW50ZXJuYWw6OndyaXRlQ2FsbGJhY2spOiBEZWxldGVk
LgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6ZGlzcGF0Y2hTeW5j
aHJvbm91c0pvYik6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUlu
dGVybmFsOjpoYW5kbGVEYXRhVVJMKTogRGVsZXRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGUuY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpSZXNvdXJjZUhhbmRsZUN1cmxE
ZWxlZ2F0ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6
flJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNl
SGFuZGxlQ3VybERlbGVnYXRlOjpoYXNIYW5kbGUgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6
UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnJlbGVhc2VIYW5kbGUpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnN0YXJ0KToKKyAgICAgICAgKFdlYkNv
cmU6OlJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpjYW5jZWwpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldERlZmVyc0xvYWRpbmcpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldEF1dGhlbnRpY2F0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpkaXNwYXRj
aFN5bmNocm9ub3VzSm9iKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlQ3VybERl
bGVnYXRlOjpyZXRhaW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVs
ZWdhdGU6OnJlbGVhc2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVs
ZWdhdGU6OnNldHVwUmVxdWVzdCk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1
cmxEZWxlZ2F0ZTo6bm90aWZ5RmluaXNoKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFu
ZGxlQ3VybERlbGVnYXRlOjpub3RpZnlGYWlsKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNl
SGFuZGxlQ3VybERlbGVnYXRlOjpyZXNwb25zZSk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJj
ZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6c2V0dXBBdXRoZW50aWNhdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpyZW1vdmVMZWFkaW5nQW5kVHJhaWxpbmdRdW90ZXMpOgorICAgICAgICAoV2ViQ29yZTo6
UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OmdldFByb3RlY3Rpb25TcGFjZSk6CisgICAgICAg
IChXZWJDb3JlOjppc0h0dHBJbmZvKToKKyAgICAgICAgKFdlYkNvcmU6OmlzSHR0cFJlZGlyZWN0
KToKKyAgICAgICAgKFdlYkNvcmU6OmlzSHR0cEF1dGhlbnRpY2F0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OmlzSHR0cE5vdE1vZGlmaWVkKToKKyAgICAgICAgKFdlYkNvcmU6OmlzQXBwZW5kYWJs
ZUhlYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6
ZGlkUmVjZWl2ZUhlYWRlckxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVD
dXJsRGVsZWdhdGU6OmRpZFJlY2VpdmVBbGxIZWFkZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
c291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpkaWRSZWNlaXZlQ29udGVudERhdGEpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OmhhbmRsZUxvY2FsUmVjZWl2
ZVJlc3BvbnNlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRl
OjpwcmVwYXJlU2VuZERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJs
RGVsZWdhdGU6OmRpZEZpbmlzaCk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1
cmxEZWxlZ2F0ZTo6ZGlkRmFpbCk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1
cmxEZWxlZ2F0ZTo6aGFuZGxlRGF0YVVSTCk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhh
bmRsZUN1cmxEZWxlZ2F0ZTo6c2V0dXBQT1NUKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNl
SGFuZGxlQ3VybERlbGVnYXRlOjpzZXR1cFBVVCk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJj
ZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6Z2V0Rm9ybUVsZW1lbnRzQ291bnQpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldHVwRm9ybURhdGEpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OmFwcGx5QXV0aGVudGljYXRp
b24pOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldFdl
YlRpbWluZ3MpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6
OmRpZFJlY2VpdmVIZWFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVDdXJs
RGVsZWdhdGU6OmRpZFJlY2VpdmVEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFu
ZGxlQ3VybERlbGVnYXRlOjp3aWxsU2VuZERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6UmVzb3Vy
Y2VIYW5kbGVDdXJsRGVsZWdhdGU6OmRpZFJlY2VpdmVIZWFkZXJDYWxsYmFjayk6CisgICAgICAg
IChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6ZGlkUmVjZWl2ZURhdGFDYWxs
YmFjayk6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6d2ls
bFNlbmREYXRhQ2FsbGJhY2spOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNv
dXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZS5oOiBBZGRlZC4KKwogMjAxNy0wOC0xOCAgUGVyIEFybmUg
Vm9sbGFuICA8cHZvbGxhbkBhcHBsZS5jb20+CiAKICAgICAgICAgW1dpbl0gYWNjZXNzaWJpbGl0
eS9oZWFkaW5nLWNyYXNoLWFmdGVyLWhpZGRlbi5odG1sIGlzIGEgZmxha3kgY3Jhc2guCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9DdXJsLmNtYWtlCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL0N1cmwuY21ha2UJKHJldmlzaW9uIDIyMDkzMikKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL0N1cmwuY21ha2UJKHdvcmtpbmcgY29weSkKQEAgLTE1LDYgKzE1
LDcgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9TT1VSQ0VTCiAgICAgcGxhdGZvcm0vbmV0d29yay9j
dXJsL011bHRpcGFydEhhbmRsZS5jcHAKICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUHJveHlT
ZXJ2ZXJDdXJsLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1
cmwuY3BwCisgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybERlbGVn
YXRlLmNwcAogICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9TU0xIYW5kbGUuY3BwCiAgICAgcGxh
dGZvcm0vbmV0d29yay9jdXJsL1NvY2tldFN0cmVhbUhhbmRsZUltcGxDdXJsLmNwcAogICAgIHBs
YXRmb3JtL25ldHdvcmsvY3VybC9TeW5jaHJvbm91c0xvYWRlckNsaWVudEN1cmwuY3BwCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlSW50ZXJuYWwu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNl
SGFuZGxlSW50ZXJuYWwuaAkocmV2aXNpb24gMjIwOTMyKQorKysgU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZUludGVybmFsLmgJKHdvcmtpbmcgY29weSkKQEAg
LTQzLDExICs0Myw3IEBACiAjZW5kaWYKIAogI2lmIFVTRShDVVJMKQotI2luY2x1ZGUgIkN1cmxD
b250ZXh0LmgiCi0jaW5jbHVkZSAiQ3VybEpvYk1hbmFnZXIuaCIKLSNpbmNsdWRlICJGb3JtRGF0
YVN0cmVhbUN1cmwuaCIKLSNpbmNsdWRlICJNdWx0aXBhcnRIYW5kbGUuaCIKLSNpbmNsdWRlIDx3
dGYvTG9jay5oPgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlLmgiCiAjZW5k
aWYKIAogI2lmIFVTRShTT1VQKQpAQCAtODgsMTAgKzg0LDYgQEAgcHVibGljOgogI2lmIFVTRShD
RlVSTENPTk5FQ1RJT04pCiAgICAgICAgICwgbV9jdXJyZW50UmVxdWVzdChyZXF1ZXN0KQogI2Vu
ZGlmCi0jaWYgVVNFKENVUkwpCi0gICAgICAgICwgbV9oYW5kbGUgeyBsb2FkZXIgfQotICAgICAg
ICAsIG1fZm9ybURhdGFTdHJlYW0geyBsb2FkZXIgfQotI2VuZGlmCiAjaWYgVVNFKFNPVVApCiAg
ICAgICAgICwgbV90aW1lb3V0U291cmNlKFJ1bkxvb3A6Om1haW4oKSwgbG9hZGVyLCAmUmVzb3Vy
Y2VIYW5kbGU6OnRpbWVvdXRGaXJlZCkKICNlbmRpZgpAQCAtMTQwLDQ5ICsxMzIsOCBAQCBwdWJs
aWM6CiAgICAgUmV0YWluUHRyPENGVVJMU3RvcmFnZVNlc3Npb25SZWY+IG1fc3RvcmFnZVNlc3Np
b247CiAjZW5kaWYKICNpZiBVU0UoQ1VSTCkKLSAgICBSZXNvdXJjZUhhbmRsZSogbV9oYW5kbGU7
Ci0gICAgQ3VybEhhbmRsZSBtX2N1cmxIYW5kbGU7Ci0KKyAgICBSZWZQdHI8UmVzb3VyY2VIYW5k
bGVDdXJsRGVsZWdhdGU+IG1fZGVsZWdhdGU7CiAgICAgUmVzb3VyY2VSZXNwb25zZSBtX3Jlc3Bv
bnNlOwotICAgIGJvb2wgbV9jYW5jZWxsZWQgeyBmYWxzZSB9OwotICAgIHVuc2lnbmVkIHNob3J0
IG1fYXV0aEZhaWx1cmVDb3VudCB7IDAgfTsKLQotICAgIEZvcm1EYXRhU3RyZWFtIG1fZm9ybURh
dGFTdHJlYW07Ci0gICAgdW5zaWduZWQgbV9zc2xFcnJvcnMgeyAwIH07Ci0gICAgVmVjdG9yPGNo
YXI+IG1fcG9zdEJ5dGVzOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPE11bHRpcGFydEhhbmRsZT4g
bV9tdWx0aXBhcnRIYW5kbGU7Ci0gICAgYm9vbCBtX2FkZGVkQ2FjaGVWYWxpZGF0aW9uSGVhZGVy
cyB7IGZhbHNlIH07Ci0gICAgQ3VybEpvYlRpY2tldCBtX2pvYiB7IG51bGxwdHIgfTsKLQotICAg
IFZlY3RvcjxjaGFyPiBtX3JlY2VpdmVkQnVmZmVyOwotICAgIExvY2sgbV9yZWNlaXZlZEJ1ZmZl
ck11dGV4OwotCi0gICAgdm9pZCBpbml0aWFsaXplKCk7Ci0gICAgdm9pZCBhcHBseUF1dGhlbnRp
Y2F0aW9uKCk7Ci0gICAgdm9pZCBzZXR1cFBPU1QoKTsKLSAgICB2b2lkIHNldHVwUFVUKCk7Ci0g
ICAgdm9pZCBzZXR1cEZvcm1EYXRhKGJvb2wgaXNQb3N0UmVxdWVzdCk7Ci0KLSAgICB2b2lkIGRp
ZEZpbmlzaCgpOwotICAgIHZvaWQgZGlkRmFpbCgpOwotCi0gICAgc2l6ZV90IHdpbGxQcmVwYXJl
U2VuZERhdGEoY2hhciogcHRyLCBzaXplX3QgYmxvY2tTaXplLCBzaXplX3QgbnVtYmVyT2ZCbG9j
a3MpOwotICAgIHZvaWQgZGlkUmVjZWl2ZUhlYWRlckxpbmUoY29uc3QgU3RyaW5nJiBoZWFkZXIp
OwotICAgIHZvaWQgZGlkUmVjZWl2ZUFsbEhlYWRlcnMobG9uZyBodHRwQ29kZSwgbG9uZyBsb25n
IGNvbnRlbnRMZW5ndGgpOwotICAgIHZvaWQgZGlkUmVjZWl2ZUNvbnRlbnREYXRhKCk7Ci0KLSAg
ICB2b2lkIGhhbmRsZUxvY2FsUmVjZWl2ZVJlc3BvbnNlKCk7Ci0KLSAgICBzdGF0aWMgc2l6ZV90
IHJlYWRDYWxsYmFjayhjaGFyKiBwdHIsIHNpemVfdCBibG9ja1NpemUsIHNpemVfdCBudW1iZXJP
ZkJsb2Nrcywgdm9pZCogZGF0YSk7Ci0gICAgc3RhdGljIHNpemVfdCBoZWFkZXJDYWxsYmFjayhj
aGFyKiBwdHIsIHNpemVfdCBibG9ja1NpemUsIHNpemVfdCBudW1iZXJPZkJsb2Nrcywgdm9pZCog
ZGF0YSk7Ci0gICAgc3RhdGljIHNpemVfdCB3cml0ZUNhbGxiYWNrKGNoYXIqIHB0ciwgc2l6ZV90
IGJsb2NrU2l6ZSwgc2l6ZV90IG51bWJlck9mQmxvY2tzLCB2b2lkKiBkYXRhKTsKLQotICAgIHZv
aWQgZGlzcGF0Y2hTeW5jaHJvbm91c0pvYigpOwotICAgIHZvaWQgaGFuZGxlRGF0YVVSTCgpOwot
Ci0gICAgdm9pZCBjYWxjdWxhdGVXZWJUaW1pbmdJbmZvcm1hdGlvbnMoKTsKLQogI2VuZGlmCiAK
ICNpZiBVU0UoU09VUCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3Vy
bC9DdXJsQ2FjaGVNYW5hZ2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybENhY2hlTWFuYWdlci5jcHAJKHJldmlzaW9uIDIyMDkzMikK
KysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsQ2FjaGVNYW5hZ2Vy
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTk5LDcgKzE5OSw3IEBAIHZvaWQgQ3VybENhY2hlTWFu
YWdlcjo6ZGlkUmVjZWl2ZVJlc3BvbnMKICAgICAgICAgcmV0dXJuOwogCiAgICAgUmVzb3VyY2VI
YW5kbGVJbnRlcm5hbCogZCA9IGpvYi5nZXRJbnRlcm5hbCgpOwotICAgIGlmIChkLT5tX2NhbmNl
bGxlZCkKKyAgICBpZiAoIWQtPm1fZGVsZWdhdGUtPmhhc0hhbmRsZSgpKQogICAgICAgICByZXR1
cm47CiAKICAgICBjb25zdCBTdHJpbmcmIHVybCA9IGpvYi5maXJzdFJlcXVlc3QoKS51cmwoKS5z
dHJpbmcoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJs
RG93bmxvYWQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvY3VybC9DdXJsRG93bmxvYWQuY3BwCShyZXZpc2lvbiAyMjA5MzIpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybERvd25sb2FkLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNTgsOCArNTgsNiBAQCB2b2lkIEN1cmxEb3dubG9hZDo6aW5pdChDdXJsRG93bmxvYWRM
aXN0CiAKICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX211dGV4KTsKIAotICAgIHNldHVwUmVxdWVz
dCgpOwotCiAgICAgbV9saXN0ZW5lciA9IGxpc3RlbmVyOwogICAgIG1fdXJsID0gdXJsOwogfQpA
QCAtNzgsMjYgKzc2LDE1IEBAIHZvaWQgQ3VybERvd25sb2FkOjppbml0KEN1cmxEb3dubG9hZExp
c3QKIAogYm9vbCBDdXJsRG93bmxvYWQ6OnN0YXJ0KCkKIHsKLSAgICBtX2pvYiA9IEN1cmxKb2JN
YW5hZ2VyOjpzaW5nbGV0b24oKS5hZGQobV9jdXJsSGFuZGxlLCBbdGhpcywgcHJvdGVjdGVkVGhp
cyA9IG1ha2VSZWYoKnRoaXMpXShDdXJsSm9iUmVzdWx0IHJlc3VsdCkgbXV0YWJsZSB7Ci0gICAg
ICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgQ3VybEpvYlJlc3VsdDo6RG9uZToK
LSAgICAgICAgICAgIGRpZEZpbmlzaCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAg
Y2FzZSBDdXJsSm9iUmVzdWx0OjpFcnJvcjoKLSAgICAgICAgICAgIGRpZEZhaWwoKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ3VybEpvYlJlc3VsdDo6Q2FuY2VsbGVkOgot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gdHJ1ZTsK
KyAgICBtX2pvYiA9IEN1cmxKb2JNYW5hZ2VyOjpzaW5nbGV0b24oKS5hZGQobV9jdXJsSGFuZGxl
LCAqdGhpcyk7CisgICAgcmV0dXJuICEhbV9qb2I7CiB9CiAKIGJvb2wgQ3VybERvd25sb2FkOjpj
YW5jZWwoKQogewotICAgIEN1cmxKb2JNYW5hZ2VyOjpzaW5nbGV0b24oKS5jYW5jZWwobV9qb2Ip
OworICAgIEN1cmxKb2JUaWNrZXQgam9iID0gbV9qb2I7CisgICAgbV9qb2IgPSBudWxscHRyOwor
ICAgIEN1cmxKb2JNYW5hZ2VyOjpzaW5nbGV0b24oKS5jYW5jZWwoam9iKTsKICAgICByZXR1cm4g
dHJ1ZTsKIH0KIApAQCAtMTA5LDYgKzk2LDE2IEBAIFJlc291cmNlUmVzcG9uc2UgQ3VybERvd25s
b2FkOjpnZXRSZXNwb24KICAgICByZXR1cm4gcmVzcG9uc2U7CiB9CiAKK3ZvaWQgQ3VybERvd25s
b2FkOjpyZXRhaW4oKQoreworICAgIHJlZigpOworfQorCit2b2lkIEN1cmxEb3dubG9hZDo6cmVs
ZWFzZSgpCit7CisgICAgZGVyZWYoKTsKK30KKwogdm9pZCBDdXJsRG93bmxvYWQ6OnNldHVwUmVx
dWVzdCgpCiB7CiAgICAgTG9ja0hvbGRlciBsb2NrZXIobV9tdXRleCk7CkBAIC0xMjUsNiArMTIy
LDI0IEBAIHZvaWQgQ3VybERvd25sb2FkOjpzZXR1cFJlcXVlc3QoKQogICAgIG1fY3VybEhhbmRs
ZS5lbmFibGVDQUluZm9JZkV4aXN0cygpOwogfQogCit2b2lkIEN1cmxEb3dubG9hZDo6bm90aWZ5
RmluaXNoKCkKK3sKKyAgICBjYWxsT25NYWluVGhyZWFkKFtwcm90ZWN0ZWRUaGlzID0gbWFrZVJl
ZigqdGhpcyldIHsKKyAgICAgICAgaWYgKCFwcm90ZWN0ZWRUaGlzLT5tX2pvYikKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgcHJvdGVjdGVkVGhpcy0+ZGlkRmluaXNoKCk7CisgICAgfSk7
Cit9CisKK3ZvaWQgQ3VybERvd25sb2FkOjpub3RpZnlGYWlsKCkKK3sKKyAgICBjYWxsT25NYWlu
VGhyZWFkKFtwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyldIHsKKyAgICAgICAgaWYgKCFw
cm90ZWN0ZWRUaGlzLT5tX2pvYikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcHJvdGVj
dGVkVGhpcy0+ZGlkRmFpbCgpOworICAgIH0pOworfQorCiB2b2lkIEN1cmxEb3dubG9hZDo6Y2xv
c2VGaWxlKCkKIHsKICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX211dGV4KTsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsRG93bmxvYWQuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybERvd25sb2FkLmgJ
KHJldmlzaW9uIDIyMDkzMikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3Vy
bC9DdXJsRG93bmxvYWQuaAkod29ya2luZyBjb3B5KQpAQCAtNDQsNyArNDQsNyBAQCBwdWJsaWM6
CiAgICAgdmlydHVhbCB2b2lkIGRpZEZhaWwoKSB7IH0KIH07CiAKLWNsYXNzIEN1cmxEb3dubG9h
ZCA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxDdXJsRG93bmxvYWQ+IHsKK2NsYXNzIEN1
cmxEb3dubG9hZCA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxDdXJsRG93bmxvYWQ+LCBw
dWJsaWMgQ3VybEpvYkNsaWVudCB7CiBwdWJsaWM6CiAgICAgQ3VybERvd25sb2FkKCk7CiAgICAg
fkN1cmxEb3dubG9hZCgpOwpAQCAtNjUsNyArNjUsMTIgQEAgcHVibGljOgogICAgIHZvaWQgc2V0
RGVzdGluYXRpb24oY29uc3QgU3RyaW5nJiBkZXN0aW5hdGlvbikgeyBtX2Rlc3RpbmF0aW9uID0g
ZGVzdGluYXRpb247IH0KIAogcHJpdmF0ZToKLSAgICB2b2lkIHNldHVwUmVxdWVzdCgpOworICAg
IHZvaWQgcmV0YWluKCkgb3ZlcnJpZGU7CisgICAgdm9pZCByZWxlYXNlKCkgb3ZlcnJpZGU7CisK
KyAgICB2b2lkIHNldHVwUmVxdWVzdCgpIG92ZXJyaWRlOworICAgIHZvaWQgbm90aWZ5RmluaXNo
KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBub3RpZnlGYWlsKCkgb3ZlcnJpZGU7CiAKICAgICB2b2lk
IGNsb3NlRmlsZSgpOwogICAgIHZvaWQgbW92ZUZpbGVUb0Rlc3RpbmF0aW9uKCk7CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ3VybEpvYk1hbmFnZXIuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9DdXJsSm9i
TWFuYWdlci5jcHAJKHJldmlzaW9uIDIyMDkzMikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9DdXJsSm9iTWFuYWdlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNiAr
MSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDEzIEFwcGxlIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTcgU29ueSBJbnRlcmFjdGl2ZSBFbnRlcnRh
aW5tZW50IEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBOQVZFUiBDb3JwLgogICoKICAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNSwxMCArMjYsMTEgQEAKICAqLwogCiAjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ3VybEpvYk1hbmFnZXIuaCIKIAogI2lmIFVTRShDVVJM
KQotI2luY2x1ZGUgIkN1cmxKb2JNYW5hZ2VyLmgiCiAKKyNpbmNsdWRlICJSZXNvdXJjZUhhbmRs
ZUN1cmxEZWxlZ2F0ZS5oIgogI2luY2x1ZGUgPGl0ZXJhdG9yPgogI2luY2x1ZGUgPHd0Zi9NYWlu
VGhyZWFkLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgpAQCAtMzcsODggKzM5LDY5
IEBAIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2Vu
dW0gY2xhc3MgQ3VybEpvYlJlc3VsdCB7IERvbmUsIEVycm9yLCBDYW5jZWxsZWQgfTsKKwogLyoK
ICAqIEN1cmxKb2JMaXN0IGlzIHVzZWQgb25seSBpbiBiYWNrZ3JvdW5kIHNvIHRoYXQgbm8gbmVl
ZCB0byBtYW5hZ2UgbXV0ZXgKICAqLwogY2xhc3MgQ3VybEpvYkxpc3QgOiBwdWJsaWMgQ3VybE11
bHRpSGFuZGxlIHsKLSAgICB1c2luZyBQcmVkaWNhdGUgPSBXVEY6OkZ1bmN0aW9uPGJvb2woY29u
c3QgQ3VybEpvYiYpPjsKLSAgICB1c2luZyBBY3Rpb24gPSBXVEY6OkZ1bmN0aW9uPHZvaWQoQ3Vy
bEpvYiYpPjsKLSAgICB1c2luZyBKb2JNYXAgPSBIYXNoTWFwPEN1cmxKb2JUaWNrZXQsIEN1cmxK
b2I+OwotCiBwdWJsaWM6Ci0gICAgdm9pZCBhcHBlbmQoQ3VybEpvYiYgam9iKQotICAgIHsKLSAg
ICAgICAgQ3VybEhhbmRsZSogY3VybCA9IGpvYi5jdXJsSGFuZGxlKCk7CisgICAgYm9vbCBpc0Vt
cHR5KCkgY29uc3QgeyByZXR1cm4gbV9hY3RpdmVKb2JzLmlzRW1wdHkoKTsgfQogCi0gICAgICAg
IENVUkxNY29kZSByZXR2YWwgPSBhZGRIYW5kbGUoY3VybC0+aGFuZGxlKCkpOwotICAgICAgICAg
ICAgLy8gQEZJWE1FIGVycm9yIGxvZ2dpbmcKLSAgICAgICAgaWYgKHJldHZhbCA9PSBDVVJMTV9P
SykKLSAgICAgICAgICAgIG1fam9icy5zZXQoam9iLnRpY2tldCgpLCBXVEZNb3ZlKGpvYikpOwot
ICAgIH0KLQotICAgIHZvaWQgY2FuY2VsKEN1cmxKb2JUaWNrZXQgdGlja2V0KQorICAgIHZvaWQg
c3RhcnRKb2JzKEhhc2hNYXA8Q3VybEpvYlRpY2tldCwgQ3VybEpvYkNsaWVudCo+JiYgam9icykK
ICAgICB7Ci0gICAgICAgIGNvbXBsZXRlKHRpY2tldCwgW10oYXV0byYmIGpvYikgeyBqb2IuY2Fu
Y2VsKCk7IH0pOworICAgICAgICBhdXRvIGxvY2FsSm9icyA9IFdURk1vdmUoam9icyk7CisgICAg
ICAgIGZvciAoYXV0byYgam9iIDogbG9jYWxKb2JzKSB7CisgICAgICAgICAgICBqb2IudmFsdWUt
PnNldHVwUmVxdWVzdCgpOworICAgICAgICAgICAgbV9hY3RpdmVKb2JzLmFkZChqb2Iua2V5LCBq
b2IudmFsdWUpOworICAgICAgICAgICAgYWRkSGFuZGxlKGpvYi5rZXkpOworICAgICAgICB9CiAg
ICAgfQogCi0gICAgdm9pZCBjb21wbGV0ZShDdXJsSm9iVGlja2V0IHRpY2tldCwgQWN0aW9uIGFj
dGlvbikKKyAgICB2b2lkIGZpbmlzaEpvYnMoSGFzaFNldDxDdXJsSm9iVGlja2V0PiYmIHRpY2tl
dHMsIEN1cmxKb2JSZXN1bHQgcmVzdWx0KQogICAgIHsKLSAgICAgICAgYXV0byBmb3VuZCA9IG1f
am9icy5maW5kKHRpY2tldCk7Ci0gICAgICAgIGlmIChmb3VuZCAhPSBtX2pvYnMuZW5kKCkpIHsK
LSAgICAgICAgICAgIGF1dG8gam9iID0gV1RGTW92ZShmb3VuZC0+dmFsdWUpOwotCi0gICAgICAg
ICAgICByZW1vdmVIYW5kbGUoam9iLmN1cmxIYW5kbGUoKS0+aGFuZGxlKCkpOwotICAgICAgICAg
ICAgYWN0aW9uKGpvYik7Ci0KLSAgICAgICAgICAgIG1fam9icy5yZW1vdmUoZm91bmQpOworICAg
ICAgICBhdXRvIGxvY2FsVGlja2V0cyA9IFdURk1vdmUodGlja2V0cyk7CisgICAgICAgIGZvciAo
YXV0byYgdGlja2V0IDogbG9jYWxUaWNrZXRzKSB7CisgICAgICAgICAgICBpZiAoIW1fYWN0aXZl
Sm9icy5jb250YWlucyh0aWNrZXQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICAgICAgcmVtb3ZlSGFuZGxlKHRpY2tldCk7CisgICAgICAgICAgICBub3RpZnlSZXN1bHQobV9h
Y3RpdmVKb2JzLmZhc3RHZXQodGlja2V0KSwgcmVzdWx0KTsKKyAgICAgICAgICAgIG1fYWN0aXZl
Sm9icy5yZW1vdmUodGlja2V0KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGJvb2wgaXNFbXB0
eSgpIGNvbnN0IHsgcmV0dXJuIG1fam9icy5pc0VtcHR5KCk7IH0KLQotICAgIGJvb2wgd2l0aEpv
YihDdXJsSm9iVGlja2V0IHRpY2tldCwgV1RGOjpGdW5jdGlvbjx2b2lkKEpvYk1hcDo6aXRlcmF0
b3IpPiBjYWxsYmFjaykKK3ByaXZhdGU6CisgICAgdm9pZCBub3RpZnlSZXN1bHQoQ3VybEpvYkNs
aWVudCogY2xpZW50LCBDdXJsSm9iUmVzdWx0IHJlc3VsdCkKICAgICB7Ci0gICAgICAgIGF1dG8g
Zm91bmQgPSBtX2pvYnMuZmluZCh0aWNrZXQpOwotICAgICAgICBpZiAoZm91bmQgPT0gbV9qb2Jz
LmVuZCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgY2Fs
bGJhY2soZm91bmQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9CisgICAgICAgIHN3aXRj
aCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgQ3VybEpvYlJlc3VsdDo6RG9uZToKKyAgICAgICAg
ICAgIGNsaWVudC0+bm90aWZ5RmluaXNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBDdXJsSm9iUmVzdWx0OjpFcnJvcjoKKyAgICAgICAgICAgIGNsaWVudC0+bm90aWZ5RmFp
bCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ3VybEpvYlJlc3VsdDo6Q2Fu
Y2VsbGVkOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotICAgIGJvb2wgd2l0aEN1
cmxIYW5kbGUoQ3VybEpvYlRpY2tldCB0aWNrZXQsIFdURjo6RnVuY3Rpb248dm9pZChDdXJsSGFu
ZGxlJik+IGNhbGxiYWNrKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdpdGhKb2IodGlja2V0LCBb
JmNhbGxiYWNrXShKb2JNYXA6Oml0ZXJhdG9yIGl0KSB7Ci0gICAgICAgICAgICBjYWxsYmFjaygq
aXQtPnZhbHVlLmN1cmxIYW5kbGUoKSk7Ci0gICAgICAgIH0pOworICAgICAgICBjbGllbnQtPnJl
bGVhc2UoKTsKICAgICB9CiAKLXByaXZhdGU6Ci0gICAgSm9iTWFwIG1fam9iczsKKyAgICBIYXNo
TWFwPEN1cmxKb2JUaWNrZXQsIEN1cmxKb2JDbGllbnQqPiBtX2FjdGl2ZUpvYnM7CiB9OwogCi12
b2lkIEN1cmxKb2I6Omludm9rZShDdXJsSm9iUmVzdWx0IHJlc3VsdCkKLXsKLSAgICBjYWxsT25N
YWluVGhyZWFkKFtqb2IgPSBXVEZNb3ZlKG1fam9iKSwgcmVzdWx0XSB7Ci0gICAgICAgIGpvYihy
ZXN1bHQpOwotICAgIH0pOwotfQotCi1DdXJsSm9iVGlja2V0IEN1cmxKb2JNYW5hZ2VyOjphZGQo
Q3VybEhhbmRsZSYgY3VybCwgQ2FsbGJhY2sgY2FsbGJhY2spCitDdXJsSm9iVGlja2V0IEN1cmxK
b2JNYW5hZ2VyOjphZGQoQ3VybEhhbmRsZSYgY3VybCwgQ3VybEpvYkNsaWVudCYgY2xpZW50KQog
ewogICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CiAKKyAgICBjbGllbnQucmV0YWluKCk7CisK
ICAgICBDdXJsSm9iVGlja2V0IHRpY2tldCA9IHN0YXRpY19jYXN0PEN1cmxKb2JUaWNrZXQ+KGN1
cmwuaGFuZGxlKCkpOwogCiAgICAgewogICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX211dGV4
KTsKLQotICAgICAgICBpZiAoaXNBY3RpdmVKb2IodGlja2V0KSkKLSAgICAgICAgICAgIHJldHVy
biB0aWNrZXQ7Ci0KLQotICAgICAgICBtX3BlbmRpbmdKb2JzLmFwcGVuZChDdXJsSm9iIHsgJmN1
cmwsIFdURk1vdmUoY2FsbGJhY2spIH0pOwotICAgICAgICBtX2FjdGl2ZUpvYnMuYWRkKHRpY2tl
dCk7CisgICAgICAgIG1fY2FuY2VsbGVkVGlja2V0cy5yZW1vdmUodGlja2V0KTsKKyAgICAgICAg
bV9wZW5kaW5nSm9icy5hZGQodGlja2V0LCAmY2xpZW50KTsKICAgICB9CiAKICAgICBzdGFydFRo
cmVhZElmTmVlZGVkKCk7CkBAIC0xMjYsMjggKzEwOSwxOCBAQCBDdXJsSm9iVGlja2V0IEN1cmxK
b2JNYW5hZ2VyOjphZGQoQ3VybEhhCiAgICAgcmV0dXJuIHRpY2tldDsKIH0KIAotYm9vbCBDdXJs
Sm9iTWFuYWdlcjo6Y2FuY2VsKEN1cmxKb2JUaWNrZXQgam9iKQordm9pZCBDdXJsSm9iTWFuYWdl
cjo6Y2FuY2VsKEN1cmxKb2JUaWNrZXQgam9iKQogewogICAgIEFTU0VSVChpc01haW5UaHJlYWQo
KSk7CiAKLSAgICBpZiAobV9ydW5UaHJlYWQpIHsKLSAgICAgICAgTG9ja0hvbGRlciBsb2NrZXIo
bV9tdXRleCk7Ci0KLSAgICAgICAgaWYgKCFpc0FjdGl2ZUpvYihqb2IpKQotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgICAKLSAgICAgICAgbV9jYW5jZWxsZWRUaWNrZXRzLmFwcGVu
ZChqb2IpOwotICAgICAgICBtX2FjdGl2ZUpvYnMucmVtb3ZlKGpvYik7Ci0gICAgfQotCi0gICAg
cmV0dXJuIHRydWU7CisgICAgTG9ja0hvbGRlciBsb2NrZXIobV9tdXRleCk7CisgICAgbV9jYW5j
ZWxsZWRUaWNrZXRzLmFkZChqb2IpOwogfQogCi12b2lkIEN1cmxKb2JNYW5hZ2VyOjpjYWxsT25K
b2JUaHJlYWQoV1RGOjpGdW5jdGlvbjx2b2lkKCk+JiYgY2FsbGJhY2spCit2b2lkIEN1cmxKb2JN
YW5hZ2VyOjpjYWxsT25Kb2JUaHJlYWQoV1RGOjpGdW5jdGlvbjx2b2lkKCk+JiYgdGFzaykKIHsK
LSAgICBMb2NrSG9sZGVyIGxvY2tlciB7IG1fbXV0ZXggfTsKLQotICAgIG1fdGFza1F1ZXVlLmFw
cGVuZChzdGQ6Om1ha2VfdW5pcXVlPFdURjo6RnVuY3Rpb248dm9pZCgpPj4oV1RGTW92ZShjYWxs
YmFjaykpKTsKKyAgICBMb2NrSG9sZGVyIGxvY2tlcihtX211dGV4KTsKKyAgICBtX3Rhc2tRdWV1
ZS5hcHBlbmQoV1RGTW92ZSh0YXNrKSk7CiB9CiAKIHZvaWQgQ3VybEpvYk1hbmFnZXI6OnN0YXJ0
VGhyZWFkSWZOZWVkZWQoKQpAQCAtMTYyLDYgKzEzNSw3IEBAIHZvaWQgQ3VybEpvYk1hbmFnZXI6
OnN0YXJ0VGhyZWFkSWZOZWVkZWQKICAgICAgICAgbV9ydW5UaHJlYWQgPSB0cnVlOwogICAgICAg
ICBtX3RocmVhZCA9IFRocmVhZDo6Y3JlYXRlKCJjdXJsVGhyZWFkIiwgW3RoaXNdIHsKICAgICAg
ICAgICAgIHdvcmtlclRocmVhZCgpOworICAgICAgICAgICAgbV9ydW5UaHJlYWQgPSBmYWxzZTsK
ICAgICAgICAgfSk7CiAgICAgfQogfQpAQCAtMTg2LDMyICsxNjAsMjkgQEAgdm9pZCBDdXJsSm9i
TWFuYWdlcjo6c3RvcFRocmVhZCgpCiAgICAgfQogfQogCi1ib29sIEN1cmxKb2JNYW5hZ2VyOjp1
cGRhdGVKb2JzKEN1cmxKb2JMaXN0JiBqb2JzKQordm9pZCBDdXJsSm9iTWFuYWdlcjo6dXBkYXRl
Sm9iTGlzdChDdXJsSm9iTGlzdCYgam9icykKIHsKICAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgp
KTsKIAotICAgIFZlY3RvcjxDdXJsSm9iPiBwZW5kaW5nSm9iczsKLSAgICBWZWN0b3I8Q3VybEpv
YlRpY2tldD4gY2FuY2VsbGVkVGlja2V0czsKKyAgICBIYXNoTWFwPEN1cmxKb2JUaWNrZXQsIEN1
cmxKb2JDbGllbnQqPiBwZW5kaW5nSm9iczsKKyAgICBIYXNoU2V0PEN1cmxKb2JUaWNrZXQ+IGNh
bmNlbGxlZFRpY2tldHM7CisgICAgVmVjdG9yPFdURjo6RnVuY3Rpb248dm9pZCgpPj4gdGFza1F1
ZXVlOworCiAgICAgewogICAgICAgICBMb2NrSG9sZGVyIGxvY2tlcihtX211dGV4KTsKLSAgICAg
ICAgaWYgKCFtX3J1blRocmVhZCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAg
ICBwZW5kaW5nSm9icyA9IFdURk1vdmUobV9wZW5kaW5nSm9icyk7CiAgICAgICAgIGNhbmNlbGxl
ZFRpY2tldHMgPSBXVEZNb3ZlKG1fY2FuY2VsbGVkVGlja2V0cyk7CisgICAgICAgIHRhc2tRdWV1
ZSA9IFdURk1vdmUobV90YXNrUXVldWUpOwogICAgIH0KIAotICAgIGZvciAoYXV0byYgam9iIDog
cGVuZGluZ0pvYnMpCi0gICAgICAgIGpvYnMuYXBwZW5kKGpvYik7CisgICAgam9icy5zdGFydEpv
YnMoV1RGTW92ZShwZW5kaW5nSm9icykpOworICAgIGpvYnMuZmluaXNoSm9icyhXVEZNb3ZlKGNh
bmNlbGxlZFRpY2tldHMpLCBDdXJsSm9iUmVzdWx0OjpDYW5jZWxsZWQpOworICAgIGpvYnMuZmlu
aXNoSm9icyhXVEZNb3ZlKG1fZmluaXNoZWRUaWNrZXRzKSwgQ3VybEpvYlJlc3VsdDo6RG9uZSk7
CisgICAgam9icy5maW5pc2hKb2JzKFdURk1vdmUobV9mYWlsZWRUaWNrZXRzKSwgQ3VybEpvYlJl
c3VsdDo6RXJyb3IpOwogCi0gICAgZm9yIChhdXRvJiB0aWNrZXQgOiBjYW5jZWxsZWRUaWNrZXRz
KQotICAgICAgICBqb2JzLmNhbmNlbCh0aWNrZXQpOwotCi0gICAgZm9yIChhdXRvJiBjYWxsYmFj
ayA6IG1fdGFza1F1ZXVlLnRha2VBbGxNZXNzYWdlcygpKSB7Ci0gICAgICAgICgqY2FsbGJhY2sp
KCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7CisgICAgZm9yIChhdXRvJiB0YXNrIDogdGFz
a1F1ZXVlKQorICAgICAgICB0YXNrKCk7CiB9CiAKIHZvaWQgQ3VybEpvYk1hbmFnZXI6Ondvcmtl
clRocmVhZCgpCkBAIC0yMjAsNyArMTkxLDkgQEAgdm9pZCBDdXJsSm9iTWFuYWdlcjo6d29ya2Vy
VGhyZWFkKCkKIAogICAgIEN1cmxKb2JMaXN0IGpvYnM7CiAKLSAgICB3aGlsZSAodXBkYXRlSm9i
cyhqb2JzKSkgeworICAgIHdoaWxlIChtX3J1blRocmVhZCkgeworICAgICAgICB1cGRhdGVKb2JM
aXN0KGpvYnMpOworCiAgICAgICAgIC8vIFJldHJ5ICdzZWxlY3QnIGlmIGl0IHdhcyBpbnRlcnJ1
cHRlZCBieSBhIHByb2Nlc3Mgc2lnbmFsLgogICAgICAgICBpbnQgcmMgPSAwOwogICAgICAgICBk
byB7CkBAIC0yNTUsMzggKzIyOCwxNiBAQCB2b2lkIEN1cmxKb2JNYW5hZ2VyOjp3b3JrZXJUaHJl
YWQoKQogICAgICAgICAgICAgaWYgKCFtc2cpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAg
ICAgICAgICAgIGlmIChtc2ctPm1zZyA9PSBDVVJMTVNHX0RPTkUpIHsKLSAgICAgICAgICAgICAg
ICBhdXRvIHRpY2tldCA9IHN0YXRpY19jYXN0PEN1cmxKb2JUaWNrZXQ+KG1zZy0+ZWFzeV9oYW5k
bGUpOwotICAgICAgICAgICAgICAgIENVUkxjb2RlIHJlc3VsdCA9IG1zZy0+ZGF0YS5yZXN1bHQ7
Ci0KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIExvY2tIb2xkZXIgbG9j
a2VyKG1fbXV0ZXgpOwotICAgICAgICAgICAgICAgICAgICBtX2FjdGl2ZUpvYnMucmVtb3ZlKHRp
Y2tldCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgam9icy5jb21wbGV0
ZSh0aWNrZXQsIFtyZXN1bHRdKGF1dG8mIGpvYikgewotICAgICAgICAgICAgICAgICAgICBqb2Iu
Y3VybEhhbmRsZSgpLT5zZXRFcnJvckNvZGUocmVzdWx0KTsKLQotICAgICAgICAgICAgICAgICAg
ICBib29sIGRvbmUgPSByZXN1bHQgPT0gQ1VSTEVfT0s7Ci0gICAgICAgICAgICAgICAgICAgIGlm
IChkb25lKQotICAgICAgICAgICAgICAgICAgICAgICAgam9iLmZpbmlzaGVkKCk7Ci0gICAgICAg
ICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IGpv
Yi5jdXJsSGFuZGxlKCktPmdldEVmZmVjdGl2ZVVSTCgpOwotI2lmbmRlZiBOREVCVUcKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ3VybCBFUlJPUiBmb3IgdXJsPScl
cycsIGVycm9yOiAnJXMnXG4iLCB1cmwuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSwgam9iLmN1cmxI
YW5kbGUoKS0+ZXJyb3JEZXNjcmlwdGlvbigpLnV0ZjgoKS5kYXRhKCkpOwotI2VuZGlmCi0gICAg
ICAgICAgICAgICAgICAgICAgICBqb2IuZXJyb3IoKTsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBBU1NFUlQobXNnLT5tc2cgPT0gQ1VS
TE1TR19ET05FKTsKKyAgICAgICAgICAgIGF1dG8gdGlja2V0ID0gc3RhdGljX2Nhc3Q8Q3VybEpv
YlRpY2tldD4obXNnLT5lYXN5X2hhbmRsZSk7CisgICAgICAgICAgICBpZiAobXNnLT5kYXRhLnJl
c3VsdCA9PSBDVVJMRV9PSykKKyAgICAgICAgICAgICAgICBtX2ZpbmlzaGVkVGlja2V0cy5hZGQo
dGlja2V0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX2ZhaWxlZFRpY2tl
dHMuYWRkKHRpY2tldCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoam9icy5pc0VtcHR5KCkp
IHsKKyAgICAgICAgaWYgKGpvYnMuaXNFbXB0eSgpKQogICAgICAgICAgICAgc3RvcFRocmVhZElm
Tm9Nb3JlSm9iUnVubmluZygpOwotICAgICAgICAgICAgaWYgKCFtX3J1blRocmVhZCkKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQogICAgIH0KIH0KIApJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxKb2JNYW5hZ2VyLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0N1cmxKb2JNYW5hZ2VyLmgJ
KHJldmlzaW9uIDIyMDkzMikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3Vy
bC9DdXJsSm9iTWFuYWdlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEsNyBAQAogLyoKICAq
IENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICog
Q29weXJpZ2h0IChDKSAyMDE3IFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgTkFWRVIgQ29ycC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwpAQCAtMjcsNzQgKzI4LDMwIEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgIkN1
cmxDb250ZXh0LmgiCi0KLSNpbmNsdWRlIDx3dGYvRnVuY3Rpb24uaD4KICNpbmNsdWRlIDx3dGYv
SGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL0xvY2su
aD4KLSNpbmNsdWRlIDx3dGYvTWVzc2FnZVF1ZXVlLmg+CiAjaW5jbHVkZSA8d3RmL05vbmNvcHlh
YmxlLmg+CiAjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgotI2luY2x1ZGUgPHd0Zi9WZWN0b3Iu
aD4KLQotI2lmIE9TKFdJTkRPV1MpCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2luY2x1ZGUgPHdp
bnNvY2syLmg+Ci0jZW5kaWYKLQogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLWVudW0gY2xhc3Mg
Q3VybEpvYlJlc3VsdCB7IERvbmUsIEVycm9yLCBDYW5jZWxsZWQgfTsKLXVzaW5nIEN1cmxKb2JU
aWNrZXQgPSB2b2lkKjsKLXVzaW5nIEN1cmxKb2JDYWxsYmFjayA9IFdURjo6RnVuY3Rpb248dm9p
ZChDdXJsSm9iUmVzdWx0KT47Ci11c2luZyBDdXJsSm9iVGFzayA9IFdURjo6RnVuY3Rpb248dm9p
ZChDdXJsSGFuZGxlJik+OwotCiBjbGFzcyBDdXJsSm9iTGlzdDsKK3VzaW5nIEN1cmxKb2JUaWNr
ZXQgPSB2b2lkKjsKIAotY2xhc3MgQ3VybEpvYiB7Ci0gICAgV1RGX01BS0VfTk9OQ09QWUFCTEUo
Q3VybEpvYik7CitjbGFzcyBDdXJsSm9iQ2xpZW50IHsKIHB1YmxpYzoKLSAgICBDdXJsSm9iKCkg
eyB9Ci0gICAgQ3VybEpvYihDdXJsSGFuZGxlKiBjdXJsLCBDdXJsSm9iQ2FsbGJhY2sgam9iKQot
ICAgICAgICA6IG1fY3VybCB7IGN1cmwgfSwgbV9qb2IgeyBXVEZNb3ZlKGpvYikgfSB7IH0KLSAg
ICBDdXJsSm9iKEN1cmxKb2ImJiBvdGhlcikKLSAgICB7Ci0gICAgICAgIG1fY3VybCA9IG90aGVy
Lm1fY3VybDsKLSAgICAgICAgb3RoZXIubV9jdXJsID0gbnVsbHB0cjsKLSAgICAgICAgbV9qb2Ig
PSBXVEZNb3ZlKG90aGVyLm1fam9iKTsKLSAgICB9Ci0gICAgfkN1cmxKb2IoKSB7IH0KKyAgICB2
aXJ0dWFsIHZvaWQgcmV0YWluKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAw
OwogCi0gICAgQ3VybEpvYiYgb3BlcmF0b3I9KEN1cmxKb2ImJiBvdGhlcikKLSAgICB7Ci0gICAg
ICAgIG1fY3VybCA9IG90aGVyLm1fY3VybDsKLSAgICAgICAgb3RoZXIubV9jdXJsID0gbnVsbHB0
cjsKLSAgICAgICAgbV9qb2IgPSBXVEZNb3ZlKG90aGVyLm1fam9iKTsKLSAgICAgICAgcmV0dXJu
ICp0aGlzOwotICAgIH0KLQotICAgIEN1cmxIYW5kbGUqIGN1cmxIYW5kbGUoKSBjb25zdCB7IHJl
dHVybiBtX2N1cmw7IH0KLSAgICBDdXJsSm9iVGlja2V0IHRpY2tldCgpIGNvbnN0IHsgcmV0dXJu
IHN0YXRpY19jYXN0PEN1cmxKb2JUaWNrZXQ+KG1fY3VybC0+aGFuZGxlKCkpOyB9Ci0KLSAgICB2
b2lkIGZpbmlzaGVkKCkgeyBpbnZva2UoQ3VybEpvYlJlc3VsdDo6RG9uZSk7IH0KLSAgICB2b2lk
IGVycm9yKCkgeyBpbnZva2UoQ3VybEpvYlJlc3VsdDo6RXJyb3IpOyB9Ci0gICAgdm9pZCBjYW5j
ZWwoKSB7IGludm9rZShDdXJsSm9iUmVzdWx0OjpDYW5jZWxsZWQpOyB9Ci0KLXByaXZhdGU6Ci0g
ICAgQ3VybEhhbmRsZSogbV9jdXJsOwotICAgIEN1cmxKb2JDYWxsYmFjayBtX2pvYjsKLQotICAg
IHZvaWQgaW52b2tlKEN1cmxKb2JSZXN1bHQpOworICAgIHZpcnR1YWwgdm9pZCBzZXR1cFJlcXVl
c3QoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeUZpbmlzaCgpID0gMDsKKyAgICB2aXJ0
dWFsIHZvaWQgbm90aWZ5RmFpbCgpID0gMDsKIH07CiAKLQogY2xhc3MgQ3VybEpvYk1hbmFnZXIg
ewogICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEN1cmxKb2JNYW5hZ2VyKTsKLSAgICB1c2luZyBD
YWxsYmFjayA9IEN1cmxKb2JDYWxsYmFjazsKLQogcHVibGljOgotCiAgICAgc3RhdGljIEN1cmxK
b2JNYW5hZ2VyJiBzaW5nbGV0b24oKQogICAgIHsKICAgICAgICAgc3RhdGljIEN1cmxKb2JNYW5h
Z2VyIHNoYXJlZDsKQEAgLTEwNCw4ICs2MSw5IEBAIHB1YmxpYzoKICAgICBDdXJsSm9iTWFuYWdl
cigpID0gZGVmYXVsdDsKICAgICB+Q3VybEpvYk1hbmFnZXIoKSB7IHN0b3BUaHJlYWQoKTsgfQog
Ci0gICAgQ3VybEpvYlRpY2tldCBhZGQoQ3VybEhhbmRsZSYsIENhbGxiYWNrKTsKLSAgICBib29s
IGNhbmNlbChDdXJsSm9iVGlja2V0KTsKKyAgICBDdXJsSm9iVGlja2V0IGFkZChDdXJsSGFuZGxl
JiwgQ3VybEpvYkNsaWVudCYpOworICAgIHZvaWQgY2FuY2VsKEN1cmxKb2JUaWNrZXQpOworCiAg
ICAgdm9pZCBjYWxsT25Kb2JUaHJlYWQoV1RGOjpGdW5jdGlvbjx2b2lkKCk+JiYpOwogCiBwcml2
YXRlOgpAQCAtMTEzLDE4ICs3MSwxOCBAQCBwcml2YXRlOgogICAgIHZvaWQgc3RvcFRocmVhZElm
Tm9Nb3JlSm9iUnVubmluZygpOwogICAgIHZvaWQgc3RvcFRocmVhZCgpOwogCi0gICAgYm9vbCB1
cGRhdGVKb2JzKEN1cmxKb2JMaXN0JiBqb2JzKTsKLSAgICBib29sIGlzQWN0aXZlSm9iKEN1cmxK
b2JUaWNrZXQgam9iKSBjb25zdCB7IHJldHVybiBtX2FjdGl2ZUpvYnMuY29udGFpbnMoam9iKTsg
fQorICAgIHZvaWQgdXBkYXRlSm9iTGlzdChDdXJsSm9iTGlzdCYpOwogCiAgICAgdm9pZCB3b3Jr
ZXJUaHJlYWQoKTsKIAogICAgIFJlZlB0cjxUaHJlYWQ+IG1fdGhyZWFkOwotICAgIFZlY3RvcjxD
dXJsSm9iPiBtX3BlbmRpbmdKb2JzOwotICAgIEhhc2hTZXQ8Q3VybEpvYlRpY2tldD4gbV9hY3Rp
dmVKb2JzOwotICAgIFZlY3RvcjxDdXJsSm9iVGlja2V0PiBtX2NhbmNlbGxlZFRpY2tldHM7Ci0g
ICAgTWVzc2FnZVF1ZXVlPFdURjo6RnVuY3Rpb248dm9pZCgpPj4gbV90YXNrUXVldWU7CisgICAg
SGFzaE1hcDxDdXJsSm9iVGlja2V0LCBDdXJsSm9iQ2xpZW50Kj4gbV9wZW5kaW5nSm9iczsKKyAg
ICBIYXNoU2V0PEN1cmxKb2JUaWNrZXQ+IG1fY2FuY2VsbGVkVGlja2V0czsKKyAgICBIYXNoU2V0
PEN1cmxKb2JUaWNrZXQ+IG1fZmluaXNoZWRUaWNrZXRzOworICAgIEhhc2hTZXQ8Q3VybEpvYlRp
Y2tldD4gbV9mYWlsZWRUaWNrZXRzOworICAgIFZlY3RvcjxXVEY6OkZ1bmN0aW9uPHZvaWQoKT4+
IG1fdGFza1F1ZXVlOwogICAgIG11dGFibGUgTG9jayBtX211dGV4OwotICAgIGJvb2wgbV9ydW5U
aHJlYWQgeyB9OworICAgIGJvb2wgbV9ydW5UaHJlYWQgeyBmYWxzZSB9OwogfTsKIAogfQpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL011bHRpcGFydEhhbmRsZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL011
bHRpcGFydEhhbmRsZS5jcHAJKHJldmlzaW9uIDIyMDkzMikKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvY3VybC9NdWx0aXBhcnRIYW5kbGUuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0zMjEsNyArMzIxLDcgQEAgdm9pZCBNdWx0aXBhcnRIYW5kbGU6OmRpZFJlY2VpdmVEYXRhKHNp
egogewogICAgIFJlc291cmNlSGFuZGxlSW50ZXJuYWwqIGQgPSBtX3Jlc291cmNlSGFuZGxlLT5n
ZXRJbnRlcm5hbCgpOwogCi0gICAgaWYgKGQtPm1fY2FuY2VsbGVkKSB7CisgICAgaWYgKCFkLT5t
X2RlbGVnYXRlLT5oYXNIYW5kbGUoKSkgewogICAgICAgICAvLyBSZXF1ZXN0IGhhcyBiZWVuIGNh
bmNlbGVkLCBzbyB3ZSdsbCBnbyB0byB0aGUgZW5kIHN0YXRlLgogICAgICAgICBtX3N0YXRlID0g
RW5kOwogICAgICAgICByZXR1cm47CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsLmNwcAkocmV2aXNp
b24gMjIwOTMyKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291
cmNlSGFuZGxlQ3VybC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMsNiArMyw3IEBACiAgKiBDb3B5
cmlnaHQgKEMpIDIwMDUsIDIwMDYgTWljaGFlbCBFbW1lbCBtaWtlLmVtbWVsQGdtYWlsLmNvbQog
ICogQ29weXJpZ2h0IChDKSAyMDE3IFNvbnkgSW50ZXJhY3RpdmUgRW50ZXJ0YWlubWVudCBJbmMu
CiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE3IE5BVkVSIENv
cnAuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTQ5LDYgKzUwLDggQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogCiBSZXNvdXJjZUhhbmRsZUludGVybmFsOjp+UmVzb3VyY2VIYW5k
bGVJbnRlcm5hbCgpCiB7CisgICAgaWYgKG1fZGVsZWdhdGUpCisgICAgICAgIG1fZGVsZWdhdGUt
PnJlbGVhc2VIYW5kbGUoKTsKIH0KIAogUmVzb3VyY2VIYW5kbGU6On5SZXNvdXJjZUhhbmRsZSgp
CkBAIC01OSw2ICs2Miw4IEBAIGJvb2wgUmVzb3VyY2VIYW5kbGU6OnN0YXJ0KCkKIHsKICAgICBB
U1NFUlQoaXNNYWluVGhyZWFkKCkpOwogCisgICAgQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpOwor
CiAgICAgLy8gVGhlIGZyYW1lIGNvdWxkIGJlIG51bGwgaWYgdGhlIFJlc291cmNlSGFuZGxlIGlz
IG5vdCBhc3NvY2lhdGVkIHRvIGFueQogICAgIC8vIEZyYW1lLCBlLmcuIGlmIHdlIGFyZSBkb3du
bG9hZGluZyBhIGZpbGUuCiAgICAgLy8gSWYgdGhlIGZyYW1lIGlzIG5vdCBudWxsIGJ1dCB0aGUg
cGFnZSBpcyBudWxsIHRoaXMgbXVzdCBiZSBhbiBhdHRlbXB0ZWQKQEAgLTY3LDI2MSArNzIsMTMg
QEAgYm9vbCBSZXNvdXJjZUhhbmRsZTo6c3RhcnQoKQogICAgIGlmIChkLT5tX2NvbnRleHQgJiYg
IWQtPm1fY29udGV4dC0+aXNWYWxpZCgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBk
LT5pbml0aWFsaXplKCk7Ci0KLSAgICBkLT5tX2pvYiA9IEN1cmxKb2JNYW5hZ2VyOjpzaW5nbGV0
b24oKS5hZGQoZC0+bV9jdXJsSGFuZGxlLCBbdGhpcywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYo
KnRoaXMpXShDdXJsSm9iUmVzdWx0IHJlc3VsdCkgewotICAgICAgICBBU1NFUlQoaXNNYWluVGhy
ZWFkKCkpOwotCi0gICAgICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgQ3VybEpv
YlJlc3VsdDo6RG9uZToKLSAgICAgICAgICAgIGQtPmRpZEZpbmlzaCgpOwotICAgICAgICAgICAg
YnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDdXJsSm9iUmVzdWx0OjpFcnJvcjoKLSAgICAgICAgICAg
IGQtPmRpZEZhaWwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ3VybEpv
YlJlc3VsdDo6Q2FuY2VsbGVkOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9
KTsKLSAgICBBU1NFUlQoZC0+bV9qb2IpOwotCi0gICAgcmV0dXJuIHRydWU7CisgICAgZC0+bV9k
ZWxlZ2F0ZSA9IGFkb3B0UmVmKG5ldyBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZSh0aGlzKSk7
CisgICAgcmV0dXJuIGQtPm1fZGVsZWdhdGUtPnN0YXJ0KCk7CiB9CiAKIHZvaWQgUmVzb3VyY2VI
YW5kbGU6OmNhbmNlbCgpCiB7Ci0gICAgZC0+bV9jYW5jZWxsZWQgPSB0cnVlOwotICAgIEN1cmxK
b2JNYW5hZ2VyOjpzaW5nbGV0b24oKS5jYW5jZWwoZC0+bV9qb2IpOwotfQotCi12b2lkIFJlc291
cmNlSGFuZGxlSW50ZXJuYWw6OmluaXRpYWxpemUoKQotewotICAgIEN1cmxDb250ZXh0JiBjb250
ZXh0ID0gQ3VybENvbnRleHQ6OnNpbmdsZXRvbigpOwotCi0gICAgVVJMIHVybCA9IG1fZmlyc3RS
ZXF1ZXN0LnVybCgpOwotCi0gICAgLy8gUmVtb3ZlIGFueSBmcmFnbWVudCBwYXJ0LCBvdGhlcndp
c2UgY3VybCB3aWxsIHNlbmQgaXQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4KLSAgICB1cmwucmVt
b3ZlRnJhZ21lbnRJZGVudGlmaWVyKCk7Ci0KLSAgICBTdHJpbmcgdXJsU3RyaW5nID0gdXJsLnN0
cmluZygpOwotCi0gICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7Ci0gICAgICAgIC8vIFJlbW92
ZSBhbnkgcXVlcnkgcGFydCBzZW50IHRvIGEgbG9jYWwgZmlsZS4KLSAgICAgICAgaWYgKCF1cmwu
cXVlcnkoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIEJ5IHNldHRpbmcgdGhlIHF1ZXJ5
IHRvIGEgbnVsbCBzdHJpbmcgaXQnbGwgYmUgcmVtb3ZlZC4KLSAgICAgICAgICAgIHVybC5zZXRR
dWVyeShTdHJpbmcoKSk7Ci0gICAgICAgICAgICB1cmxTdHJpbmcgPSB1cmwuc3RyaW5nKCk7Ci0g
ICAgICAgIH0KLSAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBNSU1FIHR5cGUgYmFzZWQgb24gdGhl
IHBhdGguCi0gICAgICAgIG1fcmVzcG9uc2Uuc2V0TWltZVR5cGUoTUlNRVR5cGVSZWdpc3RyeTo6
Z2V0TUlNRVR5cGVGb3JQYXRoKHVybCkpOwotICAgIH0KLQotICAgIGlmIChtX2RlZmVyc0xvYWRp
bmcpIHsKLSAgICAgICAgQ1VSTGNvZGUgZXJyb3IgPSBtX2N1cmxIYW5kbGUucGF1c2UoQ1VSTFBB
VVNFX0FMTCk7Ci0gICAgICAgIC8vIElmIHdlIGRpZCBub3QgcGF1c2UgdGhlIGhhbmRsZSwgd2Ug
d291bGQgQVNTRVJUIGluIHRoZQotICAgICAgICAvLyBoZWFkZXIgY2FsbGJhY2suIFNvIGp1c3Qg
YXNzZXJ0IGhlcmUuCi0gICAgICAgIEFTU0VSVF9VTlVTRUQoZXJyb3IsIGVycm9yID09IENVUkxF
X09LKTsKLSAgICB9Ci0KLSNpZm5kZWYgTkRFQlVHCi0gICAgbV9jdXJsSGFuZGxlLmVuYWJsZVZl
cmJvc2VJZlVzZWQoKTsKLSAgICBtX2N1cmxIYW5kbGUuZW5hYmxlU3RkRXJySWZVc2VkKCk7Ci0j
ZW5kaWYKLQotICAgIG1fY3VybEhhbmRsZS5pbml0aWFsaXplKCk7Ci0gICAgbV9jdXJsSGFuZGxl
LnNldFNzbFZlcmlmeVBlZXIoQ3VybEhhbmRsZTo6VmVyaWZ5UGVlckVuYWJsZSk7Ci0gICAgbV9j
dXJsSGFuZGxlLnNldFNzbFZlcmlmeUhvc3QoQ3VybEhhbmRsZTo6VmVyaWZ5SG9zdFN0cmljdE5h
bWVDaGVjayk7Ci0gICAgbV9jdXJsSGFuZGxlLnNldFByaXZhdGVEYXRhKHRoaXMpOwotICAgIG1f
Y3VybEhhbmRsZS5zZXRXcml0ZUNhbGxiYWNrRnVuY3Rpb24od3JpdGVDYWxsYmFjaywgdGhpcyk7
Ci0gICAgbV9jdXJsSGFuZGxlLnNldEhlYWRlckNhbGxiYWNrRnVuY3Rpb24oaGVhZGVyQ2FsbGJh
Y2ssIHRoaXMpOwotICAgIG1fY3VybEhhbmRsZS5lbmFibGVBdXRvUmVmZXJlcigpOwotICAgIG1f
Y3VybEhhbmRsZS5lbmFibGVGb2xsb3dMb2NhdGlvbigpOwotICAgIG1fY3VybEhhbmRsZS5lbmFi
bGVIdHRwQXV0aGVudGljYXRpb24oQ1VSTEFVVEhfQU5ZKTsKLSAgICBtX2N1cmxIYW5kbGUuZW5h
YmxlU2hhcmVIYW5kbGUoKTsKLSAgICBtX2N1cmxIYW5kbGUuZW5hYmxlVGltZW91dCgpOwotICAg
IG1fY3VybEhhbmRsZS5lbmFibGVBbGxvd2VkUHJvdG9jb2xzKCk7Ci0gICAgYXV0byBjZXJ0aWZp
Y2F0ZSA9IGdldFNTTENsaWVudENlcnRpZmljYXRlKG1fZmlyc3RSZXF1ZXN0LnVybCgpLmhvc3Qo
KSk7Ci0gICAgaWYgKGNlcnRpZmljYXRlKSB7Ci0gICAgICAgIG1fY3VybEhhbmRsZS5zZXRTc2xD
ZXJ0KCgqY2VydGlmaWNhdGUpLmZpcnN0LnV0ZjgoKS5kYXRhKCkpOwotICAgICAgICBtX2N1cmxI
YW5kbGUuc2V0U3NsQ2VydFR5cGUoIlAxMiIpOwotICAgICAgICBtX2N1cmxIYW5kbGUuc2V0U3Ns
S2V5UGFzc3dvcmQoKCpjZXJ0aWZpY2F0ZSkuc2Vjb25kLnV0ZjgoKS5kYXRhKCkpOwotICAgIH0K
LQotICAgIGlmIChDdXJsQ29udGV4dDo6c2luZ2xldG9uKCkuc2hvdWxkSWdub3JlU1NMRXJyb3Jz
KCkpCi0gICAgICAgIG1fY3VybEhhbmRsZS5zZXRTc2xWZXJpZnlQZWVyKEN1cmxIYW5kbGU6OlZl
cmlmeVBlZXJEaXNhYmxlKTsKLSAgICBlbHNlCi0gICAgICAgIHNldFNTTFZlcmlmeU9wdGlvbnMo
bV9jdXJsSGFuZGxlKTsKLQotICAgIG1fY3VybEhhbmRsZS5lbmFibGVDQUluZm9JZkV4aXN0cygp
OwotCi0gICAgbV9jdXJsSGFuZGxlLmVuYWJsZUFjY2VwdEVuY29kaW5nKCk7Ci0gICAgbV9jdXJs
SGFuZGxlLnNldFVybCh1cmxTdHJpbmcpOwotICAgIG1fY3VybEhhbmRsZS5lbmFibGVDb29raWVK
YXJJZkV4aXN0cygpOwotCi0gICAgaWYgKG1fZmlyc3RSZXF1ZXN0Lmh0dHBIZWFkZXJGaWVsZHMo
KS5zaXplKCkpIHsKLSAgICAgICAgYXV0byBjdXN0b21IZWFkZXJzID0gbV9maXJzdFJlcXVlc3Qu
aHR0cEhlYWRlckZpZWxkcygpOwotICAgICAgICBhdXRvJiBjYWNoZSA9IEN1cmxDYWNoZU1hbmFn
ZXI6OmdldEluc3RhbmNlKCk7Ci0KLSAgICAgICAgYm9vbCBoYXNDYWNoZUhlYWRlcnMgPSBjdXN0
b21IZWFkZXJzLmNvbnRhaW5zKEhUVFBIZWFkZXJOYW1lOjpJZk1vZGlmaWVkU2luY2UpIHx8IGN1
c3RvbUhlYWRlcnMuY29udGFpbnMoSFRUUEhlYWRlck5hbWU6OklmTm9uZU1hdGNoKTsKLSAgICAg
ICAgaWYgKCFoYXNDYWNoZUhlYWRlcnMgJiYgY2FjaGUuaXNDYWNoZWQodXJsKSkgewotICAgICAg
ICAgICAgY2FjaGUuYWRkQ2FjaGVFbnRyeUNsaWVudCh1cmwsIG1faGFuZGxlKTsKLQotICAgICAg
ICAgICAgLy8gYXBwZW5kIGFkZGl0aW9uYWwgY2FjaGUgaW5mb3JtYXRpb24KLSAgICAgICAgICAg
IGZvciAoYXV0byBlbnRyeSA6IGNhY2hlLnJlcXVlc3RIZWFkZXJzKHVybCkpCi0gICAgICAgICAg
ICAgICAgY3VzdG9tSGVhZGVycy5zZXQoZW50cnkua2V5LCBlbnRyeS52YWx1ZSk7Ci0KLSAgICAg
ICAgICAgIG1fYWRkZWRDYWNoZVZhbGlkYXRpb25IZWFkZXJzID0gdHJ1ZTsKLSAgICAgICAgfQot
Ci0gICAgICAgIG1fY3VybEhhbmRsZS5hcHBlbmRSZXF1ZXN0SGVhZGVycyhjdXN0b21IZWFkZXJz
KTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgbWV0aG9kID0gbV9maXJzdFJlcXVlc3QuaHR0cE1ldGhv
ZCgpOwotICAgIGlmICgiR0VUIiA9PSBtZXRob2QpCi0gICAgICAgIG1fY3VybEhhbmRsZS5lbmFi
bGVIdHRwR2V0UmVxdWVzdCgpOwotICAgIGVsc2UgaWYgKCJQT1NUIiA9PSBtZXRob2QpCi0gICAg
ICAgIHNldHVwUE9TVCgpOwotICAgIGVsc2UgaWYgKCJQVVQiID09IG1ldGhvZCkKLSAgICAgICAg
c2V0dXBQVVQoKTsKLSAgICBlbHNlIGlmICgiSEVBRCIgPT0gbWV0aG9kKQotICAgICAgICBtX2N1
cmxIYW5kbGUuZW5hYmxlSHR0cEhlYWRSZXF1ZXN0KCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIG1f
Y3VybEhhbmRsZS5zZXRIdHRwQ3VzdG9tUmVxdWVzdChtZXRob2QpOwotICAgICAgICBzZXR1cFBV
VCgpOwotICAgIH0KLQotICAgIG1fY3VybEhhbmRsZS5lbmFibGVSZXF1ZXN0SGVhZGVycygpOwot
Ci0gICAgYXBwbHlBdXRoZW50aWNhdGlvbigpOwotCi0gICAgbV9jdXJsSGFuZGxlLmVuYWJsZVBy
b3h5SWZFeGlzdHMoKTsKLX0KLQotdm9pZCBSZXNvdXJjZUhhbmRsZUludGVybmFsOjphcHBseUF1
dGhlbnRpY2F0aW9uKCkKLXsKLSAgICAvLyBtX3VzZXIvbV9wYXNzIGFyZSBjcmVkZW50aWFscyBn
aXZlbiBtYW51YWxseSwgZm9yIGluc3RhbmNlLCBieSB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBY
TUxIdHRwUmVxdWVzdC5vcGVuKCkuCi0gICAgU3RyaW5nIHBhcnRpdGlvbiA9IG1fZmlyc3RSZXF1
ZXN0LmNhY2hlUGFydGl0aW9uKCk7Ci0KLSAgICBpZiAobV9oYW5kbGUtPnNob3VsZFVzZUNyZWRl
bnRpYWxTdG9yYWdlKCkpIHsKLSAgICAgICAgaWYgKG1fdXNlci5pc0VtcHR5KCkgJiYgbV9wYXNz
LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgLy8gPHJkYXI6Ly9wcm9ibGVtLzcxNzQwNTA+IC0g
Rm9yIFVSTHMgdGhhdCBtYXRjaCB0aGUgcGF0aHMgb2YgdGhvc2UgcHJldmlvdXNseSBjaGFsbGVu
Z2VkIGZvciBIVFRQIEJhc2ljIGF1dGhlbnRpY2F0aW9uLCAKLSAgICAgICAgICAgIC8vIHRyeSBh
bmQgcmV1c2UgdGhlIGNyZWRlbnRpYWwgcHJlZW1wdGl2ZWx5LCBhcyBhbGxvd2VkIGJ5IFJGQyAy
NjE3LgotICAgICAgICAgICAgbV9pbml0aWFsQ3JlZGVudGlhbCA9IENyZWRlbnRpYWxTdG9yYWdl
OjpkZWZhdWx0Q3JlZGVudGlhbFN0b3JhZ2UoKS5nZXQocGFydGl0aW9uLCBtX2ZpcnN0UmVxdWVz
dC51cmwoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBh
bHJlYWR5IGEgcHJvdGVjdGlvbiBzcGFjZSBrbm93biBmb3IgdGhlIFVSTCwgdXBkYXRlIHN0b3Jl
ZCBjcmVkZW50aWFscwotICAgICAgICAgICAgLy8gYmVmb3JlIHNlbmRpbmcgYSByZXF1ZXN0LiBU
aGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGltcGxlbWVudCBsb2dvdXQgYnkgc2VuZGluZyBhbgot
ICAgICAgICAgICAgLy8gWE1MSHR0cFJlcXVlc3Qgd2l0aCBrbm93biBpbmNvcnJlY3QgY3JlZGVu
dGlhbHMsIGFuZCBhYm9ydGluZyBpdCBpbW1lZGlhdGVseSAoc28gdGhhdAotICAgICAgICAgICAg
Ly8gYW4gYXV0aGVudGljYXRpb24gZGlhbG9nIGRvZXNuJ3QgcG9wIHVwKS4KLSAgICAgICAgICAg
IENyZWRlbnRpYWxTdG9yYWdlOjpkZWZhdWx0Q3JlZGVudGlhbFN0b3JhZ2UoKS5zZXQocGFydGl0
aW9uLCBDcmVkZW50aWFsKG1fdXNlciwgbV9wYXNzLCBDcmVkZW50aWFsUGVyc2lzdGVuY2VOb25l
KSwgbV9maXJzdFJlcXVlc3QudXJsKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU3RyaW5n
IHVzZXIgPSBtX3VzZXI7Ci0gICAgU3RyaW5nIHBhc3N3b3JkID0gbV9wYXNzOwotCi0gICAgaWYg
KCFtX2luaXRpYWxDcmVkZW50aWFsLmlzRW1wdHkoKSkgewotICAgICAgICB1c2VyID0gbV9pbml0
aWFsQ3JlZGVudGlhbC51c2VyKCk7Ci0gICAgICAgIHBhc3N3b3JkID0gbV9pbml0aWFsQ3JlZGVu
dGlhbC5wYXNzd29yZCgpOwotICAgICAgICBtX2N1cmxIYW5kbGUuZW5hYmxlSHR0cEF1dGhlbnRp
Y2F0aW9uKENVUkxBVVRIX0JBU0lDKTsKLSAgICB9Ci0KLSAgICAvLyBJdCBzZWVtcyB3ZSBuZWVk
IHRvIHNldCBDVVJMT1BUX1VTRVJQV0QgZXZlbiBpZiB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaXMg
ZW1wdHkuCi0gICAgLy8gT3RoZXJ3aXNlIGNVUkwgd2lsbCBub3QgYXV0b21hdGljYWxseSBjb250
aW51ZSB3aXRoIGEgbmV3IHJlcXVlc3QgYWZ0ZXIgYSA0MDEgcmVzcG9uc2UuCi0KLSAgICAvLyBj
dXJsIENVUkxPUFRfVVNFUlBXRCBleHBlY3RzIHVzZXJuYW1lOnBhc3N3b3JkCi0gICAgbV9jdXJs
SGFuZGxlLnNldEh0dHBBdXRoVXNlclBhc3ModXNlciwgcGFzc3dvcmQpOwotfQotCi1zdGF0aWMg
aW5saW5lIHNpemVfdCBnZXRGb3JtRWxlbWVudHNDb3VudChSZXNvdXJjZUhhbmRsZSogam9iKQot
ewotICAgIFJlZlB0cjxGb3JtRGF0YT4gZm9ybURhdGEgPSBqb2ItPmZpcnN0UmVxdWVzdCgpLmh0
dHBCb2R5KCk7Ci0KLSAgICBpZiAoIWZvcm1EYXRhKQotICAgICAgICByZXR1cm4gMDsKLQotICAg
IC8vIFJlc29sdmUgdGhlIGJsb2IgZWxlbWVudHMgc28gdGhlIGZvcm1EYXRhIGNhbiBjb3JyZWN0
bHkgcmVwb3J0IGl0J3Mgc2l6ZS4KLSAgICBmb3JtRGF0YSA9IGZvcm1EYXRhLT5yZXNvbHZlQmxv
YlJlZmVyZW5jZXMoKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGZvcm1EYXRhLT5lbGVtZW50cygpLnNp
emUoKTsKLSAgICBqb2ItPmZpcnN0UmVxdWVzdCgpLnNldEhUVFBCb2R5KFdURk1vdmUoZm9ybURh
dGEpKTsKLQotICAgIHJldHVybiBzaXplOwotfQotCi12b2lkIFJlc291cmNlSGFuZGxlSW50ZXJu
YWw6OnNldHVwUFVUKCkKLXsKLSAgICBtX2N1cmxIYW5kbGUuZW5hYmxlSHR0cFB1dFJlcXVlc3Qo
KTsKLQotICAgIC8vIERpc2FibGUgdGhlIEV4cGVjdDogMTAwIGNvbnRpbnVlIGhlYWRlcgotICAg
IG1fY3VybEhhbmRsZS5hcHBlbmRSZXF1ZXN0SGVhZGVyKCJFeHBlY3Q6Iik7Ci0KLSAgICBzaXpl
X3QgbnVtRWxlbWVudHMgPSBnZXRGb3JtRWxlbWVudHNDb3VudChtX2hhbmRsZSk7Ci0gICAgaWYg
KCFudW1FbGVtZW50cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgc2V0dXBGb3JtRGF0YShmYWxz
ZSk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6c2V0dXBQT1NUKCkKLXsKLSAg
ICBtX2N1cmxIYW5kbGUuZW5hYmxlSHR0cFBvc3RSZXF1ZXN0KCk7Ci0KLSAgICBzaXplX3QgbnVt
RWxlbWVudHMgPSBnZXRGb3JtRWxlbWVudHNDb3VudChtX2hhbmRsZSk7Ci0gICAgaWYgKCFudW1F
bGVtZW50cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gRG8gbm90IHN0cmVhbSBmb3Igc2lt
cGxlIFBPU1QgZGF0YQotICAgIGlmIChudW1FbGVtZW50cyA9PSAxKSB7Ci0gICAgICAgIG1fZmly
c3RSZXF1ZXN0Lmh0dHBCb2R5KCktPmZsYXR0ZW4obV9wb3N0Qnl0ZXMpOwotICAgICAgICBpZiAo
bV9wb3N0Qnl0ZXMuc2l6ZSgpKQotICAgICAgICAgICAgbV9jdXJsSGFuZGxlLnNldFBvc3RGaWVs
ZHMobV9wb3N0Qnl0ZXMuZGF0YSgpLCBtX3Bvc3RCeXRlcy5zaXplKCkpOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgc2V0dXBGb3JtRGF0YSh0cnVlKTsKLX0KLQotdm9pZCBSZXNvdXJj
ZUhhbmRsZUludGVybmFsOjpzZXR1cEZvcm1EYXRhKGJvb2wgaXNQb3N0UmVxdWVzdCkKLXsKLSAg
ICBWZWN0b3I8Rm9ybURhdGFFbGVtZW50PiBlbGVtZW50cyA9IG1fZmlyc3RSZXF1ZXN0Lmh0dHBC
b2R5KCktPmVsZW1lbnRzKCk7Ci0gICAgc2l6ZV90IG51bUVsZW1lbnRzID0gZWxlbWVudHMuc2l6
ZSgpOwotCi0gICAgc3RhdGljIGNvbnN0IGxvbmcgbG9uZyBtYXhDdXJsT2ZmVCA9IG1fY3VybEhh
bmRsZS5tYXhDdXJsT2ZmVCgpOwotCi0gICAgLy8gT2J0YWluIHRoZSB0b3RhbCBzaXplIG9mIHRo
ZSBmb3JtIGRhdGEKLSAgICBjdXJsX29mZl90IHNpemUgPSAwOwotICAgIGJvb2wgY2h1bmtlZFRy
YW5zZmVyID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1FbGVtZW50czsg
aSsrKSB7Ci0gICAgICAgIEZvcm1EYXRhRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0g
ICAgICAgIGlmIChlbGVtZW50Lm1fdHlwZSA9PSBGb3JtRGF0YUVsZW1lbnQ6OlR5cGU6OkVuY29k
ZWRGaWxlKSB7Ci0gICAgICAgICAgICBsb25nIGxvbmcgZmlsZVNpemVSZXN1bHQ7Ci0gICAgICAg
ICAgICBpZiAoZ2V0RmlsZVNpemUoZWxlbWVudC5tX2ZpbGVuYW1lLCBmaWxlU2l6ZVJlc3VsdCkp
IHsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZVNpemVSZXN1bHQgPiBtYXhDdXJsT2ZmVCkgewot
ICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIHNpemUgaXMgdG9vIGJpZyBmb3Igc3BlY2lmeWlu
ZyBpdCB0byBjVVJMCi0gICAgICAgICAgICAgICAgICAgIGNodW5rZWRUcmFuc2ZlciA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICBzaXplICs9IGZpbGVTaXplUmVzdWx0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICBjaHVua2VkVHJhbnNmZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHNpemUgKz0g
ZWxlbWVudHNbaV0ubV9kYXRhLnNpemUoKTsKLSAgICB9Ci0KLSAgICAvLyBjVVJMIGd1ZXNzZXMg
dGhhdCB3ZSB3YW50IGNodW5rZWQgZW5jb2RpbmcgYXMgbG9uZyBhcyB3ZSBzcGVjaWZ5IHRoZSBo
ZWFkZXIKLSAgICBpZiAoY2h1bmtlZFRyYW5zZmVyKQotICAgICAgICBtX2N1cmxIYW5kbGUuYXBw
ZW5kUmVxdWVzdEhlYWRlcigiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiKTsKLSAgICBlbHNl
IHsKLSAgICAgICAgaWYgKGlzUG9zdFJlcXVlc3QpCi0gICAgICAgICAgICBtX2N1cmxIYW5kbGUu
c2V0UG9zdEZpZWxkTGFyZ2Uoc2l6ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1fY3Vy
bEhhbmRsZS5zZXRJbkZpbGVTaXplTGFyZ2Uoc2l6ZSk7Ci0gICAgfQotCi0gICAgbV9jdXJsSGFu
ZGxlLnNldFJlYWRDYWxsYmFja0Z1bmN0aW9uKHJlYWRDYWxsYmFjaywgdGhpcyk7CisgICAgZC0+
bV9kZWxlZ2F0ZS0+Y2FuY2VsKCk7CiB9CiAKICNpZiBPUyhXSU5ET1dTKQpAQCAtMzU3LDU5ICsx
MTQsNyBAQCB2b2lkIFJlc291cmNlSGFuZGxlOjpwbGF0Zm9ybVNldERlZmVyc0xvCiB7CiAgICAg
QVNTRVJUKGlzTWFpblRocmVhZCgpKTsKIAotICAgIGF1dG8gYWN0aW9uID0gW2RlZmVycywgdGhp
cywgcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpXSgpIHsKLSAgICAgICAgaWYgKGRlZmVy
cykgewotICAgICAgICAgICAgQ1VSTGNvZGUgZXJyb3IgPSBkLT5tX2N1cmxIYW5kbGUucGF1c2Uo
Q1VSTFBBVVNFX0FMTCk7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZCBub3QgZGVmZXIgdGhl
IGhhbmRsZSwgc28gZG9uJ3QgZG8gaXQuCi0gICAgICAgICAgICBpZiAoZXJyb3IgIT0gQ1VSTEVf
T0spCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAg
ICAgQ1VSTGNvZGUgZXJyb3IgPSBkLT5tX2N1cmxIYW5kbGUucGF1c2UoQ1VSTFBBVVNFX0NPTlQp
OwotICAgICAgICAgICAgaWYgKGVycm9yICE9IENVUkxFX09LKSB7Ci0gICAgICAgICAgICAgICAg
Ly8gUmVzdGFydGluZyB0aGUgaGFuZGxlIGhhcyBmYWlsZWQgc28ganVzdCBjYW5jZWwgaXQuCi0g
ICAgICAgICAgICAgICAgY2FuY2VsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9
OwotCi0gICAgaWYgKGQtPm1fam9iKSB7Ci0gICAgICAgIEN1cmxKb2JNYW5hZ2VyOjpzaW5nbGV0
b24oKS5jYWxsT25Kb2JUaHJlYWQoV1RGTW92ZShhY3Rpb24pKTsKLSAgICB9IGVsc2UgewotICAg
ICAgICBhY3Rpb24oKTsKLSAgICB9Ci19Ci0KLXZvaWQgUmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6
ZGlkRmluaXNoKCkKLXsKLSAgICBjYWxjdWxhdGVXZWJUaW1pbmdJbmZvcm1hdGlvbnMoKTsKLQot
ICAgIGlmIChtX2NhbmNlbGxlZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFtX3Jlc3Bv
bnNlLnJlc3BvbnNlRmlyZWQoKSkgewotICAgICAgICBoYW5kbGVMb2NhbFJlY2VpdmVSZXNwb25z
ZSgpOwotICAgICAgICBpZiAobV9jYW5jZWxsZWQpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgaWYgKG1fbXVsdGlwYXJ0SGFuZGxlKQotICAgICAgICBtX211bHRpcGFydEhhbmRs
ZS0+Y29udGVudEVuZGVkKCk7Ci0KLSAgICBpZiAoY2xpZW50KCkpIHsKLSAgICAgICAgY2xpZW50
KCktPmRpZEZpbmlzaExvYWRpbmcobV9oYW5kbGUpOwotICAgICAgICBDdXJsQ2FjaGVNYW5hZ2Vy
OjpnZXRJbnN0YW5jZSgpLmRpZEZpbmlzaExvYWRpbmcoKm1faGFuZGxlKTsKLSAgICB9Ci19Ci0K
LXZvaWQgUmVzb3VyY2VIYW5kbGVJbnRlcm5hbDo6ZGlkRmFpbCgpCi17Ci0gICAgaWYgKG1fY2Fu
Y2VsbGVkKQotICAgICAgICByZXR1cm47Ci0gICAgVVJMIHVybCA9IG1fY3VybEhhbmRsZS5nZXRF
ZmZlY3RpdmVVUkwoKTsKLSAgICBpZiAoY2xpZW50KCkpIHsKLSAgICAgICAgY2xpZW50KCktPmRp
ZEZhaWwobV9oYW5kbGUsIFJlc291cmNlRXJyb3IoQ3VybENvbnRleHQ6OmVycm9yRG9tYWluLCBt
X2N1cmxIYW5kbGUuZXJyb3JDb2RlKCksIG1fY3VybEhhbmRsZS5nZXRFZmZlY3RpdmVVUkwoKSwg
bV9jdXJsSGFuZGxlLmVycm9yRGVzY3JpcHRpb24oKSwgbV9jdXJsSGFuZGxlLmdldFNzbEVycm9y
cygpKSk7Ci0gICAgICAgIEN1cmxDYWNoZU1hbmFnZXI6OmdldEluc3RhbmNlKCkuZGlkRmFpbCgq
bV9oYW5kbGUpOwotICAgIH0KKyAgICBkLT5tX2RlbGVnYXRlLT5zZXREZWZlcnNMb2FkaW5nKGRl
ZmVycyk7CiB9CiAKIGJvb2wgUmVzb3VyY2VIYW5kbGU6OnNob3VsZFVzZUNyZWRlbnRpYWxTdG9y
YWdlKCkKQEAgLTQzMSw3ICsxMzYsNyBAQCB2b2lkIFJlc291cmNlSGFuZGxlOjpkaWRSZWNlaXZl
QXV0aGVudGljCiAgICAgICAgICAgICB1cmxUb1N0b3JlID0gY2hhbGxlbmdlLmZhaWx1cmVSZXNw
b25zZSgpLnVybCgpOwogICAgICAgICBDcmVkZW50aWFsU3RvcmFnZTo6ZGVmYXVsdENyZWRlbnRp
YWxTdG9yYWdlKCkuc2V0KHBhcnRpdGlvbiwgY3JlZGVudGlhbCwgY2hhbGxlbmdlLnByb3RlY3Rp
b25TcGFjZSgpLCB1cmxUb1N0b3JlKTsKICAgICAgICAgCi0gICAgICAgIGQtPm1fY3VybEhhbmRs
ZS5zZXRIdHRwQXV0aFVzZXJQYXNzKGNyZWRlbnRpYWwudXNlcigpLCBjcmVkZW50aWFsLnBhc3N3
b3JkKCkpOworICAgICAgICBkLT5tX2RlbGVnYXRlLT5zZXRBdXRoZW50aWNhdGlvbihjcmVkZW50
aWFsLnVzZXIoKSwgY3JlZGVudGlhbC5wYXNzd29yZCgpKTsKIAogICAgICAgICBkLT5tX3VzZXIg
PSBTdHJpbmcoKTsKICAgICAgICAgZC0+bV9wYXNzID0gU3RyaW5nKCk7CkBAIC00NTYsNyArMTYx
LDcgQEAgdm9pZCBSZXNvdXJjZUhhbmRsZTo6ZGlkUmVjZWl2ZUF1dGhlbnRpYwogICAgICAgICAg
ICAgICAgICAgICBDcmVkZW50aWFsU3RvcmFnZTo6ZGVmYXVsdENyZWRlbnRpYWxTdG9yYWdlKCku
c2V0KHBhcnRpdGlvbiwgY3JlZGVudGlhbCwgY2hhbGxlbmdlLnByb3RlY3Rpb25TcGFjZSgpLCBj
aGFsbGVuZ2UuZmFpbHVyZVJlc3BvbnNlKCkudXJsKCkpOwogICAgICAgICAgICAgICAgIH0KIAot
ICAgICAgICAgICAgICAgIGQtPm1fY3VybEhhbmRsZS5zZXRIdHRwQXV0aFVzZXJQYXNzKGNyZWRl
bnRpYWwudXNlcigpLCBjcmVkZW50aWFsLnBhc3N3b3JkKCkpOworICAgICAgICAgICAgICAgIGQt
Pm1fZGVsZWdhdGUtPnNldEF1dGhlbnRpY2F0aW9uKGNyZWRlbnRpYWwudXNlcigpLCBjcmVkZW50
aWFsLnBhc3N3b3JkKCkpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0K
ICAgICAgICAgfQpAQCAtNDg5LDcgKzE5NCw3IEBAIHZvaWQgUmVzb3VyY2VIYW5kbGU6OnJlY2Vp
dmVkQ3JlZGVudGlhbCgKICAgICAgICAgfQogICAgIH0KIAotICAgIGQtPm1fY3VybEhhbmRsZS5z
ZXRIdHRwQXV0aFVzZXJQYXNzKGNyZWRlbnRpYWwudXNlcigpLCBjcmVkZW50aWFsLnBhc3N3b3Jk
KCkpOworICAgIGQtPm1fZGVsZWdhdGUtPnNldEF1dGhlbnRpY2F0aW9uKGNyZWRlbnRpYWwudXNl
cigpLCBjcmVkZW50aWFsLnBhc3N3b3JkKCkpOwogICAgIGNsZWFyQXV0aGVudGljYXRpb24oKTsK
IH0KIApAQCAtNTAwLDcgKzIwNSw3IEBAIHZvaWQgUmVzb3VyY2VIYW5kbGU6OnJlY2VpdmVkUmVx
dWVzdFRvQ28KICAgICBpZiAoY2hhbGxlbmdlICE9IGQtPm1fY3VycmVudFdlYkNoYWxsZW5nZSkK
ICAgICAgICAgcmV0dXJuOwogCi0gICAgZC0+bV9jdXJsSGFuZGxlLnNldEh0dHBBdXRoVXNlclBh
c3MoIiIsICIiKTsKKyAgICBkLT5tX2RlbGVnYXRlLT5zZXRBdXRoZW50aWNhdGlvbigiIiwgIiIp
OwogICAgIGNsZWFyQXV0aGVudGljYXRpb24oKTsKIH0KIApAQCAtNTI1LDQzOCArMjMwLDYgQEAg
dm9pZCBSZXNvdXJjZUhhbmRsZTo6cmVjZWl2ZWRDaGFsbGVuZ2VSZQogICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwogfQogCi12b2lkIFJlc291cmNlSGFuZGxlSW50ZXJuYWw6OmNhbGN1bGF0ZVdl
YlRpbWluZ0luZm9ybWF0aW9ucygpCi17Ci0gICAgZG91YmxlIHByZVRyYW5zZmVyVGltZSA9IDA7
Ci0gICAgZG91YmxlIGRuc2xvb2t1cFRpbWUgPSAwOwotICAgIGRvdWJsZSBjb25uZWN0VGltZSA9
IDA7Ci0gICAgZG91YmxlIGFwcENvbm5lY3RUaW1lID0gMDsKLQotICAgIG1fY3VybEhhbmRsZS5n
ZXRUaW1lcyhwcmVUcmFuc2ZlclRpbWUsIGRuc2xvb2t1cFRpbWUsIGNvbm5lY3RUaW1lLCBhcHBD
b25uZWN0VGltZSk7Ci0KLSAgICBtX3Jlc3BvbnNlLmRlcHJlY2F0ZWROZXR3b3JrTG9hZE1ldHJp
Y3MoKS5kb21haW5Mb29rdXBTdGFydCA9IFNlY29uZHMoMCk7Ci0gICAgbV9yZXNwb25zZS5kZXBy
ZWNhdGVkTmV0d29ya0xvYWRNZXRyaWNzKCkuZG9tYWluTG9va3VwRW5kID0gU2Vjb25kcyhkbnNs
b29rdXBUaW1lKTsKLQotICAgIG1fcmVzcG9uc2UuZGVwcmVjYXRlZE5ldHdvcmtMb2FkTWV0cmlj
cygpLmNvbm5lY3RTdGFydCA9IFNlY29uZHMoZG5zbG9va3VwVGltZSk7Ci0gICAgbV9yZXNwb25z
ZS5kZXByZWNhdGVkTmV0d29ya0xvYWRNZXRyaWNzKCkuY29ubmVjdEVuZCA9IFNlY29uZHMoY29u
bmVjdFRpbWUpOwotCi0gICAgbV9yZXNwb25zZS5kZXByZWNhdGVkTmV0d29ya0xvYWRNZXRyaWNz
KCkucmVxdWVzdFN0YXJ0ID0gU2Vjb25kcyhjb25uZWN0VGltZSk7Ci0gICAgbV9yZXNwb25zZS5k
ZXByZWNhdGVkTmV0d29ya0xvYWRNZXRyaWNzKCkucmVzcG9uc2VTdGFydCA9IFNlY29uZHMocHJl
VHJhbnNmZXJUaW1lKTsKLQotICAgIGlmIChhcHBDb25uZWN0VGltZSkKLSAgICAgICAgbV9yZXNw
b25zZS5kZXByZWNhdGVkTmV0d29ya0xvYWRNZXRyaWNzKCkuc2VjdXJlQ29ubmVjdGlvblN0YXJ0
ID0gU2Vjb25kcyhjb25uZWN0VGltZSk7Ci19Ci0KLXZvaWQgUmVzb3VyY2VIYW5kbGVJbnRlcm5h
bDo6aGFuZGxlTG9jYWxSZWNlaXZlUmVzcG9uc2UoKQotewotICAgIEFTU0VSVChpc01haW5UaHJl
YWQoKSk7Ci0KLSAgICAvLyBzaW5jZSB0aGUgY29kZSBpbiBoZWFkZXJDYWxsYmFjayB3aWxsIG5v
dCBoYXZlIHJ1biBmb3IgbG9jYWwgZmlsZXMKLSAgICAvLyB0aGUgY29kZSB0byBzZXQgdGhlIFVS
TCBhbmQgZmlyZSBkaWRSZWNlaXZlUmVzcG9uc2UgaXMgbmV2ZXIgcnVuLAotICAgIC8vIHdoaWNo
IG1lYW5zIHRoZSBSZXNvdXJjZUxvYWRlcidzIHJlc3BvbnNlIGRvZXMgbm90IGNvbnRhaW4gdGhl
IFVSTC4KLSAgICAvLyBSdW4gdGhlIGNvZGUgaGVyZSBmb3IgbG9jYWwgZmlsZXMgdG8gcmVzb2x2
ZSB0aGUgaXNzdWUuCi0gICAgLy8gVE9ETzogU2VlIGlmIHRoZXJlIGlzIGEgYmV0dGVyIGFwcHJv
YWNoIGZvciBoYW5kbGluZyB0aGlzLgotICAgIFVSTCB1cmwgPSBtX2N1cmxIYW5kbGUuZ2V0RWZm
ZWN0aXZlVVJMKCk7Ci0gICAgQVNTRVJUKHVybC5pc1ZhbGlkKCkpOwotICAgIG1fcmVzcG9uc2Uu
c2V0VVJMKHVybCk7Ci0gICAgaWYgKGNsaWVudCgpKQotICAgICAgICBjbGllbnQoKS0+ZGlkUmVj
ZWl2ZVJlc3BvbnNlKG1faGFuZGxlLCBSZXNvdXJjZVJlc3BvbnNlKG1fcmVzcG9uc2UpKTsKLSAg
ICBtX3Jlc3BvbnNlLnNldFJlc3BvbnNlRmlyZWQodHJ1ZSk7Ci19Ci0KLWlubGluZSBzdGF0aWMg
Ym9vbCBpc0h0dHBJbmZvKGludCBzdGF0dXNDb2RlKQotewotICAgIHJldHVybiAxMDAgPD0gc3Rh
dHVzQ29kZSAmJiBzdGF0dXNDb2RlIDwgMjAwOwotfQotCi1pbmxpbmUgc3RhdGljIGJvb2wgaXNI
dHRwUmVkaXJlY3QoaW50IHN0YXR1c0NvZGUpCi17Ci0gICAgcmV0dXJuIDMwMCA8PSBzdGF0dXND
b2RlICYmIHN0YXR1c0NvZGUgPCA0MDAgJiYgc3RhdHVzQ29kZSAhPSAzMDQ7Ci19Ci0KLWlubGlu
ZSBzdGF0aWMgYm9vbCBpc0h0dHBBdXRoZW50aWNhdGlvbihpbnQgc3RhdHVzQ29kZSkKLXsKLSAg
ICByZXR1cm4gc3RhdHVzQ29kZSA9PSA0MDE7Ci19Ci0KLWlubGluZSBzdGF0aWMgYm9vbCBpc0h0
dHBOb3RNb2RpZmllZChpbnQgc3RhdHVzQ29kZSkKLXsKLSAgICByZXR1cm4gc3RhdHVzQ29kZSA9
PSAzMDQ7Ci19Ci0KLXN0YXRpYyBib29sIGlzQXBwZW5kYWJsZUhlYWRlcihjb25zdCBTdHJpbmcg
JmtleSkKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciogYXBwZW5kYWJsZUhlYWRlcnNbXSA9IHsK
LSAgICAgICAgImFjY2Vzcy1jb250cm9sLWFsbG93LWhlYWRlcnMiLAotICAgICAgICAiYWNjZXNz
LWNvbnRyb2wtYWxsb3ctbWV0aG9kcyIsCi0gICAgICAgICJhY2Nlc3MtY29udHJvbC1hbGxvdy1v
cmlnaW4iLAotICAgICAgICAiYWNjZXNzLWNvbnRyb2wtZXhwb3NlLWhlYWRlcnMiLAotICAgICAg
ICAiYWxsb3ciLAotICAgICAgICAiY2FjaGUtY29udHJvbCIsCi0gICAgICAgICJjb25uZWN0aW9u
IiwKLSAgICAgICAgImNvbnRlbnQtZW5jb2RpbmciLAotICAgICAgICAiY29udGVudC1sYW5ndWFn
ZSIsCi0gICAgICAgICJpZi1tYXRjaCIsCi0gICAgICAgICJpZi1ub25lLW1hdGNoIiwKLSAgICAg
ICAgImtlZXAtYWxpdmUiLAotICAgICAgICAicHJhZ21hIiwKLSAgICAgICAgInByb3h5LWF1dGhl
bnRpY2F0ZSIsCi0gICAgICAgICJwdWJsaWMiLAotICAgICAgICAic2VydmVyIiwKLSAgICAgICAg
InNldC1jb29raWUiLAotICAgICAgICAidGUiLAotICAgICAgICAidHJhaWxlciIsCi0gICAgICAg
ICJ0cmFuc2Zlci1lbmNvZGluZyIsCi0gICAgICAgICJ1cGdyYWRlIiwKLSAgICAgICAgInVzZXIt
YWdlbnQiLAotICAgICAgICAidmFyeSIsCi0gICAgICAgICJ2aWEiLAotICAgICAgICAid2Fybmlu
ZyIsCi0gICAgICAgICJ3d3ctYXV0aGVudGljYXRlIgotICAgIH07Ci0KLSAgICAvLyBDdXN0b20g
aGVhZGVycyBzdGFydCB3aXRoICdYLScsIGFuZCBuZWVkIG5vIGZ1cnRoZXIgY2hlY2tpbmcuCi0g
ICAgaWYgKGtleS5zdGFydHNXaXRoKCJ4LSIsIC8qIGNhc2VTZW5zaXRpdmUgKi8gZmFsc2UpKQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGZvciAoYXV0byYgaGVhZGVyIDogYXBwZW5kYWJs
ZUhlYWRlcnMpIHsKLSAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdBU0NJSUNhc2Uoa2V5LCBoZWFk
ZXIpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi1zdGF0aWMgdm9pZCByZW1vdmVMZWFkaW5nQW5kVHJhaWxpbmdRdW90ZXMoU3RyaW5n
JiB2YWx1ZSkKLXsKLSAgICB1bnNpZ25lZCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICBp
ZiAodmFsdWUuc3RhcnRzV2l0aCgnIicpICYmIHZhbHVlLmVuZHNXaXRoKCciJykgJiYgbGVuZ3Ro
ID4gMSkKLSAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSwgbGVuZ3RoIC0gMik7Ci19
Ci0KLXN0YXRpYyBib29sIGdldFByb3RlY3Rpb25TcGFjZShSZXNvdXJjZUhhbmRsZSogam9iLCBj
b25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSwgUHJvdGVjdGlvblNwYWNlJiBwcm90ZWN0
aW9uU3BhY2UpCi17Ci0gICAgUmVzb3VyY2VIYW5kbGVJbnRlcm5hbCogZCA9IGpvYi0+Z2V0SW50
ZXJuYWwoKTsKLQotICAgIENVUkxjb2RlIGVycjsKLQotICAgIGxvbmcgcG9ydCA9IDA7Ci0gICAg
ZXJyID0gZC0+bV9jdXJsSGFuZGxlLmdldFByaW1hcnlQb3J0KHBvcnQpOwotICAgIGlmIChlcnIg
IT0gQ1VSTEVfT0spCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGxvbmcgYXZhaWxhYmxl
QXV0aCA9IENVUkxBVVRIX05PTkU7Ci0gICAgZXJyID0gZC0+bV9jdXJsSGFuZGxlLmdldEh0dHBB
dXRoQXZhaWwoYXZhaWxhYmxlQXV0aCk7Ci0gICAgaWYgKGVyciAhPSBDVVJMRV9PSykKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgVVJMIHVybCA9IGQtPm1fY3VybEhhbmRsZS5nZXRFZmZl
Y3RpdmVVUkwoKTsKLSAgICBpZiAoIXVybC5pc1ZhbGlkKCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIFN0cmluZyBob3N0ID0gdXJsLmhvc3QoKTsKLSAgICBTdHJpbmdWaWV3IHByb3Rv
Y29sID0gdXJsLnByb3RvY29sKCk7Ci0KLSAgICBTdHJpbmcgcmVhbG07Ci0KLSAgICBjb25zdCBT
dHJpbmcgYXV0aEhlYWRlciA9IHJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZChIVFRQSGVhZGVyTmFt
ZTo6QXV0aG9yaXphdGlvbik7Ci0gICAgY29uc3QgU3RyaW5nIHJlYWxtU3RyaW5nID0gInJlYWxt
PSI7Ci0gICAgaW50IHJlYWxtUG9zID0gYXV0aEhlYWRlci5maW5kKHJlYWxtU3RyaW5nKTsKLSAg
ICBpZiAocmVhbG1Qb3MgPiAwKSB7Ci0gICAgICAgIHJlYWxtID0gYXV0aEhlYWRlci5zdWJzdHJp
bmcocmVhbG1Qb3MgKyByZWFsbVN0cmluZy5sZW5ndGgoKSk7Ci0gICAgICAgIHJlYWxtID0gcmVh
bG0ubGVmdChyZWFsbS5maW5kKCcsJykpOwotICAgICAgICByZW1vdmVMZWFkaW5nQW5kVHJhaWxp
bmdRdW90ZXMocmVhbG0pOwotICAgIH0KLQotICAgIFByb3RlY3Rpb25TcGFjZVNlcnZlclR5cGUg
c2VydmVyVHlwZSA9IFByb3RlY3Rpb25TcGFjZVNlcnZlckhUVFA7Ci0gICAgaWYgKHByb3RvY29s
ID09ICJodHRwcyIpCi0gICAgICAgIHNlcnZlclR5cGUgPSBQcm90ZWN0aW9uU3BhY2VTZXJ2ZXJI
VFRQUzsKLQotICAgIFByb3RlY3Rpb25TcGFjZUF1dGhlbnRpY2F0aW9uU2NoZW1lIGF1dGhTY2hl
bWUgPSBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZVVua25vd247Ci0KLSAgICBp
ZiAoYXZhaWxhYmxlQXV0aCAmIENVUkxBVVRIX0JBU0lDKQotICAgICAgICBhdXRoU2NoZW1lID0g
UHJvdGVjdGlvblNwYWNlQXV0aGVudGljYXRpb25TY2hlbWVIVFRQQmFzaWM7Ci0gICAgaWYgKGF2
YWlsYWJsZUF1dGggJiBDVVJMQVVUSF9ESUdFU1QpCi0gICAgICAgIGF1dGhTY2hlbWUgPSBQcm90
ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZUhUVFBEaWdlc3Q7Ci0gICAgaWYgKGF2YWls
YWJsZUF1dGggJiBDVVJMQVVUSF9HU1NORUdPVElBVEUpCi0gICAgICAgIGF1dGhTY2hlbWUgPSBQ
cm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZU5lZ290aWF0ZTsKLSAgICBpZiAoYXZh
aWxhYmxlQXV0aCAmIENVUkxBVVRIX05UTE0pCi0gICAgICAgIGF1dGhTY2hlbWUgPSBQcm90ZWN0
aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZU5UTE07Ci0KLSAgICBwcm90ZWN0aW9uU3BhY2Ug
PSBQcm90ZWN0aW9uU3BhY2UoaG9zdCwgcG9ydCwgc2VydmVyVHlwZSwgcmVhbG0sIGF1dGhTY2hl
bWUpOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXNpemVfdCBSZXNvdXJjZUhhbmRsZUludGVy
bmFsOjp3aWxsUHJlcGFyZVNlbmREYXRhKGNoYXIqIHB0ciwgc2l6ZV90IGJsb2NrU2l6ZSwgc2l6
ZV90IG51bWJlck9mQmxvY2tzKQotewotICAgIGlmICghbV9mb3JtRGF0YVN0cmVhbS5oYXNNb3Jl
RWxlbWVudHMoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IG1fZm9y
bURhdGFTdHJlYW0ucmVhZChwdHIsIGJsb2NrU2l6ZSwgbnVtYmVyT2ZCbG9ja3MpOwotCi0gICAg
Ly8gU29tZXRoaW5nIHdlbnQgd3Jvbmcgc28gY2FuY2VsIHRoZSBqb2IuCi0gICAgaWYgKCFzaXpl
KSB7Ci0gICAgICAgIG1faGFuZGxlLT5jYW5jZWwoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
fQotCi0gICAgcmV0dXJuIHNpemU7Ci0KLX0KLQotdm9pZCBSZXNvdXJjZUhhbmRsZUludGVybmFs
OjpkaWRSZWNlaXZlSGVhZGVyTGluZShjb25zdCBTdHJpbmcmIGhlYWRlcikKLXsKLSAgICBBU1NF
UlQoaXNNYWluVGhyZWFkKCkpOwotCi0gICAgYXV0byBzcGxpdFBvc2l0aW9uID0gaGVhZGVyLmZp
bmQoIjoiKTsKLSAgICBpZiAoc3BsaXRQb3NpdGlvbiAhPSBub3RGb3VuZCkgewotICAgICAgICBT
dHJpbmcga2V5ID0gaGVhZGVyLmxlZnQoc3BsaXRQb3NpdGlvbikuc3RyaXBXaGl0ZVNwYWNlKCk7
Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGhlYWRlci5zdWJzdHJpbmcoc3BsaXRQb3NpdGlvbiAr
IDEpLnN0cmlwV2hpdGVTcGFjZSgpOwotCi0gICAgICAgIGlmIChpc0FwcGVuZGFibGVIZWFkZXIo
a2V5KSkKLSAgICAgICAgICAgIG1fcmVzcG9uc2UuYWRkSFRUUEhlYWRlckZpZWxkKGtleSwgdmFs
dWUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX3Jlc3BvbnNlLnNldEhUVFBIZWFkZXJG
aWVsZChrZXksIHZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKGhlYWRlci5zdGFydHNXaXRoKCJIVFRQ
IiwgZmFsc2UpKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHJl
c3BvbnNlLgotICAgICAgICAvLyBFeHRyYWN0IHRoZSBodHRwIHN0YXR1cyB0ZXh0IGZyb20gdGhp
cy4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSWYgdGhlIEZPTExPV0xPQ0FUSU9OIG9wdGlvbiBp
cyBlbmFibGVkIGZvciB0aGUgY3VybCBoYW5kbGUgdGhlbgotICAgICAgICAvLyBjdXJsIHdpbGwg
Zm9sbG93IHRoZSByZWRpcmVjdGlvbnMgaW50ZXJuYWxseS4gVGh1cyB0aGlzIGhlYWRlciBjYWxs
YmFjawotICAgICAgICAvLyB3aWxsIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25lIHRpbWUgd2l0aCB0
aGUgbGluZSBzdGFydGluZyAiSFRUUCIgZm9yIG9uZSBqb2IuCi0gICAgICAgIGxvbmcgaHR0cENv
ZGUgPSAwOwotICAgICAgICBtX2N1cmxIYW5kbGUuZ2V0UmVzcG9uc2VDb2RlKGh0dHBDb2RlKTsK
LQotICAgICAgICBTdHJpbmcgaHR0cENvZGVTdHJpbmcgPSBTdHJpbmc6Om51bWJlcihodHRwQ29k
ZSk7Ci0gICAgICAgIGludCBzdGF0dXNDb2RlUG9zID0gaGVhZGVyLmZpbmQoaHR0cENvZGVTdHJp
bmcpOwotCi0gICAgICAgIGlmIChzdGF0dXNDb2RlUG9zICE9IG5vdEZvdW5kKSB7Ci0gICAgICAg
ICAgICAvLyBUaGUgc3RhdHVzIHRleHQgaXMgYWZ0ZXIgdGhlIHN0YXR1cyBjb2RlLgotICAgICAg
ICAgICAgU3RyaW5nIHN0YXR1cyA9IGhlYWRlci5zdWJzdHJpbmcoc3RhdHVzQ29kZVBvcyArIGh0
dHBDb2RlU3RyaW5nLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIG1fcmVzcG9uc2Uuc2V0SFRUUFN0
YXR1c1RleHQoc3RhdHVzLnN0cmlwV2hpdGVTcGFjZSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0K
LQotdm9pZCBSZXNvdXJjZUhhbmRsZUludGVybmFsOjpkaWRSZWNlaXZlQWxsSGVhZGVycyhsb25n
IGh0dHBDb2RlLCBsb25nIGxvbmcgY29udGVudExlbmd0aCkKLXsKLSAgICBBU1NFUlQoaXNNYWlu
VGhyZWFkKCkpOwotCi0gICAgbV9yZXNwb25zZS5zZXRFeHBlY3RlZENvbnRlbnRMZW5ndGgoY29u
dGVudExlbmd0aCk7Ci0KLSAgICBtX3Jlc3BvbnNlLnNldFVSTChtX2N1cmxIYW5kbGUuZ2V0RWZm
ZWN0aXZlVVJMKCkpOwotCi0gICAgbV9yZXNwb25zZS5zZXRIVFRQU3RhdHVzQ29kZShodHRwQ29k
ZSk7Ci0gICAgbV9yZXNwb25zZS5zZXRNaW1lVHlwZShleHRyYWN0TUlNRVR5cGVGcm9tTWVkaWFU
eXBlKG1fcmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkKEhUVFBIZWFkZXJOYW1lOjpDb250ZW50VHlw
ZSkpLmNvbnZlcnRUb0FTQ0lJTG93ZXJjYXNlKCkpOwotICAgIG1fcmVzcG9uc2Uuc2V0VGV4dEVu
Y29kaW5nTmFtZShleHRyYWN0Q2hhcnNldEZyb21NZWRpYVR5cGUobV9yZXNwb25zZS5odHRwSGVh
ZGVyRmllbGQoSFRUUEhlYWRlck5hbWU6OkNvbnRlbnRUeXBlKSkpOwotCi0gICAgaWYgKG1fcmVz
cG9uc2UuaXNNdWx0aXBhcnQoKSkgewotICAgICAgICBTdHJpbmcgYm91bmRhcnk7Ci0gICAgICAg
IGJvb2wgcGFyc2VkID0gTXVsdGlwYXJ0SGFuZGxlOjpleHRyYWN0Qm91bmRhcnkobV9yZXNwb25z
ZS5odHRwSGVhZGVyRmllbGQoSFRUUEhlYWRlck5hbWU6OkNvbnRlbnRUeXBlKSwgYm91bmRhcnkp
OwotICAgICAgICBpZiAocGFyc2VkKQotICAgICAgICAgICAgbV9tdWx0aXBhcnRIYW5kbGUgPSBz
dGQ6Om1ha2VfdW5pcXVlPE11bHRpcGFydEhhbmRsZT4obV9oYW5kbGUsIGJvdW5kYXJ5KTsKLSAg
ICB9Ci0KLSAgICAvLyBIVFRQIHJlZGlyZWN0aW9uCi0gICAgaWYgKGlzSHR0cFJlZGlyZWN0KGh0
dHBDb2RlKSkgewotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBtX3Jlc3BvbnNlLmh0dHBIZWFk
ZXJGaWVsZChIVFRQSGVhZGVyTmFtZTo6TG9jYXRpb24pOwotICAgICAgICBpZiAoIWxvY2F0aW9u
LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgVVJMIG5ld1VSTCA9IFVSTChtX2ZpcnN0UmVxdWVz
dC51cmwoKSwgbG9jYXRpb24pOwotCi0gICAgICAgICAgICBSZXNvdXJjZVJlcXVlc3QgcmVkaXJl
Y3RlZFJlcXVlc3QgPSBtX2ZpcnN0UmVxdWVzdDsKLSAgICAgICAgICAgIHJlZGlyZWN0ZWRSZXF1
ZXN0LnNldFVSTChuZXdVUkwpOwotICAgICAgICAgICAgUmVzb3VyY2VSZXNwb25zZSByZXNwb25z
ZSA9IG1fcmVzcG9uc2U7Ci0gICAgICAgICAgICBpZiAoY2xpZW50KCkpCi0gICAgICAgICAgICAg
ICAgY2xpZW50KCktPndpbGxTZW5kUmVxdWVzdChtX2hhbmRsZSwgV1RGTW92ZShyZWRpcmVjdGVk
UmVxdWVzdCksIFdURk1vdmUocmVzcG9uc2UpKTsKLQotICAgICAgICAgICAgbV9maXJzdFJlcXVl
c3Quc2V0VVJMKG5ld1VSTCk7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAg
IH0gZWxzZSBpZiAoaXNIdHRwQXV0aGVudGljYXRpb24oaHR0cENvZGUpKSB7Ci0gICAgICAgIFBy
b3RlY3Rpb25TcGFjZSBwcm90ZWN0aW9uU3BhY2U7Ci0gICAgICAgIGlmIChnZXRQcm90ZWN0aW9u
U3BhY2UobV9oYW5kbGUsIG1fcmVzcG9uc2UsIHByb3RlY3Rpb25TcGFjZSkpIHsKLSAgICAgICAg
ICAgIENyZWRlbnRpYWwgY3JlZGVudGlhbDsKLSAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uQ2hh
bGxlbmdlIGNoYWxsZW5nZShwcm90ZWN0aW9uU3BhY2UsIGNyZWRlbnRpYWwsIG1fYXV0aEZhaWx1
cmVDb3VudCwgbV9yZXNwb25zZSwgUmVzb3VyY2VFcnJvcigpKTsKLSAgICAgICAgICAgIGNoYWxs
ZW5nZS5zZXRBdXRoZW50aWNhdGlvbkNsaWVudChtX2hhbmRsZSk7Ci0gICAgICAgICAgICBtX2hh
bmRsZS0+ZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKGNoYWxsZW5nZSk7Ci0gICAg
ICAgICAgICBtX2F1dGhGYWlsdXJlQ291bnQrKzsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgfQotICAgIH0KLQotICAgIGlmIChjbGllbnQoKSkgewotICAgICAgICBpZiAoaXNIdHRwTm90
TW9kaWZpZWQoaHR0cENvZGUpKSB7Ci0gICAgICAgICAgICBjb25zdCBTdHJpbmcmIHVybCA9IG1f
Zmlyc3RSZXF1ZXN0LnVybCgpLnN0cmluZygpOwotICAgICAgICAgICAgaWYgKEN1cmxDYWNoZU1h
bmFnZXI6OmdldEluc3RhbmNlKCkuZ2V0Q2FjaGVkUmVzcG9uc2UodXJsLCBtX3Jlc3BvbnNlKSkg
ewotICAgICAgICAgICAgICAgIGlmIChtX2FkZGVkQ2FjaGVWYWxpZGF0aW9uSGVhZGVycykgewot
ICAgICAgICAgICAgICAgICAgICBtX3Jlc3BvbnNlLnNldEhUVFBTdGF0dXNDb2RlKDIwMCk7Ci0g
ICAgICAgICAgICAgICAgICAgIG1fcmVzcG9uc2Uuc2V0SFRUUFN0YXR1c1RleHQoIk9LIik7Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNsaWVu
dCgpLT5kaWRSZWNlaXZlUmVzcG9uc2UobV9oYW5kbGUsIFJlc291cmNlUmVzcG9uc2UobV9yZXNw
b25zZSkpOwotICAgICAgICBDdXJsQ2FjaGVNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpLmRpZFJlY2Vp
dmVSZXNwb25zZSgqbV9oYW5kbGUsIG1fcmVzcG9uc2UpOwotICAgIH0KLQotICAgIG1fcmVzcG9u
c2Uuc2V0UmVzcG9uc2VGaXJlZCh0cnVlKTsKLX0KLQotdm9pZCBSZXNvdXJjZUhhbmRsZUludGVy
bmFsOjpkaWRSZWNlaXZlQ29udGVudERhdGEoKQotewotICAgIEFTU0VSVChpc01haW5UaHJlYWQo
KSk7Ci0KLSAgICBpZiAoIW1fcmVzcG9uc2UucmVzcG9uc2VGaXJlZCgpKQotICAgICAgICBoYW5k
bGVMb2NhbFJlY2VpdmVSZXNwb25zZSgpOwotCi0gICAgVmVjdG9yPGNoYXI+IGJ1ZmZlcjsKLSAg
ICB7Ci0gICAgICAgIExvY2tIb2xkZXIgbG9ja2VyIHsgbV9yZWNlaXZlZEJ1ZmZlck11dGV4IH07
Ci0gICAgICAgIGJ1ZmZlciA9IFdURk1vdmUobV9yZWNlaXZlZEJ1ZmZlcik7Ci0gICAgfQotCi0g
ICAgY2hhciogcHRyID0gYnVmZmVyLmJlZ2luKCk7Ci0gICAgc2l6ZV90IHNpemUgPSBidWZmZXIu
c2l6ZSgpOwotCi0gICAgaWYgKG1fbXVsdGlwYXJ0SGFuZGxlKQotICAgICAgICBtX211bHRpcGFy
dEhhbmRsZS0+Y29udGVudFJlY2VpdmVkKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihwdHIpLCBz
aXplKTsKLSAgICBlbHNlIGlmIChjbGllbnQoKSkgewotICAgICAgICBjbGllbnQoKS0+ZGlkUmVj
ZWl2ZURhdGEobV9oYW5kbGUsIHB0ciwgc2l6ZSwgMCk7Ci0gICAgICAgIEN1cmxDYWNoZU1hbmFn
ZXI6OmdldEluc3RhbmNlKCkuZGlkUmVjZWl2ZURhdGEoKm1faGFuZGxlLCBwdHIsIHNpemUpOwot
ICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgdG8gb2J0YWluIEhUVFAgUE9TVCBvciBQVVQg
ZGF0YS4KLUl0ZXJhdGUgdGhyb3VnaCBGb3JtRGF0YSBlbGVtZW50cyBhbmQgdXBsb2FkIGZpbGVz
LgotQ2FyZWZ1bGx5IHJlc3BlY3QgdGhlIGdpdmVuIGJ1ZmZlciBzaXplIGFuZCBmaWxsIHRoZSBy
ZXN0IG9mIHRoZSBkYXRhIGF0IHRoZSBuZXh0IGNhbGxzLgotKi8KLXNpemVfdCBSZXNvdXJjZUhh
bmRsZUludGVybmFsOjpyZWFkQ2FsbGJhY2soY2hhciogcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90
IG5tZW1iLCB2b2lkKiBkYXRhKQotewotICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOwotCi0g
ICAgUmVzb3VyY2VIYW5kbGVJbnRlcm5hbCogZCA9IHN0YXRpY19jYXN0PFJlc291cmNlSGFuZGxl
SW50ZXJuYWwqPihkYXRhKTsKLQotICAgIGlmIChkLT5tX2NhbmNlbGxlZCkKLSAgICAgICAgcmV0
dXJuIDA7Ci0KLSAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdoZW4gZGVmZXJyZWQg
bG9hZGluZyBpcyBhY3RpdmF0ZWQuCi0gICAgQVNTRVJUKCFkLT5tX2RlZmVyc0xvYWRpbmcpOwot
Ci0gICAgaWYgKCFzaXplIHx8ICFubWVtYikKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1
cm4gZC0+d2lsbFByZXBhcmVTZW5kRGF0YShwdHIsIHNpemUsIG5tZW1iKTsKLX0KLQotLyoKLSog
VGhpcyBpcyBiZWluZyBjYWxsZWQgZm9yIGVhY2ggSFRUUCBoZWFkZXIgaW4gdGhlIHJlc3BvbnNl
LiBUaGlzIGluY2x1ZGVzICdcclxuJwotKiBmb3IgdGhlIGxhc3QgbGluZSBvZiB0aGUgaGVhZGVy
LgotKgotKiBXZSB3aWxsIGFkZCBlYWNoIEhUVFAgSGVhZGVyIHRvIHRoZSBSZXNvdXJjZVJlc3Bv
bnNlIGFuZCBvbiB0aGUgdGVybWluYXRpb24KLSogb2YgdGhlIGhlYWRlciAoXHJcbikgd2Ugd2ls
bCBwYXJzZSBDb250ZW50LVR5cGUgYW5kIENvbnRlbnQtRGlzcG9zaXRpb24gYW5kCi0qIHVwZGF0
ZSB0aGUgUmVzb3VyY2VSZXNwb25zZSBhbmQgdGhlbiBzZW5kIGl0IGF3YXkuCi0qCi0qLwotc2l6
ZV90IFJlc291cmNlSGFuZGxlSW50ZXJuYWw6OmhlYWRlckNhbGxiYWNrKGNoYXIqIHB0ciwgc2l6
ZV90IHNpemUsIHNpemVfdCBubWVtYiwgdm9pZCogZGF0YSkKLXsKLSAgICBBU1NFUlQoIWlzTWFp
blRocmVhZCgpKTsKLQotICAgIFJlc291cmNlSGFuZGxlSW50ZXJuYWwqIGQgPSBzdGF0aWNfY2Fz
dDxSZXNvdXJjZUhhbmRsZUludGVybmFsKj4oZGF0YSk7Ci0gICAgUmVzb3VyY2VIYW5kbGUqIGpv
YiA9IGQtPm1faGFuZGxlOwotCi0gICAgaWYgKGQtPm1fY2FuY2VsbGVkKQotICAgICAgICByZXR1
cm4gMDsKLQotICAgIC8vIFdlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgd2hlbiBkZWZlcnJlZCBs
b2FkaW5nIGlzIGFjdGl2YXRlZC4KLSAgICBBU1NFUlQoIWQtPm1fZGVmZXJzTG9hZGluZyk7Ci0K
LSAgICBzaXplX3QgdG90YWxTaXplID0gc2l6ZSAqIG5tZW1iOwotCi0gICAgU3RyaW5nIGhlYWRl
cihzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4ocHRyKSwgdG90YWxTaXplKTsKLQotICAgIC8qCi0g
ICAgKiBhKSBXZSBjYW4gZmluaXNoIGFuZCBzZW5kIHRoZSBSZXNvdXJjZVJlc3BvbnNlCi0gICAg
KiBiKSBXZSB3aWxsIGFkZCB0aGUgY3VycmVudCBoZWFkZXIgdG8gdGhlIEhUVFBIZWFkZXJNYXAg
b2YgdGhlIFJlc291cmNlUmVzcG9uc2UKLSAgICAqCi0gICAgKiBUaGUgSFRUUCBzdGFuZGFyZCBy
ZXF1aXJlcyB0byB1c2UgXHJcbiBidXQgZm9yIGNvbXBhdGliaWxpdHkgaXQgcmVjb21tZW5kcyB0
bwotICAgICogYWNjZXB0IGFsc28gXG4uCi0gICAgKi8KLSAgICBpZiAoaGVhZGVyID09IEF0b21p
Y1N0cmluZygiXHJcbiIpIHx8IGhlYWRlciA9PSBBdG9taWNTdHJpbmcoIlxuIikpIHsKLSAgICAg
ICAgbG9uZyBodHRwQ29kZSA9IDA7Ci0gICAgICAgIGQtPm1fY3VybEhhbmRsZS5nZXRSZXNwb25z
ZUNvZGUoaHR0cENvZGUpOwotCi0gICAgICAgIGlmICghaHR0cENvZGUpIHsKLSAgICAgICAgICAg
IC8vIENvbWVzIGhlcmUgd2hlbiByZWNlaXZpbmcgMjAwIENvbm5lY3Rpb24gRXN0YWJsaXNoZWQu
IEp1c3QgcmV0dXJuLgotICAgICAgICAgICAgcmV0dXJuIHRvdGFsU2l6ZTsKLSAgICAgICAgfQot
ICAgICAgICBpZiAoaXNIdHRwSW5mbyhodHRwQ29kZSkpIHsKLSAgICAgICAgICAgIC8vIEp1c3Qg
cmV0dXJuIHdoZW4gcmVjZWl2aW5nIGh0dHAgaW5mbywgZS5nLiBIVFRQLzEuMSAxMDAgQ29udGlu
dWUuCi0gICAgICAgICAgICAvLyBJZiBub3QsIHRoZSByZXF1ZXN0IG1pZ2h0IGJlIGNhbmNlbGxl
ZCwgYmVjYXVzZSB0aGUgTUlNRSB0eXBlIHdpbGwgYmUgZW1wdHkgZm9yIHRoaXMgcmVzcG9uc2Uu
Ci0gICAgICAgICAgICByZXR1cm4gdG90YWxTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9u
ZyBsb25nIGNvbnRlbnRMZW5ndGggPSAwOwotICAgICAgICBkLT5tX2N1cmxIYW5kbGUuZ2V0Q29u
dGVudExlbmdodERvd25sb2FkKGNvbnRlbnRMZW5ndGgpOwotCi0gICAgICAgIGNhbGxPbk1haW5U
aHJlYWQoW2pvYiA9IFJlZlB0cjxSZXNvdXJjZUhhbmRsZT4oam9iKSwgZCwgaHR0cENvZGUsIGNv
bnRlbnRMZW5ndGhdIHsKLSAgICAgICAgICAgIGlmICghZC0+bV9jYW5jZWxsZWQpCi0gICAgICAg
ICAgICAgICAgZC0+ZGlkUmVjZWl2ZUFsbEhlYWRlcnMoaHR0cENvZGUsIGNvbnRlbnRMZW5ndGgp
OwotICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBjYWxsT25NYWluVGhyZWFkKFtq
b2IgPSBSZWZQdHI8UmVzb3VyY2VIYW5kbGU+KGpvYiksIGQsIGhlYWRlcl0gewotICAgICAgICAg
ICAgaWYgKCFkLT5tX2NhbmNlbGxlZCkKLSAgICAgICAgICAgICAgICBkLT5kaWRSZWNlaXZlSGVh
ZGVyTGluZShoZWFkZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdG90YWxT
aXplOwotfQotCi0vLyBjYWxsZWQgd2l0aCBkYXRhIGFmdGVyIGFsbCBoZWFkZXJzIGhhdmUgYmVl
biBwcm9jZXNzZWQgdmlhIGhlYWRlckNhbGxiYWNrCi1zaXplX3QgUmVzb3VyY2VIYW5kbGVJbnRl
cm5hbDo6d3JpdGVDYWxsYmFjayhjaGFyKiBwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1lbWIs
IHZvaWQqIGRhdGEpCi17Ci0gICAgQVNTRVJUKCFpc01haW5UaHJlYWQoKSk7Ci0KLSAgICBSZXNv
dXJjZUhhbmRsZUludGVybmFsKiBkID0gc3RhdGljX2Nhc3Q8UmVzb3VyY2VIYW5kbGVJbnRlcm5h
bCo+KGRhdGEpOwotICAgIFJlc291cmNlSGFuZGxlKiBqb2IgPSBkLT5tX2hhbmRsZTsKLQotICAg
IGlmIChkLT5tX2NhbmNlbGxlZCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBXZSBzaG91
bGQgbmV2ZXIgYmUgY2FsbGVkIHdoZW4gZGVmZXJyZWQgbG9hZGluZyBpcyBhY3RpdmF0ZWQuCi0g
ICAgQVNTRVJUKCFkLT5tX2RlZmVyc0xvYWRpbmcpOwotCi0gICAgc2l6ZV90IHRvdGFsU2l6ZSA9
IHNpemUgKiBubWVtYjsKLQotICAgIC8vIHRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBidXQg
YXBwYXJlbnRseSBpcy4gQ1VSTCB3cml0ZXMgdGhlIGRhdGEKLSAgICAvLyBvZiBodG1sIHBhZ2Ug
ZXZlbiBpZiBpdCBpcyBhIHJlZGlyZWN0IHRoYXQgd2FzIGhhbmRsZWQgaW50ZXJuYWxseQotICAg
IC8vIGNhbiBiZSBvYnNlcnZlZCBlLmcuIG9uIGdtYWlsLmNvbQotICAgIGxvbmcgaHR0cENvZGUg
PSAwOwotICAgIENVUkxjb2RlIGVyckNkID0gZC0+bV9jdXJsSGFuZGxlLmdldFJlc3BvbnNlQ29k
ZShodHRwQ29kZSk7Ci0gICAgaWYgKENVUkxFX09LID09IGVyckNkICYmIGh0dHBDb2RlID49IDMw
MCAmJiBodHRwQ29kZSA8IDQwMCkKLSAgICAgICAgcmV0dXJuIHRvdGFsU2l6ZTsKLQotICAgIGJv
b2wgc2hvdWxkQ2FsbCB7IGZhbHNlIH07Ci0gICAgewotICAgICAgICBMb2NrSG9sZGVyIGxvY2tl
cihkLT5tX3JlY2VpdmVkQnVmZmVyTXV0ZXgpOwotICAgICAgICAKLSAgICAgICAgaWYgKGQtPm1f
cmVjZWl2ZWRCdWZmZXIuaXNFbXB0eSgpKQotICAgICAgICAgICAgc2hvdWxkQ2FsbCA9IHRydWU7
Ci0gICAgICAgIAotICAgICAgICBkLT5tX3JlY2VpdmVkQnVmZmVyLmFwcGVuZChwdHIsIHRvdGFs
U2l6ZSk7Ci0gICAgfQotCi0gICAgaWYgKHNob3VsZENhbGwpIHsKLSAgICAgICAgY2FsbE9uTWFp
blRocmVhZChbam9iID0gUmVmUHRyPFJlc291cmNlSGFuZGxlPihqb2IpLCBkXSB7Ci0gICAgICAg
ICAgICBpZiAoIWQtPm1fY2FuY2VsbGVkKQotICAgICAgICAgICAgICAgIGQtPmRpZFJlY2VpdmVD
b250ZW50RGF0YSgpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdG90YWxTaXpl
OwotfQotCiAvLyBzeW5jIGxvYWRlcgogCiB2b2lkIFJlc291cmNlSGFuZGxlOjpwbGF0Zm9ybUxv
YWRSZXNvdXJjZVN5bmNocm9ub3VzbHkoTmV0d29ya2luZ0NvbnRleHQqIGNvbnRleHQsIGNvbnN0
IFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCwgU3RvcmVkQ3JlZGVudGlhbHMsIFJlc291cmNlRXJy
b3ImIGVycm9yLCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSwgVmVjdG9yPGNoYXI+JiBkYXRh
KQpAQCAtOTY2LDEwMyArMjM5LDEzIEBAIHZvaWQgUmVzb3VyY2VIYW5kbGU6OnBsYXRmb3JtTG9h
ZFJlc291cmMKICAgICBTeW5jaHJvbm91c0xvYWRlckNsaWVudCBjbGllbnQ7CiAgICAgUmVmUHRy
PFJlc291cmNlSGFuZGxlPiBoYW5kbGUgPSBhZG9wdFJlZihuZXcgUmVzb3VyY2VIYW5kbGUoY29u
dGV4dCwgcmVxdWVzdCwgJmNsaWVudCwgZmFsc2UsIGZhbHNlKSk7CiAKLSAgICBoYW5kbGUtPmQt
PmRpc3BhdGNoU3luY2hyb25vdXNKb2IoKTsKKyAgICBoYW5kbGUtPmQtPm1fZGVsZWdhdGUtPmRp
c3BhdGNoU3luY2hyb25vdXNKb2IoKTsKIAogICAgIGVycm9yID0gY2xpZW50LmVycm9yKCk7CiAg
ICAgZGF0YS5zd2FwKGNsaWVudC5tdXRhYmxlRGF0YSgpKTsKICAgICByZXNwb25zZSA9IGNsaWVu
dC5yZXNwb25zZSgpOwogfQogCi12b2lkIFJlc291cmNlSGFuZGxlSW50ZXJuYWw6OmRpc3BhdGNo
U3luY2hyb25vdXNKb2IoKQotewotICAgIFVSTCBrdXJsID0gbV9maXJzdFJlcXVlc3QudXJsKCk7
Ci0KLSAgICBpZiAoa3VybC5wcm90b2NvbElzRGF0YSgpKSB7Ci0gICAgICAgIGhhbmRsZURhdGFV
UkwoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIElmIGRlZmVyc0xvYWRpbmcg
aXMgdHJ1ZSBhbmQgd2UgY2FsbCBjdXJsX2Vhc3lfcGVyZm9ybQotICAgIC8vIG9uIGEgcGF1c2Vk
IGhhbmRsZSwgbGliY1VSTCB3b3VsZCBkbyB0aGUgdHJhbnNmZXJ0IGFueXdheQotICAgIC8vIGFu
ZCB3ZSB3b3VsZCBhc3NlcnQgc28gZm9yY2UgZGVmZXJzTG9hZGluZyB0byBiZSBmYWxzZS4KLSAg
ICBtX2RlZmVyc0xvYWRpbmcgPSBmYWxzZTsKLQotICAgIGluaXRpYWxpemUoKTsKLQotICAgIC8v
IGN1cmxfZWFzeV9wZXJmb3JtIGJsb2NrcyB1bnRpbCB0aGUgdHJhbnNmZXJ0IGlzIGZpbmlzaGVk
LgotICAgIENVUkxjb2RlIHJldCA9IG1fY3VybEhhbmRsZS5wZXJmb3JtKCk7Ci0KLSAgICBjYWxj
dWxhdGVXZWJUaW1pbmdJbmZvcm1hdGlvbnMoKTsKLQotICAgIGlmIChjbGllbnQoKSkgewotICAg
ICAgICBpZiAocmV0ICE9IENVUkxFX09LKQotICAgICAgICAgICAgY2xpZW50KCktPmRpZEZhaWwo
bV9oYW5kbGUsIFJlc291cmNlRXJyb3IoQ3VybENvbnRleHQ6OmVycm9yRG9tYWluLCBtX2N1cmxI
YW5kbGUuZXJyb3JDb2RlKCksIG1fY3VybEhhbmRsZS5nZXRFZmZlY3RpdmVVUkwoKSwgbV9jdXJs
SGFuZGxlLmVycm9yRGVzY3JpcHRpb24oKSwgbV9jdXJsSGFuZGxlLmdldFNzbEVycm9ycygpKSk7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNsaWVudCgpLT5kaWRSZWNlaXZlUmVzcG9uc2Uo
bV9oYW5kbGUsIFJlc291cmNlUmVzcG9uc2UobV9yZXNwb25zZSkpOwotICAgIH0KLX0KLQotdm9p
ZCBSZXNvdXJjZUhhbmRsZUludGVybmFsOjpoYW5kbGVEYXRhVVJMKCkKLXsKLSAgICBBU1NFUlQo
bV9maXJzdFJlcXVlc3QudXJsKCkucHJvdG9jb2xJc0RhdGEoKSk7Ci0gICAgU3RyaW5nIHVybCA9
IG1fZmlyc3RSZXF1ZXN0LnVybCgpLnN0cmluZygpOwotCi0gICAgQVNTRVJUKGNsaWVudCgpKTsK
LQotICAgIGludCBpbmRleCA9IHVybC5maW5kKCcsJyk7Ci0gICAgaWYgKGluZGV4ID09IC0xKSB7
Ci0gICAgICAgIGNsaWVudCgpLT5jYW5ub3RTaG93VVJMKG1faGFuZGxlKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLQotICAgIFN0cmluZyBtZWRpYVR5cGUgPSB1cmwuc3Vic3RyaW5nKDUsIGlu
ZGV4IC0gNSk7Ci0gICAgU3RyaW5nIGRhdGEgPSB1cmwuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0K
LSAgICBib29sIGJhc2U2NCA9IG1lZGlhVHlwZS5lbmRzV2l0aCgiO2Jhc2U2NCIsIGZhbHNlKTsK
LSAgICBpZiAoYmFzZTY0KQotICAgICAgICBtZWRpYVR5cGUgPSBtZWRpYVR5cGUubGVmdChtZWRp
YVR5cGUubGVuZ3RoKCkgLSA3KTsKLQotICAgIGlmIChtZWRpYVR5cGUuaXNFbXB0eSgpKQotICAg
ICAgICBtZWRpYVR5cGUgPSAidGV4dC9wbGFpbiI7Ci0KLSAgICBTdHJpbmcgbWltZVR5cGUgPSBl
eHRyYWN0TUlNRVR5cGVGcm9tTWVkaWFUeXBlKG1lZGlhVHlwZSk7Ci0gICAgU3RyaW5nIGNoYXJz
ZXQgPSBleHRyYWN0Q2hhcnNldEZyb21NZWRpYVR5cGUobWVkaWFUeXBlKTsKLQotICAgIGlmIChj
aGFyc2V0LmlzRW1wdHkoKSkKLSAgICAgICAgY2hhcnNldCA9ICJVUy1BU0NJSSI7Ci0KLSAgICBS
ZXNvdXJjZVJlc3BvbnNlIHJlc3BvbnNlOwotICAgIHJlc3BvbnNlLnNldE1pbWVUeXBlKG1pbWVU
eXBlKTsKLSAgICByZXNwb25zZS5zZXRUZXh0RW5jb2RpbmdOYW1lKGNoYXJzZXQpOwotICAgIHJl
c3BvbnNlLnNldFVSTChtX2ZpcnN0UmVxdWVzdC51cmwoKSk7Ci0KLSAgICBpZiAoYmFzZTY0KSB7
Ci0gICAgICAgIGRhdGEgPSBkZWNvZGVVUkxFc2NhcGVTZXF1ZW5jZXMoZGF0YSk7Ci0gICAgICAg
IGNsaWVudCgpLT5kaWRSZWNlaXZlUmVzcG9uc2UobV9oYW5kbGUsIFdURk1vdmUocmVzcG9uc2Up
KTsKLQotICAgICAgICAvLyBkaWRSZWNlaXZlUmVzcG9uc2UgbWlnaHQgY2F1c2UgdGhlIGNsaWVu
dCB0byBiZSBkZWxldGVkLgotICAgICAgICBpZiAoY2xpZW50KCkpIHsKLSAgICAgICAgICAgIFZl
Y3RvcjxjaGFyPiBvdXQ7Ci0gICAgICAgICAgICBpZiAoYmFzZTY0RGVjb2RlKGRhdGEsIG91dCwg
QmFzZTY0SWdub3JlU3BhY2VzQW5kTmV3TGluZXMpICYmIG91dC5zaXplKCkgPiAwKQotICAgICAg
ICAgICAgICAgIGNsaWVudCgpLT5kaWRSZWNlaXZlRGF0YShtX2hhbmRsZSwgb3V0LmRhdGEoKSwg
b3V0LnNpemUoKSwgMCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBUZXh0RW5j
b2RpbmcgZW5jb2RpbmcoY2hhcnNldCk7Ci0gICAgICAgIGRhdGEgPSBkZWNvZGVVUkxFc2NhcGVT
ZXF1ZW5jZXMoZGF0YSwgZW5jb2RpbmcpOwotICAgICAgICBjbGllbnQoKS0+ZGlkUmVjZWl2ZVJl
c3BvbnNlKG1faGFuZGxlLCBXVEZNb3ZlKHJlc3BvbnNlKSk7Ci0KLSAgICAgICAgLy8gZGlkUmVj
ZWl2ZVJlc3BvbnNlIG1pZ2h0IGNhdXNlIHRoZSBjbGllbnQgdG8gYmUgZGVsZXRlZC4KLSAgICAg
ICAgaWYgKGNsaWVudCgpKSB7Ci0gICAgICAgICAgICBDU3RyaW5nIGVuY29kZWREYXRhID0gZW5j
b2RpbmcuZW5jb2RlKGRhdGEsIFVSTEVuY29kZWRFbnRpdGllc0ZvclVuZW5jb2RhYmxlcyk7Ci0g
ICAgICAgICAgICBpZiAoZW5jb2RlZERhdGEubGVuZ3RoKCkpCi0gICAgICAgICAgICAgICAgY2xp
ZW50KCktPmRpZFJlY2VpdmVEYXRhKG1faGFuZGxlLCBlbmNvZGVkRGF0YS5kYXRhKCksIGVuY29k
ZWREYXRhLmxlbmd0aCgpLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChjbGllbnQo
KSkKLSAgICAgICAgY2xpZW50KCktPmRpZEZpbmlzaExvYWRpbmcobV9oYW5kbGUpOwotfQotCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5k
bGVDdXJsRGVsZWdhdGUuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDk2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNiBB
cHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAy
MDA2IE1pY2hhZWwgRW1tZWwgbWlrZS5lbW1lbEBnbWFpbC5jb20KKyAqIENvcHlyaWdodCAoQykg
MjAxNyBTb255IEludGVyYWN0aXZlIEVudGVydGFpbm1lbnQgSW5jLgorICogQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBOQVZFUiBDb3JwLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGUuaCIK
KworI2lmIFVTRShDVVJMKQorCisjaW5jbHVkZSAiQ3JlZGVudGlhbFN0b3JhZ2UuaCIKKyNpbmNs
dWRlICJDdXJsQ2FjaGVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgor
I2luY2x1ZGUgIk11bHRpcGFydEhhbmRsZS5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgi
CisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oIgorI2luY2x1ZGUgIlNTTEhhbmRs
ZS5oIgorI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgorI2luY2x1ZGUgIlRocmVhZFNhZmVEYXRh
QnVmZmVyLmgiCisjaW5jbHVkZSAiVVJMLmgiCisjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4K
KyNpbmNsdWRlIDx3dGYvdGV4dC9CYXNlNjQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitS
ZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6UmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGUoUmVz
b3VyY2VIYW5kbGUqIGhhbmRsZSkKKyAgICA6IG1faGFuZGxlKGhhbmRsZSkKKyAgICAsIG1fZm9y
bURhdGFTdHJlYW0oaGFuZGxlKQorICAgICwgbV9maXJzdFJlcXVlc3QoaGFuZGxlLT5maXJzdFJl
cXVlc3QoKS5pc29sYXRlZENvcHkoKSkKKyAgICAsIG1fY3VzdG9tSFRUUEhlYWRlckZpZWxkcyht
X2ZpcnN0UmVxdWVzdC5odHRwSGVhZGVyRmllbGRzKCkuaXNvbGF0ZWRDb3B5KCkpCisgICAgLCBt
X3Nob3VsZFVzZUNyZWRlbnRpYWxTdG9yYWdlKGhhbmRsZS0+c2hvdWxkVXNlQ3JlZGVudGlhbFN0
b3JhZ2UoKSkKKyAgICAsIG1fdXNlcihoYW5kbGUtPmdldEludGVybmFsKCktPm1fdXNlci5pc29s
YXRlZENvcHkoKSkKKyAgICAsIG1fcGFzcyhoYW5kbGUtPmdldEludGVybmFsKCktPm1fcGFzcy5p
c29sYXRlZENvcHkoKSkKKyAgICAsIG1faW5pdGlhbENyZWRlbnRpYWwoaGFuZGxlLT5nZXRJbnRl
cm5hbCgpLT5tX2luaXRpYWxDcmVkZW50aWFsKQorICAgICwgbV9kZWZlcnNMb2FkaW5nKGhhbmRs
ZS0+Z2V0SW50ZXJuYWwoKS0+bV9kZWZlcnNMb2FkaW5nKQoreworICAgIGNvbnN0IFVSTCYgdXJs
ID0gbV9maXJzdFJlcXVlc3QudXJsKCk7CisKKyAgICBpZiAodXJsLmlzTG9jYWxGaWxlKCkpIHsK
KyAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBNSU1FIHR5cGUgYmFzZWQgb24gdGhlIHBhdGguCisg
ICAgICAgIHJlc3BvbnNlKCkuc2V0TWltZVR5cGUoTUlNRVR5cGVSZWdpc3RyeTo6Z2V0TUlNRVR5
cGVGb3JQYXRoKHVybCkpOworICAgIH0KKworICAgIGlmIChtX2N1c3RvbUhUVFBIZWFkZXJGaWVs
ZHMuc2l6ZSgpKSB7CisgICAgICAgIGF1dG8mIGNhY2hlID0gQ3VybENhY2hlTWFuYWdlcjo6Z2V0
SW5zdGFuY2UoKTsKKyAgICAgICAgYm9vbCBoYXNDYWNoZUhlYWRlcnMgPSBtX2N1c3RvbUhUVFBI
ZWFkZXJGaWVsZHMuY29udGFpbnMoSFRUUEhlYWRlck5hbWU6OklmTW9kaWZpZWRTaW5jZSkgfHwg
bV9jdXN0b21IVFRQSGVhZGVyRmllbGRzLmNvbnRhaW5zKEhUVFBIZWFkZXJOYW1lOjpJZk5vbmVN
YXRjaCk7CisgICAgICAgIGlmICghaGFzQ2FjaGVIZWFkZXJzICYmIGNhY2hlLmlzQ2FjaGVkKHVy
bCkpIHsKKyAgICAgICAgICAgIGNhY2hlLmFkZENhY2hlRW50cnlDbGllbnQodXJsLCBtX2hhbmRs
ZSk7CisgICAgICAgICAgICAvLyBhcHBlbmQgYWRkaXRpb25hbCBjYWNoZSBpbmZvcm1hdGlvbgor
ICAgICAgICAgICAgZm9yIChhdXRvIGVudHJ5IDogY2FjaGUucmVxdWVzdEhlYWRlcnModXJsKSkK
KyAgICAgICAgICAgICAgICBtX2N1c3RvbUhUVFBIZWFkZXJGaWVsZHMuc2V0KGVudHJ5LmtleSwg
ZW50cnkudmFsdWUpOworICAgICAgICAgICAgbV9hZGRlZENhY2hlVmFsaWRhdGlvbkhlYWRlcnMg
PSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgbV9zc2xDbGllbnRDZXJ0aWZpY2F0ZSA9
IGdldFNTTENsaWVudENlcnRpZmljYXRlKHVybC5ob3N0KCkpOworCisgICAgc2V0dXBBdXRoZW50
aWNhdGlvbigpOworfQorCitSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6flJlc291cmNlSGFu
ZGxlQ3VybERlbGVnYXRlKCkKK3sKK30KKworYm9vbCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0
ZTo6aGFzSGFuZGxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gISFtX2hhbmRsZTsKK30KKwordm9p
ZCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6cmVsZWFzZUhhbmRsZSgpCit7CisgICAgbV9o
YW5kbGUgPSBudWxscHRyOworfQorCitib29sIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpz
dGFydCgpCit7CisgICAgbV9qb2IgPSBDdXJsSm9iTWFuYWdlcjo6c2luZ2xldG9uKCkuYWRkKG1f
Y3VybEhhbmRsZSwgKnRoaXMpOworICAgIHJldHVybiAhIW1fam9iOworfQorCit2b2lkIFJlc291
cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpjYW5jZWwoKQoreworICAgIHJlbGVhc2VIYW5kbGUoKTsK
KyAgICBDdXJsSm9iTWFuYWdlcjo6c2luZ2xldG9uKCkuY2FuY2VsKG1fam9iKTsKK30KKwordm9p
ZCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6c2V0RGVmZXJzTG9hZGluZyhib29sIGRlZmVy
cykKK3sKKyAgICBpZiAoZGVmZXJzID09IG1fZGVmZXJzTG9hZGluZykKKyAgICAgICAgcmV0dXJu
OworCisgICAgbV9kZWZlcnNMb2FkaW5nID0gZGVmZXJzOworCisgICAgYXV0byBhY3Rpb24gPSBb
cHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRoaXMpXSgpIHsKKyAgICAgICAgaWYgKHByb3RlY3Rl
ZFRoaXMtPm1fZGVmZXJzTG9hZGluZykgeworICAgICAgICAgICAgQ1VSTGNvZGUgZXJyb3IgPSBw
cm90ZWN0ZWRUaGlzLT5tX2N1cmxIYW5kbGUucGF1c2UoQ1VSTFBBVVNFX0FMTCk7CisgICAgICAg
ICAgICAvLyBJZiB3ZSBjb3VsZCBub3QgZGVmZXIgdGhlIGhhbmRsZSwgc28gZG9uJ3QgZG8gaXQu
CisgICAgICAgICAgICBpZiAoZXJyb3IgIT0gQ1VSTEVfT0spCisgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ1VSTGNvZGUgZXJyb3IgPSBwcm90
ZWN0ZWRUaGlzLT5tX2N1cmxIYW5kbGUucGF1c2UoQ1VSTFBBVVNFX0NPTlQpOworICAgICAgICAg
ICAgaWYgKGVycm9yICE9IENVUkxFX09LKSB7CisgICAgICAgICAgICAgICAgLy8gUmVzdGFydGlu
ZyB0aGUgaGFuZGxlIGhhcyBmYWlsZWQgc28ganVzdCBjYW5jZWwgaXQuCisgICAgICAgICAgICAg
ICAgcHJvdGVjdGVkVGhpcy0+bV9oYW5kbGUtPmNhbmNlbCgpOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgfTsKKworICAgIEN1cmxKb2JNYW5hZ2VyOjpzaW5nbGV0b24oKS5jYWxsT25K
b2JUaHJlYWQoV1RGTW92ZShhY3Rpb24pKTsKK30KKwordm9pZCBSZXNvdXJjZUhhbmRsZUN1cmxE
ZWxlZ2F0ZTo6c2V0QXV0aGVudGljYXRpb24oY29uc3QgU3RyaW5nJiB1c2VyLCBjb25zdCBTdHJp
bmcmIHBhc3MpCit7CisgICAgYXV0byBhY3Rpb24gPSBbcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYo
KnRoaXMpLCB1c2VyID0gdXNlci5pc29sYXRlZENvcHkoKSwgcGFzcyA9IHBhc3MuaXNvbGF0ZWRD
b3B5KCldKCkgeworICAgICAgICBwcm90ZWN0ZWRUaGlzLT5tX3VzZXIgPSB1c2VyOworICAgICAg
ICBwcm90ZWN0ZWRUaGlzLT5tX3Bhc3MgPSBwYXNzOworICAgICAgICBwcm90ZWN0ZWRUaGlzLT5t
X2N1cmxIYW5kbGUuc2V0SHR0cEF1dGhVc2VyUGFzcyh1c2VyLCBwYXNzKTsKKyAgICB9OworCisg
ICAgQ3VybEpvYk1hbmFnZXI6OnNpbmdsZXRvbigpLmNhbGxPbkpvYlRocmVhZChXVEZNb3ZlKGFj
dGlvbikpOworfQorCit2b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpkaXNwYXRjaFN5
bmNocm9ub3VzSm9iKCkKK3sKKyAgICBVUkwga3VybCA9IG1fZmlyc3RSZXF1ZXN0LnVybCgpOwor
CisgICAgaWYgKGt1cmwucHJvdG9jb2xJc0RhdGEoKSkgeworICAgICAgICBoYW5kbGVEYXRhVVJM
KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiBkZWZlcnNMb2FkaW5nIGlz
IHRydWUgYW5kIHdlIGNhbGwgY3VybF9lYXN5X3BlcmZvcm0KKyAgICAvLyBvbiBhIHBhdXNlZCBo
YW5kbGUsIGxpYmNVUkwgd291bGQgZG8gdGhlIHRyYW5zZmVydCBhbnl3YXkKKyAgICAvLyBhbmQg
d2Ugd291bGQgYXNzZXJ0IHNvIGZvcmNlIGRlZmVyc0xvYWRpbmcgdG8gYmUgZmFsc2UuCisgICAg
bV9kZWZlcnNMb2FkaW5nID0gZmFsc2U7CisKKyAgICBzZXR1cFJlcXVlc3QoKTsKKworICAgIC8v
IGN1cmxfZWFzeV9wZXJmb3JtIGJsb2NrcyB1bnRpbCB0aGUgdHJhbnNmZXIgaXMgZmluaXNoZWQu
CisgICAgQ1VSTGNvZGUgcmV0ID0gbV9jdXJsSGFuZGxlLnBlcmZvcm0oKTsKKworICAgIGRvdWJs
ZSBwcmV0cmFuc2ZlclRpbWUgPSAwOworICAgIGRvdWJsZSBkbnNMb29rdXBUaW1lID0gMDsKKyAg
ICBkb3VibGUgY29ubmVjdFRpbWUgPSAwOworICAgIGRvdWJsZSBhcHBDb25uZWN0VGltZSA9IDA7
CisKKyAgICBtX2N1cmxIYW5kbGUuZ2V0VGltZXMocHJldHJhbnNmZXJUaW1lLCBkbnNMb29rdXBU
aW1lLCBjb25uZWN0VGltZSwgYXBwQ29ubmVjdFRpbWUpOworICAgIHNldFdlYlRpbWluZ3MocHJl
dHJhbnNmZXJUaW1lLCBkbnNMb29rdXBUaW1lLCBjb25uZWN0VGltZSwgYXBwQ29ubmVjdFRpbWUp
OworCisgICAgaWYgKG1faGFuZGxlLT5jbGllbnQoKSkgeworICAgICAgICBpZiAocmV0ICE9IENV
UkxFX09LKSB7CisgICAgICAgICAgICBTdHJpbmcgZG9tYWluID0gQ3VybENvbnRleHQ6OmVycm9y
RG9tYWluOworICAgICAgICAgICAgaW50IGVycm9yQ29kZSA9IG1fY3VybEhhbmRsZS5lcnJvckNv
ZGUoKTsKKyAgICAgICAgICAgIFVSTCBmYWlsaW5nVVJMID0gbV9jdXJsSGFuZGxlLmdldEVmZmVj
dGl2ZVVSTCgpOworICAgICAgICAgICAgU3RyaW5nIGVycm9yRGVzY3JpcHRpb24gPSBtX2N1cmxI
YW5kbGUuZXJyb3JEZXNjcmlwdGlvbigpOworICAgICAgICAgICAgdW5zaWduZWQgc3NsRXJyb3Jz
ID0gbV9jdXJsSGFuZGxlLmdldFNzbEVycm9ycygpOworCisgICAgICAgICAgICBtX2hhbmRsZS0+
Y2xpZW50KCktPmRpZEZhaWwobV9oYW5kbGUsIFJlc291cmNlRXJyb3IoZG9tYWluLCBlcnJvckNv
ZGUsIGZhaWxpbmdVUkwsIGVycm9yRGVzY3JpcHRpb24sIHNzbEVycm9ycykpOworICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZVJlc3BvbnNl
KG1faGFuZGxlLCBSZXNvdXJjZVJlc3BvbnNlKHJlc3BvbnNlKCkpKTsKKyAgICB9Cit9CisKK3Zv
aWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnJldGFpbigpCit7CisgICAgcmVmKCk7Cit9
CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnJlbGVhc2UoKQoreworICAgIGRl
cmVmKCk7Cit9CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldHVwUmVxdWVz
dCgpCit7CisgICAgQ3VybENvbnRleHQmIGNvbnRleHQgPSBDdXJsQ29udGV4dDo6c2luZ2xldG9u
KCk7CisKKyAgICBVUkwgdXJsID0gbV9maXJzdFJlcXVlc3QudXJsKCk7CisKKyAgICAvLyBSZW1v
dmUgYW55IGZyYWdtZW50IHBhcnQsIG90aGVyd2lzZSBjdXJsIHdpbGwgc2VuZCBpdCBhcyBwYXJ0
IG9mIHRoZSByZXF1ZXN0LgorICAgIHVybC5yZW1vdmVGcmFnbWVudElkZW50aWZpZXIoKTsKKwor
ICAgIFN0cmluZyB1cmxTdHJpbmcgPSB1cmwuc3RyaW5nKCk7CisKKyAgICBtX2N1cmxIYW5kbGUu
aW5pdGlhbGl6ZSgpOworCisgICAgaWYgKHVybC5pc0xvY2FsRmlsZSgpKSB7CisgICAgICAgIC8v
IFJlbW92ZSBhbnkgcXVlcnkgcGFydCBzZW50IHRvIGEgbG9jYWwgZmlsZS4KKyAgICAgICAgaWYg
KCF1cmwucXVlcnkoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIEJ5IHNldHRpbmcgdGhl
IHF1ZXJ5IHRvIGEgbnVsbCBzdHJpbmcgaXQnbGwgYmUgcmVtb3ZlZC4KKyAgICAgICAgICAgIHVy
bC5zZXRRdWVyeShTdHJpbmcoKSk7CisgICAgICAgICAgICB1cmxTdHJpbmcgPSB1cmwuc3RyaW5n
KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobV9kZWZlcnNMb2FkaW5nKSB7CisgICAg
ICAgIENVUkxjb2RlIGVycm9yID0gbV9jdXJsSGFuZGxlLnBhdXNlKENVUkxQQVVTRV9BTEwpOwor
ICAgICAgICAvLyBJZiB3ZSBkaWQgbm90IHBhdXNlIHRoZSBoYW5kbGUsIHdlIHdvdWxkIEFTU0VS
VCBpbiB0aGUKKyAgICAgICAgLy8gaGVhZGVyIGNhbGxiYWNrLiBTbyBqdXN0IGFzc2VydCBoZXJl
LgorICAgICAgICBBU1NFUlRfVU5VU0VEKGVycm9yLCBlcnJvciA9PSBDVVJMRV9PSyk7CisgICAg
fQorCisjaWZuZGVmIE5ERUJVRworICAgIG1fY3VybEhhbmRsZS5lbmFibGVWZXJib3NlSWZVc2Vk
KCk7CisgICAgbV9jdXJsSGFuZGxlLmVuYWJsZVN0ZEVycklmVXNlZCgpOworI2VuZGlmCisKKyAg
ICBtX2N1cmxIYW5kbGUuc2V0U3NsVmVyaWZ5UGVlcihDdXJsSGFuZGxlOjpWZXJpZnlQZWVyRW5h
YmxlKTsKKyAgICBtX2N1cmxIYW5kbGUuc2V0U3NsVmVyaWZ5SG9zdChDdXJsSGFuZGxlOjpWZXJp
ZnlIb3N0U3RyaWN0TmFtZUNoZWNrKTsKKyAgICBtX2N1cmxIYW5kbGUuc2V0UHJpdmF0ZURhdGEo
dGhpcyk7CisgICAgbV9jdXJsSGFuZGxlLnNldFdyaXRlQ2FsbGJhY2tGdW5jdGlvbihkaWRSZWNl
aXZlRGF0YUNhbGxiYWNrLCB0aGlzKTsKKyAgICBtX2N1cmxIYW5kbGUuc2V0SGVhZGVyQ2FsbGJh
Y2tGdW5jdGlvbihkaWRSZWNlaXZlSGVhZGVyQ2FsbGJhY2ssIHRoaXMpOworICAgIG1fY3VybEhh
bmRsZS5lbmFibGVBdXRvUmVmZXJlcigpOworICAgIG1fY3VybEhhbmRsZS5lbmFibGVGb2xsb3dM
b2NhdGlvbigpOworICAgIG1fY3VybEhhbmRsZS5lbmFibGVIdHRwQXV0aGVudGljYXRpb24oQ1VS
TEFVVEhfQU5ZKTsKKyAgICBtX2N1cmxIYW5kbGUuZW5hYmxlU2hhcmVIYW5kbGUoKTsKKyAgICBt
X2N1cmxIYW5kbGUuZW5hYmxlVGltZW91dCgpOworICAgIG1fY3VybEhhbmRsZS5lbmFibGVBbGxv
d2VkUHJvdG9jb2xzKCk7CisKKyAgICBpZiAobV9zc2xDbGllbnRDZXJ0aWZpY2F0ZSkgeworICAg
ICAgICBtX2N1cmxIYW5kbGUuc2V0U3NsQ2VydCgoKm1fc3NsQ2xpZW50Q2VydGlmaWNhdGUpLmZp
cnN0LnV0ZjgoKS5kYXRhKCkpOworICAgICAgICBtX2N1cmxIYW5kbGUuc2V0U3NsQ2VydFR5cGUo
IlAxMiIpOworICAgICAgICBtX2N1cmxIYW5kbGUuc2V0U3NsS2V5UGFzc3dvcmQoKCptX3NzbENs
aWVudENlcnRpZmljYXRlKS5zZWNvbmQudXRmOCgpLmRhdGEoKSk7CisgICAgfQorCisgICAgaWYg
KEN1cmxDb250ZXh0OjpzaW5nbGV0b24oKS5zaG91bGRJZ25vcmVTU0xFcnJvcnMoKSkKKyAgICAg
ICAgbV9jdXJsSGFuZGxlLnNldFNzbFZlcmlmeVBlZXIoQ3VybEhhbmRsZTo6VmVyaWZ5UGVlckRp
c2FibGUpOworICAgIGVsc2UKKyAgICAgICAgc2V0U1NMVmVyaWZ5T3B0aW9ucyhtX2N1cmxIYW5k
bGUpOworCisgICAgbV9jdXJsSGFuZGxlLmVuYWJsZUNBSW5mb0lmRXhpc3RzKCk7CisKKyAgICBt
X2N1cmxIYW5kbGUuZW5hYmxlQWNjZXB0RW5jb2RpbmcoKTsKKyAgICBtX2N1cmxIYW5kbGUuc2V0
VXJsKHVybFN0cmluZyk7CisgICAgbV9jdXJsSGFuZGxlLmVuYWJsZUNvb2tpZUphcklmRXhpc3Rz
KCk7CisKKyAgICBpZiAobV9jdXN0b21IVFRQSGVhZGVyRmllbGRzLnNpemUoKSkKKyAgICAgICAg
bV9jdXJsSGFuZGxlLmFwcGVuZFJlcXVlc3RIZWFkZXJzKG1fY3VzdG9tSFRUUEhlYWRlckZpZWxk
cyk7CisKKyAgICBTdHJpbmcgbWV0aG9kID0gbV9maXJzdFJlcXVlc3QuaHR0cE1ldGhvZCgpOwor
ICAgIGlmICgiR0VUIiA9PSBtZXRob2QpCisgICAgICAgIG1fY3VybEhhbmRsZS5lbmFibGVIdHRw
R2V0UmVxdWVzdCgpOworICAgIGVsc2UgaWYgKCJQT1NUIiA9PSBtZXRob2QpCisgICAgICAgIHNl
dHVwUE9TVCgpOworICAgIGVsc2UgaWYgKCJQVVQiID09IG1ldGhvZCkKKyAgICAgICAgc2V0dXBQ
VVQoKTsKKyAgICBlbHNlIGlmICgiSEVBRCIgPT0gbWV0aG9kKQorICAgICAgICBtX2N1cmxIYW5k
bGUuZW5hYmxlSHR0cEhlYWRSZXF1ZXN0KCk7CisgICAgZWxzZSB7CisgICAgICAgIG1fY3VybEhh
bmRsZS5zZXRIdHRwQ3VzdG9tUmVxdWVzdChtZXRob2QpOworICAgICAgICBzZXR1cFBVVCgpOwor
ICAgIH0KKworICAgIG1fY3VybEhhbmRsZS5lbmFibGVSZXF1ZXN0SGVhZGVycygpOworCisgICAg
YXBwbHlBdXRoZW50aWNhdGlvbigpOworCisgICAgbV9jdXJsSGFuZGxlLmVuYWJsZVByb3h5SWZF
eGlzdHMoKTsKK30KKwordm9pZCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6bm90aWZ5Rmlu
aXNoKCkKK3sKKyAgICBkb3VibGUgcHJldHJhbnNmZXJUaW1lID0gMDsKKyAgICBkb3VibGUgZG5z
TG9va3VwVGltZSA9IDA7CisgICAgZG91YmxlIGNvbm5lY3RUaW1lID0gMDsKKyAgICBkb3VibGUg
YXBwQ29ubmVjdFRpbWUgPSAwOworCisgICAgbV9jdXJsSGFuZGxlLmdldFRpbWVzKHByZXRyYW5z
ZmVyVGltZSwgZG5zTG9va3VwVGltZSwgY29ubmVjdFRpbWUsIGFwcENvbm5lY3RUaW1lKTsKKwor
ICAgIGNhbGxPbk1haW5UaHJlYWQoW3Byb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgcHJl
dHJhbnNmZXJUaW1lLCBkbnNMb29rdXBUaW1lLCBjb25uZWN0VGltZSwgYXBwQ29ubmVjdFRpbWVd
IHsKKyAgICAgICAgaWYgKCFwcm90ZWN0ZWRUaGlzLT5tX2hhbmRsZSkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgcHJvdGVjdGVkVGhpcy0+ZGlkRmluaXNoKHByZXRyYW5zZmVyVGltZSwg
ZG5zTG9va3VwVGltZSwgY29ubmVjdFRpbWUsIGFwcENvbm5lY3RUaW1lKTsKKyAgICB9KTsKK30K
Kwordm9pZCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6bm90aWZ5RmFpbCgpCit7CisgICAg
U3RyaW5nIGRvbWFpbiA9IEN1cmxDb250ZXh0OjplcnJvckRvbWFpbjsKKyAgICBpbnQgZXJyb3JD
b2RlID0gbV9jdXJsSGFuZGxlLmVycm9yQ29kZSgpOworICAgIFVSTCBmYWlsaW5nVVJMID0gbV9j
dXJsSGFuZGxlLmdldEVmZmVjdGl2ZVVSTCgpOworICAgIFN0cmluZyBlcnJvckRlc2NyaXB0aW9u
ID0gbV9jdXJsSGFuZGxlLmVycm9yRGVzY3JpcHRpb24oKTsKKyAgICB1bnNpZ25lZCBzc2xFcnJv
cnMgPSBtX2N1cmxIYW5kbGUuZ2V0U3NsRXJyb3JzKCk7CisKKyAgICBjYWxsT25NYWluVGhyZWFk
KFtwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyksIGRvbWFpbiA9IGRvbWFpbi5pc29sYXRl
ZENvcHkoKSwgZXJyb3JDb2RlLCBmYWlsaW5nVVJMID0gZmFpbGluZ1VSTC5pc29sYXRlZENvcHko
KSwgZXJyb3JEZXNjcmlwdGlvbiA9IGVycm9yRGVzY3JpcHRpb24uaXNvbGF0ZWRDb3B5KCksIHNz
bEVycm9yc10geworICAgICAgICBpZiAoIXByb3RlY3RlZFRoaXMtPm1faGFuZGxlKQorICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICBwcm90ZWN0ZWRUaGlzLT5kaWRGYWlsKGRvbWFpbiwgZXJy
b3JDb2RlLCBmYWlsaW5nVVJMLCBlcnJvckRlc2NyaXB0aW9uLCBzc2xFcnJvcnMpOworICAgIH0p
OworfQorCitSZXNvdXJjZVJlc3BvbnNlJiBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6cmVz
cG9uc2UoKQoreworICAgIHJldHVybiBtX2hhbmRsZS0+Z2V0SW50ZXJuYWwoKS0+bV9yZXNwb25z
ZTsKK30KKwordm9pZCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6c2V0dXBBdXRoZW50aWNh
dGlvbigpCit7CisgICAgLy8gbV91c2VyL21fcGFzcyBhcmUgY3JlZGVudGlhbHMgZ2l2ZW4gbWFu
dWFsbHksIGZvciBpbnN0YW5jZSwgYnkgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gWE1MSHR0cFJl
cXVlc3Qub3BlbigpLgorICAgIFN0cmluZyBwYXJ0aXRpb24gPSBtX2ZpcnN0UmVxdWVzdC5jYWNo
ZVBhcnRpdGlvbigpOworCisgICAgaWYgKG1fc2hvdWxkVXNlQ3JlZGVudGlhbFN0b3JhZ2UpIHsK
KyAgICAgICAgaWYgKG1fdXNlci5pc0VtcHR5KCkgJiYgbV9wYXNzLmlzRW1wdHkoKSkgeworICAg
ICAgICAgICAgLy8gPHJkYXI6Ly9wcm9ibGVtLzcxNzQwNTA+IC0gRm9yIFVSTHMgdGhhdCBtYXRj
aCB0aGUgcGF0aHMgb2YgdGhvc2UgcHJldmlvdXNseSBjaGFsbGVuZ2VkIGZvciBIVFRQIEJhc2lj
IGF1dGhlbnRpY2F0aW9uLCAKKyAgICAgICAgICAgIC8vIHRyeSBhbmQgcmV1c2UgdGhlIGNyZWRl
bnRpYWwgcHJlZW1wdGl2ZWx5LCBhcyBhbGxvd2VkIGJ5IFJGQyAyNjE3LgorICAgICAgICAgICAg
bV9pbml0aWFsQ3JlZGVudGlhbCA9IENyZWRlbnRpYWxTdG9yYWdlOjpkZWZhdWx0Q3JlZGVudGlh
bFN0b3JhZ2UoKS5nZXQocGFydGl0aW9uLCBtX2ZpcnN0UmVxdWVzdC51cmwoKSk7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgcHJvdGVjdGlv
biBzcGFjZSBrbm93biBmb3IgdGhlIFVSTCwgdXBkYXRlIHN0b3JlZCBjcmVkZW50aWFscworICAg
ICAgICAgICAgLy8gYmVmb3JlIHNlbmRpbmcgYSByZXF1ZXN0LiBUaGlzIG1ha2VzIGl0IHBvc3Np
YmxlIHRvIGltcGxlbWVudCBsb2dvdXQgYnkgc2VuZGluZyBhbgorICAgICAgICAgICAgLy8gWE1M
SHR0cFJlcXVlc3Qgd2l0aCBrbm93biBpbmNvcnJlY3QgY3JlZGVudGlhbHMsIGFuZCBhYm9ydGlu
ZyBpdCBpbW1lZGlhdGVseSAoc28gdGhhdAorICAgICAgICAgICAgLy8gYW4gYXV0aGVudGljYXRp
b24gZGlhbG9nIGRvZXNuJ3QgcG9wIHVwKS4KKyAgICAgICAgICAgIENyZWRlbnRpYWxTdG9yYWdl
OjpkZWZhdWx0Q3JlZGVudGlhbFN0b3JhZ2UoKS5zZXQocGFydGl0aW9uLCBDcmVkZW50aWFsKG1f
dXNlciwgbV9wYXNzLCBDcmVkZW50aWFsUGVyc2lzdGVuY2VOb25lKSwgbV9maXJzdFJlcXVlc3Qu
dXJsKCkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZW1vdmVMZWFkaW5n
QW5kVHJhaWxpbmdRdW90ZXMoU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICB1bnNpZ25lZCBsZW5ndGgg
PSB2YWx1ZS5sZW5ndGgoKTsKKyAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnIicpICYmIHZhbHVl
LmVuZHNXaXRoKCciJykgJiYgbGVuZ3RoID4gMSkKKyAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJz
dHJpbmcoMSwgbGVuZ3RoIC0gMik7Cit9CisKK2Jvb2wgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdh
dGU6OmdldFByb3RlY3Rpb25TcGFjZShjb25zdCBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSwg
UHJvdGVjdGlvblNwYWNlJiBwcm90ZWN0aW9uU3BhY2UpCit7CisgICAgQ1VSTGNvZGUgZXJyOwor
CisgICAgbG9uZyBwb3J0ID0gMDsKKyAgICBlcnIgPSBtX2N1cmxIYW5kbGUuZ2V0UHJpbWFyeVBv
cnQocG9ydCk7CisgICAgaWYgKGVyciAhPSBDVVJMRV9PSykKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgbG9uZyBhdmFpbGFibGVBdXRoID0gQ1VSTEFVVEhfTk9ORTsKKyAgICBlcnIgPSBt
X2N1cmxIYW5kbGUuZ2V0SHR0cEF1dGhBdmFpbChhdmFpbGFibGVBdXRoKTsKKyAgICBpZiAoZXJy
ICE9IENVUkxFX09LKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBVUkwgdXJsID0gbV9j
dXJsSGFuZGxlLmdldEVmZmVjdGl2ZVVSTCgpOworICAgIGlmICghdXJsLmlzVmFsaWQoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgU3RyaW5nIGhvc3QgPSB1cmwuaG9zdCgpOworICAg
IFN0cmluZ1ZpZXcgcHJvdG9jb2wgPSB1cmwucHJvdG9jb2woKTsKKworICAgIFN0cmluZyByZWFs
bTsKKworICAgIGNvbnN0IFN0cmluZyBhdXRoSGVhZGVyID0gcmVzcG9uc2UuaHR0cEhlYWRlckZp
ZWxkKEhUVFBIZWFkZXJOYW1lOjpBdXRob3JpemF0aW9uKTsKKyAgICBjb25zdCBTdHJpbmcgcmVh
bG1TdHJpbmcgPSAicmVhbG09IjsKKyAgICBpbnQgcmVhbG1Qb3MgPSBhdXRoSGVhZGVyLmZpbmQo
cmVhbG1TdHJpbmcpOworICAgIGlmIChyZWFsbVBvcyA+IDApIHsKKyAgICAgICAgcmVhbG0gPSBh
dXRoSGVhZGVyLnN1YnN0cmluZyhyZWFsbVBvcyArIHJlYWxtU3RyaW5nLmxlbmd0aCgpKTsKKyAg
ICAgICAgcmVhbG0gPSByZWFsbS5sZWZ0KHJlYWxtLmZpbmQoJywnKSk7CisgICAgICAgIHJlbW92
ZUxlYWRpbmdBbmRUcmFpbGluZ1F1b3RlcyhyZWFsbSk7CisgICAgfQorCisgICAgUHJvdGVjdGlv
blNwYWNlU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gUHJvdGVjdGlvblNwYWNlU2VydmVySFRUUDsK
KyAgICBpZiAocHJvdG9jb2wgPT0gImh0dHBzIikKKyAgICAgICAgc2VydmVyVHlwZSA9IFByb3Rl
Y3Rpb25TcGFjZVNlcnZlckhUVFBTOworCisgICAgUHJvdGVjdGlvblNwYWNlQXV0aGVudGljYXRp
b25TY2hlbWUgYXV0aFNjaGVtZSA9IFByb3RlY3Rpb25TcGFjZUF1dGhlbnRpY2F0aW9uU2NoZW1l
VW5rbm93bjsKKworICAgIGlmIChhdmFpbGFibGVBdXRoICYgQ1VSTEFVVEhfQkFTSUMpCisgICAg
ICAgIGF1dGhTY2hlbWUgPSBQcm90ZWN0aW9uU3BhY2VBdXRoZW50aWNhdGlvblNjaGVtZUhUVFBC
YXNpYzsKKyAgICBpZiAoYXZhaWxhYmxlQXV0aCAmIENVUkxBVVRIX0RJR0VTVCkKKyAgICAgICAg
YXV0aFNjaGVtZSA9IFByb3RlY3Rpb25TcGFjZUF1dGhlbnRpY2F0aW9uU2NoZW1lSFRUUERpZ2Vz
dDsKKyAgICBpZiAoYXZhaWxhYmxlQXV0aCAmIENVUkxBVVRIX0dTU05FR09USUFURSkKKyAgICAg
ICAgYXV0aFNjaGVtZSA9IFByb3RlY3Rpb25TcGFjZUF1dGhlbnRpY2F0aW9uU2NoZW1lTmVnb3Rp
YXRlOworICAgIGlmIChhdmFpbGFibGVBdXRoICYgQ1VSTEFVVEhfTlRMTSkKKyAgICAgICAgYXV0
aFNjaGVtZSA9IFByb3RlY3Rpb25TcGFjZUF1dGhlbnRpY2F0aW9uU2NoZW1lTlRMTTsKKworICAg
IHByb3RlY3Rpb25TcGFjZSA9IFByb3RlY3Rpb25TcGFjZShob3N0LCBwb3J0LCBzZXJ2ZXJUeXBl
LCByZWFsbSwgYXV0aFNjaGVtZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIHN0
YXRpYyBib29sIGlzSHR0cEluZm8oaW50IHN0YXR1c0NvZGUpCit7CisgICAgcmV0dXJuIDEwMCA8
PSBzdGF0dXNDb2RlICYmIHN0YXR1c0NvZGUgPCAyMDA7Cit9CisKK2lubGluZSBzdGF0aWMgYm9v
bCBpc0h0dHBSZWRpcmVjdChpbnQgc3RhdHVzQ29kZSkKK3sKKyAgICByZXR1cm4gMzAwIDw9IHN0
YXR1c0NvZGUgJiYgc3RhdHVzQ29kZSA8IDQwMCAmJiBzdGF0dXNDb2RlICE9IDMwNDsKK30KKwor
aW5saW5lIHN0YXRpYyBib29sIGlzSHR0cEF1dGhlbnRpY2F0aW9uKGludCBzdGF0dXNDb2RlKQor
eworICAgIHJldHVybiBzdGF0dXNDb2RlID09IDQwMTsKK30KKworaW5saW5lIHN0YXRpYyBib29s
IGlzSHR0cE5vdE1vZGlmaWVkKGludCBzdGF0dXNDb2RlKQoreworICAgIHJldHVybiBzdGF0dXND
b2RlID09IDMwNDsKK30KKworc3RhdGljIGJvb2wgaXNBcHBlbmRhYmxlSGVhZGVyKGNvbnN0IFN0
cmluZyAma2V5KQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBhcHBlbmRhYmxlSGVhZGVyc1td
ID0geworICAgICAgICAiYWNjZXNzLWNvbnRyb2wtYWxsb3ctaGVhZGVycyIsCisgICAgICAgICJh
Y2Nlc3MtY29udHJvbC1hbGxvdy1tZXRob2RzIiwKKyAgICAgICAgImFjY2Vzcy1jb250cm9sLWFs
bG93LW9yaWdpbiIsCisgICAgICAgICJhY2Nlc3MtY29udHJvbC1leHBvc2UtaGVhZGVycyIsCisg
ICAgICAgICJhbGxvdyIsCisgICAgICAgICJjYWNoZS1jb250cm9sIiwKKyAgICAgICAgImNvbm5l
Y3Rpb24iLAorICAgICAgICAiY29udGVudC1lbmNvZGluZyIsCisgICAgICAgICJjb250ZW50LWxh
bmd1YWdlIiwKKyAgICAgICAgImlmLW1hdGNoIiwKKyAgICAgICAgImlmLW5vbmUtbWF0Y2giLAor
ICAgICAgICAia2VlcC1hbGl2ZSIsCisgICAgICAgICJwcmFnbWEiLAorICAgICAgICAicHJveHkt
YXV0aGVudGljYXRlIiwKKyAgICAgICAgInB1YmxpYyIsCisgICAgICAgICJzZXJ2ZXIiLAorICAg
ICAgICAic2V0LWNvb2tpZSIsCisgICAgICAgICJ0ZSIsCisgICAgICAgICJ0cmFpbGVyIiwKKyAg
ICAgICAgInRyYW5zZmVyLWVuY29kaW5nIiwKKyAgICAgICAgInVwZ3JhZGUiLAorICAgICAgICAi
dXNlci1hZ2VudCIsCisgICAgICAgICJ2YXJ5IiwKKyAgICAgICAgInZpYSIsCisgICAgICAgICJ3
YXJuaW5nIiwKKyAgICAgICAgInd3dy1hdXRoZW50aWNhdGUiCisgICAgfTsKKworICAgIC8vIEN1
c3RvbSBoZWFkZXJzIHN0YXJ0IHdpdGggJ1gtJywgYW5kIG5lZWQgbm8gZnVydGhlciBjaGVja2lu
Zy4KKyAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoIngtIiwgLyogY2FzZVNlbnNpdGl2ZSAqLyBmYWxz
ZSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgZm9yIChhdXRvJiBoZWFkZXIgOiBhcHBl
bmRhYmxlSGVhZGVycykgeworICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0FTQ0lJQ2FzZShrZXks
IGhlYWRlcikpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OmRpZFJlY2VpdmVI
ZWFkZXJMaW5lKGNvbnN0IFN0cmluZyYgaGVhZGVyKQoreworICAgIEFTU0VSVChpc01haW5UaHJl
YWQoKSk7CisKKyAgICBhdXRvIHNwbGl0UG9zaXRpb24gPSBoZWFkZXIuZmluZCgiOiIpOworICAg
IGlmIChzcGxpdFBvc2l0aW9uICE9IG5vdEZvdW5kKSB7CisgICAgICAgIFN0cmluZyBrZXkgPSBo
ZWFkZXIubGVmdChzcGxpdFBvc2l0aW9uKS5zdHJpcFdoaXRlU3BhY2UoKTsKKyAgICAgICAgU3Ry
aW5nIHZhbHVlID0gaGVhZGVyLnN1YnN0cmluZyhzcGxpdFBvc2l0aW9uICsgMSkuc3RyaXBXaGl0
ZVNwYWNlKCk7CisKKyAgICAgICAgaWYgKGlzQXBwZW5kYWJsZUhlYWRlcihrZXkpKQorICAgICAg
ICAgICAgcmVzcG9uc2UoKS5hZGRIVFRQSGVhZGVyRmllbGQoa2V5LCB2YWx1ZSk7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIHJlc3BvbnNlKCkuc2V0SFRUUEhlYWRlckZpZWxkKGtleSwgdmFs
dWUpOworICAgIH0gZWxzZSBpZiAoaGVhZGVyLnN0YXJ0c1dpdGgoIkhUVFAiLCBmYWxzZSkpIHsK
KyAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgcmVzcG9uc2UuCisgICAg
ICAgIC8vIEV4dHJhY3QgdGhlIGh0dHAgc3RhdHVzIHRleHQgZnJvbSB0aGlzLgorICAgICAgICAv
LworICAgICAgICAvLyBJZiB0aGUgRk9MTE9XTE9DQVRJT04gb3B0aW9uIGlzIGVuYWJsZWQgZm9y
IHRoZSBjdXJsIGhhbmRsZSB0aGVuCisgICAgICAgIC8vIGN1cmwgd2lsbCBmb2xsb3cgdGhlIHJl
ZGlyZWN0aW9ucyBpbnRlcm5hbGx5LiBUaHVzIHRoaXMgaGVhZGVyIGNhbGxiYWNrCisgICAgICAg
IC8vIHdpbGwgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmUgdGltZSB3aXRoIHRoZSBsaW5lIHN0YXJ0
aW5nICJIVFRQIiBmb3Igb25lIGpvYi4KKyAgICAgICAgbG9uZyBodHRwQ29kZSA9IDA7CisgICAg
ICAgIG1fY3VybEhhbmRsZS5nZXRSZXNwb25zZUNvZGUoaHR0cENvZGUpOworCisgICAgICAgIFN0
cmluZyBodHRwQ29kZVN0cmluZyA9IFN0cmluZzo6bnVtYmVyKGh0dHBDb2RlKTsKKyAgICAgICAg
aW50IHN0YXR1c0NvZGVQb3MgPSBoZWFkZXIuZmluZChodHRwQ29kZVN0cmluZyk7CisKKyAgICAg
ICAgaWYgKHN0YXR1c0NvZGVQb3MgIT0gbm90Rm91bmQpIHsKKyAgICAgICAgICAgIC8vIFRoZSBz
dGF0dXMgdGV4dCBpcyBhZnRlciB0aGUgc3RhdHVzIGNvZGUuCisgICAgICAgICAgICBTdHJpbmcg
c3RhdHVzID0gaGVhZGVyLnN1YnN0cmluZyhzdGF0dXNDb2RlUG9zICsgaHR0cENvZGVTdHJpbmcu
bGVuZ3RoKCkpOworICAgICAgICAgICAgcmVzcG9uc2UoKS5zZXRIVFRQU3RhdHVzVGV4dChzdGF0
dXMuc3RyaXBXaGl0ZVNwYWNlKCkpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJlc291
cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpkaWRSZWNlaXZlQWxsSGVhZGVycyhsb25nIGh0dHBDb2Rl
LCBsb25nIGxvbmcgY29udGVudExlbmd0aCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OworCisgICAgcmVzcG9uc2UoKS5zZXRFeHBlY3RlZENvbnRlbnRMZW5ndGgoY29udGVudExlbmd0
aCk7CisgICAgcmVzcG9uc2UoKS5zZXRVUkwobV9jdXJsSGFuZGxlLmdldEVmZmVjdGl2ZVVSTCgp
KTsKKyAgICByZXNwb25zZSgpLnNldEhUVFBTdGF0dXNDb2RlKGh0dHBDb2RlKTsKKyAgICByZXNw
b25zZSgpLnNldE1pbWVUeXBlKGV4dHJhY3RNSU1FVHlwZUZyb21NZWRpYVR5cGUocmVzcG9uc2Uo
KS5odHRwSGVhZGVyRmllbGQoSFRUUEhlYWRlck5hbWU6OkNvbnRlbnRUeXBlKSkuY29udmVydFRv
QVNDSUlMb3dlcmNhc2UoKSk7CisgICAgcmVzcG9uc2UoKS5zZXRUZXh0RW5jb2RpbmdOYW1lKGV4
dHJhY3RDaGFyc2V0RnJvbU1lZGlhVHlwZShyZXNwb25zZSgpLmh0dHBIZWFkZXJGaWVsZChIVFRQ
SGVhZGVyTmFtZTo6Q29udGVudFR5cGUpKSk7CisKKyAgICBpZiAocmVzcG9uc2UoKS5pc011bHRp
cGFydCgpKSB7CisgICAgICAgIFN0cmluZyBib3VuZGFyeTsKKyAgICAgICAgYm9vbCBwYXJzZWQg
PSBNdWx0aXBhcnRIYW5kbGU6OmV4dHJhY3RCb3VuZGFyeShyZXNwb25zZSgpLmh0dHBIZWFkZXJG
aWVsZChIVFRQSGVhZGVyTmFtZTo6Q29udGVudFR5cGUpLCBib3VuZGFyeSk7CisgICAgICAgIGlm
IChwYXJzZWQpCisgICAgICAgICAgICBtX211bHRpcGFydEhhbmRsZSA9IHN0ZDo6bWFrZV91bmlx
dWU8TXVsdGlwYXJ0SGFuZGxlPihtX2hhbmRsZSwgYm91bmRhcnkpOworICAgIH0KKworICAgIC8v
IEhUVFAgcmVkaXJlY3Rpb24KKyAgICBpZiAoaXNIdHRwUmVkaXJlY3QoaHR0cENvZGUpKSB7Cisg
ICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHJlc3BvbnNlKCkuaHR0cEhlYWRlckZpZWxkKEhUVFBI
ZWFkZXJOYW1lOjpMb2NhdGlvbik7CisgICAgICAgIGlmICghbG9jYXRpb24uaXNFbXB0eSgpKSB7
CisgICAgICAgICAgICBVUkwgbmV3VVJMID0gVVJMKG1fZmlyc3RSZXF1ZXN0LnVybCgpLCBsb2Nh
dGlvbik7CisKKyAgICAgICAgICAgIFJlc291cmNlUmVxdWVzdCByZWRpcmVjdGVkUmVxdWVzdCA9
IG1fZmlyc3RSZXF1ZXN0OworICAgICAgICAgICAgcmVkaXJlY3RlZFJlcXVlc3Quc2V0VVJMKG5l
d1VSTCk7CisgICAgICAgICAgICBSZXNvdXJjZVJlc3BvbnNlIGxvY2FsUmVzcG9uc2UgPSByZXNw
b25zZSgpOworICAgICAgICAgICAgaWYgKG1faGFuZGxlLT5jbGllbnQoKSkKKyAgICAgICAgICAg
ICAgICBtX2hhbmRsZS0+Y2xpZW50KCktPndpbGxTZW5kUmVxdWVzdChtX2hhbmRsZSwgV1RGTW92
ZShyZWRpcmVjdGVkUmVxdWVzdCksIFdURk1vdmUobG9jYWxSZXNwb25zZSkpOworCisgICAgICAg
ICAgICBtX2ZpcnN0UmVxdWVzdC5zZXRVUkwobmV3VVJMKTsKKworICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpc0h0dHBBdXRoZW50aWNhdGlvbihodHRwQ29k
ZSkpIHsKKyAgICAgICAgUHJvdGVjdGlvblNwYWNlIHByb3RlY3Rpb25TcGFjZTsKKyAgICAgICAg
aWYgKGdldFByb3RlY3Rpb25TcGFjZShyZXNwb25zZSgpLCBwcm90ZWN0aW9uU3BhY2UpKSB7Cisg
ICAgICAgICAgICBDcmVkZW50aWFsIGNyZWRlbnRpYWw7CisgICAgICAgICAgICBBdXRoZW50aWNh
dGlvbkNoYWxsZW5nZSBjaGFsbGVuZ2UocHJvdGVjdGlvblNwYWNlLCBjcmVkZW50aWFsLCBtX2F1
dGhGYWlsdXJlQ291bnQsIHJlc3BvbnNlKCksIFJlc291cmNlRXJyb3IoKSk7CisgICAgICAgICAg
ICBjaGFsbGVuZ2Uuc2V0QXV0aGVudGljYXRpb25DbGllbnQobV9oYW5kbGUpOworICAgICAgICAg
ICAgbV9oYW5kbGUtPmRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShjaGFsbGVuZ2Up
OworICAgICAgICAgICAgbV9hdXRoRmFpbHVyZUNvdW50Kys7CisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXNwb25zZSgpLnNldFJlc3BvbnNlRmlyZWQodHJ1
ZSk7CisKKyAgICBpZiAobV9oYW5kbGUtPmNsaWVudCgpKSB7CisgICAgICAgIGlmIChpc0h0dHBO
b3RNb2RpZmllZChodHRwQ29kZSkpIHsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZyYgdXJsID0g
bV9maXJzdFJlcXVlc3QudXJsKCkuc3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoQ3VybENhY2hl
TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKS5nZXRDYWNoZWRSZXNwb25zZSh1cmwsIHJlc3BvbnNlKCkp
KSB7CisgICAgICAgICAgICAgICAgaWYgKG1fYWRkZWRDYWNoZVZhbGlkYXRpb25IZWFkZXJzKSB7
CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlKCkuc2V0SFRUUFN0YXR1c0NvZGUoMjAwKTsK
KyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UoKS5zZXRIVFRQU3RhdHVzVGV4dCgiT0siKTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ3Vy
bENhY2hlTWFuYWdlcjo6Z2V0SW5zdGFuY2UoKS5kaWRSZWNlaXZlUmVzcG9uc2UoKm1faGFuZGxl
LCByZXNwb25zZSgpKTsKKyAgICAgICAgbV9oYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZlUmVz
cG9uc2UobV9oYW5kbGUsIFJlc291cmNlUmVzcG9uc2UocmVzcG9uc2UoKSkpOworICAgIH0KK30K
Kwordm9pZCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6ZGlkUmVjZWl2ZUNvbnRlbnREYXRh
KFRocmVhZFNhZmVEYXRhQnVmZmVyIGJ1ZmZlcikKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFk
KCkpOworCisgICAgaWYgKCFyZXNwb25zZSgpLnJlc3BvbnNlRmlyZWQoKSkKKyAgICAgICAgaGFu
ZGxlTG9jYWxSZWNlaXZlUmVzcG9uc2UoKTsKKworICAgIGNvbnN0IGNoYXIqIHB0ciA9IHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlci5kYXRhKCktPmJlZ2luKCkpOworICAgIHNp
emVfdCBzaXplID0gYnVmZmVyLnNpemUoKTsKKworICAgIGlmIChtX211bHRpcGFydEhhbmRsZSkK
KyAgICAgICAgbV9tdWx0aXBhcnRIYW5kbGUtPmNvbnRlbnRSZWNlaXZlZChwdHIsIHNpemUpOwor
ICAgIGVsc2UgaWYgKG1faGFuZGxlLT5jbGllbnQoKSkgeworICAgICAgICBDdXJsQ2FjaGVNYW5h
Z2VyOjpnZXRJbnN0YW5jZSgpLmRpZFJlY2VpdmVEYXRhKCptX2hhbmRsZSwgcHRyLCBzaXplKTsK
KyAgICAgICAgbV9oYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZlRGF0YShtX2hhbmRsZSwgcHRy
LCBzaXplLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6
OmhhbmRsZUxvY2FsUmVjZWl2ZVJlc3BvbnNlKCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFk
KCkpOworCisgICAgLy8gc2luY2UgdGhlIGNvZGUgaW4gaGVhZGVyQ2FsbGJhY2sgd2lsbCBub3Qg
aGF2ZSBydW4gZm9yIGxvY2FsIGZpbGVzCisgICAgLy8gdGhlIGNvZGUgdG8gc2V0IHRoZSBVUkwg
YW5kIGZpcmUgZGlkUmVjZWl2ZVJlc3BvbnNlIGlzIG5ldmVyIHJ1biwKKyAgICAvLyB3aGljaCBt
ZWFucyB0aGUgUmVzb3VyY2VMb2FkZXIncyByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIHRoZSBV
UkwuCisgICAgLy8gUnVuIHRoZSBjb2RlIGhlcmUgZm9yIGxvY2FsIGZpbGVzIHRvIHJlc29sdmUg
dGhlIGlzc3VlLgorICAgIC8vIFRPRE86IFNlZSBpZiB0aGVyZSBpcyBhIGJldHRlciBhcHByb2Fj
aCBmb3IgaGFuZGxpbmcgdGhpcy4KKyAgICBVUkwgdXJsID0gbV9jdXJsSGFuZGxlLmdldEVmZmVj
dGl2ZVVSTCgpOworICAgIEFTU0VSVCh1cmwuaXNWYWxpZCgpKTsKKyAgICByZXNwb25zZSgpLnNl
dFVSTCh1cmwpOworICAgIHJlc3BvbnNlKCkuc2V0UmVzcG9uc2VGaXJlZCh0cnVlKTsKKyAgICBp
ZiAobV9oYW5kbGUtPmNsaWVudCgpKQorICAgICAgICBtX2hhbmRsZS0+Y2xpZW50KCktPmRpZFJl
Y2VpdmVSZXNwb25zZShtX2hhbmRsZSwgUmVzb3VyY2VSZXNwb25zZShyZXNwb25zZSgpKSk7Cit9
CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnByZXBhcmVTZW5kRGF0YShjaGFy
KiBidWZmZXIsIHNpemVfdCBibG9ja1NpemUsIHNpemVfdCBudW1iZXJPZkJsb2NrcykKK3sKKyAg
ICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIEFTU0VSVCghbV9zZW5kQnl0ZXMpOworCisg
ICAgc3RkOjp1bmlxdWVfbG9jazxMb2NrPiBsb2NrKG1fd29ya2VyVGhyZWFkTXV0ZXgpOworCisg
ICAgaWYgKCFtX2Zvcm1EYXRhU3RyZWFtLmhhc01vcmVFbGVtZW50cygpKQorICAgICAgICByZXR1
cm47CisKKyAgICBzaXplX3Qgc2l6ZSA9IG1fZm9ybURhdGFTdHJlYW0ucmVhZChidWZmZXIsIGJs
b2NrU2l6ZSwgbnVtYmVyT2ZCbG9ja3MpOworICAgIGlmICghc2l6ZSkgeworICAgICAgICAvLyBT
b21ldGhpbmcgd2VudCB3cm9uZyBzbyBjYW5jZWwgdGhlIGpvYi4KKyAgICAgICAgbV9oYW5kbGUt
PmNhbmNlbCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9zZW5kQnl0ZXMgPSBz
aXplOworICAgIG1fd29ya2VyVGhyZWFkQ29uZGl0aW9uVmFyaWFibGUubm90aWZ5T25lKCk7Cit9
CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OmRpZEZpbmlzaChkb3VibGUgcHJl
dHJhbnNmZXJUaW1lLCBkb3VibGUgZG5zTG9va3VwVGltZSwgZG91YmxlIGNvbm5lY3RUaW1lLCBk
b3VibGUgYXBwQ29ubmVjdFRpbWUpCit7CisgICAgc2V0V2ViVGltaW5ncyhwcmV0cmFuc2ZlclRp
bWUsIGRuc0xvb2t1cFRpbWUsIGNvbm5lY3RUaW1lLCBhcHBDb25uZWN0VGltZSk7CisKKyAgICBp
ZiAoIW1faGFuZGxlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIXJlc3BvbnNlKCkucmVz
cG9uc2VGaXJlZCgpKSB7CisgICAgICAgIGhhbmRsZUxvY2FsUmVjZWl2ZVJlc3BvbnNlKCk7Cisg
ICAgICAgIGlmICghbV9oYW5kbGUpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
aWYgKG1fbXVsdGlwYXJ0SGFuZGxlKQorICAgICAgICBtX211bHRpcGFydEhhbmRsZS0+Y29udGVu
dEVuZGVkKCk7CisKKyAgICBpZiAobV9oYW5kbGUtPmNsaWVudCgpKSB7CisgICAgICAgIEN1cmxD
YWNoZU1hbmFnZXI6OmdldEluc3RhbmNlKCkuZGlkRmluaXNoTG9hZGluZygqbV9oYW5kbGUpOwor
ICAgICAgICBtX2hhbmRsZS0+Y2xpZW50KCktPmRpZEZpbmlzaExvYWRpbmcobV9oYW5kbGUpOwor
ICAgIH0KK30KKwordm9pZCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6ZGlkRmFpbChjb25z
dCBTdHJpbmcmIGRvbWFpbiwgaW50IGVycm9yQ29kZSwgY29uc3QgVVJMJiBmYWlsaW5nVVJMLCBj
b25zdCBTdHJpbmcmIGxvY2FsaXplZERlc2NyaXB0aW9uLCB1bnNpZ25lZCBzc2xFcnJvcnMpCit7
CisgICAgaWYgKCFtX2hhbmRsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1faGFuZGxl
LT5jbGllbnQoKSkgeworICAgICAgICBDdXJsQ2FjaGVNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpLmRp
ZEZhaWwoKm1faGFuZGxlKTsKKyAgICAgICAgbV9oYW5kbGUtPmNsaWVudCgpLT5kaWRGYWlsKG1f
aGFuZGxlLCBSZXNvdXJjZUVycm9yKGRvbWFpbiwgZXJyb3JDb2RlLCBmYWlsaW5nVVJMLCBsb2Nh
bGl6ZWREZXNjcmlwdGlvbiwgc3NsRXJyb3JzKSk7CisgICAgfQorfQorCit2b2lkIFJlc291cmNl
SGFuZGxlQ3VybERlbGVnYXRlOjpoYW5kbGVEYXRhVVJMKCkKK3sKKyAgICBBU1NFUlQobV9maXJz
dFJlcXVlc3QudXJsKCkucHJvdG9jb2xJc0RhdGEoKSk7CisgICAgU3RyaW5nIHVybCA9IG1fZmly
c3RSZXF1ZXN0LnVybCgpLnN0cmluZygpOworCisgICAgQVNTRVJUKG1faGFuZGxlLT5jbGllbnQo
KSk7CisKKyAgICBpbnQgaW5kZXggPSB1cmwuZmluZCgnLCcpOworICAgIGlmIChpbmRleCA9PSAt
MSkgeworICAgICAgICBtX2hhbmRsZS0+Y2xpZW50KCktPmNhbm5vdFNob3dVUkwobV9oYW5kbGUp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3RyaW5nIG1lZGlhVHlwZSA9IHVybC5z
dWJzdHJpbmcoNSwgaW5kZXggLSA1KTsKKyAgICBTdHJpbmcgZGF0YSA9IHVybC5zdWJzdHJpbmco
aW5kZXggKyAxKTsKKworICAgIGJvb2wgYmFzZTY0ID0gbWVkaWFUeXBlLmVuZHNXaXRoKCI7YmFz
ZTY0IiwgZmFsc2UpOworICAgIGlmIChiYXNlNjQpCisgICAgICAgIG1lZGlhVHlwZSA9IG1lZGlh
VHlwZS5sZWZ0KG1lZGlhVHlwZS5sZW5ndGgoKSAtIDcpOworCisgICAgaWYgKG1lZGlhVHlwZS5p
c0VtcHR5KCkpCisgICAgICAgIG1lZGlhVHlwZSA9ICJ0ZXh0L3BsYWluIjsKKworICAgIFN0cmlu
ZyBtaW1lVHlwZSA9IGV4dHJhY3RNSU1FVHlwZUZyb21NZWRpYVR5cGUobWVkaWFUeXBlKTsKKyAg
ICBTdHJpbmcgY2hhcnNldCA9IGV4dHJhY3RDaGFyc2V0RnJvbU1lZGlhVHlwZShtZWRpYVR5cGUp
OworCisgICAgaWYgKGNoYXJzZXQuaXNFbXB0eSgpKQorICAgICAgICBjaGFyc2V0ID0gIlVTLUFT
Q0lJIjsKKworICAgIFJlc291cmNlUmVzcG9uc2UgcmVzcG9uc2U7CisgICAgcmVzcG9uc2Uuc2V0
TWltZVR5cGUobWltZVR5cGUpOworICAgIHJlc3BvbnNlLnNldFRleHRFbmNvZGluZ05hbWUoY2hh
cnNldCk7CisgICAgcmVzcG9uc2Uuc2V0VVJMKG1fZmlyc3RSZXF1ZXN0LnVybCgpKTsKKworICAg
IGlmIChiYXNlNjQpIHsKKyAgICAgICAgZGF0YSA9IGRlY29kZVVSTEVzY2FwZVNlcXVlbmNlcyhk
YXRhKTsKKyAgICAgICAgbV9oYW5kbGUtPmNsaWVudCgpLT5kaWRSZWNlaXZlUmVzcG9uc2UobV9o
YW5kbGUsIFdURk1vdmUocmVzcG9uc2UpKTsKKworICAgICAgICAvLyBkaWRSZWNlaXZlUmVzcG9u
c2UgbWlnaHQgY2F1c2UgdGhlIGNsaWVudCB0byBiZSBkZWxldGVkLgorICAgICAgICBpZiAobV9o
YW5kbGUtPmNsaWVudCgpKSB7CisgICAgICAgICAgICBWZWN0b3I8Y2hhcj4gb3V0OworICAgICAg
ICAgICAgaWYgKGJhc2U2NERlY29kZShkYXRhLCBvdXQsIEJhc2U2NElnbm9yZVNwYWNlc0FuZE5l
d0xpbmVzKSAmJiBvdXQuc2l6ZSgpID4gMCkKKyAgICAgICAgICAgICAgICBtX2hhbmRsZS0+Y2xp
ZW50KCktPmRpZFJlY2VpdmVEYXRhKG1faGFuZGxlLCBvdXQuZGF0YSgpLCBvdXQuc2l6ZSgpLCAw
KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFRleHRFbmNvZGluZyBlbmNvZGlu
ZyhjaGFyc2V0KTsKKyAgICAgICAgZGF0YSA9IGRlY29kZVVSTEVzY2FwZVNlcXVlbmNlcyhkYXRh
LCBlbmNvZGluZyk7CisgICAgICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZVJlc3Bv
bnNlKG1faGFuZGxlLCBXVEZNb3ZlKHJlc3BvbnNlKSk7CisKKyAgICAgICAgLy8gZGlkUmVjZWl2
ZVJlc3BvbnNlIG1pZ2h0IGNhdXNlIHRoZSBjbGllbnQgdG8gYmUgZGVsZXRlZC4KKyAgICAgICAg
aWYgKG1faGFuZGxlLT5jbGllbnQoKSkgeworICAgICAgICAgICAgQ1N0cmluZyBlbmNvZGVkRGF0
YSA9IGVuY29kaW5nLmVuY29kZShkYXRhLCBVUkxFbmNvZGVkRW50aXRpZXNGb3JVbmVuY29kYWJs
ZXMpOworICAgICAgICAgICAgaWYgKGVuY29kZWREYXRhLmxlbmd0aCgpKQorICAgICAgICAgICAg
ICAgIG1faGFuZGxlLT5jbGllbnQoKS0+ZGlkUmVjZWl2ZURhdGEobV9oYW5kbGUsIGVuY29kZWRE
YXRhLmRhdGEoKSwgZW5jb2RlZERhdGEubGVuZ3RoKCksIDApOworICAgICAgICB9CisgICAgfQor
CisgICAgaWYgKG1faGFuZGxlLT5jbGllbnQoKSkKKyAgICAgICAgbV9oYW5kbGUtPmNsaWVudCgp
LT5kaWRGaW5pc2hMb2FkaW5nKG1faGFuZGxlKTsKK30KKwordm9pZCBSZXNvdXJjZUhhbmRsZUN1
cmxEZWxlZ2F0ZTo6c2V0dXBQT1NUKCkKK3sKKyAgICBtX2N1cmxIYW5kbGUuZW5hYmxlSHR0cFBv
c3RSZXF1ZXN0KCk7CisKKyAgICBzaXplX3QgbnVtRWxlbWVudHMgPSBnZXRGb3JtRWxlbWVudHND
b3VudCgpOworICAgIGlmICghbnVtRWxlbWVudHMpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IERvIG5vdCBzdHJlYW0gZm9yIHNpbXBsZSBQT1NUIGRhdGEKKyAgICBpZiAobnVtRWxlbWVudHMg
PT0gMSkgeworICAgICAgICBtX2ZpcnN0UmVxdWVzdC5odHRwQm9keSgpLT5mbGF0dGVuKG1fcG9z
dEJ5dGVzKTsKKyAgICAgICAgaWYgKG1fcG9zdEJ5dGVzLnNpemUoKSkKKyAgICAgICAgICAgIG1f
Y3VybEhhbmRsZS5zZXRQb3N0RmllbGRzKG1fcG9zdEJ5dGVzLmRhdGEoKSwgbV9wb3N0Qnl0ZXMu
c2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNldHVwRm9ybURhdGEodHJ1
ZSk7Cit9CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldHVwUFVUKCkKK3sK
KyAgICBtX2N1cmxIYW5kbGUuZW5hYmxlSHR0cFB1dFJlcXVlc3QoKTsKKworICAgIC8vIERpc2Fi
bGUgdGhlIEV4cGVjdDogMTAwIGNvbnRpbnVlIGhlYWRlcgorICAgIG1fY3VybEhhbmRsZS5hcHBl
bmRSZXF1ZXN0SGVhZGVyKCJFeHBlY3Q6Iik7CisKKyAgICBzaXplX3QgbnVtRWxlbWVudHMgPSBn
ZXRGb3JtRWxlbWVudHNDb3VudCgpOworICAgIGlmICghbnVtRWxlbWVudHMpCisgICAgICAgIHJl
dHVybjsKKworICAgIHNldHVwRm9ybURhdGEoZmFsc2UpOworfQorCitzaXplX3QgUmVzb3VyY2VI
YW5kbGVDdXJsRGVsZWdhdGU6OmdldEZvcm1FbGVtZW50c0NvdW50KCkKK3sKKyAgICBSZWZQdHI8
Rm9ybURhdGE+IGZvcm1EYXRhID0gbV9maXJzdFJlcXVlc3QuaHR0cEJvZHkoKTsKKyAgICBpZiAo
IWZvcm1EYXRhKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIFJlc29sdmUgdGhlIGJsb2Ig
ZWxlbWVudHMgc28gdGhlIGZvcm1EYXRhIGNhbiBjb3JyZWN0bHkgcmVwb3J0IGl0J3Mgc2l6ZS4K
KyAgICBmb3JtRGF0YSA9IGZvcm1EYXRhLT5yZXNvbHZlQmxvYlJlZmVyZW5jZXMoKTsKKyAgICBz
aXplX3Qgc2l6ZSA9IGZvcm1EYXRhLT5lbGVtZW50cygpLnNpemUoKTsKKyAgICBtX2ZpcnN0UmVx
dWVzdC5zZXRIVFRQQm9keShXVEZNb3ZlKGZvcm1EYXRhKSk7CisgICAgcmV0dXJuIHNpemU7Cit9
CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OnNldHVwRm9ybURhdGEoYm9vbCBp
c1Bvc3RSZXF1ZXN0KQoreworICAgIFZlY3RvcjxGb3JtRGF0YUVsZW1lbnQ+IGVsZW1lbnRzID0g
bV9maXJzdFJlcXVlc3QuaHR0cEJvZHkoKS0+ZWxlbWVudHMoKTsKKyAgICBzaXplX3QgbnVtRWxl
bWVudHMgPSBlbGVtZW50cy5zaXplKCk7CisKKyAgICBzdGF0aWMgY29uc3QgbG9uZyBsb25nIG1h
eEN1cmxPZmZUID0gbV9jdXJsSGFuZGxlLm1heEN1cmxPZmZUKCk7CisKKyAgICAvLyBPYnRhaW4g
dGhlIHRvdGFsIHNpemUgb2YgdGhlIGZvcm0gZGF0YQorICAgIGN1cmxfb2ZmX3Qgc2l6ZSA9IDA7
CisgICAgYm9vbCBjaHVua2VkVHJhbnNmZXIgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IG51bUVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgRm9ybURhdGFFbGVtZW50IGVsZW1l
bnQgPSBlbGVtZW50c1tpXTsKKyAgICAgICAgaWYgKGVsZW1lbnQubV90eXBlID09IEZvcm1EYXRh
RWxlbWVudDo6VHlwZTo6RW5jb2RlZEZpbGUpIHsKKyAgICAgICAgICAgIGxvbmcgbG9uZyBmaWxl
U2l6ZVJlc3VsdDsKKyAgICAgICAgICAgIGlmIChnZXRGaWxlU2l6ZShlbGVtZW50Lm1fZmlsZW5h
bWUsIGZpbGVTaXplUmVzdWx0KSkgeworICAgICAgICAgICAgICAgIGlmIChmaWxlU2l6ZVJlc3Vs
dCA+IG1heEN1cmxPZmZUKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgc2l6ZSBpcyB0
b28gYmlnIGZvciBzcGVjaWZ5aW5nIGl0IHRvIGNVUkwKKyAgICAgICAgICAgICAgICAgICAgY2h1
bmtlZFRyYW5zZmVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemUgKz0gZmlsZVNpemVSZXN1bHQ7CisgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNodW5rZWRUcmFuc2ZlciA9IHRydWU7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQor
ICAgICAgICAgICAgc2l6ZSArPSBlbGVtZW50c1tpXS5tX2RhdGEuc2l6ZSgpOworICAgIH0KKwor
ICAgIC8vIGNVUkwgZ3Vlc3NlcyB0aGF0IHdlIHdhbnQgY2h1bmtlZCBlbmNvZGluZyBhcyBsb25n
IGFzIHdlIHNwZWNpZnkgdGhlIGhlYWRlcgorICAgIGlmIChjaHVua2VkVHJhbnNmZXIpCisgICAg
ICAgIG1fY3VybEhhbmRsZS5hcHBlbmRSZXF1ZXN0SGVhZGVyKCJUcmFuc2Zlci1FbmNvZGluZzog
Y2h1bmtlZCIpOworICAgIGVsc2UgeworICAgICAgICBpZiAoaXNQb3N0UmVxdWVzdCkKKyAgICAg
ICAgICAgIG1fY3VybEhhbmRsZS5zZXRQb3N0RmllbGRMYXJnZShzaXplKTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgbV9jdXJsSGFuZGxlLnNldEluRmlsZVNpemVMYXJnZShzaXplKTsKKyAg
ICB9CisKKyAgICBtX2N1cmxIYW5kbGUuc2V0UmVhZENhbGxiYWNrRnVuY3Rpb24od2lsbFNlbmRE
YXRhQ2FsbGJhY2ssIHRoaXMpOworfQorCit2b2lkIFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRl
OjphcHBseUF1dGhlbnRpY2F0aW9uKCkKK3sKKyAgICBTdHJpbmcgdXNlciA9IG1fdXNlcjsKKyAg
ICBTdHJpbmcgcGFzc3dvcmQgPSBtX3Bhc3M7CisKKyAgICBpZiAoIW1faW5pdGlhbENyZWRlbnRp
YWwuaXNFbXB0eSgpKSB7CisgICAgICAgIHVzZXIgPSBtX2luaXRpYWxDcmVkZW50aWFsLnVzZXIo
KTsKKyAgICAgICAgcGFzc3dvcmQgPSBtX2luaXRpYWxDcmVkZW50aWFsLnBhc3N3b3JkKCk7Cisg
ICAgICAgIG1fY3VybEhhbmRsZS5lbmFibGVIdHRwQXV0aGVudGljYXRpb24oQ1VSTEFVVEhfQkFT
SUMpOworICAgIH0KKworICAgIC8vIEl0IHNlZW1zIHdlIG5lZWQgdG8gc2V0IENVUkxPUFRfVVNF
UlBXRCBldmVuIGlmIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpcyBlbXB0eS4KKyAgICAvLyBPdGhl
cndpc2UgY1VSTCB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGNvbnRpbnVlIHdpdGggYSBuZXcgcmVx
dWVzdCBhZnRlciBhIDQwMSByZXNwb25zZS4KKworICAgIC8vIGN1cmwgQ1VSTE9QVF9VU0VSUFdE
IGV4cGVjdHMgdXNlcm5hbWU6cGFzc3dvcmQKKyAgICBtX2N1cmxIYW5kbGUuc2V0SHR0cEF1dGhV
c2VyUGFzcyh1c2VyLCBwYXNzd29yZCk7Cit9CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGVDdXJsRGVs
ZWdhdGU6OnNldFdlYlRpbWluZ3MoZG91YmxlIHByZXRyYW5zZmVyVGltZSwgZG91YmxlIGRuc0xv
b2t1cFRpbWUsIGRvdWJsZSBjb25uZWN0VGltZSwgZG91YmxlIGFwcENvbm5lY3RUaW1lKQorewor
ICAgIHJlc3BvbnNlKCkuZGVwcmVjYXRlZE5ldHdvcmtMb2FkTWV0cmljcygpLmRvbWFpbkxvb2t1
cFN0YXJ0ID0gU2Vjb25kcygwKTsKKyAgICByZXNwb25zZSgpLmRlcHJlY2F0ZWROZXR3b3JrTG9h
ZE1ldHJpY3MoKS5kb21haW5Mb29rdXBFbmQgPSBTZWNvbmRzKGRuc0xvb2t1cFRpbWUpOworCisg
ICAgcmVzcG9uc2UoKS5kZXByZWNhdGVkTmV0d29ya0xvYWRNZXRyaWNzKCkuY29ubmVjdFN0YXJ0
ID0gU2Vjb25kcyhkbnNMb29rdXBUaW1lKTsKKyAgICByZXNwb25zZSgpLmRlcHJlY2F0ZWROZXR3
b3JrTG9hZE1ldHJpY3MoKS5jb25uZWN0RW5kID0gU2Vjb25kcyhjb25uZWN0VGltZSk7CisKKyAg
ICByZXNwb25zZSgpLmRlcHJlY2F0ZWROZXR3b3JrTG9hZE1ldHJpY3MoKS5yZXF1ZXN0U3RhcnQg
PSBTZWNvbmRzKGNvbm5lY3RUaW1lKTsKKyAgICByZXNwb25zZSgpLmRlcHJlY2F0ZWROZXR3b3Jr
TG9hZE1ldHJpY3MoKS5yZXNwb25zZVN0YXJ0ID0gU2Vjb25kcyhwcmV0cmFuc2ZlclRpbWUpOwor
CisgICAgaWYgKGFwcENvbm5lY3RUaW1lKQorICAgICAgICByZXNwb25zZSgpLmRlcHJlY2F0ZWRO
ZXR3b3JrTG9hZE1ldHJpY3MoKS5zZWN1cmVDb25uZWN0aW9uU3RhcnQgPSBTZWNvbmRzKGNvbm5l
Y3RUaW1lKTsKK30KKworLyoKKyogVGhpcyBpcyBiZWluZyBjYWxsZWQgZm9yIGVhY2ggSFRUUCBo
ZWFkZXIgaW4gdGhlIHJlc3BvbnNlLiBUaGlzIGluY2x1ZGVzICdcclxuJworKiBmb3IgdGhlIGxh
c3QgbGluZSBvZiB0aGUgaGVhZGVyLgorKgorKiBXZSB3aWxsIGFkZCBlYWNoIEhUVFAgSGVhZGVy
IHRvIHRoZSBSZXNvdXJjZVJlc3BvbnNlIGFuZCBvbiB0aGUgdGVybWluYXRpb24KKyogb2YgdGhl
IGhlYWRlciAoXHJcbikgd2Ugd2lsbCBwYXJzZSBDb250ZW50LVR5cGUgYW5kIENvbnRlbnQtRGlz
cG9zaXRpb24gYW5kCisqIHVwZGF0ZSB0aGUgUmVzb3VyY2VSZXNwb25zZSBhbmQgdGhlbiBzZW5k
IGl0IGF3YXkuCisqCisqLworc2l6ZV90IFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlOjpkaWRS
ZWNlaXZlSGVhZGVyKFN0cmluZyYmIGhlYWRlcikKK3sKKyAgICBpZiAoIW1faGFuZGxlKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIGlmIChtX2RlZmVyc0xvYWRpbmcpCisgICAgICAgIHJldHVy
biAwOworCisgICAgLyoKKyAgICAqIGEpIFdlIGNhbiBmaW5pc2ggYW5kIHNlbmQgdGhlIFJlc291
cmNlUmVzcG9uc2UKKyAgICAqIGIpIFdlIHdpbGwgYWRkIHRoZSBjdXJyZW50IGhlYWRlciB0byB0
aGUgSFRUUEhlYWRlck1hcCBvZiB0aGUgUmVzb3VyY2VSZXNwb25zZQorICAgICoKKyAgICAqIFRo
ZSBIVFRQIHN0YW5kYXJkIHJlcXVpcmVzIHRvIHVzZSBcclxuIGJ1dCBmb3IgY29tcGF0aWJpbGl0
eSBpdCByZWNvbW1lbmRzIHRvCisgICAgKiBhY2NlcHQgYWxzbyBcbi4KKyAgICAqLworICAgIGlm
IChoZWFkZXIgPT0gQXRvbWljU3RyaW5nKCJcclxuIikgfHwgaGVhZGVyID09IEF0b21pY1N0cmlu
ZygiXG4iKSkgeworICAgICAgICBsb25nIGh0dHBDb2RlID0gMDsKKyAgICAgICAgbV9jdXJsSGFu
ZGxlLmdldFJlc3BvbnNlQ29kZShodHRwQ29kZSk7CisKKyAgICAgICAgaWYgKCFodHRwQ29kZSkg
eworICAgICAgICAgICAgLy8gQ29tZXMgaGVyZSB3aGVuIHJlY2VpdmluZyAyMDAgQ29ubmVjdGlv
biBFc3RhYmxpc2hlZC4gSnVzdCByZXR1cm4uCisgICAgICAgICAgICByZXR1cm4gaGVhZGVyLmxl
bmd0aCgpOworICAgICAgICB9CisgICAgICAgIGlmIChpc0h0dHBJbmZvKGh0dHBDb2RlKSkgewor
ICAgICAgICAgICAgLy8gSnVzdCByZXR1cm4gd2hlbiByZWNlaXZpbmcgaHR0cCBpbmZvLCBlLmcu
IEhUVFAvMS4xIDEwMCBDb250aW51ZS4KKyAgICAgICAgICAgIC8vIElmIG5vdCwgdGhlIHJlcXVl
c3QgbWlnaHQgYmUgY2FuY2VsbGVkLCBiZWNhdXNlIHRoZSBNSU1FIHR5cGUgd2lsbCBiZSBlbXB0
eSBmb3IgdGhpcyByZXNwb25zZS4KKyAgICAgICAgICAgIHJldHVybiBoZWFkZXIubGVuZ3RoKCk7
CisgICAgICAgIH0KKworICAgICAgICBsb25nIGxvbmcgY29udGVudExlbmd0aCA9IDA7CisgICAg
ICAgIG1fY3VybEhhbmRsZS5nZXRDb250ZW50TGVuZ2h0RG93bmxvYWQoY29udGVudExlbmd0aCk7
CisKKyAgICAgICAgY2FsbE9uTWFpblRocmVhZChbcHJvdGVjdGVkVGhpcyA9IG1ha2VSZWYoKnRo
aXMpLCBodHRwQ29kZSwgY29udGVudExlbmd0aF0geworICAgICAgICAgICAgaWYgKCFwcm90ZWN0
ZWRUaGlzLT5tX2hhbmRsZSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBw
cm90ZWN0ZWRUaGlzLT5kaWRSZWNlaXZlQWxsSGVhZGVycyhodHRwQ29kZSwgY29udGVudExlbmd0
aCk7CisgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGNhbGxPbk1haW5UaHJlYWQo
W3Byb3RlY3RlZFRoaXMgPSBtYWtlUmVmKCp0aGlzKSwgaGVhZGVyID0gaGVhZGVyLmlzb2xhdGVk
Q29weSgpIF0geworICAgICAgICAgICAgaWYgKCFwcm90ZWN0ZWRUaGlzLT5tX2hhbmRsZSkKKyAg
ICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBwcm90ZWN0ZWRUaGlzLT5kaWRSZWNl
aXZlSGVhZGVyTGluZShoZWFkZXIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICByZXR1cm4g
aGVhZGVyLmxlbmd0aCgpOworfQorCisvLyBjYWxsZWQgd2l0aCBkYXRhIGFmdGVyIGFsbCBoZWFk
ZXJzIGhhdmUgYmVlbiBwcm9jZXNzZWQgdmlhIGhlYWRlckNhbGxiYWNrCitzaXplX3QgUmVzb3Vy
Y2VIYW5kbGVDdXJsRGVsZWdhdGU6OmRpZFJlY2VpdmVEYXRhKFRocmVhZFNhZmVEYXRhQnVmZmVy
IGRhdGEpCit7CisgICAgaWYgKCFtX2hhbmRsZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBp
ZiAobV9kZWZlcnNMb2FkaW5nKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIHRoaXMgc2hv
dWxkbid0IGJlIG5lY2Vzc2FyeSBidXQgYXBwYXJlbnRseSBpcy4gQ1VSTCB3cml0ZXMgdGhlIGRh
dGEKKyAgICAvLyBvZiBodG1sIHBhZ2UgZXZlbiBpZiBpdCBpcyBhIHJlZGlyZWN0IHRoYXQgd2Fz
IGhhbmRsZWQgaW50ZXJuYWxseQorICAgIC8vIGNhbiBiZSBvYnNlcnZlZCBlLmcuIG9uIGdtYWls
LmNvbQorICAgIGxvbmcgaHR0cENvZGUgPSAwOworICAgIENVUkxjb2RlIGVyckNkID0gbV9jdXJs
SGFuZGxlLmdldFJlc3BvbnNlQ29kZShodHRwQ29kZSk7CisgICAgaWYgKENVUkxFX09LID09IGVy
ckNkICYmIGh0dHBDb2RlID49IDMwMCAmJiBodHRwQ29kZSA8IDQwMCkKKyAgICAgICAgcmV0dXJu
IGRhdGEuc2l6ZSgpOworCisgICAgaWYgKCFkYXRhLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBjYWxsT25NYWluVGhyZWFkKFtwcm90ZWN0ZWRUaGlzID0gbWFrZVJlZigqdGhpcyks
IGRhdGFdIHsKKyAgICAgICAgaWYgKCFwcm90ZWN0ZWRUaGlzLT5tX2hhbmRsZSkKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgcHJvdGVjdGVkVGhpcy0+ZGlkUmVjZWl2ZUNvbnRlbnREYXRh
KGRhdGEpOworICAgIH0pOworCisgICAgcmV0dXJuIGRhdGEuc2l6ZSgpOworfQorCisvKiBUaGlz
IGlzIGNhbGxlZCB0byBvYnRhaW4gSFRUUCBQT1NUIG9yIFBVVCBkYXRhLgorSXRlcmF0ZSB0aHJv
dWdoIEZvcm1EYXRhIGVsZW1lbnRzIGFuZCB1cGxvYWQgZmlsZXMuCitDYXJlZnVsbHkgcmVzcGVj
dCB0aGUgZ2l2ZW4gYnVmZmVyIGJsb2NrU2l6ZSBhbmQgZmlsbCB0aGUgcmVzdCBvZiB0aGUgZGF0
YSBhdCB0aGUgbmV4dCBjYWxscy4KKyovCitzaXplX3QgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdh
dGU6OndpbGxTZW5kRGF0YShjaGFyKiBidWZmZXIsIHNpemVfdCBibG9ja1NpemUsIHNpemVfdCBu
dW1iZXJPZkJsb2NrcykKK3sKKyAgICBBU1NFUlQoIWlzTWFpblRocmVhZCgpKTsKKworICAgIGlm
ICghbV9oYW5kbGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKG1fZGVmZXJzTG9hZGlu
ZykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIWJsb2NrU2l6ZSB8fCAhbnVtYmVyT2ZC
bG9ja3MpCisgICAgICAgIHJldHVybiAwOworCisgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9s
b2NrPExvY2s+IGxvY2sobV93b3JrZXJUaHJlYWRNdXRleCk7CisKKyAgICAgICAgbV9zZW5kQnl0
ZXMgPSAwOworCisgICAgICAgIGNhbGxPbk1haW5UaHJlYWQoW3Byb3RlY3RlZFRoaXMgPSBtYWtl
UmVmKCp0aGlzKSwgYnVmZmVyLCBibG9ja1NpemUsIG51bWJlck9mQmxvY2tzXSB7CisgICAgICAg
ICAgICBpZiAoIXByb3RlY3RlZFRoaXMtPm1faGFuZGxlKQorICAgICAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgICAgIHByb3RlY3RlZFRoaXMtPnByZXBhcmVTZW5kRGF0YShidWZmZXIsIGJs
b2NrU2l6ZSwgbnVtYmVyT2ZCbG9ja3MpOworICAgICAgICB9KTsKKworICAgICAgICBtX3dvcmtl
clRocmVhZENvbmRpdGlvblZhcmlhYmxlLndhaXQobG9jaywgW3RoaXNdIHsKKyAgICAgICAgICAg
IHJldHVybiBtX3NlbmRCeXRlczsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcmV0dXJuIG1f
c2VuZEJ5dGVzOworfQorCitzaXplX3QgUmVzb3VyY2VIYW5kbGVDdXJsRGVsZWdhdGU6OmRpZFJl
Y2VpdmVIZWFkZXJDYWxsYmFjayhjaGFyKiBwdHIsIHNpemVfdCBibG9ja1NpemUsIHNpemVfdCBu
dW1iZXJPZkJsb2Nrcywgdm9pZCogZGF0YSkKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVz
b3VyY2VIYW5kbGVDdXJsRGVsZWdhdGUqPihjb25zdF9jYXN0PHZvaWQqPihkYXRhKSktPmRpZFJl
Y2VpdmVIZWFkZXIoU3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihwdHIpLCBibG9ja1Np
emUgKiBudW1iZXJPZkJsb2NrcykpOworfQorCitzaXplX3QgUmVzb3VyY2VIYW5kbGVDdXJsRGVs
ZWdhdGU6OmRpZFJlY2VpdmVEYXRhQ2FsbGJhY2soY2hhciogcHRyLCBzaXplX3QgYmxvY2tTaXpl
LCBzaXplX3QgbnVtYmVyT2ZCbG9ja3MsIHZvaWQqIGRhdGEpCit7CisgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PFJlc291cmNlSGFuZGxlQ3VybERlbGVnYXRlKj4oY29uc3RfY2FzdDx2b2lkKj4oZGF0
YSkpLT5kaWRSZWNlaXZlRGF0YShUaHJlYWRTYWZlRGF0YUJ1ZmZlcjo6Y29weURhdGEoc3RhdGlj
X2Nhc3Q8Y29uc3QgY2hhcio+KHB0ciksIGJsb2NrU2l6ZSAqIG51bWJlck9mQmxvY2tzKSk7Cit9
CisKK3NpemVfdCBSZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZTo6d2lsbFNlbmREYXRhQ2FsbGJh
Y2soY2hhciogcHRyLCBzaXplX3QgYmxvY2tTaXplLCBzaXplX3QgbnVtYmVyT2ZCbG9ja3MsIHZv
aWQqIGRhdGEpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc291cmNlSGFuZGxlQ3VybERl
bGVnYXRlKj4oY29uc3RfY2FzdDx2b2lkKj4oZGF0YSkpLT53aWxsU2VuZERhdGEocHRyLCBibG9j
a1NpemUsIG51bWJlck9mQmxvY2tzKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJj
ZUhhbmRsZUN1cmxEZWxlZ2F0ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1cmxEZWxlZ2F0ZS5oCShyZXZpc2lvbiAw
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxl
Q3VybERlbGVnYXRlLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgTkFWRVIgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqICAqIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dO
RVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjcHJhZ21hIG9uY2UKKworI2lmIFVTRShDVVJMKQorCisjaW5jbHVkZSAiQ3JlZGVudGlhbC5o
IgorI2luY2x1ZGUgIkN1cmxDb250ZXh0LmgiCisjaW5jbHVkZSAiQ3VybEpvYk1hbmFnZXIuaCIK
KyNpbmNsdWRlICJGb3JtRGF0YVN0cmVhbUN1cmwuaCIKKyNpbmNsdWRlICJSZXNvdXJjZVJlcXVl
c3QuaCIKKyNpbmNsdWRlICJSZXNvdXJjZVJlc3BvbnNlLmgiCisjaW5jbHVkZSAiU1NMSGFuZGxl
LmgiCisjaW5jbHVkZSA8d3RmL0NvbmRpdGlvbi5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZl
UmVmQ291bnRlZC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIE11bHRpcGFydEhh
bmRsZTsKK2NsYXNzIFByb3RlY3Rpb25TcGFjZTsKK2NsYXNzIFJlc291cmNlSGFuZGxlOworY2xh
c3MgVGhyZWFkU2FmZURhdGFCdWZmZXI7CisKK2NsYXNzIFJlc291cmNlSGFuZGxlQ3VybERlbGVn
YXRlIGZpbmFsIDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPFJlc291cmNlSGFuZGxlQ3Vy
bERlbGVnYXRlPiwgcHVibGljIEN1cmxKb2JDbGllbnQgeworcHVibGljOgorICAgIFJlc291cmNl
SGFuZGxlQ3VybERlbGVnYXRlKFJlc291cmNlSGFuZGxlKik7CisgICAgflJlc291cmNlSGFuZGxl
Q3VybERlbGVnYXRlKCk7CisKKyAgICBib29sIGhhc0hhbmRsZSgpIGNvbnN0OworICAgIHZvaWQg
cmVsZWFzZUhhbmRsZSgpOworCisgICAgYm9vbCBzdGFydCgpOworICAgIHZvaWQgY2FuY2VsKCk7
CisKKyAgICB2b2lkIHNldERlZmVyc0xvYWRpbmcoYm9vbCk7CisgICAgdm9pZCBzZXRBdXRoZW50
aWNhdGlvbihjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmKTsKKworICAgIHZvaWQgZGlzcGF0
Y2hTeW5jaHJvbm91c0pvYigpOworCitwcml2YXRlOgorICAgIHZvaWQgcmV0YWluKCkgb3ZlcnJp
ZGU7CisgICAgdm9pZCByZWxlYXNlKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldHVwUmVxdWVz
dCgpIG92ZXJyaWRlOworICAgIHZvaWQgbm90aWZ5RmluaXNoKCkgb3ZlcnJpZGU7CisgICAgdm9p
ZCBub3RpZnlGYWlsKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBDYWxsZWQgZnJvbSBtYWluIHRocmVh
ZC4KKyAgICBSZXNvdXJjZVJlc3BvbnNlJiByZXNwb25zZSgpOworCisgICAgdm9pZCBzZXR1cEF1
dGhlbnRpY2F0aW9uKCk7CisgICAgYm9vbCBnZXRQcm90ZWN0aW9uU3BhY2UoY29uc3QgUmVzb3Vy
Y2VSZXNwb25zZSYsIFByb3RlY3Rpb25TcGFjZSYpOworCisgICAgdm9pZCBkaWRSZWNlaXZlSGVh
ZGVyTGluZShjb25zdCBTdHJpbmcmKTsKKyAgICB2b2lkIGRpZFJlY2VpdmVBbGxIZWFkZXJzKGxv
bmcgaHR0cENvZGUsIGxvbmcgbG9uZyBjb250ZW50TGVuZ3RoKTsKKyAgICB2b2lkIGRpZFJlY2Vp
dmVDb250ZW50RGF0YShUaHJlYWRTYWZlRGF0YUJ1ZmZlcik7CisgICAgdm9pZCBoYW5kbGVMb2Nh
bFJlY2VpdmVSZXNwb25zZSgpOworICAgIHZvaWQgcHJlcGFyZVNlbmREYXRhKGNoYXIqLCBzaXpl
X3QgYmxvY2tTaXplLCBzaXplX3QgbnVtYmVyT2ZCbG9ja3MpOworCisgICAgdm9pZCBkaWRGaW5p
c2goZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlKTsKKyAgICB2b2lkIGRpZEZhaWwoY29u
c3QgU3RyaW5nJiBkb21haW4sIGludCBlcnJvckNvZGUsIGNvbnN0IFVSTCYgZmFpbGluZ1VSTCwg
Y29uc3QgU3RyaW5nJiBsb2NhbGl6ZWREZXNjcmlwdGlvbiwgdW5zaWduZWQgc3NsRXJyb3JzKTsK
KworICAgIHZvaWQgaGFuZGxlRGF0YVVSTCgpOworCisgICAgLy8gQ2FsbGVkIGZyb20gd29ya2Vy
IHRocmVhZC4KKyAgICB2b2lkIHNldHVwUE9TVCgpOworICAgIHZvaWQgc2V0dXBQVVQoKTsKKyAg
ICBzaXplX3QgZ2V0Rm9ybUVsZW1lbnRzQ291bnQoKTsKKyAgICB2b2lkIHNldHVwRm9ybURhdGEo
Ym9vbCk7CisgICAgdm9pZCBhcHBseUF1dGhlbnRpY2F0aW9uKCk7CisgICAgdm9pZCBzZXRXZWJU
aW1pbmdzKGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSk7CisKKyAgICBzaXplX3QgZGlk
UmVjZWl2ZUhlYWRlcihTdHJpbmcmJik7CisgICAgc2l6ZV90IGRpZFJlY2VpdmVEYXRhKFRocmVh
ZFNhZmVEYXRhQnVmZmVyKTsKKyAgICBzaXplX3Qgd2lsbFNlbmREYXRhKGNoYXIqLCBzaXplX3Qg
YmxvY2tTaXplLCBzaXplX3QgbnVtYmVyT2ZCbG9ja3MpOworCisgICAgc3RhdGljIHNpemVfdCBk
aWRSZWNlaXZlSGVhZGVyQ2FsbGJhY2soY2hhciosIHNpemVfdCBibG9ja1NpemUsIHNpemVfdCBu
dW1iZXJPZkJsb2Nrcywgdm9pZCopOworICAgIHN0YXRpYyBzaXplX3QgZGlkUmVjZWl2ZURhdGFD
YWxsYmFjayhjaGFyKiwgc2l6ZV90IGJsb2NrU2l6ZSwgc2l6ZV90IG51bWJlck9mQmxvY2tzLCB2
b2lkKik7CisgICAgc3RhdGljIHNpemVfdCB3aWxsU2VuZERhdGFDYWxsYmFjayhjaGFyKiwgc2l6
ZV90IGJsb2NrU2l6ZSwgc2l6ZV90IG51bWJlck9mQmxvY2tzLCB2b2lkKik7CisKKyAgICAvLyBV
c2VkIGJ5IG1haW4gdGhyZWFkLgorICAgIFJlc291cmNlSGFuZGxlKiBtX2hhbmRsZTsKKyAgICBG
b3JtRGF0YVN0cmVhbSBtX2Zvcm1EYXRhU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNdWx0
aXBhcnRIYW5kbGU+IG1fbXVsdGlwYXJ0SGFuZGxlOworICAgIHVuc2lnbmVkIHNob3J0IG1fYXV0
aEZhaWx1cmVDb3VudCB7IDAgfTsKKyAgICBDdXJsSm9iVGlja2V0IG1fam9iIHsgbnVsbHB0ciB9
OworICAgIC8vIFVzZWQgYnkgd29ya2VyIHRocmVhZC4KKyAgICBSZXNvdXJjZVJlcXVlc3QgbV9m
aXJzdFJlcXVlc3Q7CisgICAgSFRUUEhlYWRlck1hcCBtX2N1c3RvbUhUVFBIZWFkZXJGaWVsZHM7
CisgICAgYm9vbCBtX3Nob3VsZFVzZUNyZWRlbnRpYWxTdG9yYWdlOworICAgIFN0cmluZyBtX3Vz
ZXI7CisgICAgU3RyaW5nIG1fcGFzczsKKyAgICBDcmVkZW50aWFsIG1faW5pdGlhbENyZWRlbnRp
YWw7CisgICAgc3RkOjpvcHRpb25hbDxDbGllbnRDZXJ0aWZpY2F0ZT4gbV9zc2xDbGllbnRDZXJ0
aWZpY2F0ZTsKKyAgICBib29sIG1fZGVmZXJzTG9hZGluZzsKKyAgICBib29sIG1fYWRkZWRDYWNo
ZVZhbGlkYXRpb25IZWFkZXJzIHsgZmFsc2UgfTsKKyAgICBWZWN0b3I8Y2hhcj4gbV9wb3N0Qnl0
ZXM7CisgICAgQ3VybEhhbmRsZSBtX2N1cmxIYW5kbGU7CisgICAgLy8gVXNlZCBieSBib3RoIHRo
cmVhZHMuCisgICAgQ29uZGl0aW9uIG1fd29ya2VyVGhyZWFkQ29uZGl0aW9uVmFyaWFibGU7Cisg
ICAgTG9jayBtX3dvcmtlclRocmVhZE11dGV4OworICAgIHNpemVfdCBtX3NlbmRCeXRlcyB7IDAg
fTsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>