<?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>159037</bug_id>
          
          <creation_ts>2016-06-22 13:52:16 -0700</creation_ts>
          <short_desc>TypeProfiler and TypeProfilerLog don&apos;t play nicely with the concurrent JIT</short_desc>
          <delta_ts>2016-06-22 20:24:37 -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>JavaScriptCore</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="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>bburg</cc>
    
    <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>gskachkov</cc>
    
    <cc>joepeck</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>nvasilyev</cc>
    
    <cc>sukolsak</cc>
    
    <cc>timothy</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1204652</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-22 13:52:16 -0700</bug_when>
    <thetext>We process the log on a background compiler thread, and this leads to a bad time</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1204705</commentid>
    <comment_count>1</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-22 16:06:06 -0700</bug_when>
    <thetext>&lt;rdar://problem/26935349&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1204714</commentid>
    <comment_count>2</comment_count>
      <attachid>281882</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-22 16:33:17 -0700</bug_when>
    <thetext>Created attachment 281882
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1204715</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-06-22 16:35:09 -0700</bug_when>
    <thetext>Attachment 281882 did not pass style-queue:


ERROR: Source/JavaScriptCore/runtime/TypeSet.cpp:52:  This { should be at the end of the previous line  [whitespace/braces] [4]
Total errors found: 1 in 11 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1204720</commentid>
    <comment_count>4</comment_count>
      <attachid>281882</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2016-06-22 16:45:22 -0700</bug_when>
    <thetext>Comment on attachment 281882
patch

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

&gt; Source/JavaScriptCore/runtime/TypeSet.h:106
&gt; +public:
&gt; +    ConcurrentJITLock m_lock;

Why put the lock in the middle instead of in the public declarations above?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1204725</commentid>
    <comment_count>5</comment_count>
      <attachid>281882</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-22 16:51:03 -0700</bug_when>
    <thetext>Comment on attachment 281882
patch

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

&gt;&gt; Source/JavaScriptCore/runtime/TypeSet.h:106
&gt;&gt; +    ConcurrentJITLock m_lock;
&gt; 
&gt; Why put the lock in the middle instead of in the public declarations above?

They fit into 32-bits this way. This won&apos;t matter for 64 bit paltforms, but will save 32-bits in TypeSet size for 32-bit platforms.
I guess I could reorder the fields like so to prevent the private/public break:
```
public:
... methods and such
...
Lock m_lock;
private:
bool m_isOverflown;
RuntimeTypeMask ...
....
```</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1204726</commentid>
    <comment_count>6</comment_count>
      <attachid>281882</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-22 16:51:49 -0700</bug_when>
    <thetext>Comment on attachment 281882
patch

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

&gt;&gt;&gt; Source/JavaScriptCore/runtime/TypeSet.h:106
&gt;&gt;&gt; +    ConcurrentJITLock m_lock;
&gt;&gt; 
&gt;&gt; Why put the lock in the middle instead of in the public declarations above?
&gt; 
&gt; They fit into 32-bits this way. This won&apos;t matter for 64 bit paltforms, but will save 32-bits in TypeSet size for 32-bit platforms.
&gt; I guess I could reorder the fields like so to prevent the private/public break:
&gt; ```
&gt; public:
&gt; ... methods and such
&gt; ...
&gt; Lock m_lock;
&gt; private:
&gt; bool m_isOverflown;
&gt; RuntimeTypeMask ...
&gt; ....
&gt; ```

I&apos;ll go with this reordering.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1204729</commentid>
    <comment_count>7</comment_count>
      <attachid>281886</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-22 16:57:52 -0700</bug_when>
    <thetext>Created attachment 281886
patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1204731</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-06-22 16:59:22 -0700</bug_when>
    <thetext>Attachment 281886 did not pass style-queue:


ERROR: Source/JavaScriptCore/runtime/TypeSet.cpp:52:  This { should be at the end of the previous line  [whitespace/braces] [4]
Total errors found: 1 in 11 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1204739</commentid>
    <comment_count>9</comment_count>
      <attachid>281890</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-06-22 17:46:14 -0700</bug_when>
    <thetext>Created attachment 281890
patch for landing that builds</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1204740</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-06-22 17:47:54 -0700</bug_when>
    <thetext>Attachment 281890 did not pass style-queue:


ERROR: Source/JavaScriptCore/runtime/TypeSet.cpp:52:  This { should be at the end of the previous line  [whitespace/braces] [4]
Total errors found: 1 in 11 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1204756</commentid>
    <comment_count>11</comment_count>
      <attachid>281890</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-06-22 20:24:31 -0700</bug_when>
    <thetext>Comment on attachment 281890
patch for landing that builds

Clearing flags on attachment: 281890

Committed r202364: &lt;http://trac.webkit.org/changeset/202364&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1204758</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-06-22 20:24:37 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>281882</attachid>
            <date>2016-06-22 16:33:17 -0700</date>
            <delta_ts>2016-06-22 16:57:52 -0700</delta_ts>
            <desc>patch</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>57181</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjAyMzQ4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU0IEBA
CisyMDE2LTA2LTIyICBTYWFtIGJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAg
IFR5cGVQcm9maWxlciBhbmQgVHlwZVByb2ZpbGVyTG9nIGRvbid0IHBsYXkgbmljZWx5IHdpdGgg
dGhlIGNvbmN1cnJlbnQgSklUCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xNTkwMzcKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzI2OTM1MzQ5PgorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSBwcmltYXJ5
IGZvY3VzIG9mIHRoaXMgcGF0Y2ggaXMgdG8gbWFrZSB0aGUgY29uY3VycmVudAorICAgICAgICBi
YXNlbGluZSBKSVQgd29yayB3aXRoIHRoZSB0eXBlIHByb2ZpbGVyLiBXZSB3ZXJlIGNsZWFyaW5n
CisgICAgICAgIHRoZSB0eXBlIHByb2ZpbGVyIGxvZyBvbiB0aGUgYmFja2dyb3VuZCBiYXNlbGlu
ZSBjb21waWxlcgorICAgICAgICB0aHJlYWQgd2hpY2ggbGVhZCB0byBiYWQgdGhpbmdzIGhhcHBl
bmluZy4gVGhpcyBwYXRjaCBmaXhlcworICAgICAgICB0aGlzIGJ5IHByb2Nlc3NpbmcgdGhlIGxv
ZyBiZWZvcmUgd2UgbGF1bmNoIHRoZSBjb21waWxlIG9uCisgICAgICAgIGEgYmFja2dyb3VuZCB0
aHJlYWQuCisKKyAgICAgICAgU2Vjb25kbHksIEkgYXVkaXRlZCB0aGUgdHlwZSBwcm9maWxlciBj
b2RlIGluc2lkZSB0aGUgREZHLAorICAgICAgICBhbmQgZm91bmQgdGhhdCB3ZSB3ZXJlIGRvaW5n
IHNvbWUgcmFjeSB0aGluZ3MuIEkgaGF2ZW4ndAorICAgICAgICBzZWVuIGFueSBjcmFzaGVzIGJl
Y2F1c2Ugb2YgdGhlc2UgdGhpbmdzLCBidXQgaXQgaXMgcG9zc2libGUKKyAgICAgICAgdGhhdCB0
aGV5IGV4aXN0LiBXZSB3ZXJlIGdyYWJiaW5nIGEgUmVmUHRyIHRvIGEgVHlwZVNldCwKKyAgICAg
ICAgZXZlbiB0aG91Z2ggVHlwZVNldCB3YXMgUmVmQ291bnRlZCBhbmQgbm90IFRocmVhZFNhZmVS
ZWZDb3VudGVkLgorICAgICAgICBUaGlzIHBhdGNoIG1ha2VzIFR5cGVTZXQgVGhyZWFkU2FmZVJl
ZkNvdW50ZWQuIFdlIHdlcmUKKyAgICAgICAgYWxzbyBjb3B5aW5nIGEgU3RydWN0dXJlU2V0IHdo
aWxlIHRoZSBleGVjdXRpb24gdGhyZWFkIGNvdWxkCisgICAgICAgIGJlIGF1Z21lbnRpbmcgdGhl
IFN0cnVjdHVyZVNldC4gVGhpcyBwYXRjaCBwdXRzIGNoYW5nZXMgdG8gCisgICAgICAgIFR5cGVT
ZXQncyBTdHJ1Y3R1cmVTZXQgYmVoaW5kIGEgQ29uY3VycmVudEpJVExvY2suCisKKyAgICAgICAg
SSd2ZSBhbHNvIGFkZGVkIHR3byBtb3JlIGxhcmdlIHJ1bm5pbmcgdGVzdHMgdGhhdCBydW4gd2l0
aCB0aGUKKyAgICAgICAgdHlwZSBwcm9maWxlciBlbmFibGVkLiBUaGVzZSBhcmUgaGVyZSBqdXN0
IHRvIGNhdGNoIGFueSBtYWpvciBidWdzCisgICAgICAgIGluIHRoZSB0eXBlIHByb2ZpbGVyIGlt
cGxlbWVudGF0aW9uLgorCisgICAgICAgICogaml0L0pJVC5jcHA6CisgICAgICAgIChKU0M6OkpJ
VDo6Y29tcGlsZVdpdGhvdXRMaW5raW5nKToKKyAgICAgICAgKEpTQzo6SklUOjpwcml2YXRlQ29t
cGlsZSk6CisgICAgICAgIChKU0M6OkpJVDo6cHJpdmF0ZUNvbXBpbGVFeGNlcHRpb25IYW5kbGVy
cyk6CisgICAgICAgIChKU0M6OkpJVDo6ZG9NYWluVGhyZWFkUHJlcGFyYXRpb25CZWZvcmVDb21w
aWxlKToKKyAgICAgICAgKEpTQzo6SklUOjpmcmFtZVJlZ2lzdGVyQ291bnRGb3IpOgorICAgICAg
ICAqIGppdC9KSVQuaDoKKyAgICAgICAgKEpTQzo6SklUOjpjb21waWxlKToKKyAgICAgICAgKiBq
aXQvSklUV29ya2xpc3QuY3BwOgorICAgICAgICAoSlNDOjpKSVRXb3JrbGlzdDo6UGxhbjo6UGxh
bik6CisgICAgICAgIChKU0M6OkpJVFdvcmtsaXN0OjpQbGFuOjpjb21waWxlSW5UaHJlYWQpOgor
ICAgICAgICAqIHJ1bnRpbWUvVHlwZVNldC5jcHA6CisgICAgICAgIChKU0M6OlR5cGVTZXQ6OmFk
ZFR5cGVJbmZvcm1hdGlvbik6CisgICAgICAgIChKU0M6OlR5cGVTZXQ6OmludmFsaWRhdGVDYWNo
ZSk6CisgICAgICAgICogcnVudGltZS9UeXBlU2V0Lmg6CisgICAgICAgIChKU0M6OlR5cGVTZXQ6
OmNyZWF0ZSk6CisgICAgICAgIChKU0M6OlR5cGVTZXQ6OmlzRW1wdHkpOgorICAgICAgICAoSlND
OjpUeXBlU2V0OjpzZWVuVHlwZXMpOgorICAgICAgICAoSlNDOjpUeXBlU2V0OjpzdHJ1Y3R1cmVT
ZXQpOgorICAgICAgICAqIHRlc3RzL3R5cGVQcm9maWxlci9kZWx0YWJsdWUtZm9yLW9mLmpzOiBB
ZGRlZC4KKyAgICAgICAgKiB0ZXN0cy90eXBlUHJvZmlsZXIvZ2V0dGVyLXJpY2hhcmRzLmpzOiBB
ZGRlZC4KKwogMjAxNi0wNi0yMSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBwbGUuY29t
PgogCiAgICAgICAgIEZpeCBidWlsZC4KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcv
REZHRml4dXBQaGFzZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdGaXh1cFBoYXNlLmNwcAkocmV2aXNpb24gMjAyMzQ4KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdGaXh1cFBoYXNlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ2MSw3ICsx
NDYxLDExIEBAIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgZml4RWRnZTxPdGhlclVzZT4obm9k
ZS0+Y2hpbGQxKCkpOwogICAgICAgICAgICAgICAgIG5vZGUtPnJlbW92ZSgpOwogICAgICAgICAg
ICAgfSBlbHNlIGlmICh0eXBlU2V0LT5kb2VzVHlwZUNvbmZvcm1UbyhUeXBlT2JqZWN0KSkgewot
ICAgICAgICAgICAgICAgIFN0cnVjdHVyZVNldCBzZXQgPSB0eXBlU2V0LT5zdHJ1Y3R1cmVTZXQo
KTsKKyAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVTZXQgc2V0OworICAgICAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICAgICAgQ29uY3VycmVudEpJVExvY2tlciBsb2NrZXIodHlwZVNldC0+
bV9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0ID0gdHlwZVNldC0+c3RydWN0dXJlU2V0
KGxvY2tlcik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICghc2V0Lmlz
RW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBmaXhFZGdlPENlbGxVc2U+KG5vZGUtPmNo
aWxkMSgpKTsKICAgICAgICAgICAgICAgICAgICAgbm9kZS0+Y29udmVydFRvQ2hlY2tTdHJ1Y3R1
cmUobV9ncmFwaC5hZGRTdHJ1Y3R1cmVTZXQoc2V0KSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvaml0L0pJVC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2pp
dC9KSVQuY3BwCShyZXZpc2lvbiAyMDIzNDgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0
L0pJVC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU0OSwxMCArNTQ5LDYgQEAgdm9pZCBKSVQ6OmNv
bXBpbGVXaXRob3V0TGlua2luZyhKSVRDb21waQogICAgICAgICBicmVhazsKICAgICB9CiAKLSAg
ICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYXZlIHRoZSBtb3N0IHVwIHRvIGRhdGUgdHlwZSBp
bmZvcm1hdGlvbiB3aGVuIHBlcmZvcm1pbmcgdHlwZWNoZWNrIG9wdGltaXphdGlvbnMgZm9yIG9w
X3Byb2ZpbGVfdHlwZS4KLSAgICBpZiAobV92bS0+dHlwZVByb2ZpbGVyKCkpCi0gICAgICAgIG1f
dm0tPnR5cGVQcm9maWxlckxvZygpLT5wcm9jZXNzTG9nRW50cmllcyhBU0NJSUxpdGVyYWwoIlBy
ZXBhcmluZyBmb3IgSklUIGNvbXBpbGF0aW9uLiIpKTsKLSAgICAKICAgICBpZiAoT3B0aW9uczo6
ZHVtcERpc2Fzc2VtYmx5KCkgfHwgKG1fdm0tPm1fcGVyQnl0ZWNvZGVQcm9maWxlciAmJiBPcHRp
b25zOjpkaXNhc3NlbWJsZUJhc2VsaW5lRm9yUHJvZmlsZXIoKSkpCiAgICAgICAgIG1fZGlzYXNz
ZW1ibGVyID0gc3RkOjptYWtlX3VuaXF1ZTxKSVREaXNhc3NlbWJsZXI+KG1fY29kZUJsb2NrKTsK
ICAgICBpZiAobV92bS0+bV9wZXJCeXRlY29kZVByb2ZpbGVyKSB7CkBAIC04MDQsNiArODAwLDcg
QEAgQ29tcGlsYXRpb25SZXN1bHQgSklUOjpsaW5rKCkKIAogQ29tcGlsYXRpb25SZXN1bHQgSklU
Ojpwcml2YXRlQ29tcGlsZShKSVRDb21waWxhdGlvbkVmZm9ydCBlZmZvcnQpCiB7CisgICAgZG9N
YWluVGhyZWFkUHJlcGFyYXRpb25CZWZvcmVDb21waWxlKCk7CiAgICAgY29tcGlsZVdpdGhvdXRM
aW5raW5nKGVmZm9ydCk7CiAgICAgcmV0dXJuIGxpbmsoKTsKIH0KQEAgLTg0OCw2ICs4NDUsMTMg
QEAgdm9pZCBKSVQ6OnByaXZhdGVDb21waWxlRXhjZXB0aW9uSGFuZGxlcgogICAgIH0KIH0KIAor
dm9pZCBKSVQ6OmRvTWFpblRocmVhZFByZXBhcmF0aW9uQmVmb3JlQ29tcGlsZSgpCit7CisgICAg
Ly8gVGhpcyBlbnN1cmVzIHRoYXQgd2UgaGF2ZSB0aGUgbW9zdCB1cCB0byBkYXRlIHR5cGUgaW5m
b3JtYXRpb24gd2hlbiBwZXJmb3JtaW5nIHR5cGVjaGVjayBvcHRpbWl6YXRpb25zIGZvciBvcF9w
cm9maWxlX3R5cGUuCisgICAgaWYgKG1fdm0tPnR5cGVQcm9maWxlcigpKQorICAgICAgICBtX3Zt
LT50eXBlUHJvZmlsZXJMb2coKS0+cHJvY2Vzc0xvZ0VudHJpZXMoQVNDSUlMaXRlcmFsKCJQcmVw
YXJpbmcgZm9yIEpJVCBjb21waWxhdGlvbi4iKSk7Cit9CisKIHVuc2lnbmVkIEpJVDo6ZnJhbWVS
ZWdpc3RlckNvdW50Rm9yKENvZGVCbG9jayogY29kZUJsb2NrKQogewogICAgIEFTU0VSVChzdGF0
aWNfY2FzdDx1bnNpZ25lZD4oY29kZUJsb2NrLT5tX251bUNhbGxlZUxvY2FscykgPT0gV1RGOjpy
b3VuZFVwVG9NdWx0aXBsZU9mKHN0YWNrQWxpZ25tZW50UmVnaXN0ZXJzKCksIHN0YXRpY19jYXN0
PHVuc2lnbmVkPihjb2RlQmxvY2stPm1fbnVtQ2FsbGVlTG9jYWxzKSkpOwpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL2ppdC9KSVQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvaml0L0pJVC5oCShyZXZpc2lvbiAyMDIzNDgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvaml0L0pJVC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOTksNiArMTk5LDggQEAgbmFtZXNwYWNl
IEpTQyB7CiAKICAgICAgICAgdm9pZCBjb21waWxlV2l0aG91dExpbmtpbmcoSklUQ29tcGlsYXRp
b25FZmZvcnQpOwogICAgICAgICBDb21waWxhdGlvblJlc3VsdCBsaW5rKCk7CisKKyAgICAgICAg
dm9pZCBkb01haW5UaHJlYWRQcmVwYXJhdGlvbkJlZm9yZUNvbXBpbGUoKTsKICAgICAgICAgCiAg
ICAgICAgIHN0YXRpYyBDb21waWxhdGlvblJlc3VsdCBjb21waWxlKFZNKiB2bSwgQ29kZUJsb2Nr
KiBjb2RlQmxvY2ssIEpJVENvbXBpbGF0aW9uRWZmb3J0IGVmZm9ydCkKICAgICAgICAgewpJbmRl
eDogU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVRXb3JrbGlzdC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVRXb3JrbGlzdC5jcHAJKHJldmlzaW9uIDIw
MjM0OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9qaXQvSklUV29ya2xpc3QuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC00MCw2ICs0MCw3IEBAIHB1YmxpYzoKICAgICAgICAgOiBtX2NvZGVCbG9j
ayhjb2RlQmxvY2spCiAgICAgICAgICwgbV9qaXQoY29kZUJsb2NrLT52bSgpLCBjb2RlQmxvY2sp
CiAgICAgeworICAgICAgICBtX2ppdC5kb01haW5UaHJlYWRQcmVwYXJhdGlvbkJlZm9yZUNvbXBp
bGUoKTsKICAgICB9CiAgICAgCiAgICAgdm9pZCBjb21waWxlSW5UaHJlYWQoKQpJbmRleDogU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVHlwZVNldC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVHlwZVNldC5jcHAJKHJldmlzaW9uIDIwMjM0OCkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1R5cGVTZXQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC00OSw3ICs0OSwxMCBAQCB2b2lkIFR5cGVTZXQ6OmFkZFR5cGVJbmZvcm1hdGlvbihS
dW50aW1lCiAKICAgICBpZiAoc3RydWN0dXJlICYmIG5ld1NoYXBlICYmICFydW50aW1lVHlwZUlz
UHJpbWl0aXZlKHR5cGUpKSB7CiAgICAgICAgIGlmICghbV9zdHJ1Y3R1cmVTZXQuY29udGFpbnMo
c3RydWN0dXJlKSkgewotICAgICAgICAgICAgbV9zdHJ1Y3R1cmVTZXQuYWRkKHN0cnVjdHVyZSk7
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29uY3VycmVudEpJVExvY2tlciBsb2Nr
ZXIobV9sb2NrKTsKKyAgICAgICAgICAgICAgICBtX3N0cnVjdHVyZVNldC5hZGQoc3RydWN0dXJl
KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIE1ha2Ugb25lIG1vcmUgcGFzcyBtYWtp
bmcgc3VyZSB0aGF0OiAKICAgICAgICAgICAgIC8vIC0gV2UgZG9uJ3QgaGF2ZSB0d28gaW5zdGFu
Y2VzIG9mIHRoZSBzYW1lIHNoYXBlLiAoU2FtZSBzaGFwZXMgbWF5IGhhdmUgZGlmZmVyZW50IFN0
cnVjdHVyZXMpLgogICAgICAgICAgICAgLy8gLSBXZSBkb24ndCBoYXZlIHR3byBzaGFwZXMgdGhh
dCBzaGFyZSB0aGUgc2FtZSBwcm90b3R5cGUgY2hhaW4uIElmIHRoZXNlIHNoYXBlcyBzaGFyZSB0
aGUgc2FtZSAKQEAgLTgxLDYgKzg0LDcgQEAgdm9pZCBUeXBlU2V0OjphZGRUeXBlSW5mb3JtYXRp
b24oUnVudGltZQogCiB2b2lkIFR5cGVTZXQ6OmludmFsaWRhdGVDYWNoZSgpCiB7CisgICAgQ29u
Y3VycmVudEpJVExvY2tlciBsb2NrZXIobV9sb2NrKTsKICAgICBhdXRvIGtlZXBNYXJrZWRTdHJ1
Y3R1cmVzRmlsdGVyID0gW10gKFN0cnVjdHVyZSogc3RydWN0dXJlKSAtPiBib29sIHsgcmV0dXJu
IEhlYXA6OmlzTWFya2VkKHN0cnVjdHVyZSk7IH07CiAgICAgbV9zdHJ1Y3R1cmVTZXQuZ2VuZXJp
Y0ZpbHRlcihrZWVwTWFya2VkU3RydWN0dXJlc0ZpbHRlcik7CiB9CkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9UeXBlU2V0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvVHlwZVNldC5oCShyZXZpc2lvbiAyMDIzNDgpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9UeXBlU2V0LmgJKHdvcmtpbmcgY29weSkKQEAgLTI2LDEw
ICsyNiwxMiBAQAogI2lmbmRlZiBUeXBlU2V0X2gKICNkZWZpbmUgVHlwZVNldF9oCiAKKyNpbmNs
dWRlICJDb25jdXJyZW50SklUTG9jay5oIgogI2luY2x1ZGUgIlJ1bnRpbWVUeXBlLmgiCiAjaW5j
bHVkZSAiU3RydWN0dXJlU2V0LmgiCiAjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRl
IDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5o
PgogI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgogI2luY2x1ZGUgPHd0Zi9WZWN0b3Iu
aD4KIApAQCAtNzksNyArODEsNyBAQCBwcml2YXRlOgogICAgIGJvb2wgbV9pc0luRGljdGlvbmFy
eU1vZGU7CiB9OwogCi1jbGFzcyBUeXBlU2V0IDogcHVibGljIFJlZkNvdW50ZWQ8VHlwZVNldD4g
eworY2xhc3MgVHlwZVNldCA6IHB1YmxpYyBUaHJlYWRTYWZlUmVmQ291bnRlZDxUeXBlU2V0PiB7
CiAKIHB1YmxpYzoKICAgICBzdGF0aWMgUmVmPFR5cGVTZXQ+IGNyZWF0ZSgpIHsgcmV0dXJuIGFk
b3B0UmVmKCpuZXcgVHlwZVNldCk7IH0KQEAgLTk2LDEwICs5OCwxMyBAQCBwdWJsaWM6CiAgICAg
Ym9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9zZWVuVHlwZXMgPT0gVHlwZU5vdGhpbmc7
IH0KICAgICBib29sIGRvZXNUeXBlQ29uZm9ybVRvKFJ1bnRpbWVUeXBlTWFzayB0ZXN0KSBjb25z
dDsKICAgICBSdW50aW1lVHlwZU1hc2sgc2VlblR5cGVzKCkgY29uc3QgeyByZXR1cm4gbV9zZWVu
VHlwZXM7IH0KLSAgICBTdHJ1Y3R1cmVTZXQgc3RydWN0dXJlU2V0KCkgY29uc3QgeyByZXR1cm4g
bV9zdHJ1Y3R1cmVTZXQ7IH07CisgICAgU3RydWN0dXJlU2V0IHN0cnVjdHVyZVNldChjb25zdCBD
b25jdXJyZW50SklUTG9ja2VyJikgY29uc3QgeyByZXR1cm4gbV9zdHJ1Y3R1cmVTZXQ7IH0KIAog
cHJpdmF0ZToKICAgICBSdW50aW1lVHlwZU1hc2sgbV9zZWVuVHlwZXM7CitwdWJsaWM6CisgICAg
Q29uY3VycmVudEpJVExvY2sgbV9sb2NrOworcHJpdmF0ZToKICAgICBib29sIG1faXNPdmVyZmxv
d247CiAgICAgVmVjdG9yPFJlZlB0cjxTdHJ1Y3R1cmVTaGFwZT4+IG1fc3RydWN0dXJlSGlzdG9y
eTsKICAgICBTdHJ1Y3R1cmVTZXQgbV9zdHJ1Y3R1cmVTZXQ7CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvdGVzdHMvdHlwZVByb2ZpbGVyL2RlbHRhYmx1ZS1mb3Itb2YuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3R5cGVQcm9maWxlci9kZWx0YWJsdWUt
Zm9yLW9mLmpzCShub25leGlzdGVudCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy90
eXBlUHJvZmlsZXIvZGVsdGFibHVlLWZvci1vZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDg3MCBAQAorLy8gQ29weXJpZ2h0IDIwMDggdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAxOTk2IEpvaG4gTWFsb25leSBhbmQgTWFyaW8g
V29sY3prby4KKworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisvLyB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgor
Ly8gKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKy8vCisvLyBUaGlzIHByb2dy
YW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKy8v
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorLy8KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYg
bm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8gRm91bmRhdGlvbiwgSW5jLiwgNTkg
VGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisK
Ky8vIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIERlbHRhQmx1ZSBiZW5jaG1hcmsgaXMgZGVy
aXZlZAorLy8gZnJvbSB0aGUgU21hbGx0YWxrIGltcGxlbWVudGF0aW9uIGJ5IEpvaG4gTWFsb25l
eSBhbmQgTWFyaW8KKy8vIFdvbGN6a28uIFNvbWUgcGFydHMgaGF2ZSBiZWVuIHRyYW5zbGF0ZWQg
ZGlyZWN0bHksIHdoZXJlYXMKKy8vIG90aGVycyBoYXZlIGJlZW4gbW9kaWZpZWQgbW9yZSBhZ2dy
ZXNpdmVseSB0byBtYWtlIGl0IGZlZWwKKy8vIG1vcmUgbGlrZSBhIEphdmFTY3JpcHQgcHJvZ3Jh
bS4KKworLyoqCisgKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIERlbHRhQmx1
ZSBjb25zdHJhaW50LXNvbHZpbmcKKyAqIGFsZ29yaXRobSwgYXMgZGVzY3JpYmVkIGluOgorICoK
KyAqICJUaGUgRGVsdGFCbHVlIEFsZ29yaXRobTogQW4gSW5jcmVtZW50YWwgQ29uc3RyYWludCBI
aWVyYXJjaHkgU29sdmVyIgorICogICBCam9ybiBOLiBGcmVlbWFuLUJlbnNvbiBhbmQgSm9obiBN
YWxvbmV5CisgKiAgIEphbnVhcnkgMTk5MCBDb21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNLAorICog
ICBhbHNvIGF2YWlsYWJsZSBhcyBVbml2ZXJzaXR5IG9mIFdhc2hpbmd0b24gVFIgODktMDgtMDYu
CisgKgorICogQmV3YXJlOiB0aGlzIGJlbmNobWFyayBpcyB3cml0dGVuIGluIGEgZ3JvdGVzcXVl
IHN0eWxlIHdoZXJlCisgKiB0aGUgY29uc3RyYWludCBtb2RlbCBpcyBidWlsdCBieSBzaWRlLWVm
ZmVjdHMgZnJvbSBjb25zdHJ1Y3RvcnMuCisgKiBJJ3ZlIGtlcHQgaXQgdGhpcyB3YXkgdG8gYXZv
aWQgZGV2aWF0aW5nIHRvbyBtdWNoIGZyb20gdGhlIG9yaWdpbmFsCisgKiBpbXBsZW1lbnRhdGlv
bi4KKyAqLworCisKKy8qIC0tLSBPIGIgaiBlIGMgdCAgIE0gbyBkIGUgbCAtLS0gKi8KKworT2Jq
ZWN0LnByb3RvdHlwZS5pbmhlcml0c0Zyb20gPSBmdW5jdGlvbiAoc2h1cGVyKSB7CisgIGZ1bmN0
aW9uIEluaGVyaXRlcigpIHsgfQorICBJbmhlcml0ZXIucHJvdG90eXBlID0gc2h1cGVyLnByb3Rv
dHlwZTsKKyAgdGhpcy5wcm90b3R5cGUgPSBuZXcgSW5oZXJpdGVyKCk7CisgIHRoaXMuc3VwZXJD
b25zdHJ1Y3RvciA9IHNodXBlcjsKK30KKworZnVuY3Rpb24gT3JkZXJlZENvbGxlY3Rpb24oKSB7
CisgIHRoaXMuZWxtcyA9IG5ldyBBcnJheSgpOworfQorCitPcmRlcmVkQ29sbGVjdGlvbi5wcm90
b3R5cGUuYWRkID0gZnVuY3Rpb24gKGVsbSkgeworICB0aGlzLmVsbXMucHVzaChlbG0pOworfQor
CitPcmRlcmVkQ29sbGVjdGlvbi5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiAoaW5kZXgpIHsKKyAg
cmV0dXJuIHRoaXMuZWxtc1tpbmRleF07Cit9CisKK09yZGVyZWRDb2xsZWN0aW9uLnByb3RvdHlw
ZS5zaXplID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gdGhpcy5lbG1zLmxlbmd0aDsKK30KKwor
T3JkZXJlZENvbGxlY3Rpb24ucHJvdG90eXBlLnJlbW92ZUZpcnN0ID0gZnVuY3Rpb24gKCkgewor
ICByZXR1cm4gdGhpcy5lbG1zLnBvcCgpOworfQorCitPcmRlcmVkQ29sbGVjdGlvbi5wcm90b3R5
cGUucmVtb3ZlID0gZnVuY3Rpb24gKGVsbSkgeworICB2YXIgaW5kZXggPSAwLCBza2lwcGVkID0g
MDsKKyAgZm9yICh2YXIgdmFsdWUgb2YgdGhpcy5lbG1zKSB7CisgICAgaWYgKHZhbHVlICE9IGVs
bSkgeworICAgICAgdGhpcy5lbG1zW2luZGV4XSA9IHZhbHVlOworICAgICAgaW5kZXgrKzsKKyAg
ICB9IGVsc2UgeworICAgICAgc2tpcHBlZCsrOworICAgIH0KKyAgfQorICBmb3IgKHZhciBpID0g
MDsgaSA8IHNraXBwZWQ7IGkrKykKKyAgICB0aGlzLmVsbXMucG9wKCk7Cit9CisKKy8qIC0tLSAq
CisgKiBTIHQgciBlIG4gZyB0IGgKKyAqIC0tLSAqLworCisvKioKKyAqIFN0cmVuZ3RocyBhcmUg
dXNlZCB0byBtZWFzdXJlIHRoZSByZWxhdGl2ZSBpbXBvcnRhbmNlIG9mIGNvbnN0cmFpbnRzLgor
ICogTmV3IHN0cmVuZ3RocyBtYXkgYmUgaW5zZXJ0ZWQgaW4gdGhlIHN0cmVuZ3RoIGhpZXJhcmNo
eSB3aXRob3V0CisgKiBkaXNydXB0aW5nIGN1cnJlbnQgY29uc3RyYWludHMuICBTdHJlbmd0aHMg
Y2Fubm90IGJlIGNyZWF0ZWQgb3V0c2lkZQorICogdGhpcyBjbGFzcywgc28gcG9pbnRlciBjb21w
YXJpc29uIGNhbiBiZSB1c2VkIGZvciB2YWx1ZSBjb21wYXJpc29uLgorICovCitmdW5jdGlvbiBT
dHJlbmd0aChzdHJlbmd0aFZhbHVlLCBuYW1lKSB7CisgIHRoaXMuc3RyZW5ndGhWYWx1ZSA9IHN0
cmVuZ3RoVmFsdWU7CisgIHRoaXMubmFtZSA9IG5hbWU7Cit9CisKK1N0cmVuZ3RoLnN0cm9uZ2Vy
ID0gZnVuY3Rpb24gKHMxLCBzMikgeworICByZXR1cm4gczEuc3RyZW5ndGhWYWx1ZSA8IHMyLnN0
cmVuZ3RoVmFsdWU7Cit9CisKK1N0cmVuZ3RoLndlYWtlciA9IGZ1bmN0aW9uIChzMSwgczIpIHsK
KyAgcmV0dXJuIHMxLnN0cmVuZ3RoVmFsdWUgPiBzMi5zdHJlbmd0aFZhbHVlOworfQorCitTdHJl
bmd0aC53ZWFrZXN0T2YgPSBmdW5jdGlvbiAoczEsIHMyKSB7CisgIHJldHVybiB0aGlzLndlYWtl
cihzMSwgczIpID8gczEgOiBzMjsKK30KKworU3RyZW5ndGguc3Ryb25nZXN0ID0gZnVuY3Rpb24g
KHMxLCBzMikgeworICByZXR1cm4gdGhpcy5zdHJvbmdlcihzMSwgczIpID8gczEgOiBzMjsKK30K
KworU3RyZW5ndGgucHJvdG90eXBlLm5leHRXZWFrZXIgPSBmdW5jdGlvbiAoKSB7CisgIHN3aXRj
aCAodGhpcy5zdHJlbmd0aFZhbHVlKSB7CisgICAgY2FzZSAwOiByZXR1cm4gU3RyZW5ndGguV0VB
S0VTVDsKKyAgICBjYXNlIDE6IHJldHVybiBTdHJlbmd0aC5XRUFLX0RFRkFVTFQ7CisgICAgY2Fz
ZSAyOiByZXR1cm4gU3RyZW5ndGguTk9STUFMOworICAgIGNhc2UgMzogcmV0dXJuIFN0cmVuZ3Ro
LlNUUk9OR19ERUZBVUxUOworICAgIGNhc2UgNDogcmV0dXJuIFN0cmVuZ3RoLlBSRUZFUlJFRDsK
KyAgICBjYXNlIDU6IHJldHVybiBTdHJlbmd0aC5SRVFVSVJFRDsKKyAgfQorfQorCisvLyBTdHJl
bmd0aCBjb25zdGFudHMuCitTdHJlbmd0aC5SRVFVSVJFRCAgICAgICAgPSBuZXcgU3RyZW5ndGgo
MCwgInJlcXVpcmVkIik7CitTdHJlbmd0aC5TVE9OR19QUkVGRVJSRUQgPSBuZXcgU3RyZW5ndGgo
MSwgInN0cm9uZ1ByZWZlcnJlZCIpOworU3RyZW5ndGguUFJFRkVSUkVEICAgICAgID0gbmV3IFN0
cmVuZ3RoKDIsICJwcmVmZXJyZWQiKTsKK1N0cmVuZ3RoLlNUUk9OR19ERUZBVUxUICA9IG5ldyBT
dHJlbmd0aCgzLCAic3Ryb25nRGVmYXVsdCIpOworU3RyZW5ndGguTk9STUFMICAgICAgICAgID0g
bmV3IFN0cmVuZ3RoKDQsICJub3JtYWwiKTsKK1N0cmVuZ3RoLldFQUtfREVGQVVMVCAgICA9IG5l
dyBTdHJlbmd0aCg1LCAid2Vha0RlZmF1bHQiKTsKK1N0cmVuZ3RoLldFQUtFU1QgICAgICAgICA9
IG5ldyBTdHJlbmd0aCg2LCAid2Vha2VzdCIpOworCisvKiAtLS0gKgorICogQyBvIG4gcyB0IHIg
YSBpIG4gdAorICogLS0tICovCisKKy8qKgorICogQW4gYWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50
aW5nIGEgc3lzdGVtLW1haW50YWluYWJsZSByZWxhdGlvbnNoaXAKKyAqIChvciAiY29uc3RyYWlu
dCIpIGJldHdlZW4gYSBzZXQgb2YgdmFyaWFibGVzLiBBIGNvbnN0cmFpbnQgc3VwcGxpZXMKKyAq
IGEgc3RyZW5ndGggaW5zdGFuY2UgdmFyaWFibGU7IGNvbmNyZXRlIHN1YmNsYXNzZXMgcHJvdmlk
ZSBhIG1lYW5zCisgKiBvZiBzdG9yaW5nIHRoZSBjb25zdHJhaW5lZCB2YXJpYWJsZXMgYW5kIG90
aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkCisgKiB0byByZXByZXNlbnQgYSBjb25zdHJhaW50Lgor
ICovCitmdW5jdGlvbiBDb25zdHJhaW50KHN0cmVuZ3RoKSB7CisgIHRoaXMuc3RyZW5ndGggPSBz
dHJlbmd0aDsKK30KKworLyoqCisgKiBBY3RpdmF0ZSB0aGlzIGNvbnN0cmFpbnQgYW5kIGF0dGVt
cHQgdG8gc2F0aXNmeSBpdC4KKyAqLworQ29uc3RyYWludC5wcm90b3R5cGUuYWRkQ29uc3RyYWlu
dCA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5hZGRUb0dyYXBoKCk7CisgIHBsYW5uZXIuaW5jcmVt
ZW50YWxBZGQodGhpcyk7Cit9CisKKy8qKgorICogQXR0ZW1wdCB0byBmaW5kIGEgd2F5IHRvIGVu
Zm9yY2UgdGhpcyBjb25zdHJhaW50LiBJZiBzdWNjZXNzZnVsLAorICogcmVjb3JkIHRoZSBzb2x1
dGlvbiwgcGVyaGFwcyBtb2RpZnlpbmcgdGhlIGN1cnJlbnQgZGF0YWZsb3cKKyAqIGdyYXBoLiBB
bnN3ZXIgdGhlIGNvbnN0cmFpbnQgdGhhdCB0aGlzIGNvbnN0cmFpbnQgb3ZlcnJpZGVzLCBpZgor
ICogdGhlcmUgaXMgb25lLCBvciBuaWwsIGlmIHRoZXJlIGlzbid0LgorICogQXNzdW1lOiBJIGFt
IG5vdCBhbHJlYWR5IHNhdGlzZmllZC4KKyAqLworQ29uc3RyYWludC5wcm90b3R5cGUuc2F0aXNm
eSA9IGZ1bmN0aW9uIChtYXJrKSB7CisgIHRoaXMuY2hvb3NlTWV0aG9kKG1hcmspOworICBpZiAo
IXRoaXMuaXNTYXRpc2ZpZWQoKSkgeworICAgIGlmICh0aGlzLnN0cmVuZ3RoID09IFN0cmVuZ3Ro
LlJFUVVJUkVEKQorICAgICAgYWxlcnQoIkNvdWxkIG5vdCBzYXRpc2Z5IGEgcmVxdWlyZWQgY29u
c3RyYWludCEiKTsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQorICB0aGlzLm1hcmtJbnB1dHMobWFy
ayk7CisgIHZhciBvdXQgPSB0aGlzLm91dHB1dCgpOworICB2YXIgb3ZlcnJpZGRlbiA9IG91dC5k
ZXRlcm1pbmVkQnk7CisgIGlmIChvdmVycmlkZGVuICE9IG51bGwpIG92ZXJyaWRkZW4ubWFya1Vu
c2F0aXNmaWVkKCk7CisgIG91dC5kZXRlcm1pbmVkQnkgPSB0aGlzOworICBpZiAoIXBsYW5uZXIu
YWRkUHJvcGFnYXRlKHRoaXMsIG1hcmspKQorICAgIGFsZXJ0KCJDeWNsZSBlbmNvdW50ZXJlZCIp
OworICBvdXQubWFyayA9IG1hcms7CisgIHJldHVybiBvdmVycmlkZGVuOworfQorCitDb25zdHJh
aW50LnByb3RvdHlwZS5kZXN0cm95Q29uc3RyYWludCA9IGZ1bmN0aW9uICgpIHsKKyAgaWYgKHRo
aXMuaXNTYXRpc2ZpZWQoKSkgcGxhbm5lci5pbmNyZW1lbnRhbFJlbW92ZSh0aGlzKTsKKyAgZWxz
ZSB0aGlzLnJlbW92ZUZyb21HcmFwaCgpOworfQorCisvKioKKyAqIE5vcm1hbCBjb25zdHJhaW50
cyBhcmUgbm90IGlucHV0IGNvbnN0cmFpbnRzLiAgQW4gaW5wdXQgY29uc3RyYWludAorICogaXMg
b25lIHRoYXQgZGVwZW5kcyBvbiBleHRlcm5hbCBzdGF0ZSwgc3VjaCBhcyB0aGUgbW91c2UsIHRo
ZQorICoga2V5Ym9yZCwgYSBjbG9jaywgb3Igc29tZSBhcmJpdHJhdHkgcGllY2Ugb2YgaW1wZXJh
dGl2ZSBjb2RlLgorICovCitDb25zdHJhaW50LnByb3RvdHlwZS5pc0lucHV0ID0gZnVuY3Rpb24g
KCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIC0tLSAqCisgKiBVIG4gYSByIHkgICBDIG8g
biBzIHQgciBhIGkgbiB0CisgKiAtLS0gKi8KKworLyoqCisgKiBBYnN0cmFjdCBzdXBlcmNsYXNz
IGZvciBjb25zdHJhaW50cyBoYXZpbmcgYSBzaW5nbGUgcG9zc2libGUgb3V0cHV0CisgKiB2YXJp
YWJsZS4KKyAqLworZnVuY3Rpb24gVW5hcnlDb25zdHJhaW50KHYsIHN0cmVuZ3RoKSB7CisgIFVu
YXJ5Q29uc3RyYWludC5zdXBlckNvbnN0cnVjdG9yLmNhbGwodGhpcywgc3RyZW5ndGgpOworICB0
aGlzLm15T3V0cHV0ID0gdjsKKyAgdGhpcy5zYXRpc2ZpZWQgPSBmYWxzZTsKKyAgdGhpcy5hZGRD
b25zdHJhaW50KCk7Cit9CisKK1VuYXJ5Q29uc3RyYWludC5pbmhlcml0c0Zyb20oQ29uc3RyYWlu
dCk7CisKKy8qKgorICogQWRkcyB0aGlzIGNvbnN0cmFpbnQgdG8gdGhlIGNvbnN0cmFpbnQgZ3Jh
cGgKKyAqLworVW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5hZGRUb0dyYXBoID0gZnVuY3Rpb24g
KCkgeworICB0aGlzLm15T3V0cHV0LmFkZENvbnN0cmFpbnQodGhpcyk7CisgIHRoaXMuc2F0aXNm
aWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogRGVjaWRlcyBpZiB0aGlzIGNvbnN0cmFpbnQgY2Fu
IGJlIHNhdGlzZmllZCBhbmQgcmVjb3JkcyB0aGF0CisgKiBkZWNpc2lvbi4KKyAqLworVW5hcnlD
b25zdHJhaW50LnByb3RvdHlwZS5jaG9vc2VNZXRob2QgPSBmdW5jdGlvbiAobWFyaykgeworICB0
aGlzLnNhdGlzZmllZCA9ICh0aGlzLm15T3V0cHV0Lm1hcmsgIT0gbWFyaykKKyAgICAmJiBTdHJl
bmd0aC5zdHJvbmdlcih0aGlzLnN0cmVuZ3RoLCB0aGlzLm15T3V0cHV0LndhbGtTdHJlbmd0aCk7
Cit9CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29uc3RyYWludCBpcyBzYXRpc2Zp
ZWQgaW4gdGhlIGN1cnJlbnQgc29sdXRpb24uCisgKi8KK1VuYXJ5Q29uc3RyYWludC5wcm90b3R5
cGUuaXNTYXRpc2ZpZWQgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0aGlzLnNhdGlzZmllZDsK
K30KKworVW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5tYXJrSW5wdXRzID0gZnVuY3Rpb24gKG1h
cmspIHsKKyAgLy8gaGFzIG5vIGlucHV0cworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGN1cnJl
bnQgb3V0cHV0IHZhcmlhYmxlLgorICovCitVbmFyeUNvbnN0cmFpbnQucHJvdG90eXBlLm91dHB1
dCA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHRoaXMubXlPdXRwdXQ7Cit9CisKKy8qKgorICog
Q2FsY3VsYXRlIHRoZSB3YWxrYWJvdXQgc3RyZW5ndGgsIHRoZSBzdGF5IGZsYWcsIGFuZCwgaWYg
aXQgaXMKKyAqICdzdGF5JywgdGhlIHZhbHVlIGZvciB0aGUgY3VycmVudCBvdXRwdXQgb2YgdGhp
cyBjb25zdHJhaW50LiBBc3N1bWUKKyAqIHRoaXMgY29uc3RyYWludCBpcyBzYXRpc2ZpZWQuCisg
Ki8KK1VuYXJ5Q29uc3RyYWludC5wcm90b3R5cGUucmVjYWxjdWxhdGUgPSBmdW5jdGlvbiAoKSB7
CisgIHRoaXMubXlPdXRwdXQud2Fsa1N0cmVuZ3RoID0gdGhpcy5zdHJlbmd0aDsKKyAgdGhpcy5t
eU91dHB1dC5zdGF5ID0gIXRoaXMuaXNJbnB1dCgpOworICBpZiAodGhpcy5teU91dHB1dC5zdGF5
KSB0aGlzLmV4ZWN1dGUoKTsgLy8gU3RheSBvcHRpbWl6YXRpb24KK30KKworLyoqCisgKiBSZWNv
cmRzIHRoYXQgdGhpcyBjb25zdHJhaW50IGlzIHVuc2F0aXNmaWVkCisgKi8KK1VuYXJ5Q29uc3Ry
YWludC5wcm90b3R5cGUubWFya1Vuc2F0aXNmaWVkID0gZnVuY3Rpb24gKCkgeworICB0aGlzLnNh
dGlzZmllZCA9IGZhbHNlOworfQorCitVbmFyeUNvbnN0cmFpbnQucHJvdG90eXBlLmlucHV0c0tu
b3duID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gdHJ1ZTsKK30KKworVW5hcnlDb25zdHJhaW50
LnByb3RvdHlwZS5yZW1vdmVGcm9tR3JhcGggPSBmdW5jdGlvbiAoKSB7CisgIGlmICh0aGlzLm15
T3V0cHV0ICE9IG51bGwpIHRoaXMubXlPdXRwdXQucmVtb3ZlQ29uc3RyYWludCh0aGlzKTsKKyAg
dGhpcy5zYXRpc2ZpZWQgPSBmYWxzZTsKK30KKworLyogLS0tICoKKyAqIFMgdCBhIHkgICBDIG8g
biBzIHQgciBhIGkgbiB0CisgKiAtLS0gKi8KKworLyoqCisgKiBWYXJpYWJsZXMgdGhhdCBzaG91
bGQsIHdpdGggc29tZSBsZXZlbCBvZiBwcmVmZXJlbmNlLCBzdGF5IHRoZSBzYW1lLgorICogUGxh
bm5lcnMgbWF5IGV4cGxvaXQgdGhlIGZhY3QgdGhhdCBpbnN0YW5jZXMsIGlmIHNhdGlzZmllZCwg
d2lsbCBub3QKKyAqIGNoYW5nZSB0aGVpciBvdXRwdXQgZHVyaW5nIHBsYW4gZXhlY3V0aW9uLiAg
VGhpcyBpcyBjYWxsZWQgInN0YXkKKyAqIG9wdGltaXphdGlvbiIuCisgKi8KK2Z1bmN0aW9uIFN0
YXlDb25zdHJhaW50KHYsIHN0cikgeworICBTdGF5Q29uc3RyYWludC5zdXBlckNvbnN0cnVjdG9y
LmNhbGwodGhpcywgdiwgc3RyKTsKK30KKworU3RheUNvbnN0cmFpbnQuaW5oZXJpdHNGcm9tKFVu
YXJ5Q29uc3RyYWludCk7CisKK1N0YXlDb25zdHJhaW50LnByb3RvdHlwZS5leGVjdXRlID0gZnVu
Y3Rpb24gKCkgeworICAvLyBTdGF5IGNvbnN0cmFpbnRzIGRvIG5vdGhpbmcKK30KKworLyogLS0t
ICoKKyAqIEUgZCBpIHQgICBDIG8gbiBzIHQgciBhIGkgbiB0CisgKiAtLS0gKi8KKworLyoqCisg
KiBBIHVuYXJ5IGlucHV0IGNvbnN0cmFpbnQgdXNlZCB0byBtYXJrIGEgdmFyaWFibGUgdGhhdCB0
aGUgY2xpZW50CisgKiB3aXNoZXMgdG8gY2hhbmdlLgorICovCitmdW5jdGlvbiBFZGl0Q29uc3Ry
YWludCh2LCBzdHIpIHsKKyAgRWRpdENvbnN0cmFpbnQuc3VwZXJDb25zdHJ1Y3Rvci5jYWxsKHRo
aXMsIHYsIHN0cik7Cit9CisKK0VkaXRDb25zdHJhaW50LmluaGVyaXRzRnJvbShVbmFyeUNvbnN0
cmFpbnQpOworCisvKioKKyAqIEVkaXRzIGluZGljYXRlIHRoYXQgYSB2YXJpYWJsZSBpcyB0byBi
ZSBjaGFuZ2VkIGJ5IGltcGVyYXRpdmUgY29kZS4KKyAqLworRWRpdENvbnN0cmFpbnQucHJvdG90
eXBlLmlzSW5wdXQgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0cnVlOworfQorCitFZGl0Q29u
c3RyYWludC5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHsKKyAgLy8gRWRpdCBjb25z
dHJhaW50cyBkbyBub3RoaW5nCit9CisKKy8qIC0tLSAqCisgKiBCIGkgbiBhIHIgeSAgIEMgbyBu
IHMgdCByIGEgaSBuIHQKKyAqIC0tLSAqLworCit2YXIgRGlyZWN0aW9uID0gbmV3IE9iamVjdCgp
OworRGlyZWN0aW9uLk5PTkUgICAgID0gMDsKK0RpcmVjdGlvbi5GT1JXQVJEICA9IDE7CitEaXJl
Y3Rpb24uQkFDS1dBUkQgPSAtMTsKKworLyoqCisgKiBBYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBj
b25zdHJhaW50cyBoYXZpbmcgdHdvIHBvc3NpYmxlIG91dHB1dAorICogdmFyaWFibGVzLgorICov
CitmdW5jdGlvbiBCaW5hcnlDb25zdHJhaW50KHZhcjEsIHZhcjIsIHN0cmVuZ3RoKSB7CisgIEJp
bmFyeUNvbnN0cmFpbnQuc3VwZXJDb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHN0cmVuZ3RoKTsKKyAg
dGhpcy52MSA9IHZhcjE7CisgIHRoaXMudjIgPSB2YXIyOworICB0aGlzLmRpcmVjdGlvbiA9IERp
cmVjdGlvbi5OT05FOworICB0aGlzLmFkZENvbnN0cmFpbnQoKTsKK30KKworQmluYXJ5Q29uc3Ry
YWludC5pbmhlcml0c0Zyb20oQ29uc3RyYWludCk7CisKKy8qKgorICogRGVjaWRlcyBpZiB0aGlz
IGNvbnN0cmFpbnQgY2FuIGJlIHNhdGlzZmllZCBhbmQgd2hpY2ggd2F5IGl0CisgKiBzaG91bGQg
ZmxvdyBiYXNlZCBvbiB0aGUgcmVsYXRpdmUgc3RyZW5ndGggb2YgdGhlIHZhcmlhYmxlcyByZWxh
dGVkLAorICogYW5kIHJlY29yZCB0aGF0IGRlY2lzaW9uLgorICovCitCaW5hcnlDb25zdHJhaW50
LnByb3RvdHlwZS5jaG9vc2VNZXRob2QgPSBmdW5jdGlvbiAobWFyaykgeworICBpZiAodGhpcy52
MS5tYXJrID09IG1hcmspIHsKKyAgICB0aGlzLmRpcmVjdGlvbiA9ICh0aGlzLnYyLm1hcmsgIT0g
bWFyayAmJiBTdHJlbmd0aC5zdHJvbmdlcih0aGlzLnN0cmVuZ3RoLCB0aGlzLnYyLndhbGtTdHJl
bmd0aCkpCisgICAgICA/IERpcmVjdGlvbi5GT1JXQVJECisgICAgICA6IERpcmVjdGlvbi5OT05F
OworICB9CisgIGlmICh0aGlzLnYyLm1hcmsgPT0gbWFyaykgeworICAgIHRoaXMuZGlyZWN0aW9u
ID0gKHRoaXMudjEubWFyayAhPSBtYXJrICYmIFN0cmVuZ3RoLnN0cm9uZ2VyKHRoaXMuc3RyZW5n
dGgsIHRoaXMudjEud2Fsa1N0cmVuZ3RoKSkKKyAgICAgID8gRGlyZWN0aW9uLkJBQ0tXQVJECisg
ICAgICA6IERpcmVjdGlvbi5OT05FOworICB9CisgIGlmIChTdHJlbmd0aC53ZWFrZXIodGhpcy52
MS53YWxrU3RyZW5ndGgsIHRoaXMudjIud2Fsa1N0cmVuZ3RoKSkgeworICAgIHRoaXMuZGlyZWN0
aW9uID0gU3RyZW5ndGguc3Ryb25nZXIodGhpcy5zdHJlbmd0aCwgdGhpcy52MS53YWxrU3RyZW5n
dGgpCisgICAgICA/IERpcmVjdGlvbi5CQUNLV0FSRAorICAgICAgOiBEaXJlY3Rpb24uTk9ORTsK
KyAgfSBlbHNlIHsKKyAgICB0aGlzLmRpcmVjdGlvbiA9IFN0cmVuZ3RoLnN0cm9uZ2VyKHRoaXMu
c3RyZW5ndGgsIHRoaXMudjIud2Fsa1N0cmVuZ3RoKQorICAgICAgPyBEaXJlY3Rpb24uRk9SV0FS
RAorICAgICAgOiBEaXJlY3Rpb24uQkFDS1dBUkQKKyAgfQorfQorCisvKioKKyAqIEFkZCB0aGlz
IGNvbnN0cmFpbnQgdG8gdGhlIGNvbnN0cmFpbnQgZ3JhcGgKKyAqLworQmluYXJ5Q29uc3RyYWlu
dC5wcm90b3R5cGUuYWRkVG9HcmFwaCA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy52MS5hZGRDb25z
dHJhaW50KHRoaXMpOworICB0aGlzLnYyLmFkZENvbnN0cmFpbnQodGhpcyk7CisgIHRoaXMuZGly
ZWN0aW9uID0gRGlyZWN0aW9uLk5PTkU7Cit9CisKKy8qKgorICogQW5zd2VyIHRydWUgaWYgdGhp
cyBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBpbiB0aGUgY3VycmVudCBzb2x1dGlvbi4KKyAqLwor
QmluYXJ5Q29uc3RyYWludC5wcm90b3R5cGUuaXNTYXRpc2ZpZWQgPSBmdW5jdGlvbiAoKSB7Cisg
IHJldHVybiB0aGlzLmRpcmVjdGlvbiAhPSBEaXJlY3Rpb24uTk9ORTsKK30KKworLyoqCisgKiBN
YXJrIHRoZSBpbnB1dCB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBtYXJrLgorICovCitCaW5hcnlD
b25zdHJhaW50LnByb3RvdHlwZS5tYXJrSW5wdXRzID0gZnVuY3Rpb24gKG1hcmspIHsKKyAgdGhp
cy5pbnB1dCgpLm1hcmsgPSBtYXJrOworfQorCisvKioKKyAqIFJldHVybnMgdGhlIGN1cnJlbnQg
aW5wdXQgdmFyaWFibGUKKyAqLworQmluYXJ5Q29uc3RyYWludC5wcm90b3R5cGUuaW5wdXQgPSBm
dW5jdGlvbiAoKSB7CisgIHJldHVybiAodGhpcy5kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkZPUldB
UkQpID8gdGhpcy52MSA6IHRoaXMudjI7Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVu
dCBvdXRwdXQgdmFyaWFibGUKKyAqLworQmluYXJ5Q29uc3RyYWludC5wcm90b3R5cGUub3V0cHV0
ID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gKHRoaXMuZGlyZWN0aW9uID09IERpcmVjdGlvbi5G
T1JXQVJEKSA/IHRoaXMudjIgOiB0aGlzLnYxOworfQorCisvKioKKyAqIENhbGN1bGF0ZSB0aGUg
d2Fsa2Fib3V0IHN0cmVuZ3RoLCB0aGUgc3RheSBmbGFnLCBhbmQsIGlmIGl0IGlzCisgKiAnc3Rh
eScsIHRoZSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgb3V0cHV0IG9mIHRoaXMKKyAqIGNvbnN0cmFp
bnQuIEFzc3VtZSB0aGlzIGNvbnN0cmFpbnQgaXMgc2F0aXNmaWVkLgorICovCitCaW5hcnlDb25z
dHJhaW50LnByb3RvdHlwZS5yZWNhbGN1bGF0ZSA9IGZ1bmN0aW9uICgpIHsKKyAgdmFyIGlobiA9
IHRoaXMuaW5wdXQoKSwgb3V0ID0gdGhpcy5vdXRwdXQoKTsKKyAgb3V0LndhbGtTdHJlbmd0aCA9
IFN0cmVuZ3RoLndlYWtlc3RPZih0aGlzLnN0cmVuZ3RoLCBpaG4ud2Fsa1N0cmVuZ3RoKTsKKyAg
b3V0LnN0YXkgPSBpaG4uc3RheTsKKyAgaWYgKG91dC5zdGF5KSB0aGlzLmV4ZWN1dGUoKTsKK30K
KworLyoqCisgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCB0aGlzIGNvbnN0cmFpbnQgaXMgdW5zYXRp
c2ZpZWQuCisgKi8KK0JpbmFyeUNvbnN0cmFpbnQucHJvdG90eXBlLm1hcmtVbnNhdGlzZmllZCA9
IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5kaXJlY3Rpb24gPSBEaXJlY3Rpb24uTk9ORTsKK30KKwor
QmluYXJ5Q29uc3RyYWludC5wcm90b3R5cGUuaW5wdXRzS25vd24gPSBmdW5jdGlvbiAobWFyaykg
eworICB2YXIgaSA9IHRoaXMuaW5wdXQoKTsKKyAgcmV0dXJuIGkubWFyayA9PSBtYXJrIHx8IGku
c3RheSB8fCBpLmRldGVybWluZWRCeSA9PSBudWxsOworfQorCitCaW5hcnlDb25zdHJhaW50LnBy
b3RvdHlwZS5yZW1vdmVGcm9tR3JhcGggPSBmdW5jdGlvbiAoKSB7CisgIGlmICh0aGlzLnYxICE9
IG51bGwpIHRoaXMudjEucmVtb3ZlQ29uc3RyYWludCh0aGlzKTsKKyAgaWYgKHRoaXMudjIgIT0g
bnVsbCkgdGhpcy52Mi5yZW1vdmVDb25zdHJhaW50KHRoaXMpOworICB0aGlzLmRpcmVjdGlvbiA9
IERpcmVjdGlvbi5OT05FOworfQorCisvKiAtLS0gKgorICogUyBjIGEgbCBlICAgQyBvIG4gcyB0
IHIgYSBpIG4gdAorICogLS0tICovCisKKy8qKgorICogUmVsYXRlcyB0d28gdmFyaWFibGVzIGJ5
IHRoZSBsaW5lYXIgc2NhbGluZyByZWxhdGlvbnNoaXA6ICJ2MiA9CisgKiAodjEgKiBzY2FsZSkg
KyBvZmZzZXQiLiBFaXRoZXIgdjEgb3IgdjIgbWF5IGJlIGNoYW5nZWQgdG8gbWFpbnRhaW4KKyAq
IHRoaXMgcmVsYXRpb25zaGlwIGJ1dCB0aGUgc2NhbGUgZmFjdG9yIGFuZCBvZmZzZXQgYXJlIGNv
bnNpZGVyZWQKKyAqIHJlYWQtb25seS4KKyAqLworZnVuY3Rpb24gU2NhbGVDb25zdHJhaW50KHNy
Yywgc2NhbGUsIG9mZnNldCwgZGVzdCwgc3RyZW5ndGgpIHsKKyAgdGhpcy5kaXJlY3Rpb24gPSBE
aXJlY3Rpb24uTk9ORTsKKyAgdGhpcy5zY2FsZSA9IHNjYWxlOworICB0aGlzLm9mZnNldCA9IG9m
ZnNldDsKKyAgU2NhbGVDb25zdHJhaW50LnN1cGVyQ29uc3RydWN0b3IuY2FsbCh0aGlzLCBzcmMs
IGRlc3QsIHN0cmVuZ3RoKTsKK30KKworU2NhbGVDb25zdHJhaW50LmluaGVyaXRzRnJvbShCaW5h
cnlDb25zdHJhaW50KTsKKworLyoqCisgKiBBZGRzIHRoaXMgY29uc3RyYWludCB0byB0aGUgY29u
c3RyYWludCBncmFwaC4KKyAqLworU2NhbGVDb25zdHJhaW50LnByb3RvdHlwZS5hZGRUb0dyYXBo
ID0gZnVuY3Rpb24gKCkgeworICBTY2FsZUNvbnN0cmFpbnQuc3VwZXJDb25zdHJ1Y3Rvci5wcm90
b3R5cGUuYWRkVG9HcmFwaC5jYWxsKHRoaXMpOworICB0aGlzLnNjYWxlLmFkZENvbnN0cmFpbnQo
dGhpcyk7CisgIHRoaXMub2Zmc2V0LmFkZENvbnN0cmFpbnQodGhpcyk7Cit9CisKK1NjYWxlQ29u
c3RyYWludC5wcm90b3R5cGUucmVtb3ZlRnJvbUdyYXBoID0gZnVuY3Rpb24gKCkgeworICBTY2Fs
ZUNvbnN0cmFpbnQuc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGUucmVtb3ZlRnJvbUdyYXBoLmNh
bGwodGhpcyk7CisgIGlmICh0aGlzLnNjYWxlICE9IG51bGwpIHRoaXMuc2NhbGUucmVtb3ZlQ29u
c3RyYWludCh0aGlzKTsKKyAgaWYgKHRoaXMub2Zmc2V0ICE9IG51bGwpIHRoaXMub2Zmc2V0LnJl
bW92ZUNvbnN0cmFpbnQodGhpcyk7Cit9CisKK1NjYWxlQ29uc3RyYWludC5wcm90b3R5cGUubWFy
a0lucHV0cyA9IGZ1bmN0aW9uIChtYXJrKSB7CisgIFNjYWxlQ29uc3RyYWludC5zdXBlckNvbnN0
cnVjdG9yLnByb3RvdHlwZS5tYXJrSW5wdXRzLmNhbGwodGhpcywgbWFyayk7CisgIHRoaXMuc2Nh
bGUubWFyayA9IHRoaXMub2Zmc2V0Lm1hcmsgPSBtYXJrOworfQorCisvKioKKyAqIEVuZm9yY2Ug
dGhpcyBjb25zdHJhaW50LiBBc3N1bWUgdGhhdCBpdCBpcyBzYXRpc2ZpZWQuCisgKi8KK1NjYWxl
Q29uc3RyYWludC5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHsKKyAgaWYgKHRoaXMu
ZGlyZWN0aW9uID09IERpcmVjdGlvbi5GT1JXQVJEKSB7CisgICAgdGhpcy52Mi52YWx1ZSA9IHRo
aXMudjEudmFsdWUgKiB0aGlzLnNjYWxlLnZhbHVlICsgdGhpcy5vZmZzZXQudmFsdWU7CisgIH0g
ZWxzZSB7CisgICAgdGhpcy52MS52YWx1ZSA9ICh0aGlzLnYyLnZhbHVlIC0gdGhpcy5vZmZzZXQu
dmFsdWUpIC8gdGhpcy5zY2FsZS52YWx1ZTsKKyAgfQorfQorCisvKioKKyAqIENhbGN1bGF0ZSB0
aGUgd2Fsa2Fib3V0IHN0cmVuZ3RoLCB0aGUgc3RheSBmbGFnLCBhbmQsIGlmIGl0IGlzCisgKiAn
c3RheScsIHRoZSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgb3V0cHV0IG9mIHRoaXMgY29uc3RyYWlu
dC4gQXNzdW1lCisgKiB0aGlzIGNvbnN0cmFpbnQgaXMgc2F0aXNmaWVkLgorICovCitTY2FsZUNv
bnN0cmFpbnQucHJvdG90eXBlLnJlY2FsY3VsYXRlID0gZnVuY3Rpb24gKCkgeworICB2YXIgaWhu
ID0gdGhpcy5pbnB1dCgpLCBvdXQgPSB0aGlzLm91dHB1dCgpOworICBvdXQud2Fsa1N0cmVuZ3Ro
ID0gU3RyZW5ndGgud2Vha2VzdE9mKHRoaXMuc3RyZW5ndGgsIGlobi53YWxrU3RyZW5ndGgpOwor
ICBvdXQuc3RheSA9IGlobi5zdGF5ICYmIHRoaXMuc2NhbGUuc3RheSAmJiB0aGlzLm9mZnNldC5z
dGF5OworICBpZiAob3V0LnN0YXkpIHRoaXMuZXhlY3V0ZSgpOworfQorCisvKiAtLS0gKgorICog
RSBxIHUgYSBsIGkgdCAgeSAgIEMgbyBuIHMgdCByIGEgaSBuIHQKKyAqIC0tLSAqLworCisvKioK
KyAqIENvbnN0cmFpbnMgdHdvIHZhcmlhYmxlcyB0byBoYXZlIHRoZSBzYW1lIHZhbHVlLgorICov
CitmdW5jdGlvbiBFcXVhbGl0eUNvbnN0cmFpbnQodmFyMSwgdmFyMiwgc3RyZW5ndGgpIHsKKyAg
RXF1YWxpdHlDb25zdHJhaW50LnN1cGVyQ29uc3RydWN0b3IuY2FsbCh0aGlzLCB2YXIxLCB2YXIy
LCBzdHJlbmd0aCk7Cit9CisKK0VxdWFsaXR5Q29uc3RyYWludC5pbmhlcml0c0Zyb20oQmluYXJ5
Q29uc3RyYWludCk7CisKKy8qKgorICogRW5mb3JjZSB0aGlzIGNvbnN0cmFpbnQuIEFzc3VtZSB0
aGF0IGl0IGlzIHNhdGlzZmllZC4KKyAqLworRXF1YWxpdHlDb25zdHJhaW50LnByb3RvdHlwZS5l
eGVjdXRlID0gZnVuY3Rpb24gKCkgeworICB0aGlzLm91dHB1dCgpLnZhbHVlID0gdGhpcy5pbnB1
dCgpLnZhbHVlOworfQorCisvKiAtLS0gKgorICogViBhIHIgaSBhIGIgbCBlCisgKiAtLS0gKi8K
KworLyoqCisgKiBBIGNvbnN0cmFpbmVkIHZhcmlhYmxlLiBJbiBhZGRpdGlvbiB0byBpdHMgdmFs
dWUsIGl0IG1haW50YWluIHRoZQorICogc3RydWN0dXJlIG9mIHRoZSBjb25zdHJhaW50IGdyYXBo
LCB0aGUgY3VycmVudCBkYXRhZmxvdyBncmFwaCwgYW5kCisgKiB2YXJpb3VzIHBhcmFtZXRlcnMg
b2YgaW50ZXJlc3QgdG8gdGhlIERlbHRhQmx1ZSBpbmNyZW1lbnRhbAorICogY29uc3RyYWludCBz
b2x2ZXIuCisgKiovCitmdW5jdGlvbiBWYXJpYWJsZShuYW1lLCBpbml0aWFsVmFsdWUpIHsKKyAg
dGhpcy52YWx1ZSA9IGluaXRpYWxWYWx1ZSB8fCAwOworICB0aGlzLmNvbnN0cmFpbnRzID0gbmV3
IE9yZGVyZWRDb2xsZWN0aW9uKCk7CisgIHRoaXMuZGV0ZXJtaW5lZEJ5ID0gbnVsbDsKKyAgdGhp
cy5tYXJrID0gMDsKKyAgdGhpcy53YWxrU3RyZW5ndGggPSBTdHJlbmd0aC5XRUFLRVNUOworICB0
aGlzLnN0YXkgPSB0cnVlOworICB0aGlzLm5hbWUgPSBuYW1lOworfQorCisvKioKKyAqIEFkZCB0
aGUgZ2l2ZW4gY29uc3RyYWludCB0byB0aGUgc2V0IG9mIGFsbCBjb25zdHJhaW50cyB0aGF0IHJl
ZmVyCisgKiB0aGlzIHZhcmlhYmxlLgorICovCitWYXJpYWJsZS5wcm90b3R5cGUuYWRkQ29uc3Ry
YWludCA9IGZ1bmN0aW9uIChjKSB7CisgIHRoaXMuY29uc3RyYWludHMuYWRkKGMpOworfQorCisv
KioKKyAqIFJlbW92ZXMgYWxsIHRyYWNlcyBvZiBjIGZyb20gdGhpcyB2YXJpYWJsZS4KKyAqLwor
VmFyaWFibGUucHJvdG90eXBlLnJlbW92ZUNvbnN0cmFpbnQgPSBmdW5jdGlvbiAoYykgeworICB0
aGlzLmNvbnN0cmFpbnRzLnJlbW92ZShjKTsKKyAgaWYgKHRoaXMuZGV0ZXJtaW5lZEJ5ID09IGMp
IHRoaXMuZGV0ZXJtaW5lZEJ5ID0gbnVsbDsKK30KKworLyogLS0tICoKKyAqIFAgbCBhIG4gbiBl
IHIKKyAqIC0tLSAqLworCisvKioKKyAqIFRoZSBEZWx0YUJsdWUgcGxhbm5lcgorICovCitmdW5j
dGlvbiBQbGFubmVyKCkgeworICB0aGlzLmN1cnJlbnRNYXJrID0gMDsKK30KKworLyoqCisgKiBB
dHRlbXB0IHRvIHNhdGlzZnkgdGhlIGdpdmVuIGNvbnN0cmFpbnQgYW5kLCBpZiBzdWNjZXNzZnVs
LAorICogaW5jcmVtZW50YWxseSB1cGRhdGUgdGhlIGRhdGFmbG93IGdyYXBoLiAgRGV0YWlsczog
SWYgc2F0aWZ5aW5nCisgKiB0aGUgY29uc3RyYWludCBpcyBzdWNjZXNzZnVsLCBpdCBtYXkgb3Zl
cnJpZGUgYSB3ZWFrZXIgY29uc3RyYWludAorICogb24gaXRzIG91dHB1dC4gVGhlIGFsZ29yaXRo
bSBhdHRlbXB0cyB0byByZXNhdGlzZnkgdGhhdAorICogY29uc3RyYWludCB1c2luZyBzb21lIG90
aGVyIG1ldGhvZC4gVGhpcyBwcm9jZXNzIGlzIHJlcGVhdGVkCisgKiB1bnRpbCBlaXRoZXIgYSkg
aXQgcmVhY2hlcyBhIHZhcmlhYmxlIHRoYXQgd2FzIG5vdCBwcmV2aW91c2x5CisgKiBkZXRlcm1p
bmVkIGJ5IGFueSBjb25zdHJhaW50IG9yIGIpIGl0IHJlYWNoZXMgYSBjb25zdHJhaW50IHRoYXQK
KyAqIGlzIHRvbyB3ZWFrIHRvIGJlIHNhdGlzZmllZCB1c2luZyBhbnkgb2YgaXRzIG1ldGhvZHMu
IFRoZQorICogdmFyaWFibGVzIG9mIGNvbnN0cmFpbnRzIHRoYXQgaGF2ZSBiZWVuIHByb2Nlc3Nl
ZCBhcmUgbWFya2VkIHdpdGgKKyAqIGEgdW5pcXVlIG1hcmsgdmFsdWUgc28gdGhhdCB3ZSBrbm93
IHdoZXJlIHdlJ3ZlIGJlZW4uIFRoaXMgYWxsb3dzCisgKiB0aGUgYWxnb3JpdGhtIHRvIGF2b2lk
IGdldHRpbmcgaW50byBhbiBpbmZpbml0ZSBsb29wIGV2ZW4gaWYgdGhlCisgKiBjb25zdHJhaW50
IGdyYXBoIGhhcyBhbiBpbmFkdmVydGVudCBjeWNsZS4KKyAqLworUGxhbm5lci5wcm90b3R5cGUu
aW5jcmVtZW50YWxBZGQgPSBmdW5jdGlvbiAoYykgeworICB2YXIgbWFyayA9IHRoaXMubmV3TWFy
aygpOworICB2YXIgb3ZlcnJpZGRlbiA9IGMuc2F0aXNmeShtYXJrKTsKKyAgd2hpbGUgKG92ZXJy
aWRkZW4gIT0gbnVsbCkKKyAgICBvdmVycmlkZGVuID0gb3ZlcnJpZGRlbi5zYXRpc2Z5KG1hcmsp
OworfQorCisvKioKKyAqIEVudHJ5IHBvaW50IGZvciByZXRyYWN0aW5nIGEgY29uc3RyYWludC4g
UmVtb3ZlIHRoZSBnaXZlbgorICogY29uc3RyYWludCBhbmQgaW5jcmVtZW50YWxseSB1cGRhdGUg
dGhlIGRhdGFmbG93IGdyYXBoLgorICogRGV0YWlsczogUmV0cmFjdGluZyB0aGUgZ2l2ZW4gY29u
c3RyYWludCBtYXkgYWxsb3cgc29tZSBjdXJyZW50bHkKKyAqIHVuc2F0aXNmaWFibGUgZG93bnN0
cmVhbSBjb25zdHJhaW50IHRvIGJlIHNhdGlzZmllZC4gV2UgdGhlcmVmb3JlIGNvbGxlY3QKKyAq
IGEgbGlzdCBvZiB1bnNhdGlzZmllZCBkb3duc3RyZWFtIGNvbnN0cmFpbnRzIGFuZCBhdHRlbXB0
IHRvCisgKiBzYXRpc2Z5IGVhY2ggb25lIGluIHR1cm4uIFRoaXMgbGlzdCBpcyB0cmF2ZXJzZWQg
YnkgY29uc3RyYWludAorICogc3RyZW5ndGgsIHN0cm9uZ2VzdCBmaXJzdCwgYXMgYSBoZXVyaXN0
aWMgZm9yIGF2b2lkaW5nCisgKiB1bm5lY2Vzc2FyaWx5IGFkZGluZyBhbmQgdGhlbiBvdmVycmlk
aW5nIHdlYWsgY29uc3RyYWludHMuCisgKiBBc3N1bWU6IGMgaXMgc2F0aXNmaWVkLgorICovCitQ
bGFubmVyLnByb3RvdHlwZS5pbmNyZW1lbnRhbFJlbW92ZSA9IGZ1bmN0aW9uIChjKSB7CisgIHZh
ciBvdXQgPSBjLm91dHB1dCgpOworICBjLm1hcmtVbnNhdGlzZmllZCgpOworICBjLnJlbW92ZUZy
b21HcmFwaCgpOworICB2YXIgdW5zYXRpc2ZpZWQgPSB0aGlzLnJlbW92ZVByb3BhZ2F0ZUZyb20o
b3V0KTsKKyAgdmFyIHN0cmVuZ3RoID0gU3RyZW5ndGguUkVRVUlSRUQ7CisgIGRvIHsKKyAgICBm
b3IgKHZhciB1IG9mIHVuc2F0aXNmaWVkLmVsbXMpIHsKKyAgICAgIGlmICh1LnN0cmVuZ3RoID09
IHN0cmVuZ3RoKQorICAgICAgICB0aGlzLmluY3JlbWVudGFsQWRkKHUpOworICAgIH0KKyAgICBz
dHJlbmd0aCA9IHN0cmVuZ3RoLm5leHRXZWFrZXIoKTsKKyAgfSB3aGlsZSAoc3RyZW5ndGggIT0g
U3RyZW5ndGguV0VBS0VTVCk7Cit9CisKKy8qKgorICogU2VsZWN0IGEgcHJldmlvdXNseSB1bnVz
ZWQgbWFyayB2YWx1ZS4KKyAqLworUGxhbm5lci5wcm90b3R5cGUubmV3TWFyayA9IGZ1bmN0aW9u
ICgpIHsKKyAgcmV0dXJuICsrdGhpcy5jdXJyZW50TWFyazsKK30KKworLyoqCisgKiBFeHRyYWN0
IGEgcGxhbiBmb3IgcmVzYXRpc2ZhY3Rpb24gc3RhcnRpbmcgZnJvbSB0aGUgZ2l2ZW4gc291cmNl
CisgKiBjb25zdHJhaW50cywgdXN1YWxseSBhIHNldCBvZiBpbnB1dCBjb25zdHJhaW50cy4gVGhp
cyBtZXRob2QKKyAqIGFzc3VtZXMgdGhhdCBzdGF5IG9wdGltaXphdGlvbiBpcyBkZXNpcmVkOyB0
aGUgcGxhbiB3aWxsIGNvbnRhaW4KKyAqIG9ubHkgY29uc3RyYWludHMgd2hvc2Ugb3V0cHV0IHZh
cmlhYmxlcyBhcmUgbm90IHN0YXkuIENvbnN0cmFpbnRzCisgKiB0aGF0IGRvIG5vIGNvbXB1dGF0
aW9uLCBzdWNoIGFzIHN0YXkgYW5kIGVkaXQgY29uc3RyYWludHMsIGFyZQorICogbm90IGluY2x1
ZGVkIGluIHRoZSBwbGFuLgorICogRGV0YWlsczogVGhlIG91dHB1dHMgb2YgYSBjb25zdHJhaW50
IGFyZSBtYXJrZWQgd2hlbiBpdCBpcyBhZGRlZAorICogdG8gdGhlIHBsYW4gdW5kZXIgY29uc3Ry
dWN0aW9uLiBBIGNvbnN0cmFpbnQgbWF5IGJlIGFwcGVuZGVkIHRvCisgKiB0aGUgcGxhbiB3aGVu
IGFsbCBpdHMgaW5wdXQgdmFyaWFibGVzIGFyZSBrbm93bi4gQSB2YXJpYWJsZSBpcworICoga25v
d24gaWYgZWl0aGVyIGEpIHRoZSB2YXJpYWJsZSBpcyBtYXJrZWQgKGluZGljYXRpbmcgdGhhdCBo
YXMKKyAqIGJlZW4gY29tcHV0ZWQgYnkgYSBjb25zdHJhaW50IGFwcGVhcmluZyBlYXJsaWVyIGlu
IHRoZSBwbGFuKSwgYikKKyAqIHRoZSB2YXJpYWJsZSBpcyAnc3RheScgKGkuZS4gaXQgaXMgYSBj
b25zdGFudCBhdCBwbGFuIGV4ZWN1dGlvbgorICogdGltZSksIG9yIGMpIHRoZSB2YXJpYWJsZSBp
cyBub3QgZGV0ZXJtaW5lZCBieSBhbnkKKyAqIGNvbnN0cmFpbnQuIFRoZSBsYXN0IHByb3Zpc2lv
biBpcyBmb3IgcGFzdCBzdGF0ZXMgb2YgaGlzdG9yeQorICogdmFyaWFibGVzLCB3aGljaCBhcmUg
bm90IHN0YXkgYnV0IHdoaWNoIGFyZSBhbHNvIG5vdCBjb21wdXRlZCBieQorICogYW55IGNvbnN0
cmFpbnQuCisgKiBBc3N1bWU6IHNvdXJjZXMgYXJlIGFsbCBzYXRpc2ZpZWQuCisgKi8KK1BsYW5u
ZXIucHJvdG90eXBlLm1ha2VQbGFuID0gZnVuY3Rpb24gKHNvdXJjZXMpIHsKKyAgdmFyIG1hcmsg
PSB0aGlzLm5ld01hcmsoKTsKKyAgdmFyIHBsYW4gPSBuZXcgUGxhbigpOworICB2YXIgdG9kbyA9
IHNvdXJjZXM7CisgIHdoaWxlICh0b2RvLnNpemUoKSA+IDApIHsKKyAgICB2YXIgYyA9IHRvZG8u
cmVtb3ZlRmlyc3QoKTsKKyAgICBpZiAoYy5vdXRwdXQoKS5tYXJrICE9IG1hcmsgJiYgYy5pbnB1
dHNLbm93bihtYXJrKSkgeworICAgICAgcGxhbi5hZGRDb25zdHJhaW50KGMpOworICAgICAgYy5v
dXRwdXQoKS5tYXJrID0gbWFyazsKKyAgICAgIHRoaXMuYWRkQ29uc3RyYWludHNDb25zdW1pbmdU
byhjLm91dHB1dCgpLCB0b2RvKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBsYW47Cit9CisKKy8q
KgorICogRXh0cmFjdCBhIHBsYW4gZm9yIHJlc2F0aXNmeWluZyBzdGFydGluZyBmcm9tIHRoZSBv
dXRwdXQgb2YgdGhlCisgKiBnaXZlbiBjb25zdHJhaW50cywgdXN1YWxseSBhIHNldCBvZiBpbnB1
dCBjb25zdHJhaW50cy4KKyAqLworUGxhbm5lci5wcm90b3R5cGUuZXh0cmFjdFBsYW5Gcm9tQ29u
c3RyYWludHMgPSBmdW5jdGlvbiAoY29uc3RyYWludHMpIHsKKyAgdmFyIHNvdXJjZXMgPSBuZXcg
T3JkZXJlZENvbGxlY3Rpb24oKTsKKyAgZm9yICh2YXIgYyBvZiBjb25zdHJhaW50cy5lbG1zKSB7
CisgICAgaWYgKGMuaXNJbnB1dCgpICYmIGMuaXNTYXRpc2ZpZWQoKSkKKyAgICAgIC8vIG5vdCBp
biBwbGFuIGFscmVhZHkgYW5kIGVsaWdpYmxlIGZvciBpbmNsdXNpb24KKyAgICAgIHNvdXJjZXMu
YWRkKGMpOworICB9CisgIHJldHVybiB0aGlzLm1ha2VQbGFuKHNvdXJjZXMpOworfQorCisvKioK
KyAqIFJlY29tcHV0ZSB0aGUgd2Fsa2Fib3V0IHN0cmVuZ3RocyBhbmQgc3RheSBmbGFncyBvZiBh
bGwgdmFyaWFibGVzCisgKiBkb3duc3RyZWFtIG9mIHRoZSBnaXZlbiBjb25zdHJhaW50IGFuZCBy
ZWNvbXB1dGUgdGhlIGFjdHVhbAorICogdmFsdWVzIG9mIGFsbCB2YXJpYWJsZXMgd2hvc2Ugc3Rh
eSBmbGFnIGlzIHRydWUuIElmIGEgY3ljbGUgaXMKKyAqIGRldGVjdGVkLCByZW1vdmUgdGhlIGdp
dmVuIGNvbnN0cmFpbnQgYW5kIGFuc3dlcgorICogZmFsc2UuIE90aGVyd2lzZSwgYW5zd2VyIHRy
dWUuCisgKiBEZXRhaWxzOiBDeWNsZXMgYXJlIGRldGVjdGVkIHdoZW4gYSBtYXJrZWQgdmFyaWFi
bGUgaXMKKyAqIGVuY291bnRlcmVkIGRvd25zdHJlYW0gb2YgdGhlIGdpdmVuIGNvbnN0cmFpbnQu
IFRoZSBzZW5kZXIgaXMKKyAqIGFzc3VtZWQgdG8gaGF2ZSBtYXJrZWQgdGhlIGlucHV0cyBvZiB0
aGUgZ2l2ZW4gY29uc3RyYWludCB3aXRoCisgKiB0aGUgZ2l2ZW4gbWFyay4gVGh1cywgZW5jb3Vu
dGVyaW5nIGEgbWFya2VkIG5vZGUgZG93bnN0cmVhbSBvZgorICogdGhlIG91dHB1dCBjb25zdHJh
aW50IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBwYXRoIGZyb20gdGhlCisgKiBjb25zdHJhaW50J3Mg
b3V0cHV0IHRvIG9uZSBvZiBpdHMgaW5wdXRzLgorICovCitQbGFubmVyLnByb3RvdHlwZS5hZGRQ
cm9wYWdhdGUgPSBmdW5jdGlvbiAoYywgbWFyaykgeworICB2YXIgdG9kbyA9IG5ldyBPcmRlcmVk
Q29sbGVjdGlvbigpOworICB0b2RvLmFkZChjKTsKKyAgd2hpbGUgKHRvZG8uc2l6ZSgpID4gMCkg
eworICAgIHZhciBkID0gdG9kby5yZW1vdmVGaXJzdCgpOworICAgIGlmIChkLm91dHB1dCgpLm1h
cmsgPT0gbWFyaykgeworICAgICAgdGhpcy5pbmNyZW1lbnRhbFJlbW92ZShjKTsKKyAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisgICAgZC5yZWNhbGN1bGF0ZSgpOworICAgIHRoaXMuYWRkQ29u
c3RyYWludHNDb25zdW1pbmdUbyhkLm91dHB1dCgpLCB0b2RvKTsKKyAgfQorICByZXR1cm4gdHJ1
ZTsKK30KKworCisvKioKKyAqIFVwZGF0ZSB0aGUgd2Fsa2Fib3V0IHN0cmVuZ3RocyBhbmQgc3Rh
eSBmbGFncyBvZiBhbGwgdmFyaWFibGVzCisgKiBkb3duc3RyZWFtIG9mIHRoZSBnaXZlbiBjb25z
dHJhaW50LiBBbnN3ZXIgYSBjb2xsZWN0aW9uIG9mCisgKiB1bnNhdGlzZmllZCBjb25zdHJhaW50
cyBzb3J0ZWQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZyBzdHJlbmd0aC4KKyAqLworUGxhbm5lci5w
cm90b3R5cGUucmVtb3ZlUHJvcGFnYXRlRnJvbSA9IGZ1bmN0aW9uIChvdXQpIHsKKyAgb3V0LmRl
dGVybWluZWRCeSA9IG51bGw7CisgIG91dC53YWxrU3RyZW5ndGggPSBTdHJlbmd0aC5XRUFLRVNU
OworICBvdXQuc3RheSA9IHRydWU7CisgIHZhciB1bnNhdGlzZmllZCA9IG5ldyBPcmRlcmVkQ29s
bGVjdGlvbigpOworICB2YXIgdG9kbyA9IG5ldyBPcmRlcmVkQ29sbGVjdGlvbigpOworICB0b2Rv
LmFkZChvdXQpOworICB3aGlsZSAodG9kby5zaXplKCkgPiAwKSB7CisgICAgdmFyIHYgPSB0b2Rv
LnJlbW92ZUZpcnN0KCk7CisgICAgZm9yICh2YXIgYyBvZiB2LmNvbnN0cmFpbnRzLmVsbXMpIHsK
KyAgICAgIGlmICghYy5pc1NhdGlzZmllZCgpKQorICAgICAgICB1bnNhdGlzZmllZC5hZGQoYyk7
CisgICAgfQorICAgIHZhciBkZXRlcm1pbmluZyA9IHYuZGV0ZXJtaW5lZEJ5OworICAgIGZvciAo
dmFyIG5leHQgb2Ygdi5jb25zdHJhaW50cy5lbG1zKSB7CisgICAgICBpZiAobmV4dCAhPSBkZXRl
cm1pbmluZyAmJiBuZXh0LmlzU2F0aXNmaWVkKCkpIHsKKyAgICAgICAgbmV4dC5yZWNhbGN1bGF0
ZSgpOworICAgICAgICB0b2RvLmFkZChuZXh0Lm91dHB1dCgpKTsKKyAgICAgIH0KKyAgICB9Cisg
IH0KKyAgcmV0dXJuIHVuc2F0aXNmaWVkOworfQorCitQbGFubmVyLnByb3RvdHlwZS5hZGRDb25z
dHJhaW50c0NvbnN1bWluZ1RvID0gZnVuY3Rpb24gKHYsIGNvbGwpIHsKKyAgdmFyIGRldGVybWlu
aW5nID0gdi5kZXRlcm1pbmVkQnk7CisgIHZhciBjYyA9IHYuY29uc3RyYWludHM7CisgIGZvciAo
dmFyIGMgb2YgY2MuZWxtcykgeworICAgIGlmIChjICE9IGRldGVybWluaW5nICYmIGMuaXNTYXRp
c2ZpZWQoKSkKKyAgICAgIGNvbGwuYWRkKGMpOworICB9Cit9CisKKy8qIC0tLSAqCisgKiBQIGwg
YSBuCisgKiAtLS0gKi8KKworLyoqCisgKiBBIFBsYW4gaXMgYW4gb3JkZXJlZCBsaXN0IG9mIGNv
bnN0cmFpbnRzIHRvIGJlIGV4ZWN1dGVkIGluIHNlcXVlbmNlCisgKiB0byByZXNhdGlzZnkgYWxs
IGN1cnJlbnRseSBzYXRpc2ZpYWJsZSBjb25zdHJhaW50cyBpbiB0aGUgZmFjZSBvZgorICogb25l
IG9yIG1vcmUgY2hhbmdpbmcgaW5wdXRzLgorICovCitmdW5jdGlvbiBQbGFuKCkgeworICB0aGlz
LnYgPSBuZXcgT3JkZXJlZENvbGxlY3Rpb24oKTsKK30KKworUGxhbi5wcm90b3R5cGUuYWRkQ29u
c3RyYWludCA9IGZ1bmN0aW9uIChjKSB7CisgIHRoaXMudi5hZGQoYyk7Cit9CisKK1BsYW4ucHJv
dG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0aGlzLnYuc2l6ZSgpOworfQor
CitQbGFuLnByb3RvdHlwZS5jb25zdHJhaW50QXQgPSBmdW5jdGlvbiAoaW5kZXgpIHsKKyAgcmV0
dXJuIHRoaXMudi5hdChpbmRleCk7Cit9CisKK1BsYW4ucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5j
dGlvbiAoKSB7CisgIGZvciAodmFyIGMgb2YgdGhpcy52LmVsbXMpIHsKKyAgICBjLmV4ZWN1dGUo
KTsKKyAgfQorfQorCisvKiAtLS0gKgorICogTSBhIGkgbgorICogLS0tICovCisKKy8qKgorICog
VGhpcyBpcyB0aGUgc3RhbmRhcmQgRGVsdGFCbHVlIGJlbmNobWFyay4gQSBsb25nIGNoYWluIG9m
IGVxdWFsaXR5CisgKiBjb25zdHJhaW50cyBpcyBjb25zdHJ1Y3RlZCB3aXRoIGEgc3RheSBjb25z
dHJhaW50IG9uIG9uZSBlbmQuIEFuCisgKiBlZGl0IGNvbnN0cmFpbnQgaXMgdGhlbiBhZGRlZCB0
byB0aGUgb3Bwb3NpdGUgZW5kIGFuZCB0aGUgdGltZSBpcworICogbWVhc3VyZWQgZm9yIGFkZGlu
ZyBhbmQgcmVtb3ZpbmcgdGhpcyBjb25zdHJhaW50LCBhbmQgZXh0cmFjdGluZworICogYW5kIGV4
ZWN1dGluZyBhIGNvbnN0cmFpbnQgc2F0aXNmYWN0aW9uIHBsYW4uIFRoZXJlIGFyZSB0d28gY2Fz
ZXMuCisgKiBJbiBjYXNlIDEsIHRoZSBhZGRlZCBjb25zdHJhaW50IGlzIHN0cm9uZ2VyIHRoYW4g
dGhlIHN0YXkKKyAqIGNvbnN0cmFpbnQgYW5kIHZhbHVlcyBtdXN0IHByb3BhZ2F0ZSBkb3duIHRo
ZSBlbnRpcmUgbGVuZ3RoIG9mIHRoZQorICogY2hhaW4uIEluIGNhc2UgMiwgdGhlIGFkZGVkIGNv
bnN0cmFpbnQgaXMgd2Vha2VyIHRoYW4gdGhlIHN0YXkKKyAqIGNvbnN0cmFpbnQgc28gaXQgY2Fu
bm90IGJlIGFjY29tb2RhdGVkLiBUaGUgY29zdCBpbiB0aGlzIGNhc2UgaXMsCisgKiBvZiBjb3Vy
c2UsIHZlcnkgbG93LiBUeXBpY2FsIHNpdHVhdGlvbnMgbGllIHNvbWV3aGVyZSBiZXR3ZWVuIHRo
ZXNlCisgKiB0d28gZXh0cmVtZXMuCisgKi8KK2Z1bmN0aW9uIGNoYWluVGVzdChuKSB7CisgIHBs
YW5uZXIgPSBuZXcgUGxhbm5lcigpOworICB2YXIgcHJldiA9IG51bGwsIGZpcnN0ID0gbnVsbCwg
bGFzdCA9IG51bGw7CisKKyAgLy8gQnVpbGQgY2hhaW4gb2YgbiBlcXVhbGl0eSBjb25zdHJhaW50
cworICBmb3IgKHZhciBpID0gMDsgaSA8PSBuOyBpKyspIHsKKyAgICB2YXIgbmFtZSA9ICJ2IiAr
IGk7CisgICAgdmFyIHYgPSBuZXcgVmFyaWFibGUobmFtZSk7CisgICAgaWYgKHByZXYgIT0gbnVs
bCkKKyAgICAgIG5ldyBFcXVhbGl0eUNvbnN0cmFpbnQocHJldiwgdiwgU3RyZW5ndGguUkVRVUlS
RUQpOworICAgIGlmIChpID09IDApIGZpcnN0ID0gdjsKKyAgICBpZiAoaSA9PSBuKSBsYXN0ID0g
djsKKyAgICBwcmV2ID0gdjsKKyAgfQorCisgIG5ldyBTdGF5Q29uc3RyYWludChsYXN0LCBTdHJl
bmd0aC5TVFJPTkdfREVGQVVMVCk7CisgIHZhciBlZGl0ID0gbmV3IEVkaXRDb25zdHJhaW50KGZp
cnN0LCBTdHJlbmd0aC5QUkVGRVJSRUQpOworICB2YXIgZWRpdHMgPSBuZXcgT3JkZXJlZENvbGxl
Y3Rpb24oKTsKKyAgZWRpdHMuYWRkKGVkaXQpOworICB2YXIgcGxhbiA9IHBsYW5uZXIuZXh0cmFj
dFBsYW5Gcm9tQ29uc3RyYWludHMoZWRpdHMpOworICBmb3IgKHZhciBpID0gMDsgaSA8IDEwMDsg
aSsrKSB7CisgICAgZmlyc3QudmFsdWUgPSBpOworICAgIHBsYW4uZXhlY3V0ZSgpOworICAgIGlm
IChsYXN0LnZhbHVlICE9IGkpCisgICAgICBhbGVydCgiQ2hhaW4gdGVzdCBmYWlsZWQuIik7Cisg
IH0KK30KKworLyoqCisgKiBUaGlzIHRlc3QgY29uc3RydWN0cyBhIHR3byBzZXRzIG9mIHZhcmlh
YmxlcyByZWxhdGVkIHRvIGVhY2gKKyAqIG90aGVyIGJ5IGEgc2ltcGxlIGxpbmVhciB0cmFuc2Zv
cm1hdGlvbiAoc2NhbGUgYW5kIG9mZnNldCkuIFRoZQorICogdGltZSBpcyBtZWFzdXJlZCB0byBj
aGFuZ2UgYSB2YXJpYWJsZSBvbiBlaXRoZXIgc2lkZSBvZiB0aGUKKyAqIG1hcHBpbmcgYW5kIHRv
IGNoYW5nZSB0aGUgc2NhbGUgYW5kIG9mZnNldCBmYWN0b3JzLgorICovCitmdW5jdGlvbiBwcm9q
ZWN0aW9uVGVzdChuKSB7CisgIHBsYW5uZXIgPSBuZXcgUGxhbm5lcigpOworICB2YXIgc2NhbGUg
PSBuZXcgVmFyaWFibGUoInNjYWxlIiwgMTApOworICB2YXIgb2Zmc2V0ID0gbmV3IFZhcmlhYmxl
KCJvZmZzZXQiLCAxMDAwKTsKKyAgdmFyIHNyYyA9IG51bGwsIGRzdCA9IG51bGw7CisKKyAgdmFy
IGRlc3RzID0gbmV3IE9yZGVyZWRDb2xsZWN0aW9uKCk7CisgIGZvciAodmFyIGkgPSAwOyBpIDwg
bjsgaSsrKSB7CisgICAgc3JjID0gbmV3IFZhcmlhYmxlKCJzcmMiICsgaSwgaSk7CisgICAgZHN0
ID0gbmV3IFZhcmlhYmxlKCJkc3QiICsgaSwgaSk7CisgICAgZGVzdHMuYWRkKGRzdCk7CisgICAg
bmV3IFN0YXlDb25zdHJhaW50KHNyYywgU3RyZW5ndGguTk9STUFMKTsKKyAgICBuZXcgU2NhbGVD
b25zdHJhaW50KHNyYywgc2NhbGUsIG9mZnNldCwgZHN0LCBTdHJlbmd0aC5SRVFVSVJFRCk7Cisg
IH0KKworICBjaGFuZ2Uoc3JjLCAxNyk7CisgIGlmIChkc3QudmFsdWUgIT0gMTE3MCkgYWxlcnQo
IlByb2plY3Rpb24gMSBmYWlsZWQiKTsKKyAgY2hhbmdlKGRzdCwgMTA1MCk7CisgIGlmIChzcmMu
dmFsdWUgIT0gNSkgYWxlcnQoIlByb2plY3Rpb24gMiBmYWlsZWQiKTsKKyAgY2hhbmdlKHNjYWxl
LCA1KTsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7CisgICAgaWYgKGRlc3Rz
LmF0KGkpLnZhbHVlICE9IGkgKiA1ICsgMTAwMCkKKyAgICAgIGFsZXJ0KCJQcm9qZWN0aW9uIDMg
ZmFpbGVkIik7CisgIH0KKyAgY2hhbmdlKG9mZnNldCwgMjAwMCk7CisgIGZvciAodmFyIGkgPSAw
OyBpIDwgbiAtIDE7IGkrKykgeworICAgIGlmIChkZXN0cy5hdChpKS52YWx1ZSAhPSBpICogNSAr
IDIwMDApCisgICAgICBhbGVydCgiUHJvamVjdGlvbiA0IGZhaWxlZCIpOworICB9Cit9CisKK2Z1
bmN0aW9uIGNoYW5nZSh2LCBuZXdWYWx1ZSkgeworICB2YXIgZWRpdCA9IG5ldyBFZGl0Q29uc3Ry
YWludCh2LCBTdHJlbmd0aC5QUkVGRVJSRUQpOworICB2YXIgZWRpdHMgPSBuZXcgT3JkZXJlZENv
bGxlY3Rpb24oKTsKKyAgZWRpdHMuYWRkKGVkaXQpOworICB2YXIgcGxhbiA9IHBsYW5uZXIuZXh0
cmFjdFBsYW5Gcm9tQ29uc3RyYWludHMoZWRpdHMpOworICBmb3IgKHZhciBpID0gMDsgaSA8IDEw
OyBpKyspIHsKKyAgICB2LnZhbHVlID0gbmV3VmFsdWU7CisgICAgcGxhbi5leGVjdXRlKCk7Cisg
IH0KKyAgZWRpdC5kZXN0cm95Q29uc3RyYWludCgpOworfQorCisvLyBHbG9iYWwgdmFyaWFibGUg
aG9sZGluZyB0aGUgY3VycmVudCBwbGFubmVyLgordmFyIHBsYW5uZXIgPSBudWxsOworCitmdW5j
dGlvbiBkZWx0YUJsdWUoKSB7CisgIGNoYWluVGVzdCg1MCk7CisgIHByb2plY3Rpb25UZXN0KDUw
KTsKK30KKworZm9yICh2YXIgaSA9IDA7IGkgPCAxMDA7ICsraSkKKyAgICBkZWx0YUJsdWUoKTsK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy90eXBlUHJvZmlsZXIvZ2V0dGVyLXJp
Y2hhcmRzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy90eXBl
UHJvZmlsZXIvZ2V0dGVyLXJpY2hhcmRzLmpzCShub25leGlzdGVudCkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS90ZXN0cy90eXBlUHJvZmlsZXIvZ2V0dGVyLXJpY2hhcmRzLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNTkzIEBACisvLyBDb3B5cmlnaHQgMjAwNi0yMDA4IHRoZSBWOCBw
cm9qZWN0IGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNCBB
cHBsZSBJbmMuCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisv
LyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorLy8gICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gICAgICAgY29weXJpZ2h0
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKy8vICAg
ICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZAorLy8gICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVp
dGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gICAg
ICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkCisvLyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
Ky8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8v
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisvLyBUaGlzIGlzIGEgSmF2YVNjcmlw
dCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmljaGFyZHMKKy8vIGJlbmNobWFyayBmcm9tOgorLy8K
Ky8vICAgIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tcjEwL0JlbmNoLmh0bWwKKy8vCisvLyBU
aGUgYmVuY2htYXJrIHdhcyBvcmlnaW5hbGx5IGltcGxlbWVudGVkIGluIEJDUEwgYnkKKy8vIE1h
cnRpbiBSaWNoYXJkcy4gSXQgd2FzIHRoZW4gcG9ydGVkIHRvIEphdmFTY3JpcHQgYnkgdGhlCisv
LyBWOCBwcm9qZWN0IGF1dGhvcnMsIGFuZCB0aGVuIHN1YnNlcXVlbnRseSBpdCB3YXMgbW9kaWZp
ZWQKKy8vIHRvIHVzZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGJ5IFdlYktpdCBhdXRob3JzLgorCisK
Ky8qKgorICogVGhlIFJpY2hhcmRzIGJlbmNobWFyayBzaW11bGF0ZXMgdGhlIHRhc2sgZGlzcGF0
Y2hlciBvZiBhbgorICogb3BlcmF0aW5nIHN5c3RlbS4KKyAqKi8KK2Z1bmN0aW9uIHJ1blJpY2hh
cmRzKCkgeworICB2YXIgc2NoZWR1bGVyID0gbmV3IFNjaGVkdWxlcigpOworICBzY2hlZHVsZXIu
YWRkSWRsZVRhc2soSURfSURMRSwgMCwgbnVsbCwgQ09VTlQpOworCisgIHZhciBxdWV1ZSA9IG5l
dyBQYWNrZXQobnVsbCwgSURfV09SS0VSLCBLSU5EX1dPUkspOworICBxdWV1ZSA9IG5ldyBQYWNr
ZXQocXVldWUsICBJRF9XT1JLRVIsIEtJTkRfV09SSyk7CisgIHNjaGVkdWxlci5hZGRXb3JrZXJU
YXNrKElEX1dPUktFUiwgMTAwMCwgcXVldWUpOworCisgIHF1ZXVlID0gbmV3IFBhY2tldChudWxs
LCBJRF9ERVZJQ0VfQSwgS0lORF9ERVZJQ0UpOworICBxdWV1ZSA9IG5ldyBQYWNrZXQocXVldWUs
ICBJRF9ERVZJQ0VfQSwgS0lORF9ERVZJQ0UpOworICBxdWV1ZSA9IG5ldyBQYWNrZXQocXVldWUs
ICBJRF9ERVZJQ0VfQSwgS0lORF9ERVZJQ0UpOworICBzY2hlZHVsZXIuYWRkSGFuZGxlclRhc2so
SURfSEFORExFUl9BLCAyMDAwLCBxdWV1ZSk7CisKKyAgcXVldWUgPSBuZXcgUGFja2V0KG51bGws
IElEX0RFVklDRV9CLCBLSU5EX0RFVklDRSk7CisgIHF1ZXVlID0gbmV3IFBhY2tldChxdWV1ZSwg
IElEX0RFVklDRV9CLCBLSU5EX0RFVklDRSk7CisgIHF1ZXVlID0gbmV3IFBhY2tldChxdWV1ZSwg
IElEX0RFVklDRV9CLCBLSU5EX0RFVklDRSk7CisgIHNjaGVkdWxlci5hZGRIYW5kbGVyVGFzayhJ
RF9IQU5ETEVSX0IsIDMwMDAsIHF1ZXVlKTsKKworICBzY2hlZHVsZXIuYWRkRGV2aWNlVGFzayhJ
RF9ERVZJQ0VfQSwgNDAwMCwgbnVsbCk7CisKKyAgc2NoZWR1bGVyLmFkZERldmljZVRhc2soSURf
REVWSUNFX0IsIDUwMDAsIG51bGwpOworCisgIHNjaGVkdWxlci5zY2hlZHVsZSgpOworCisgIGlm
IChzY2hlZHVsZXIucXVldWVDb3VudCAhPSBFWFBFQ1RFRF9RVUVVRV9DT1VOVCB8fAorICAgICAg
c2NoZWR1bGVyLmhvbGRDb3VudCAhPSBFWFBFQ1RFRF9IT0xEX0NPVU5UKSB7CisgICAgdmFyIG1z
ZyA9CisgICAgICAgICJFcnJvciBkdXJpbmcgZXhlY3V0aW9uOiBxdWV1ZUNvdW50ID0gIiArIHNj
aGVkdWxlci5xdWV1ZUNvdW50ICsKKyAgICAgICAgIiwgaG9sZENvdW50ID0gIiArIHNjaGVkdWxl
ci5ob2xkQ291bnQgKyAiLiI7CisgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CisgIH0KK30KKwor
dmFyIENPVU5UID0gMTAwMDsKKworLyoqCisgKiBUaGVzZSB0d28gY29uc3RhbnRzIHNwZWNpZnkg
aG93IG1hbnkgdGltZXMgYSBwYWNrZXQgaXMgcXVldWVkIGFuZAorICogaG93IG1hbnkgdGltZXMg
YSB0YXNrIGlzIHB1dCBvbiBob2xkIGluIGEgY29ycmVjdCBydW4gb2YgcmljaGFyZHMuCisgKiBU
aGV5IGRvbid0IGhhdmUgYW55IG1lYW5pbmcgYSBzdWNoIGJ1dCBhcmUgY2hhcmFjdGVyaXN0aWMg
b2YgYQorICogY29ycmVjdCBydW4gc28gaWYgdGhlIGFjdHVhbCBxdWV1ZSBvciBob2xkIGNvdW50
IGlzIGRpZmZlcmVudCBmcm9tCisgKiB0aGUgZXhwZWN0ZWQgdGhlcmUgbXVzdCBiZSBhIGJ1ZyBp
biB0aGUgaW1wbGVtZW50YXRpb24uCisgKiovCit2YXIgRVhQRUNURURfUVVFVUVfQ09VTlQgPSAy
MzIyOwordmFyIEVYUEVDVEVEX0hPTERfQ09VTlQgPSA5Mjg7CisKKworLyoqCisgKiBBIHNjaGVk
dWxlciBjYW4gYmUgdXNlZCB0byBzY2hlZHVsZSBhIHNldCBvZiB0YXNrcyBiYXNlZCBvbiB0aGVp
ciByZWxhdGl2ZQorICogcHJpb3JpdGllcy4gIFNjaGVkdWxpbmcgaXMgZG9uZSBieSBtYWludGFp
bmluZyBhIGxpc3Qgb2YgdGFzayBjb250cm9sIGJsb2NrcworICogd2hpY2ggaG9sZHMgdGFza3Mg
YW5kIHRoZSBkYXRhIHF1ZXVlIHRoZXkgYXJlIHByb2Nlc3NpbmcuCisgKiBAY29uc3RydWN0b3IK
KyAqLworZnVuY3Rpb24gU2NoZWR1bGVyKCkgeworICB0aGlzLl9xdWV1ZUNvdW50ID0gMDsKKyAg
dGhpcy5faG9sZENvdW50ID0gMDsKKyAgdGhpcy5fYmxvY2tzID0gbmV3IEFycmF5KE5VTUJFUl9P
Rl9JRFMpOworICB0aGlzLl9saXN0ID0gbnVsbDsKKyAgdGhpcy5fY3VycmVudFRjYiA9IG51bGw7
CisgIHRoaXMuX2N1cnJlbnRJZCA9IG51bGw7Cit9CisKK3ZhciBJRF9JRExFICAgICAgID0gMDsK
K3ZhciBJRF9XT1JLRVIgICAgID0gMTsKK3ZhciBJRF9IQU5ETEVSX0EgID0gMjsKK3ZhciBJRF9I
QU5ETEVSX0IgID0gMzsKK3ZhciBJRF9ERVZJQ0VfQSAgID0gNDsKK3ZhciBJRF9ERVZJQ0VfQiAg
ID0gNTsKK3ZhciBOVU1CRVJfT0ZfSURTID0gNjsKKwordmFyIEtJTkRfREVWSUNFICAgPSAwOwor
dmFyIEtJTkRfV09SSyAgICAgPSAxOworCitTY2hlZHVsZXIucHJvdG90eXBlLl9fZGVmaW5lR2V0
dGVyX18oInF1ZXVlQ291bnQiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3F1ZXVlQ291bnQ7
IH0pOworU2NoZWR1bGVyLnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKCJxdWV1ZUNvdW50Iiwg
ZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5fcXVldWVDb3VudCA9IHZhbHVlOyB9KTsKK1NjaGVkdWxl
ci5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygiaG9sZENvdW50IiwgZnVuY3Rpb24oKSB7IHJl
dHVybiB0aGlzLl9ob2xkQ291bnQ7IH0pOworU2NoZWR1bGVyLnByb3RvdHlwZS5fX2RlZmluZVNl
dHRlcl9fKCJob2xkQ291bnQiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl9ob2xkQ291bnQgPSB2
YWx1ZTsgfSk7CitTY2hlZHVsZXIucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oImJsb2NrcyIs
IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fYmxvY2tzOyB9KTsKK1NjaGVkdWxlci5wcm90b3R5
cGUuX19kZWZpbmVTZXR0ZXJfXygiYmxvY2tzIiwgZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5fYmxv
Y2tzID0gdmFsdWU7IH0pOworU2NoZWR1bGVyLnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fKCJs
aXN0IiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9saXN0OyB9KTsKK1NjaGVkdWxlci5wcm90
b3R5cGUuX19kZWZpbmVTZXR0ZXJfXygibGlzdCIsIGZ1bmN0aW9uKHZhbHVlKSB7IHRoaXMuX2xp
c3QgPSB2YWx1ZTsgfSk7CitTY2hlZHVsZXIucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oImN1
cnJlbnRUY2IiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2N1cnJlbnRUY2I7IH0pOworU2No
ZWR1bGVyLnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKCJjdXJyZW50VGNiIiwgZnVuY3Rpb24o
dmFsdWUpIHsgdGhpcy5fY3VycmVudFRjYiA9IHZhbHVlOyB9KTsKK1NjaGVkdWxlci5wcm90b3R5
cGUuX19kZWZpbmVHZXR0ZXJfXygiY3VycmVudElkIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlz
Ll9jdXJyZW50SWQ7IH0pOworU2NoZWR1bGVyLnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKCJj
dXJyZW50SWQiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl9jdXJyZW50SWQgPSB2YWx1ZTsgfSk7
CisKKy8qKgorICogQWRkIGFuIGlkbGUgdGFzayB0byB0aGlzIHNjaGVkdWxlci4KKyAqIEBwYXJh
bSB7aW50fSBpZCB0aGUgaWRlbnRpdHkgb2YgdGhlIHRhc2sKKyAqIEBwYXJhbSB7aW50fSBwcmlv
cml0eSB0aGUgdGFzaydzIHByaW9yaXR5CisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHF1
ZXVlIG9mIHdvcmsgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisgKiBAcGFyYW0ge2ludH0g
Y291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0byBzY2hlZHVsZSB0aGUgdGFzaworICovCitTY2hl
ZHVsZXIucHJvdG90eXBlLmFkZElkbGVUYXNrID0gZnVuY3Rpb24gKGlkLCBwcmlvcml0eSwgcXVl
dWUsIGNvdW50KSB7CisgIHRoaXMuYWRkUnVubmluZ1Rhc2soaWQsIHByaW9yaXR5LCBxdWV1ZSwg
bmV3IElkbGVUYXNrKHRoaXMsIDEsIGNvdW50KSk7Cit9OworCisvKioKKyAqIEFkZCBhIHdvcmsg
dGFzayB0byB0aGlzIHNjaGVkdWxlci4KKyAqIEBwYXJhbSB7aW50fSBpZCB0aGUgaWRlbnRpdHkg
b2YgdGhlIHRhc2sKKyAqIEBwYXJhbSB7aW50fSBwcmlvcml0eSB0aGUgdGFzaydzIHByaW9yaXR5
CisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHF1ZXVlIG9mIHdvcmsgdG8gYmUgcHJvY2Vz
c2VkIGJ5IHRoZSB0YXNrCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUuYWRkV29ya2VyVGFzayA9
IGZ1bmN0aW9uIChpZCwgcHJpb3JpdHksIHF1ZXVlKSB7CisgIHRoaXMuYWRkVGFzayhpZCwgcHJp
b3JpdHksIHF1ZXVlLCBuZXcgV29ya2VyVGFzayh0aGlzLCBJRF9IQU5ETEVSX0EsIDApKTsKK307
CisKKy8qKgorICogQWRkIGEgaGFuZGxlciB0YXNrIHRvIHRoaXMgc2NoZWR1bGVyLgorICogQHBh
cmFtIHtpbnR9IGlkIHRoZSBpZGVudGl0eSBvZiB0aGUgdGFzaworICogQHBhcmFtIHtpbnR9IHBy
aW9yaXR5IHRoZSB0YXNrJ3MgcHJpb3JpdHkKKyAqIEBwYXJhbSB7UGFja2V0fSBxdWV1ZSB0aGUg
cXVldWUgb2Ygd29yayB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHRhc2sKKyAqLworU2NoZWR1bGVy
LnByb3RvdHlwZS5hZGRIYW5kbGVyVGFzayA9IGZ1bmN0aW9uIChpZCwgcHJpb3JpdHksIHF1ZXVl
KSB7CisgIHRoaXMuYWRkVGFzayhpZCwgcHJpb3JpdHksIHF1ZXVlLCBuZXcgSGFuZGxlclRhc2so
dGhpcykpOworfTsKKworLyoqCisgKiBBZGQgYSBoYW5kbGVyIHRhc2sgdG8gdGhpcyBzY2hlZHVs
ZXIuCisgKiBAcGFyYW0ge2ludH0gaWQgdGhlIGlkZW50aXR5IG9mIHRoZSB0YXNrCisgKiBAcGFy
YW0ge2ludH0gcHJpb3JpdHkgdGhlIHRhc2sncyBwcmlvcml0eQorICogQHBhcmFtIHtQYWNrZXR9
IHF1ZXVlIHRoZSBxdWV1ZSBvZiB3b3JrIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgdGFzaworICov
CitTY2hlZHVsZXIucHJvdG90eXBlLmFkZERldmljZVRhc2sgPSBmdW5jdGlvbiAoaWQsIHByaW9y
aXR5LCBxdWV1ZSkgeworICB0aGlzLmFkZFRhc2soaWQsIHByaW9yaXR5LCBxdWV1ZSwgbmV3IERl
dmljZVRhc2sodGhpcykpCit9OworCisvKioKKyAqIEFkZCB0aGUgc3BlY2lmaWVkIHRhc2sgYW5k
IG1hcmsgaXQgYXMgcnVubmluZy4KKyAqIEBwYXJhbSB7aW50fSBpZCB0aGUgaWRlbnRpdHkgb2Yg
dGhlIHRhc2sKKyAqIEBwYXJhbSB7aW50fSBwcmlvcml0eSB0aGUgdGFzaydzIHByaW9yaXR5Cisg
KiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHF1ZXVlIG9mIHdvcmsgdG8gYmUgcHJvY2Vzc2Vk
IGJ5IHRoZSB0YXNrCisgKiBAcGFyYW0ge1Rhc2t9IHRhc2sgdGhlIHRhc2sgdG8gYWRkCisgKi8K
K1NjaGVkdWxlci5wcm90b3R5cGUuYWRkUnVubmluZ1Rhc2sgPSBmdW5jdGlvbiAoaWQsIHByaW9y
aXR5LCBxdWV1ZSwgdGFzaykgeworICB0aGlzLmFkZFRhc2soaWQsIHByaW9yaXR5LCBxdWV1ZSwg
dGFzayk7CisgIHRoaXMuY3VycmVudFRjYi5zZXRSdW5uaW5nKCk7Cit9OworCisvKioKKyAqIEFk
ZCB0aGUgc3BlY2lmaWVkIHRhc2sgdG8gdGhpcyBzY2hlZHVsZXIuCisgKiBAcGFyYW0ge2ludH0g
aWQgdGhlIGlkZW50aXR5IG9mIHRoZSB0YXNrCisgKiBAcGFyYW0ge2ludH0gcHJpb3JpdHkgdGhl
IHRhc2sncyBwcmlvcml0eQorICogQHBhcmFtIHtQYWNrZXR9IHF1ZXVlIHRoZSBxdWV1ZSBvZiB3
b3JrIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgdGFzaworICogQHBhcmFtIHtUYXNrfSB0YXNrIHRo
ZSB0YXNrIHRvIGFkZAorICovCitTY2hlZHVsZXIucHJvdG90eXBlLmFkZFRhc2sgPSBmdW5jdGlv
biAoaWQsIHByaW9yaXR5LCBxdWV1ZSwgdGFzaykgeworICB0aGlzLmN1cnJlbnRUY2IgPSBuZXcg
VGFza0NvbnRyb2xCbG9jayh0aGlzLmxpc3QsIGlkLCBwcmlvcml0eSwgcXVldWUsIHRhc2spOwor
ICB0aGlzLmxpc3QgPSB0aGlzLmN1cnJlbnRUY2I7CisgIHRoaXMuYmxvY2tzW2lkXSA9IHRoaXMu
Y3VycmVudFRjYjsKK307CisKKy8qKgorICogRXhlY3V0ZSB0aGUgdGFza3MgbWFuYWdlZCBieSB0
aGlzIHNjaGVkdWxlci4KKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0
aW9uICgpIHsKKyAgdGhpcy5jdXJyZW50VGNiID0gdGhpcy5saXN0OworICB3aGlsZSAodGhpcy5j
dXJyZW50VGNiICE9IG51bGwpIHsKKyAgICBpZiAodGhpcy5jdXJyZW50VGNiLmlzSGVsZE9yU3Vz
cGVuZGVkKCkpIHsKKyAgICAgIHRoaXMuY3VycmVudFRjYiA9IHRoaXMuY3VycmVudFRjYi5saW5r
OworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmN1cnJlbnRJZCA9IHRoaXMuY3VycmVudFRjYi5p
ZDsKKyAgICAgIHRoaXMuY3VycmVudFRjYiA9IHRoaXMuY3VycmVudFRjYi5ydW4oKTsKKyAgICB9
CisgIH0KK307CisKKy8qKgorICogUmVsZWFzZSBhIHRhc2sgdGhhdCBpcyBjdXJyZW50bHkgYmxv
Y2tlZCBhbmQgcmV0dXJuIHRoZSBuZXh0IGJsb2NrIHRvIHJ1bi4KKyAqIEBwYXJhbSB7aW50fSBp
ZCB0aGUgaWQgb2YgdGhlIHRhc2sgdG8gc3VzcGVuZAorICovCitTY2hlZHVsZXIucHJvdG90eXBl
LnJlbGVhc2UgPSBmdW5jdGlvbiAoaWQpIHsKKyAgdmFyIHRjYiA9IHRoaXMuYmxvY2tzW2lkXTsK
KyAgaWYgKHRjYiA9PSBudWxsKSByZXR1cm4gdGNiOworICB0Y2IubWFya0FzTm90SGVsZCgpOwor
ICBpZiAodGNiLnByaW9yaXR5ID4gdGhpcy5jdXJyZW50VGNiLnByaW9yaXR5KSB7CisgICAgcmV0
dXJuIHRjYjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdGhpcy5jdXJyZW50VGNiOworICB9Cit9
OworCisvKioKKyAqIEJsb2NrIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sgYW5kIHJldHVy
biB0aGUgbmV4dCB0YXNrIGNvbnRyb2wgYmxvY2sKKyAqIHRvIHJ1bi4gIFRoZSBibG9ja2VkIHRh
c2sgd2lsbCBub3QgYmUgbWFkZSBydW5uYWJsZSB1bnRpbCBpdCBpcyBleHBsaWNpdGx5CisgKiBy
ZWxlYXNlZCwgZXZlbiBpZiBuZXcgd29yayBpcyBhZGRlZCB0byBpdC4KKyAqLworU2NoZWR1bGVy
LnByb3RvdHlwZS5ob2xkQ3VycmVudCA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5ob2xkQ291bnQr
KzsKKyAgdGhpcy5jdXJyZW50VGNiLm1hcmtBc0hlbGQoKTsKKyAgcmV0dXJuIHRoaXMuY3VycmVu
dFRjYi5saW5rOworfTsKKworLyoqCisgKiBTdXNwZW5kIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5n
IHRhc2sgYW5kIHJldHVybiB0aGUgbmV4dCB0YXNrIGNvbnRyb2wgYmxvY2sKKyAqIHRvIHJ1bi4g
IElmIG5ldyB3b3JrIGlzIGFkZGVkIHRvIHRoZSBzdXNwZW5kZWQgdGFzayBpdCB3aWxsIGJlIG1h
ZGUgcnVubmFibGUuCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUuc3VzcGVuZEN1cnJlbnQgPSBm
dW5jdGlvbiAoKSB7CisgIHRoaXMuY3VycmVudFRjYi5tYXJrQXNTdXNwZW5kZWQoKTsKKyAgcmV0
dXJuIHRoaXMuY3VycmVudFRjYjsKK307CisKKy8qKgorICogQWRkIHRoZSBzcGVjaWZpZWQgcGFj
a2V0IHRvIHRoZSBlbmQgb2YgdGhlIHdvcmtsaXN0IHVzZWQgYnkgdGhlIHRhc2sKKyAqIGFzc29j
aWF0ZWQgd2l0aCB0aGUgcGFja2V0IGFuZCBtYWtlIHRoZSB0YXNrIHJ1bm5hYmxlIGlmIGl0IGlz
IGN1cnJlbnRseQorICogc3VzcGVuZGVkLgorICogQHBhcmFtIHtQYWNrZXR9IHBhY2tldCB0aGUg
cGFja2V0IHRvIGFkZAorICovCitTY2hlZHVsZXIucHJvdG90eXBlLnF1ZXVlID0gZnVuY3Rpb24g
KHBhY2tldCkgeworICB2YXIgdCA9IHRoaXMuYmxvY2tzW3BhY2tldC5pZF07CisgIGlmICh0ID09
IG51bGwpIHJldHVybiB0OworICB0aGlzLnF1ZXVlQ291bnQrKzsKKyAgcGFja2V0LmxpbmsgPSBu
dWxsOworICBwYWNrZXQuaWQgPSB0aGlzLmN1cnJlbnRJZDsKKyAgcmV0dXJuIHQuY2hlY2tQcmlv
cml0eUFkZCh0aGlzLmN1cnJlbnRUY2IsIHBhY2tldCk7Cit9OworCisvKioKKyAqIEEgdGFzayBj
b250cm9sIGJsb2NrIG1hbmFnZXMgYSB0YXNrIGFuZCB0aGUgcXVldWUgb2Ygd29yayBwYWNrYWdl
cyBhc3NvY2lhdGVkCisgKiB3aXRoIGl0LgorICogQHBhcmFtIHtUYXNrQ29udHJvbEJsb2NrfSBs
aW5rIHRoZSBwcmVjZWRpbmcgYmxvY2sgaW4gdGhlIGxpbmtlZCBibG9jayBsaXN0CisgKiBAcGFy
YW0ge2ludH0gaWQgdGhlIGlkIG9mIHRoaXMgYmxvY2sKKyAqIEBwYXJhbSB7aW50fSBwcmlvcml0
eSB0aGUgcHJpb3JpdHkgb2YgdGhpcyBibG9jaworICogQHBhcmFtIHtQYWNrZXR9IHF1ZXVlIHRo
ZSBxdWV1ZSBvZiBwYWNrYWdlcyB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHRhc2sKKyAqIEBwYXJh
bSB7VGFza30gdGFzayB0aGUgdGFzaworICogQGNvbnN0cnVjdG9yCisgKi8KK2Z1bmN0aW9uIFRh
c2tDb250cm9sQmxvY2sobGluaywgaWQsIHByaW9yaXR5LCBxdWV1ZSwgdGFzaykgeworICB0aGlz
Ll9saW5rID0gbGluazsKKyAgdGhpcy5faWQgPSBpZDsKKyAgdGhpcy5fcHJpb3JpdHkgPSBwcmlv
cml0eTsKKyAgdGhpcy5fcXVldWUgPSBxdWV1ZTsKKyAgdGhpcy5fdGFzayA9IHRhc2s7CisgIGlm
IChxdWV1ZSA9PSBudWxsKSB7CisgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1NVU1BFTkRFRDsKKyAg
fSBlbHNlIHsKKyAgICB0aGlzLnN0YXRlID0gU1RBVEVfU1VTUEVOREVEX1JVTk5BQkxFOworICB9
Cit9CisKKy8qKgorICogVGhlIHRhc2sgaXMgcnVubmluZyBhbmQgaXMgY3VycmVudGx5IHNjaGVk
dWxlZC4KKyAqLwordmFyIFNUQVRFX1JVTk5JTkcgPSAwOworCisvKioKKyAqIFRoZSB0YXNrIGhh
cyBwYWNrZXRzIGxlZnQgdG8gcHJvY2Vzcy4KKyAqLwordmFyIFNUQVRFX1JVTk5BQkxFID0gMTsK
KworLyoqCisgKiBUaGUgdGFzayBpcyBub3QgY3VycmVudGx5IHJ1bm5pbmcuICBUaGUgdGFzayBp
cyBub3QgYmxvY2tlZCBhcyBzdWNoIGFuZCBtYXkKKyogYmUgc3RhcnRlZCBieSB0aGUgc2NoZWR1
bGVyLgorICovCit2YXIgU1RBVEVfU1VTUEVOREVEID0gMjsKKworLyoqCisgKiBUaGUgdGFzayBp
cyBibG9ja2VkIGFuZCBjYW5ub3QgYmUgcnVuIHVudGlsIGl0IGlzIGV4cGxpY2l0bHkgcmVsZWFz
ZWQuCisgKi8KK3ZhciBTVEFURV9IRUxEID0gNDsKKwordmFyIFNUQVRFX1NVU1BFTkRFRF9SVU5O
QUJMRSA9IFNUQVRFX1NVU1BFTkRFRCB8IFNUQVRFX1JVTk5BQkxFOwordmFyIFNUQVRFX05PVF9I
RUxEID0gflNUQVRFX0hFTEQ7CisKK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLl9fZGVmaW5l
R2V0dGVyX18oImxpbmsiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2xpbms7IH0pOworVGFz
a0NvbnRyb2xCbG9jay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygiaWQiLCBmdW5jdGlvbigp
IHsgcmV0dXJuIHRoaXMuX2lkOyB9KTsKK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLl9fZGVm
aW5lR2V0dGVyX18oInByaW9yaXR5IiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9wcmlvcml0
eTsgfSk7CitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fKCJxdWV1
ZSIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fcXVldWU7IH0pOworVGFza0NvbnRyb2xCbG9j
ay5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXygicXVldWUiLCBmdW5jdGlvbih2YWx1ZSkgeyB0
aGlzLl9xdWV1ZSA9IHZhbHVlOyB9KTsKK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLl9fZGVm
aW5lR2V0dGVyX18oInRhc2siLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3Rhc2s7IH0pOwor
VGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygic3RhdGUiLCBmdW5j
dGlvbigpIHsgcmV0dXJuIHRoaXMuX3N0YXRlOyB9KTsKK1Rhc2tDb250cm9sQmxvY2sucHJvdG90
eXBlLl9fZGVmaW5lU2V0dGVyX18oInN0YXRlIiwgZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5fc3Rh
dGUgPSB2YWx1ZTsgfSk7CisKK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLnNldFJ1bm5pbmcg
PSBmdW5jdGlvbiAoKSB7CisgIHRoaXMuc3RhdGUgPSBTVEFURV9SVU5OSU5HOworfTsKKworVGFz
a0NvbnRyb2xCbG9jay5wcm90b3R5cGUubWFya0FzTm90SGVsZCA9IGZ1bmN0aW9uICgpIHsKKyAg
dGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGUgJiBTVEFURV9OT1RfSEVMRDsKK307CisKK1Rhc2tDb250
cm9sQmxvY2sucHJvdG90eXBlLm1hcmtBc0hlbGQgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMuc3Rh
dGUgPSB0aGlzLnN0YXRlIHwgU1RBVEVfSEVMRDsKK307CisKK1Rhc2tDb250cm9sQmxvY2sucHJv
dG90eXBlLmlzSGVsZE9yU3VzcGVuZGVkID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gKHRoaXMu
c3RhdGUgJiBTVEFURV9IRUxEKSAhPSAwIHx8ICh0aGlzLnN0YXRlID09IFNUQVRFX1NVU1BFTkRF
RCk7Cit9OworCitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5tYXJrQXNTdXNwZW5kZWQgPSBm
dW5jdGlvbiAoKSB7CisgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlIHwgU1RBVEVfU1VTUEVOREVE
OworfTsKKworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUubWFya0FzUnVubmFibGUgPSBmdW5j
dGlvbiAoKSB7CisgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlIHwgU1RBVEVfUlVOTkFCTEU7Cit9
OworCisvKioKKyAqIFJ1bnMgdGhpcyB0YXNrLCBpZiBpdCBpcyByZWFkeSB0byBiZSBydW4sIGFu
ZCByZXR1cm5zIHRoZSBuZXh0IHRhc2sgdG8gcnVuLgorICovCitUYXNrQ29udHJvbEJsb2NrLnBy
b3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7CisgIHZhciBwYWNrZXQ7CisgIGlmICh0aGlzLnN0
YXRlID09IFNUQVRFX1NVU1BFTkRFRF9SVU5OQUJMRSkgeworICAgIHBhY2tldCA9IHRoaXMucXVl
dWU7CisgICAgdGhpcy5xdWV1ZSA9IHBhY2tldC5saW5rOworICAgIGlmICh0aGlzLnF1ZXVlID09
IG51bGwpIHsKKyAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9SVU5OSU5HOworICAgIH0gZWxzZSB7
CisgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUlVOTkFCTEU7CisgICAgfQorICB9IGVsc2Ugewor
ICAgIHBhY2tldCA9IG51bGw7CisgIH0KKyAgcmV0dXJuIHRoaXMudGFzay5ydW4ocGFja2V0KTsK
K307CisKKy8qKgorICogQWRkcyBhIHBhY2tldCB0byB0aGUgd29ya2xpc3Qgb2YgdGhpcyBibG9j
aydzIHRhc2ssIG1hcmtzIHRoaXMgYXMgcnVubmFibGUgaWYKKyAqIG5lY2Vzc2FyeSwgYW5kIHJl
dHVybnMgdGhlIG5leHQgcnVubmFibGUgb2JqZWN0IHRvIHJ1biAodGhlIG9uZQorICogd2l0aCB0
aGUgaGlnaGVzdCBwcmlvcml0eSkuCisgKi8KK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLmNo
ZWNrUHJpb3JpdHlBZGQgPSBmdW5jdGlvbiAodGFzaywgcGFja2V0KSB7CisgIGlmICh0aGlzLnF1
ZXVlID09IG51bGwpIHsKKyAgICB0aGlzLnF1ZXVlID0gcGFja2V0OworICAgIHRoaXMubWFya0Fz
UnVubmFibGUoKTsKKyAgICBpZiAodGhpcy5wcmlvcml0eSA+IHRhc2sucHJpb3JpdHkpIHJldHVy
biB0aGlzOworICB9IGVsc2UgeworICAgIHRoaXMucXVldWUgPSBwYWNrZXQuYWRkVG8odGhpcy5x
dWV1ZSk7CisgIH0KKyAgcmV0dXJuIHRhc2s7Cit9OworCitUYXNrQ29udHJvbEJsb2NrLnByb3Rv
dHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuICJ0Y2IgeyAiICsgdGhpcy50
YXNrICsgIkAiICsgdGhpcy5zdGF0ZSArICIgfSI7Cit9OworCisvKioKKyAqIEFuIGlkbGUgdGFz
ayBkb2Vzbid0IGRvIGFueSB3b3JrIGl0c2VsZiBidXQgY3ljbGVzIGNvbnRyb2wgYmV0d2VlbiB0
aGUgdHdvCisgKiBkZXZpY2UgdGFza3MuCisgKiBAcGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1bGVy
IHRoZSBzY2hlZHVsZXIgdGhhdCBtYW5hZ2VzIHRoaXMgdGFzaworICogQHBhcmFtIHtpbnR9IHYx
IGEgc2VlZCB2YWx1ZSB0aGF0IGNvbnRyb2xzIGhvdyB0aGUgZGV2aWNlIHRhc2tzIGFyZSBzY2hl
ZHVsZWQKKyAqIEBwYXJhbSB7aW50fSBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgdGFz
ayBzaG91bGQgYmUgc2NoZWR1bGVkCisgKiBAY29uc3RydWN0b3IKKyAqLworZnVuY3Rpb24gSWRs
ZVRhc2soc2NoZWR1bGVyLCB2MSwgY291bnQpIHsKKyAgdGhpcy5fc2NoZWR1bGVyID0gc2NoZWR1
bGVyOworICB0aGlzLl92MSA9IHYxOworICB0aGlzLl9jb3VudCA9IGNvdW50OworfQorCitJZGxl
VGFzay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygic2NoZWR1bGVyIiwgZnVuY3Rpb24oKSB7
IHJldHVybiB0aGlzLl9zY2hlZHVsZXI7IH0pOworSWRsZVRhc2sucHJvdG90eXBlLl9fZGVmaW5l
R2V0dGVyX18oInYxIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl92MTsgfSk7CitJZGxlVGFz
ay5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXygidjEiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlz
Ll92MSA9IHZhbHVlOyB9KTsKK0lkbGVUYXNrLnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fKCJj
b3VudCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fY291bnQ7IH0pOworSWRsZVRhc2sucHJv
dG90eXBlLl9fZGVmaW5lU2V0dGVyX18oImNvdW50IiwgZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5f
Y291bnQgPSB2YWx1ZTsgfSk7CisKK0lkbGVUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAo
cGFja2V0KSB7CisgIHRoaXMuY291bnQtLTsKKyAgaWYgKHRoaXMuY291bnQgPT0gMCkgcmV0dXJu
IHRoaXMuc2NoZWR1bGVyLmhvbGRDdXJyZW50KCk7CisgIGlmICgodGhpcy52MSAmIDEpID09IDAp
IHsKKyAgICB0aGlzLnYxID0gdGhpcy52MSA+PiAxOworICAgIHJldHVybiB0aGlzLnNjaGVkdWxl
ci5yZWxlYXNlKElEX0RFVklDRV9BKTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnYxID0gKHRoaXMu
djEgPj4gMSkgXiAweEQwMDg7CisgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnJlbGVhc2UoSURf
REVWSUNFX0IpOworICB9Cit9OworCitJZGxlVGFzay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5j
dGlvbiAoKSB7CisgIHJldHVybiAiSWRsZVRhc2siCit9OworCisvKioKKyAqIEEgdGFzayB0aGF0
IHN1c3BlbmRzIGl0c2VsZiBhZnRlciBlYWNoIHRpbWUgaXQgaGFzIGJlZW4gcnVuIHRvIHNpbXVs
YXRlCisgKiB3YWl0aW5nIGZvciBkYXRhIGZyb20gYW4gZXh0ZXJuYWwgZGV2aWNlLgorICogQHBh
cmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciB0aGUgc2NoZWR1bGVyIHRoYXQgbWFuYWdlcyB0aGlz
IHRhc2sKKyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBEZXZpY2VUYXNrKHNjaGVkdWxl
cikgeworICB0aGlzLl9zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CisgIHRoaXMuX3YxID0gbnVsbDsK
K30KKworRGV2aWNlVGFzay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygic2NoZWR1bGVyIiwg
ZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zY2hlZHVsZXI7IH0pOworRGV2aWNlVGFzay5wcm90
b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygidjEiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3Yx
OyB9KTsKK0RldmljZVRhc2sucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oInYxIiwgZnVuY3Rp
b24odmFsdWUpIHsgdGhpcy5fdjEgPSB2YWx1ZTsgfSk7CisKK0RldmljZVRhc2sucHJvdG90eXBl
LnJ1biA9IGZ1bmN0aW9uIChwYWNrZXQpIHsKKyAgaWYgKHBhY2tldCA9PSBudWxsKSB7CisgICAg
aWYgKHRoaXMudjEgPT0gbnVsbCkgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnN1c3BlbmRDdXJyZW50
KCk7CisgICAgdmFyIHYgPSB0aGlzLnYxOworICAgIHRoaXMudjEgPSBudWxsOworICAgIHJldHVy
biB0aGlzLnNjaGVkdWxlci5xdWV1ZSh2KTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnYxID0gcGFj
a2V0OworICAgIHJldHVybiB0aGlzLnNjaGVkdWxlci5ob2xkQ3VycmVudCgpOworICB9Cit9Owor
CitEZXZpY2VUYXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJu
ICJEZXZpY2VUYXNrIjsKK307CisKKy8qKgorICogQSB0YXNrIHRoYXQgbWFuaXB1bGF0ZXMgd29y
ayBwYWNrZXRzLgorICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciB0aGUgc2NoZWR1bGVy
IHRoYXQgbWFuYWdlcyB0aGlzIHRhc2sKKyAqIEBwYXJhbSB7aW50fSB2MSBhIHNlZWQgdXNlZCB0
byBzcGVjaWZ5IGhvdyB3b3JrIHBhY2tldHMgYXJlIG1hbmlwdWxhdGVkCisgKiBAcGFyYW0ge2lu
dH0gdjIgYW5vdGhlciBzZWVkIHVzZWQgdG8gc3BlY2lmeSBob3cgd29yayBwYWNrZXRzIGFyZSBt
YW5pcHVsYXRlZAorICogQGNvbnN0cnVjdG9yCisgKi8KK2Z1bmN0aW9uIFdvcmtlclRhc2soc2No
ZWR1bGVyLCB2MSwgdjIpIHsKKyAgdGhpcy5fc2NoZWR1bGVyID0gc2NoZWR1bGVyOworICB0aGlz
Ll92MSA9IHYxOworICB0aGlzLl92MiA9IHYyOworfQorCitXb3JrZXJUYXNrLnByb3RvdHlwZS5f
X2RlZmluZUdldHRlcl9fKCJzY2hlZHVsZXIiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3Nj
aGVkdWxlcjsgfSk7CitXb3JrZXJUYXNrLnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fKCJ2MSIs
IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fdjE7IH0pOworV29ya2VyVGFzay5wcm90b3R5cGUu
X19kZWZpbmVTZXR0ZXJfXygidjEiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl92MSA9IHZhbHVl
OyB9KTsKK1dvcmtlclRhc2sucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oInYyIiwgZnVuY3Rp
b24oKSB7IHJldHVybiB0aGlzLl92MjsgfSk7CitXb3JrZXJUYXNrLnByb3RvdHlwZS5fX2RlZmlu
ZVNldHRlcl9fKCJ2MiIsIGZ1bmN0aW9uKHZhbHVlKSB7IHRoaXMuX3YyID0gdmFsdWU7IH0pOwor
CitXb3JrZXJUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAocGFja2V0KSB7CisgIGlmIChw
YWNrZXQgPT0gbnVsbCkgeworICAgIHJldHVybiB0aGlzLnNjaGVkdWxlci5zdXNwZW5kQ3VycmVu
dCgpOworICB9IGVsc2UgeworICAgIGlmICh0aGlzLnYxID09IElEX0hBTkRMRVJfQSkgeworICAg
ICAgdGhpcy52MSA9IElEX0hBTkRMRVJfQjsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy52MSA9
IElEX0hBTkRMRVJfQTsKKyAgICB9CisgICAgcGFja2V0LmlkID0gdGhpcy52MTsKKyAgICBwYWNr
ZXQuYTEgPSAwOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgREFUQV9TSVpFOyBpKyspIHsKKyAg
ICAgIHRoaXMudjIrKzsKKyAgICAgIGlmICh0aGlzLnYyID4gMjYpIHRoaXMudjIgPSAxOworICAg
ICAgcGFja2V0LmEyW2ldID0gdGhpcy52MjsKKyAgICB9CisgICAgcmV0dXJuIHRoaXMuc2NoZWR1
bGVyLnF1ZXVlKHBhY2tldCk7CisgIH0KK307CisKK1dvcmtlclRhc2sucHJvdG90eXBlLnRvU3Ry
aW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gIldvcmtlclRhc2siOworfTsKKworLyoqCisg
KiBBIHRhc2sgdGhhdCBtYW5pcHVsYXRlcyB3b3JrIHBhY2tldHMgYW5kIHRoZW4gc3VzcGVuZHMg
aXRzZWxmLgorICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciB0aGUgc2NoZWR1bGVyIHRo
YXQgbWFuYWdlcyB0aGlzIHRhc2sKKyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBIYW5k
bGVyVGFzayhzY2hlZHVsZXIpIHsKKyAgdGhpcy5fc2NoZWR1bGVyID0gc2NoZWR1bGVyOworICB0
aGlzLl92MSA9IG51bGw7CisgIHRoaXMuX3YyID0gbnVsbDsKK30KKworSGFuZGxlclRhc2sucHJv
dG90eXBlLl9fZGVmaW5lR2V0dGVyX18oInNjaGVkdWxlciIsIGZ1bmN0aW9uKCkgeyByZXR1cm4g
dGhpcy5fc2NoZWR1bGVyOyB9KTsKK0hhbmRsZXJUYXNrLnByb3RvdHlwZS5fX2RlZmluZUdldHRl
cl9fKCJ2MSIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fdjE7IH0pOworSGFuZGxlclRhc2su
cHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oInYxIiwgZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5f
djEgPSB2YWx1ZTsgfSk7CitIYW5kbGVyVGFzay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygi
djIiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3YyOyB9KTsKK0hhbmRsZXJUYXNrLnByb3Rv
dHlwZS5fX2RlZmluZVNldHRlcl9fKCJ2MiIsIGZ1bmN0aW9uKHZhbHVlKSB7IHRoaXMuX3YyID0g
dmFsdWU7IH0pOworCitIYW5kbGVyVGFzay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKHBhY2tl
dCkgeworICBpZiAocGFja2V0ICE9IG51bGwpIHsKKyAgICBpZiAocGFja2V0LmtpbmQgPT0gS0lO
RF9XT1JLKSB7CisgICAgICB0aGlzLnYxID0gcGFja2V0LmFkZFRvKHRoaXMudjEpOworICAgIH0g
ZWxzZSB7CisgICAgICB0aGlzLnYyID0gcGFja2V0LmFkZFRvKHRoaXMudjIpOworICAgIH0KKyAg
fQorICBpZiAodGhpcy52MSAhPSBudWxsKSB7CisgICAgdmFyIGNvdW50ID0gdGhpcy52MS5hMTsK
KyAgICB2YXIgdjsKKyAgICBpZiAoY291bnQgPCBEQVRBX1NJWkUpIHsKKyAgICAgIGlmICh0aGlz
LnYyICE9IG51bGwpIHsKKyAgICAgICAgdiA9IHRoaXMudjI7CisgICAgICAgIHRoaXMudjIgPSB0
aGlzLnYyLmxpbms7CisgICAgICAgIHYuYTEgPSB0aGlzLnYxLmEyW2NvdW50XTsKKyAgICAgICAg
dGhpcy52MS5hMSA9IGNvdW50ICsgMTsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnF1
ZXVlKHYpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2ID0gdGhpcy52MTsKKyAgICAg
IHRoaXMudjEgPSB0aGlzLnYxLmxpbms7CisgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZXIucXVl
dWUodik7CisgICAgfQorICB9CisgIHJldHVybiB0aGlzLnNjaGVkdWxlci5zdXNwZW5kQ3VycmVu
dCgpOworfTsKKworSGFuZGxlclRhc2sucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkg
eworICByZXR1cm4gIkhhbmRsZXJUYXNrIjsKK307CisKKy8qIC0tLSAqCisgKiBQIGEgYyBrIGUg
dAorICogLS0tICovCisKK3ZhciBEQVRBX1NJWkUgPSA0OworCisvKioKKyAqIEEgc2ltcGxlIHBh
Y2thZ2Ugb2YgZGF0YSB0aGF0IGlzIG1hbmlwdWxhdGVkIGJ5IHRoZSB0YXNrcy4gIFRoZSBleGFj
dCBsYXlvdXQKKyAqIG9mIHRoZSBwYXlsb2FkIGRhdGEgY2FycmllZCBieSBhIHBhY2tldCBpcyBu
b3QgaW1wb3J0YWludCwgYW5kIG5laXRoZXIgaXMgdGhlCisgKiBuYXR1cmUgb2YgdGhlIHdvcmsg
cGVyZm9ybWVkIG9uIHBhY2tldHMgYnkgdGhlIHRhc2tzLgorICoKKyAqIEJlc2lkZXMgY2Fycnlp
bmcgZGF0YSwgcGFja2V0cyBmb3JtIGxpbmtlZCBsaXN0cyBhbmQgYXJlIGhlbmNlIHVzZWQgYm90
aCBhcworICogZGF0YSBhbmQgd29ya2xpc3RzLgorICogQHBhcmFtIHtQYWNrZXR9IGxpbmsgdGhl
IHRhaWwgb2YgdGhlIGxpbmtlZCBsaXN0IG9mIHBhY2tldHMKKyAqIEBwYXJhbSB7aW50fSBpZCBh
biBJRCBmb3IgdGhpcyBwYWNrZXQKKyAqIEBwYXJhbSB7aW50fSBraW5kIHRoZSB0eXBlIG9mIHRo
aXMgcGFja2V0CisgKiBAY29uc3RydWN0b3IKKyAqLworZnVuY3Rpb24gUGFja2V0KGxpbmssIGlk
LCBraW5kKSB7CisgIHRoaXMuX2xpbmsgPSBsaW5rOworICB0aGlzLl9pZCA9IGlkOworICB0aGlz
Ll9raW5kID0ga2luZDsKKyAgdGhpcy5fYTEgPSAwOworICB0aGlzLl9hMiA9IG5ldyBBcnJheShE
QVRBX1NJWkUpOworfQorCitQYWNrZXQucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oImxpbmsi
LCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2xpbms7IH0pOworUGFja2V0LnByb3RvdHlwZS5f
X2RlZmluZVNldHRlcl9fKCJsaW5rIiwgZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5fbGluayA9IHZh
bHVlOyB9KTsKK1BhY2tldC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygiaWQiLCBmdW5jdGlv
bigpIHsgcmV0dXJuIHRoaXMuX2lkOyB9KTsKK1BhY2tldC5wcm90b3R5cGUuX19kZWZpbmVTZXR0
ZXJfXygiaWQiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl9pZCA9IHZhbHVlOyB9KTsKK1BhY2tl
dC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygia2luZCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4g
dGhpcy5fa2luZDsgfSk7CitQYWNrZXQucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oImExIiwg
ZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9hMTsgfSk7CitQYWNrZXQucHJvdG90eXBlLl9fZGVm
aW5lU2V0dGVyX18oImExIiwgZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5fYTEgPSB2YWx1ZTsgfSk7
CitQYWNrZXQucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oImEyIiwgZnVuY3Rpb24oKSB7IHJl
dHVybiB0aGlzLl9hMjsgfSk7CisKKy8qKgorICogQWRkIHRoaXMgcGFja2V0IHRvIHRoZSBlbmQg
b2YgYSB3b3JrbGlzdCwgYW5kIHJldHVybiB0aGUgd29ya2xpc3QuCisgKiBAcGFyYW0ge1BhY2tl
dH0gcXVldWUgdGhlIHdvcmtsaXN0IHRvIGFkZCB0aGlzIHBhY2tldCB0bworICovCitQYWNrZXQu
cHJvdG90eXBlLmFkZFRvID0gZnVuY3Rpb24gKHF1ZXVlKSB7CisgIHRoaXMubGluayA9IG51bGw7
CisgIGlmIChxdWV1ZSA9PSBudWxsKSByZXR1cm4gdGhpczsKKyAgdmFyIHBlZWssIG5leHQgPSBx
dWV1ZTsKKyAgd2hpbGUgKChwZWVrID0gbmV4dC5saW5rKSAhPSBudWxsKQorICAgIG5leHQgPSBw
ZWVrOworICBuZXh0LmxpbmsgPSB0aGlzOworICByZXR1cm4gcXVldWU7Cit9OworCitQYWNrZXQu
cHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gIlBhY2tldCI7Cit9
OworCitmb3IgKHZhciBpID0gMDsgaSA8IDM1MDsgKytpKQorICBydW5SaWNoYXJkcygpOwpJbmRl
eDogVG9vbHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0NoYW5nZUxvZwkocmV2aXNp
b24gMjAyMzU1KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEs
MTUgQEAKKzIwMTYtMDYtMjIgIFNhYW0gYmFyYXRpICA8c2JhcmF0aUBhcHBsZS5jb20+CisKKyAg
ICAgICAgVHlwZVByb2ZpbGVyIGFuZCBUeXBlUHJvZmlsZXJMb2cgZG9uJ3QgcGxheSBuaWNlbHkg
d2l0aCB0aGUgY29uY3VycmVudCBKSVQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTE1OTAzNworICAgICAgICA8cmRhcjovL3Byb2JsZW0vMjY5MzUzNDk+
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUnVuIHR5
cGVQcm9maWxlci55YW1sIHRlc3RzIHVuZGVyIGFuIGFkZGl0aW9uYWwgQ0pJVCBlbmFibGVkIG1v
ZGUuCisKKyAgICAgICAgKiBTY3JpcHRzL3J1bi1qc2Mtc3RyZXNzLXRlc3RzOgorCiAyMDE2LTA2
LTIyICBKb24gTGVlICA8am9ubGVlQGFwcGxlLmNvbT4KIAogICAgICAgICBVcGRhdGUgYW5pbW9t
ZXRlci5wbGFuCkluZGV4OiBUb29scy9TY3JpcHRzL3J1bi1qc2Mtc3RyZXNzLXRlc3RzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL1NjcmlwdHMvcnVuLWpzYy1zdHJlc3MtdGVzdHMJKHJldmlzaW9uIDIw
MjM0OCkKKysrIFRvb2xzL1NjcmlwdHMvcnVuLWpzYy1zdHJlc3MtdGVzdHMJKHdvcmtpbmcgY29w
eSkKQEAgLTEwMjUsOCArMTAyNSwxMCBAQCBkZWYgcnVuVHlwZVByb2ZpbGVyCiAKICAgICBpZiAk
ZW5hYmxlRlRMCiAgICAgICAgIHJ1bigiZnRsLW5vLWNqaXQtdHlwZS1wcm9maWxlciIsICItLXVz
ZVR5cGVQcm9maWxlcj10cnVlIiwgKihGVExfT1BUSU9OUyArIE5PX0NKSVRfT1BUSU9OUykpCisg
ICAgICAgIHJ1bigiZnRsLXR5cGUtcHJvZmlsZXIiLCAiLS11c2VUeXBlUHJvZmlsZXI9dHJ1ZSIs
ICooRlRMX09QVElPTlMpKQogICAgIGVsc2UKICAgICAgICAgcnVuKCJuby1jaml0LXR5cGUtcHJv
ZmlsZXIiLCAiLS11c2VUeXBlUHJvZmlsZXI9dHJ1ZSIsICpOT19DSklUX09QVElPTlMpCisgICAg
ICAgIHJ1bigidHlwZS1wcm9maWxlciIsICItLXVzZVR5cGVQcm9maWxlcj10cnVlIikKICAgICBl
bmQKIGVuZAogCg==
</data>
<flag name="review"
          id="305709"
          type_id="1"
          status="+"
          setter="benjamin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>281886</attachid>
            <date>2016-06-22 16:57:52 -0700</date>
            <delta_ts>2016-06-22 17:46:14 -0700</delta_ts>
            <desc>patch for landing</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>57204</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjAyMzQ4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU0IEBA
CisyMDE2LTA2LTIyICBTYWFtIGJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAg
IFR5cGVQcm9maWxlciBhbmQgVHlwZVByb2ZpbGVyTG9nIGRvbid0IHBsYXkgbmljZWx5IHdpdGgg
dGhlIGNvbmN1cnJlbnQgSklUCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xNTkwMzcKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzI2OTM1MzQ5PgorCisg
ICAgICAgIFJldmlld2VkIGJ5IEJlbmphbWluIFBvdWxhaW4uCisKKyAgICAgICAgVGhlIHByaW1h
cnkgZm9jdXMgb2YgdGhpcyBwYXRjaCBpcyB0byBtYWtlIHRoZSBjb25jdXJyZW50CisgICAgICAg
IGJhc2VsaW5lIEpJVCB3b3JrIHdpdGggdGhlIHR5cGUgcHJvZmlsZXIuIFdlIHdlcmUgY2xlYXJp
bmcKKyAgICAgICAgdGhlIHR5cGUgcHJvZmlsZXIgbG9nIG9uIHRoZSBiYWNrZ3JvdW5kIGJhc2Vs
aW5lIGNvbXBpbGVyCisgICAgICAgIHRocmVhZCB3aGljaCBsZWFkIHRvIGJhZCB0aGluZ3MgaGFw
cGVuaW5nLiBUaGlzIHBhdGNoIGZpeGVzCisgICAgICAgIHRoaXMgYnkgcHJvY2Vzc2luZyB0aGUg
bG9nIGJlZm9yZSB3ZSBsYXVuY2ggdGhlIGNvbXBpbGUgb24KKyAgICAgICAgYSBiYWNrZ3JvdW5k
IHRocmVhZC4KKworICAgICAgICBTZWNvbmRseSwgSSBhdWRpdGVkIHRoZSB0eXBlIHByb2ZpbGVy
IGNvZGUgaW5zaWRlIHRoZSBERkcsCisgICAgICAgIGFuZCBmb3VuZCB0aGF0IHdlIHdlcmUgZG9p
bmcgc29tZSByYWN5IHRoaW5ncy4gSSBoYXZlbid0CisgICAgICAgIHNlZW4gYW55IGNyYXNoZXMg
YmVjYXVzZSBvZiB0aGVzZSB0aGluZ3MsIGJ1dCBpdCBpcyBwb3NzaWJsZQorICAgICAgICB0aGF0
IHRoZXkgZXhpc3QuIFdlIHdlcmUgZ3JhYmJpbmcgYSBSZWZQdHIgdG8gYSBUeXBlU2V0LAorICAg
ICAgICBldmVuIHRob3VnaCBUeXBlU2V0IHdhcyBSZWZDb3VudGVkIGFuZCBub3QgVGhyZWFkU2Fm
ZVJlZkNvdW50ZWQuCisgICAgICAgIFRoaXMgcGF0Y2ggbWFrZXMgVHlwZVNldCBUaHJlYWRTYWZl
UmVmQ291bnRlZC4gV2Ugd2VyZQorICAgICAgICBhbHNvIGNvcHlpbmcgYSBTdHJ1Y3R1cmVTZXQg
d2hpbGUgdGhlIGV4ZWN1dGlvbiB0aHJlYWQgY291bGQKKyAgICAgICAgYmUgYXVnbWVudGluZyB0
aGUgU3RydWN0dXJlU2V0LiBUaGlzIHBhdGNoIHB1dHMgY2hhbmdlcyB0byAKKyAgICAgICAgVHlw
ZVNldCdzIFN0cnVjdHVyZVNldCBiZWhpbmQgYSBDb25jdXJyZW50SklUTG9jay4KKworICAgICAg
ICBJJ3ZlIGFsc28gYWRkZWQgdHdvIG1vcmUgbGFyZ2UgcnVubmluZyB0ZXN0cyB0aGF0IHJ1biB3
aXRoIHRoZQorICAgICAgICB0eXBlIHByb2ZpbGVyIGVuYWJsZWQuIFRoZXNlIGFyZSBoZXJlIGp1
c3QgdG8gY2F0Y2ggYW55IG1ham9yIGJ1Z3MKKyAgICAgICAgaW4gdGhlIHR5cGUgcHJvZmlsZXIg
aW1wbGVtZW50YXRpb24uCisKKyAgICAgICAgKiBqaXQvSklULmNwcDoKKyAgICAgICAgKEpTQzo6
SklUOjpjb21waWxlV2l0aG91dExpbmtpbmcpOgorICAgICAgICAoSlNDOjpKSVQ6OnByaXZhdGVD
b21waWxlKToKKyAgICAgICAgKEpTQzo6SklUOjpwcml2YXRlQ29tcGlsZUV4Y2VwdGlvbkhhbmRs
ZXJzKToKKyAgICAgICAgKEpTQzo6SklUOjpkb01haW5UaHJlYWRQcmVwYXJhdGlvbkJlZm9yZUNv
bXBpbGUpOgorICAgICAgICAoSlNDOjpKSVQ6OmZyYW1lUmVnaXN0ZXJDb3VudEZvcik6CisgICAg
ICAgICogaml0L0pJVC5oOgorICAgICAgICAoSlNDOjpKSVQ6OmNvbXBpbGUpOgorICAgICAgICAq
IGppdC9KSVRXb3JrbGlzdC5jcHA6CisgICAgICAgIChKU0M6OkpJVFdvcmtsaXN0OjpQbGFuOjpQ
bGFuKToKKyAgICAgICAgKEpTQzo6SklUV29ya2xpc3Q6OlBsYW46OmNvbXBpbGVJblRocmVhZCk6
CisgICAgICAgICogcnVudGltZS9UeXBlU2V0LmNwcDoKKyAgICAgICAgKEpTQzo6VHlwZVNldDo6
YWRkVHlwZUluZm9ybWF0aW9uKToKKyAgICAgICAgKEpTQzo6VHlwZVNldDo6aW52YWxpZGF0ZUNh
Y2hlKToKKyAgICAgICAgKiBydW50aW1lL1R5cGVTZXQuaDoKKyAgICAgICAgKEpTQzo6VHlwZVNl
dDo6Y3JlYXRlKToKKyAgICAgICAgKEpTQzo6VHlwZVNldDo6aXNFbXB0eSk6CisgICAgICAgIChK
U0M6OlR5cGVTZXQ6OnNlZW5UeXBlcyk6CisgICAgICAgIChKU0M6OlR5cGVTZXQ6OnN0cnVjdHVy
ZVNldCk6CisgICAgICAgICogdGVzdHMvdHlwZVByb2ZpbGVyL2RlbHRhYmx1ZS1mb3Itb2YuanM6
IEFkZGVkLgorICAgICAgICAqIHRlc3RzL3R5cGVQcm9maWxlci9nZXR0ZXItcmljaGFyZHMuanM6
IEFkZGVkLgorCiAyMDE2LTA2LTIxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBhcHBsZS5j
b20+CiAKICAgICAgICAgRml4IGJ1aWxkLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdGaXh1cFBoYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0ZpeHVwUGhhc2UuY3BwCShyZXZpc2lvbiAyMDIzNDgpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR0ZpeHVwUGhhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDYxLDcg
KzE0NjEsMTEgQEAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICBmaXhFZGdlPE90aGVyVXNlPihu
b2RlLT5jaGlsZDEoKSk7CiAgICAgICAgICAgICAgICAgbm9kZS0+cmVtb3ZlKCk7CiAgICAgICAg
ICAgICB9IGVsc2UgaWYgKHR5cGVTZXQtPmRvZXNUeXBlQ29uZm9ybVRvKFR5cGVPYmplY3QpKSB7
Ci0gICAgICAgICAgICAgICAgU3RydWN0dXJlU2V0IHNldCA9IHR5cGVTZXQtPnN0cnVjdHVyZVNl
dCgpOworICAgICAgICAgICAgICAgIFN0cnVjdHVyZVNldCBzZXQ7CisgICAgICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgICAgICBDb25jdXJyZW50SklUTG9ja2VyIGxvY2tlcih0eXBlU2V0
LT5tX2xvY2spOworICAgICAgICAgICAgICAgICAgICBzZXQgPSB0eXBlU2V0LT5zdHJ1Y3R1cmVT
ZXQobG9ja2VyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCFzZXQu
aXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpeEVkZ2U8Q2VsbFVzZT4obm9kZS0+
Y2hpbGQxKCkpOwogICAgICAgICAgICAgICAgICAgICBub2RlLT5jb252ZXJ0VG9DaGVja1N0cnVj
dHVyZShtX2dyYXBoLmFkZFN0cnVjdHVyZVNldChzZXQpKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9qaXQvSklULmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
aml0L0pJVC5jcHAJKHJldmlzaW9uIDIwMjM0OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9q
aXQvSklULmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTQ5LDEwICs1NDksNiBAQCB2b2lkIEpJVDo6
Y29tcGlsZVdpdGhvdXRMaW5raW5nKEpJVENvbXBpCiAgICAgICAgIGJyZWFrOwogICAgIH0KIAot
ICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGhhdmUgdGhlIG1vc3QgdXAgdG8gZGF0ZSB0eXBl
IGluZm9ybWF0aW9uIHdoZW4gcGVyZm9ybWluZyB0eXBlY2hlY2sgb3B0aW1pemF0aW9ucyBmb3Ig
b3BfcHJvZmlsZV90eXBlLgotICAgIGlmIChtX3ZtLT50eXBlUHJvZmlsZXIoKSkKLSAgICAgICAg
bV92bS0+dHlwZVByb2ZpbGVyTG9nKCktPnByb2Nlc3NMb2dFbnRyaWVzKEFTQ0lJTGl0ZXJhbCgi
UHJlcGFyaW5nIGZvciBKSVQgY29tcGlsYXRpb24uIikpOwotICAgIAogICAgIGlmIChPcHRpb25z
OjpkdW1wRGlzYXNzZW1ibHkoKSB8fCAobV92bS0+bV9wZXJCeXRlY29kZVByb2ZpbGVyICYmIE9w
dGlvbnM6OmRpc2Fzc2VtYmxlQmFzZWxpbmVGb3JQcm9maWxlcigpKSkKICAgICAgICAgbV9kaXNh
c3NlbWJsZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPEpJVERpc2Fzc2VtYmxlcj4obV9jb2RlQmxvY2sp
OwogICAgIGlmIChtX3ZtLT5tX3BlckJ5dGVjb2RlUHJvZmlsZXIpIHsKQEAgLTgwNCw2ICs4MDAs
NyBAQCBDb21waWxhdGlvblJlc3VsdCBKSVQ6OmxpbmsoKQogCiBDb21waWxhdGlvblJlc3VsdCBK
SVQ6OnByaXZhdGVDb21waWxlKEpJVENvbXBpbGF0aW9uRWZmb3J0IGVmZm9ydCkKIHsKKyAgICBk
b01haW5UaHJlYWRQcmVwYXJhdGlvbkJlZm9yZUNvbXBpbGUoKTsKICAgICBjb21waWxlV2l0aG91
dExpbmtpbmcoZWZmb3J0KTsKICAgICByZXR1cm4gbGluaygpOwogfQpAQCAtODQ4LDYgKzg0NSwx
MyBAQCB2b2lkIEpJVDo6cHJpdmF0ZUNvbXBpbGVFeGNlcHRpb25IYW5kbGVyCiAgICAgfQogfQog
Cit2b2lkIEpJVDo6ZG9NYWluVGhyZWFkUHJlcGFyYXRpb25CZWZvcmVDb21waWxlKCkKK3sKKyAg
ICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYXZlIHRoZSBtb3N0IHVwIHRvIGRhdGUgdHlwZSBp
bmZvcm1hdGlvbiB3aGVuIHBlcmZvcm1pbmcgdHlwZWNoZWNrIG9wdGltaXphdGlvbnMgZm9yIG9w
X3Byb2ZpbGVfdHlwZS4KKyAgICBpZiAobV92bS0+dHlwZVByb2ZpbGVyKCkpCisgICAgICAgIG1f
dm0tPnR5cGVQcm9maWxlckxvZygpLT5wcm9jZXNzTG9nRW50cmllcyhBU0NJSUxpdGVyYWwoIlBy
ZXBhcmluZyBmb3IgSklUIGNvbXBpbGF0aW9uLiIpKTsKK30KKwogdW5zaWduZWQgSklUOjpmcmFt
ZVJlZ2lzdGVyQ291bnRGb3IoQ29kZUJsb2NrKiBjb2RlQmxvY2spCiB7CiAgICAgQVNTRVJUKHN0
YXRpY19jYXN0PHVuc2lnbmVkPihjb2RlQmxvY2stPm1fbnVtQ2FsbGVlTG9jYWxzKSA9PSBXVEY6
OnJvdW5kVXBUb011bHRpcGxlT2Yoc3RhY2tBbGlnbm1lbnRSZWdpc3RlcnMoKSwgc3RhdGljX2Nh
c3Q8dW5zaWduZWQ+KGNvZGVCbG9jay0+bV9udW1DYWxsZWVMb2NhbHMpKSk7CkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9qaXQvSklULmgJKHJldmlzaW9uIDIwMjM0OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9qaXQvSklULmgJKHdvcmtpbmcgY29weSkKQEAgLTE5OSw2ICsxOTksOCBAQCBuYW1lc3Bh
Y2UgSlNDIHsKIAogICAgICAgICB2b2lkIGNvbXBpbGVXaXRob3V0TGlua2luZyhKSVRDb21waWxh
dGlvbkVmZm9ydCk7CiAgICAgICAgIENvbXBpbGF0aW9uUmVzdWx0IGxpbmsoKTsKKworICAgICAg
ICB2b2lkIGRvTWFpblRocmVhZFByZXBhcmF0aW9uQmVmb3JlQ29tcGlsZSgpOwogICAgICAgICAK
ICAgICAgICAgc3RhdGljIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGUoVk0qIHZtLCBDb2RlQmxv
Y2sqIGNvZGVCbG9jaywgSklUQ29tcGlsYXRpb25FZmZvcnQgZWZmb3J0KQogICAgICAgICB7Cklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVFdvcmtsaXN0LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVFdvcmtsaXN0LmNwcAkocmV2aXNpb24g
MjAyMzQ4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVRXb3JrbGlzdC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTQwLDYgKzQwLDcgQEAgcHVibGljOgogICAgICAgICA6IG1fY29kZUJs
b2NrKGNvZGVCbG9jaykKICAgICAgICAgLCBtX2ppdChjb2RlQmxvY2stPnZtKCksIGNvZGVCbG9j
aykKICAgICB7CisgICAgICAgIG1faml0LmRvTWFpblRocmVhZFByZXBhcmF0aW9uQmVmb3JlQ29t
cGlsZSgpOwogICAgIH0KICAgICAKICAgICB2b2lkIGNvbXBpbGVJblRocmVhZCgpCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9UeXBlU2V0LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9UeXBlU2V0LmNwcAkocmV2aXNpb24gMjAyMzQ4
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVHlwZVNldC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTQ5LDcgKzQ5LDEwIEBAIHZvaWQgVHlwZVNldDo6YWRkVHlwZUluZm9ybWF0aW9u
KFJ1bnRpbWUKIAogICAgIGlmIChzdHJ1Y3R1cmUgJiYgbmV3U2hhcGUgJiYgIXJ1bnRpbWVUeXBl
SXNQcmltaXRpdmUodHlwZSkpIHsKICAgICAgICAgaWYgKCFtX3N0cnVjdHVyZVNldC5jb250YWlu
cyhzdHJ1Y3R1cmUpKSB7Ci0gICAgICAgICAgICBtX3N0cnVjdHVyZVNldC5hZGQoc3RydWN0dXJl
KTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb25jdXJyZW50SklUTG9ja2VyIGxv
Y2tlcihtX2xvY2spOworICAgICAgICAgICAgICAgIG1fc3RydWN0dXJlU2V0LmFkZChzdHJ1Y3R1
cmUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gTWFrZSBvbmUgbW9yZSBwYXNzIG1h
a2luZyBzdXJlIHRoYXQ6IAogICAgICAgICAgICAgLy8gLSBXZSBkb24ndCBoYXZlIHR3byBpbnN0
YW5jZXMgb2YgdGhlIHNhbWUgc2hhcGUuIChTYW1lIHNoYXBlcyBtYXkgaGF2ZSBkaWZmZXJlbnQg
U3RydWN0dXJlcykuCiAgICAgICAgICAgICAvLyAtIFdlIGRvbid0IGhhdmUgdHdvIHNoYXBlcyB0
aGF0IHNoYXJlIHRoZSBzYW1lIHByb3RvdHlwZSBjaGFpbi4gSWYgdGhlc2Ugc2hhcGVzIHNoYXJl
IHRoZSBzYW1lIApAQCAtODEsNiArODQsNyBAQCB2b2lkIFR5cGVTZXQ6OmFkZFR5cGVJbmZvcm1h
dGlvbihSdW50aW1lCiAKIHZvaWQgVHlwZVNldDo6aW52YWxpZGF0ZUNhY2hlKCkKIHsKKyAgICBD
b25jdXJyZW50SklUTG9ja2VyIGxvY2tlcihtX2xvY2spOwogICAgIGF1dG8ga2VlcE1hcmtlZFN0
cnVjdHVyZXNGaWx0ZXIgPSBbXSAoU3RydWN0dXJlKiBzdHJ1Y3R1cmUpIC0+IGJvb2wgeyByZXR1
cm4gSGVhcDo6aXNNYXJrZWQoc3RydWN0dXJlKTsgfTsKICAgICBtX3N0cnVjdHVyZVNldC5nZW5l
cmljRmlsdGVyKGtlZXBNYXJrZWRTdHJ1Y3R1cmVzRmlsdGVyKTsKIH0KSW5kZXg6IFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS9ydW50aW1lL1R5cGVTZXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvcnVudGltZS9UeXBlU2V0LmgJKHJldmlzaW9uIDIwMjM0OCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1R5cGVTZXQuaAkod29ya2luZyBjb3B5KQpAQCAtMjYs
MTAgKzI2LDEyIEBACiAjaWZuZGVmIFR5cGVTZXRfaAogI2RlZmluZSBUeXBlU2V0X2gKIAorI2lu
Y2x1ZGUgIkNvbmN1cnJlbnRKSVRMb2NrLmgiCiAjaW5jbHVkZSAiUnVudGltZVR5cGUuaCIKICNp
bmNsdWRlICJTdHJ1Y3R1cmVTZXQuaCIKICNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgogI2luY2x1
ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVk
Lmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CiAjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgogCkBAIC03OSw3ICs4MSw3IEBAIHByaXZhdGU6CiAgICAgYm9vbCBtX2lzSW5EaWN0aW9u
YXJ5TW9kZTsKIH07CiAKLWNsYXNzIFR5cGVTZXQgOiBwdWJsaWMgUmVmQ291bnRlZDxUeXBlU2V0
PiB7CitjbGFzcyBUeXBlU2V0IDogcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPFR5cGVTZXQ+
IHsKIAogcHVibGljOgogICAgIHN0YXRpYyBSZWY8VHlwZVNldD4gY3JlYXRlKCkgeyByZXR1cm4g
YWRvcHRSZWYoKm5ldyBUeXBlU2V0KTsgfQpAQCAtOTYsMTEgKzk4LDEyIEBAIHB1YmxpYzoKICAg
ICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX3NlZW5UeXBlcyA9PSBUeXBlTm90aGlu
ZzsgfQogICAgIGJvb2wgZG9lc1R5cGVDb25mb3JtVG8oUnVudGltZVR5cGVNYXNrIHRlc3QpIGNv
bnN0OwogICAgIFJ1bnRpbWVUeXBlTWFzayBzZWVuVHlwZXMoKSBjb25zdCB7IHJldHVybiBtX3Nl
ZW5UeXBlczsgfQotICAgIFN0cnVjdHVyZVNldCBzdHJ1Y3R1cmVTZXQoKSBjb25zdCB7IHJldHVy
biBtX3N0cnVjdHVyZVNldDsgfTsKKyAgICBTdHJ1Y3R1cmVTZXQgc3RydWN0dXJlU2V0KGNvbnN0
IENvbmN1cnJlbnRKSVRMb2NrZXImKSBjb25zdCB7IHJldHVybiBtX3N0cnVjdHVyZVNldDsgfQog
CisgICAgQ29uY3VycmVudEpJVExvY2sgbV9sb2NrOwogcHJpdmF0ZToKLSAgICBSdW50aW1lVHlw
ZU1hc2sgbV9zZWVuVHlwZXM7CiAgICAgYm9vbCBtX2lzT3ZlcmZsb3duOworICAgIFJ1bnRpbWVU
eXBlTWFzayBtX3NlZW5UeXBlczsKICAgICBWZWN0b3I8UmVmUHRyPFN0cnVjdHVyZVNoYXBlPj4g
bV9zdHJ1Y3R1cmVIaXN0b3J5OwogICAgIFN0cnVjdHVyZVNldCBtX3N0cnVjdHVyZVNldDsKIH07
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvdGVzdHMvdHlwZVByb2ZpbGVyL2RlbHRhYmx1
ZS1mb3Itb2YuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3R5
cGVQcm9maWxlci9kZWx0YWJsdWUtZm9yLW9mLmpzCShub25leGlzdGVudCkKKysrIFNvdXJjZS9K
YXZhU2NyaXB0Q29yZS90ZXN0cy90eXBlUHJvZmlsZXIvZGVsdGFibHVlLWZvci1vZi5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDg3MCBAQAorLy8gQ29weXJpZ2h0IDIwMDggdGhlIFY4IHBy
b2plY3QgYXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAxOTk2IEpv
aG4gTWFsb25leSBhbmQgTWFyaW8gV29sY3prby4KKworLy8gVGhpcyBwcm9ncmFtIGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKy8vIGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5CisvLyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvcgorLy8gKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KKy8vCisvLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKy8vIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisvLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisvLyBHTlUgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisvLyBhbG9uZyB3
aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorLy8g
Rm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEg
IDAyMTExLTEzMDcgIFVTQQorCisKKy8vIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIERlbHRh
Qmx1ZSBiZW5jaG1hcmsgaXMgZGVyaXZlZAorLy8gZnJvbSB0aGUgU21hbGx0YWxrIGltcGxlbWVu
dGF0aW9uIGJ5IEpvaG4gTWFsb25leSBhbmQgTWFyaW8KKy8vIFdvbGN6a28uIFNvbWUgcGFydHMg
aGF2ZSBiZWVuIHRyYW5zbGF0ZWQgZGlyZWN0bHksIHdoZXJlYXMKKy8vIG90aGVycyBoYXZlIGJl
ZW4gbW9kaWZpZWQgbW9yZSBhZ2dyZXNpdmVseSB0byBtYWtlIGl0IGZlZWwKKy8vIG1vcmUgbGlr
ZSBhIEphdmFTY3JpcHQgcHJvZ3JhbS4KKworLyoqCisgKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50
YXRpb24gb2YgdGhlIERlbHRhQmx1ZSBjb25zdHJhaW50LXNvbHZpbmcKKyAqIGFsZ29yaXRobSwg
YXMgZGVzY3JpYmVkIGluOgorICoKKyAqICJUaGUgRGVsdGFCbHVlIEFsZ29yaXRobTogQW4gSW5j
cmVtZW50YWwgQ29uc3RyYWludCBIaWVyYXJjaHkgU29sdmVyIgorICogICBCam9ybiBOLiBGcmVl
bWFuLUJlbnNvbiBhbmQgSm9obiBNYWxvbmV5CisgKiAgIEphbnVhcnkgMTk5MCBDb21tdW5pY2F0
aW9ucyBvZiB0aGUgQUNNLAorICogICBhbHNvIGF2YWlsYWJsZSBhcyBVbml2ZXJzaXR5IG9mIFdh
c2hpbmd0b24gVFIgODktMDgtMDYuCisgKgorICogQmV3YXJlOiB0aGlzIGJlbmNobWFyayBpcyB3
cml0dGVuIGluIGEgZ3JvdGVzcXVlIHN0eWxlIHdoZXJlCisgKiB0aGUgY29uc3RyYWludCBtb2Rl
bCBpcyBidWlsdCBieSBzaWRlLWVmZmVjdHMgZnJvbSBjb25zdHJ1Y3RvcnMuCisgKiBJJ3ZlIGtl
cHQgaXQgdGhpcyB3YXkgdG8gYXZvaWQgZGV2aWF0aW5nIHRvbyBtdWNoIGZyb20gdGhlIG9yaWdp
bmFsCisgKiBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisKKy8qIC0tLSBPIGIgaiBlIGMgdCAgIE0g
byBkIGUgbCAtLS0gKi8KKworT2JqZWN0LnByb3RvdHlwZS5pbmhlcml0c0Zyb20gPSBmdW5jdGlv
biAoc2h1cGVyKSB7CisgIGZ1bmN0aW9uIEluaGVyaXRlcigpIHsgfQorICBJbmhlcml0ZXIucHJv
dG90eXBlID0gc2h1cGVyLnByb3RvdHlwZTsKKyAgdGhpcy5wcm90b3R5cGUgPSBuZXcgSW5oZXJp
dGVyKCk7CisgIHRoaXMuc3VwZXJDb25zdHJ1Y3RvciA9IHNodXBlcjsKK30KKworZnVuY3Rpb24g
T3JkZXJlZENvbGxlY3Rpb24oKSB7CisgIHRoaXMuZWxtcyA9IG5ldyBBcnJheSgpOworfQorCitP
cmRlcmVkQ29sbGVjdGlvbi5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKGVsbSkgeworICB0aGlz
LmVsbXMucHVzaChlbG0pOworfQorCitPcmRlcmVkQ29sbGVjdGlvbi5wcm90b3R5cGUuYXQgPSBm
dW5jdGlvbiAoaW5kZXgpIHsKKyAgcmV0dXJuIHRoaXMuZWxtc1tpbmRleF07Cit9CisKK09yZGVy
ZWRDb2xsZWN0aW9uLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gdGhp
cy5lbG1zLmxlbmd0aDsKK30KKworT3JkZXJlZENvbGxlY3Rpb24ucHJvdG90eXBlLnJlbW92ZUZp
cnN0ID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gdGhpcy5lbG1zLnBvcCgpOworfQorCitPcmRl
cmVkQ29sbGVjdGlvbi5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gKGVsbSkgeworICB2YXIg
aW5kZXggPSAwLCBza2lwcGVkID0gMDsKKyAgZm9yICh2YXIgdmFsdWUgb2YgdGhpcy5lbG1zKSB7
CisgICAgaWYgKHZhbHVlICE9IGVsbSkgeworICAgICAgdGhpcy5lbG1zW2luZGV4XSA9IHZhbHVl
OworICAgICAgaW5kZXgrKzsKKyAgICB9IGVsc2UgeworICAgICAgc2tpcHBlZCsrOworICAgIH0K
KyAgfQorICBmb3IgKHZhciBpID0gMDsgaSA8IHNraXBwZWQ7IGkrKykKKyAgICB0aGlzLmVsbXMu
cG9wKCk7Cit9CisKKy8qIC0tLSAqCisgKiBTIHQgciBlIG4gZyB0IGgKKyAqIC0tLSAqLworCisv
KioKKyAqIFN0cmVuZ3RocyBhcmUgdXNlZCB0byBtZWFzdXJlIHRoZSByZWxhdGl2ZSBpbXBvcnRh
bmNlIG9mIGNvbnN0cmFpbnRzLgorICogTmV3IHN0cmVuZ3RocyBtYXkgYmUgaW5zZXJ0ZWQgaW4g
dGhlIHN0cmVuZ3RoIGhpZXJhcmNoeSB3aXRob3V0CisgKiBkaXNydXB0aW5nIGN1cnJlbnQgY29u
c3RyYWludHMuICBTdHJlbmd0aHMgY2Fubm90IGJlIGNyZWF0ZWQgb3V0c2lkZQorICogdGhpcyBj
bGFzcywgc28gcG9pbnRlciBjb21wYXJpc29uIGNhbiBiZSB1c2VkIGZvciB2YWx1ZSBjb21wYXJp
c29uLgorICovCitmdW5jdGlvbiBTdHJlbmd0aChzdHJlbmd0aFZhbHVlLCBuYW1lKSB7CisgIHRo
aXMuc3RyZW5ndGhWYWx1ZSA9IHN0cmVuZ3RoVmFsdWU7CisgIHRoaXMubmFtZSA9IG5hbWU7Cit9
CisKK1N0cmVuZ3RoLnN0cm9uZ2VyID0gZnVuY3Rpb24gKHMxLCBzMikgeworICByZXR1cm4gczEu
c3RyZW5ndGhWYWx1ZSA8IHMyLnN0cmVuZ3RoVmFsdWU7Cit9CisKK1N0cmVuZ3RoLndlYWtlciA9
IGZ1bmN0aW9uIChzMSwgczIpIHsKKyAgcmV0dXJuIHMxLnN0cmVuZ3RoVmFsdWUgPiBzMi5zdHJl
bmd0aFZhbHVlOworfQorCitTdHJlbmd0aC53ZWFrZXN0T2YgPSBmdW5jdGlvbiAoczEsIHMyKSB7
CisgIHJldHVybiB0aGlzLndlYWtlcihzMSwgczIpID8gczEgOiBzMjsKK30KKworU3RyZW5ndGgu
c3Ryb25nZXN0ID0gZnVuY3Rpb24gKHMxLCBzMikgeworICByZXR1cm4gdGhpcy5zdHJvbmdlcihz
MSwgczIpID8gczEgOiBzMjsKK30KKworU3RyZW5ndGgucHJvdG90eXBlLm5leHRXZWFrZXIgPSBm
dW5jdGlvbiAoKSB7CisgIHN3aXRjaCAodGhpcy5zdHJlbmd0aFZhbHVlKSB7CisgICAgY2FzZSAw
OiByZXR1cm4gU3RyZW5ndGguV0VBS0VTVDsKKyAgICBjYXNlIDE6IHJldHVybiBTdHJlbmd0aC5X
RUFLX0RFRkFVTFQ7CisgICAgY2FzZSAyOiByZXR1cm4gU3RyZW5ndGguTk9STUFMOworICAgIGNh
c2UgMzogcmV0dXJuIFN0cmVuZ3RoLlNUUk9OR19ERUZBVUxUOworICAgIGNhc2UgNDogcmV0dXJu
IFN0cmVuZ3RoLlBSRUZFUlJFRDsKKyAgICBjYXNlIDU6IHJldHVybiBTdHJlbmd0aC5SRVFVSVJF
RDsKKyAgfQorfQorCisvLyBTdHJlbmd0aCBjb25zdGFudHMuCitTdHJlbmd0aC5SRVFVSVJFRCAg
ICAgICAgPSBuZXcgU3RyZW5ndGgoMCwgInJlcXVpcmVkIik7CitTdHJlbmd0aC5TVE9OR19QUkVG
RVJSRUQgPSBuZXcgU3RyZW5ndGgoMSwgInN0cm9uZ1ByZWZlcnJlZCIpOworU3RyZW5ndGguUFJF
RkVSUkVEICAgICAgID0gbmV3IFN0cmVuZ3RoKDIsICJwcmVmZXJyZWQiKTsKK1N0cmVuZ3RoLlNU
Uk9OR19ERUZBVUxUICA9IG5ldyBTdHJlbmd0aCgzLCAic3Ryb25nRGVmYXVsdCIpOworU3RyZW5n
dGguTk9STUFMICAgICAgICAgID0gbmV3IFN0cmVuZ3RoKDQsICJub3JtYWwiKTsKK1N0cmVuZ3Ro
LldFQUtfREVGQVVMVCAgICA9IG5ldyBTdHJlbmd0aCg1LCAid2Vha0RlZmF1bHQiKTsKK1N0cmVu
Z3RoLldFQUtFU1QgICAgICAgICA9IG5ldyBTdHJlbmd0aCg2LCAid2Vha2VzdCIpOworCisvKiAt
LS0gKgorICogQyBvIG4gcyB0IHIgYSBpIG4gdAorICogLS0tICovCisKKy8qKgorICogQW4gYWJz
dHJhY3QgY2xhc3MgcmVwcmVzZW50aW5nIGEgc3lzdGVtLW1haW50YWluYWJsZSByZWxhdGlvbnNo
aXAKKyAqIChvciAiY29uc3RyYWludCIpIGJldHdlZW4gYSBzZXQgb2YgdmFyaWFibGVzLiBBIGNv
bnN0cmFpbnQgc3VwcGxpZXMKKyAqIGEgc3RyZW5ndGggaW5zdGFuY2UgdmFyaWFibGU7IGNvbmNy
ZXRlIHN1YmNsYXNzZXMgcHJvdmlkZSBhIG1lYW5zCisgKiBvZiBzdG9yaW5nIHRoZSBjb25zdHJh
aW5lZCB2YXJpYWJsZXMgYW5kIG90aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkCisgKiB0byByZXBy
ZXNlbnQgYSBjb25zdHJhaW50LgorICovCitmdW5jdGlvbiBDb25zdHJhaW50KHN0cmVuZ3RoKSB7
CisgIHRoaXMuc3RyZW5ndGggPSBzdHJlbmd0aDsKK30KKworLyoqCisgKiBBY3RpdmF0ZSB0aGlz
IGNvbnN0cmFpbnQgYW5kIGF0dGVtcHQgdG8gc2F0aXNmeSBpdC4KKyAqLworQ29uc3RyYWludC5w
cm90b3R5cGUuYWRkQ29uc3RyYWludCA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5hZGRUb0dyYXBo
KCk7CisgIHBsYW5uZXIuaW5jcmVtZW50YWxBZGQodGhpcyk7Cit9CisKKy8qKgorICogQXR0ZW1w
dCB0byBmaW5kIGEgd2F5IHRvIGVuZm9yY2UgdGhpcyBjb25zdHJhaW50LiBJZiBzdWNjZXNzZnVs
LAorICogcmVjb3JkIHRoZSBzb2x1dGlvbiwgcGVyaGFwcyBtb2RpZnlpbmcgdGhlIGN1cnJlbnQg
ZGF0YWZsb3cKKyAqIGdyYXBoLiBBbnN3ZXIgdGhlIGNvbnN0cmFpbnQgdGhhdCB0aGlzIGNvbnN0
cmFpbnQgb3ZlcnJpZGVzLCBpZgorICogdGhlcmUgaXMgb25lLCBvciBuaWwsIGlmIHRoZXJlIGlz
bid0LgorICogQXNzdW1lOiBJIGFtIG5vdCBhbHJlYWR5IHNhdGlzZmllZC4KKyAqLworQ29uc3Ry
YWludC5wcm90b3R5cGUuc2F0aXNmeSA9IGZ1bmN0aW9uIChtYXJrKSB7CisgIHRoaXMuY2hvb3Nl
TWV0aG9kKG1hcmspOworICBpZiAoIXRoaXMuaXNTYXRpc2ZpZWQoKSkgeworICAgIGlmICh0aGlz
LnN0cmVuZ3RoID09IFN0cmVuZ3RoLlJFUVVJUkVEKQorICAgICAgYWxlcnQoIkNvdWxkIG5vdCBz
YXRpc2Z5IGEgcmVxdWlyZWQgY29uc3RyYWludCEiKTsKKyAgICByZXR1cm4gbnVsbDsKKyAgfQor
ICB0aGlzLm1hcmtJbnB1dHMobWFyayk7CisgIHZhciBvdXQgPSB0aGlzLm91dHB1dCgpOworICB2
YXIgb3ZlcnJpZGRlbiA9IG91dC5kZXRlcm1pbmVkQnk7CisgIGlmIChvdmVycmlkZGVuICE9IG51
bGwpIG92ZXJyaWRkZW4ubWFya1Vuc2F0aXNmaWVkKCk7CisgIG91dC5kZXRlcm1pbmVkQnkgPSB0
aGlzOworICBpZiAoIXBsYW5uZXIuYWRkUHJvcGFnYXRlKHRoaXMsIG1hcmspKQorICAgIGFsZXJ0
KCJDeWNsZSBlbmNvdW50ZXJlZCIpOworICBvdXQubWFyayA9IG1hcms7CisgIHJldHVybiBvdmVy
cmlkZGVuOworfQorCitDb25zdHJhaW50LnByb3RvdHlwZS5kZXN0cm95Q29uc3RyYWludCA9IGZ1
bmN0aW9uICgpIHsKKyAgaWYgKHRoaXMuaXNTYXRpc2ZpZWQoKSkgcGxhbm5lci5pbmNyZW1lbnRh
bFJlbW92ZSh0aGlzKTsKKyAgZWxzZSB0aGlzLnJlbW92ZUZyb21HcmFwaCgpOworfQorCisvKioK
KyAqIE5vcm1hbCBjb25zdHJhaW50cyBhcmUgbm90IGlucHV0IGNvbnN0cmFpbnRzLiAgQW4gaW5w
dXQgY29uc3RyYWludAorICogaXMgb25lIHRoYXQgZGVwZW5kcyBvbiBleHRlcm5hbCBzdGF0ZSwg
c3VjaCBhcyB0aGUgbW91c2UsIHRoZQorICoga2V5Ym9yZCwgYSBjbG9jaywgb3Igc29tZSBhcmJp
dHJhdHkgcGllY2Ugb2YgaW1wZXJhdGl2ZSBjb2RlLgorICovCitDb25zdHJhaW50LnByb3RvdHlw
ZS5pc0lucHV0ID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIC0tLSAq
CisgKiBVIG4gYSByIHkgICBDIG8gbiBzIHQgciBhIGkgbiB0CisgKiAtLS0gKi8KKworLyoqCisg
KiBBYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBjb25zdHJhaW50cyBoYXZpbmcgYSBzaW5nbGUgcG9z
c2libGUgb3V0cHV0CisgKiB2YXJpYWJsZS4KKyAqLworZnVuY3Rpb24gVW5hcnlDb25zdHJhaW50
KHYsIHN0cmVuZ3RoKSB7CisgIFVuYXJ5Q29uc3RyYWludC5zdXBlckNvbnN0cnVjdG9yLmNhbGwo
dGhpcywgc3RyZW5ndGgpOworICB0aGlzLm15T3V0cHV0ID0gdjsKKyAgdGhpcy5zYXRpc2ZpZWQg
PSBmYWxzZTsKKyAgdGhpcy5hZGRDb25zdHJhaW50KCk7Cit9CisKK1VuYXJ5Q29uc3RyYWludC5p
bmhlcml0c0Zyb20oQ29uc3RyYWludCk7CisKKy8qKgorICogQWRkcyB0aGlzIGNvbnN0cmFpbnQg
dG8gdGhlIGNvbnN0cmFpbnQgZ3JhcGgKKyAqLworVW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5h
ZGRUb0dyYXBoID0gZnVuY3Rpb24gKCkgeworICB0aGlzLm15T3V0cHV0LmFkZENvbnN0cmFpbnQo
dGhpcyk7CisgIHRoaXMuc2F0aXNmaWVkID0gZmFsc2U7Cit9CisKKy8qKgorICogRGVjaWRlcyBp
ZiB0aGlzIGNvbnN0cmFpbnQgY2FuIGJlIHNhdGlzZmllZCBhbmQgcmVjb3JkcyB0aGF0CisgKiBk
ZWNpc2lvbi4KKyAqLworVW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5jaG9vc2VNZXRob2QgPSBm
dW5jdGlvbiAobWFyaykgeworICB0aGlzLnNhdGlzZmllZCA9ICh0aGlzLm15T3V0cHV0Lm1hcmsg
IT0gbWFyaykKKyAgICAmJiBTdHJlbmd0aC5zdHJvbmdlcih0aGlzLnN0cmVuZ3RoLCB0aGlzLm15
T3V0cHV0LndhbGtTdHJlbmd0aCk7Cit9CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmIHRoaXMg
Y29uc3RyYWludCBpcyBzYXRpc2ZpZWQgaW4gdGhlIGN1cnJlbnQgc29sdXRpb24uCisgKi8KK1Vu
YXJ5Q29uc3RyYWludC5wcm90b3R5cGUuaXNTYXRpc2ZpZWQgPSBmdW5jdGlvbiAoKSB7CisgIHJl
dHVybiB0aGlzLnNhdGlzZmllZDsKK30KKworVW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5tYXJr
SW5wdXRzID0gZnVuY3Rpb24gKG1hcmspIHsKKyAgLy8gaGFzIG5vIGlucHV0cworfQorCisvKioK
KyAqIFJldHVybnMgdGhlIGN1cnJlbnQgb3V0cHV0IHZhcmlhYmxlLgorICovCitVbmFyeUNvbnN0
cmFpbnQucHJvdG90eXBlLm91dHB1dCA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHRoaXMubXlP
dXRwdXQ7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSB3YWxrYWJvdXQgc3RyZW5ndGgsIHRo
ZSBzdGF5IGZsYWcsIGFuZCwgaWYgaXQgaXMKKyAqICdzdGF5JywgdGhlIHZhbHVlIGZvciB0aGUg
Y3VycmVudCBvdXRwdXQgb2YgdGhpcyBjb25zdHJhaW50LiBBc3N1bWUKKyAqIHRoaXMgY29uc3Ry
YWludCBpcyBzYXRpc2ZpZWQuCisgKi8KK1VuYXJ5Q29uc3RyYWludC5wcm90b3R5cGUucmVjYWxj
dWxhdGUgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMubXlPdXRwdXQud2Fsa1N0cmVuZ3RoID0gdGhp
cy5zdHJlbmd0aDsKKyAgdGhpcy5teU91dHB1dC5zdGF5ID0gIXRoaXMuaXNJbnB1dCgpOworICBp
ZiAodGhpcy5teU91dHB1dC5zdGF5KSB0aGlzLmV4ZWN1dGUoKTsgLy8gU3RheSBvcHRpbWl6YXRp
b24KK30KKworLyoqCisgKiBSZWNvcmRzIHRoYXQgdGhpcyBjb25zdHJhaW50IGlzIHVuc2F0aXNm
aWVkCisgKi8KK1VuYXJ5Q29uc3RyYWludC5wcm90b3R5cGUubWFya1Vuc2F0aXNmaWVkID0gZnVu
Y3Rpb24gKCkgeworICB0aGlzLnNhdGlzZmllZCA9IGZhbHNlOworfQorCitVbmFyeUNvbnN0cmFp
bnQucHJvdG90eXBlLmlucHV0c0tub3duID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gdHJ1ZTsK
K30KKworVW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5yZW1vdmVGcm9tR3JhcGggPSBmdW5jdGlv
biAoKSB7CisgIGlmICh0aGlzLm15T3V0cHV0ICE9IG51bGwpIHRoaXMubXlPdXRwdXQucmVtb3Zl
Q29uc3RyYWludCh0aGlzKTsKKyAgdGhpcy5zYXRpc2ZpZWQgPSBmYWxzZTsKK30KKworLyogLS0t
ICoKKyAqIFMgdCBhIHkgICBDIG8gbiBzIHQgciBhIGkgbiB0CisgKiAtLS0gKi8KKworLyoqCisg
KiBWYXJpYWJsZXMgdGhhdCBzaG91bGQsIHdpdGggc29tZSBsZXZlbCBvZiBwcmVmZXJlbmNlLCBz
dGF5IHRoZSBzYW1lLgorICogUGxhbm5lcnMgbWF5IGV4cGxvaXQgdGhlIGZhY3QgdGhhdCBpbnN0
YW5jZXMsIGlmIHNhdGlzZmllZCwgd2lsbCBub3QKKyAqIGNoYW5nZSB0aGVpciBvdXRwdXQgZHVy
aW5nIHBsYW4gZXhlY3V0aW9uLiAgVGhpcyBpcyBjYWxsZWQgInN0YXkKKyAqIG9wdGltaXphdGlv
biIuCisgKi8KK2Z1bmN0aW9uIFN0YXlDb25zdHJhaW50KHYsIHN0cikgeworICBTdGF5Q29uc3Ry
YWludC5zdXBlckNvbnN0cnVjdG9yLmNhbGwodGhpcywgdiwgc3RyKTsKK30KKworU3RheUNvbnN0
cmFpbnQuaW5oZXJpdHNGcm9tKFVuYXJ5Q29uc3RyYWludCk7CisKK1N0YXlDb25zdHJhaW50LnBy
b3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKCkgeworICAvLyBTdGF5IGNvbnN0cmFpbnRzIGRv
IG5vdGhpbmcKK30KKworLyogLS0tICoKKyAqIEUgZCBpIHQgICBDIG8gbiBzIHQgciBhIGkgbiB0
CisgKiAtLS0gKi8KKworLyoqCisgKiBBIHVuYXJ5IGlucHV0IGNvbnN0cmFpbnQgdXNlZCB0byBt
YXJrIGEgdmFyaWFibGUgdGhhdCB0aGUgY2xpZW50CisgKiB3aXNoZXMgdG8gY2hhbmdlLgorICov
CitmdW5jdGlvbiBFZGl0Q29uc3RyYWludCh2LCBzdHIpIHsKKyAgRWRpdENvbnN0cmFpbnQuc3Vw
ZXJDb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHYsIHN0cik7Cit9CisKK0VkaXRDb25zdHJhaW50Lmlu
aGVyaXRzRnJvbShVbmFyeUNvbnN0cmFpbnQpOworCisvKioKKyAqIEVkaXRzIGluZGljYXRlIHRo
YXQgYSB2YXJpYWJsZSBpcyB0byBiZSBjaGFuZ2VkIGJ5IGltcGVyYXRpdmUgY29kZS4KKyAqLwor
RWRpdENvbnN0cmFpbnQucHJvdG90eXBlLmlzSW5wdXQgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVy
biB0cnVlOworfQorCitFZGl0Q29uc3RyYWludC5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9u
ICgpIHsKKyAgLy8gRWRpdCBjb25zdHJhaW50cyBkbyBub3RoaW5nCit9CisKKy8qIC0tLSAqCisg
KiBCIGkgbiBhIHIgeSAgIEMgbyBuIHMgdCByIGEgaSBuIHQKKyAqIC0tLSAqLworCit2YXIgRGly
ZWN0aW9uID0gbmV3IE9iamVjdCgpOworRGlyZWN0aW9uLk5PTkUgICAgID0gMDsKK0RpcmVjdGlv
bi5GT1JXQVJEICA9IDE7CitEaXJlY3Rpb24uQkFDS1dBUkQgPSAtMTsKKworLyoqCisgKiBBYnN0
cmFjdCBzdXBlcmNsYXNzIGZvciBjb25zdHJhaW50cyBoYXZpbmcgdHdvIHBvc3NpYmxlIG91dHB1
dAorICogdmFyaWFibGVzLgorICovCitmdW5jdGlvbiBCaW5hcnlDb25zdHJhaW50KHZhcjEsIHZh
cjIsIHN0cmVuZ3RoKSB7CisgIEJpbmFyeUNvbnN0cmFpbnQuc3VwZXJDb25zdHJ1Y3Rvci5jYWxs
KHRoaXMsIHN0cmVuZ3RoKTsKKyAgdGhpcy52MSA9IHZhcjE7CisgIHRoaXMudjIgPSB2YXIyOwor
ICB0aGlzLmRpcmVjdGlvbiA9IERpcmVjdGlvbi5OT05FOworICB0aGlzLmFkZENvbnN0cmFpbnQo
KTsKK30KKworQmluYXJ5Q29uc3RyYWludC5pbmhlcml0c0Zyb20oQ29uc3RyYWludCk7CisKKy8q
KgorICogRGVjaWRlcyBpZiB0aGlzIGNvbnN0cmFpbnQgY2FuIGJlIHNhdGlzZmllZCBhbmQgd2hp
Y2ggd2F5IGl0CisgKiBzaG91bGQgZmxvdyBiYXNlZCBvbiB0aGUgcmVsYXRpdmUgc3RyZW5ndGgg
b2YgdGhlIHZhcmlhYmxlcyByZWxhdGVkLAorICogYW5kIHJlY29yZCB0aGF0IGRlY2lzaW9uLgor
ICovCitCaW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5jaG9vc2VNZXRob2QgPSBmdW5jdGlvbiAo
bWFyaykgeworICBpZiAodGhpcy52MS5tYXJrID09IG1hcmspIHsKKyAgICB0aGlzLmRpcmVjdGlv
biA9ICh0aGlzLnYyLm1hcmsgIT0gbWFyayAmJiBTdHJlbmd0aC5zdHJvbmdlcih0aGlzLnN0cmVu
Z3RoLCB0aGlzLnYyLndhbGtTdHJlbmd0aCkpCisgICAgICA/IERpcmVjdGlvbi5GT1JXQVJECisg
ICAgICA6IERpcmVjdGlvbi5OT05FOworICB9CisgIGlmICh0aGlzLnYyLm1hcmsgPT0gbWFyaykg
eworICAgIHRoaXMuZGlyZWN0aW9uID0gKHRoaXMudjEubWFyayAhPSBtYXJrICYmIFN0cmVuZ3Ro
LnN0cm9uZ2VyKHRoaXMuc3RyZW5ndGgsIHRoaXMudjEud2Fsa1N0cmVuZ3RoKSkKKyAgICAgID8g
RGlyZWN0aW9uLkJBQ0tXQVJECisgICAgICA6IERpcmVjdGlvbi5OT05FOworICB9CisgIGlmIChT
dHJlbmd0aC53ZWFrZXIodGhpcy52MS53YWxrU3RyZW5ndGgsIHRoaXMudjIud2Fsa1N0cmVuZ3Ro
KSkgeworICAgIHRoaXMuZGlyZWN0aW9uID0gU3RyZW5ndGguc3Ryb25nZXIodGhpcy5zdHJlbmd0
aCwgdGhpcy52MS53YWxrU3RyZW5ndGgpCisgICAgICA/IERpcmVjdGlvbi5CQUNLV0FSRAorICAg
ICAgOiBEaXJlY3Rpb24uTk9ORTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLmRpcmVjdGlvbiA9IFN0
cmVuZ3RoLnN0cm9uZ2VyKHRoaXMuc3RyZW5ndGgsIHRoaXMudjIud2Fsa1N0cmVuZ3RoKQorICAg
ICAgPyBEaXJlY3Rpb24uRk9SV0FSRAorICAgICAgOiBEaXJlY3Rpb24uQkFDS1dBUkQKKyAgfQor
fQorCisvKioKKyAqIEFkZCB0aGlzIGNvbnN0cmFpbnQgdG8gdGhlIGNvbnN0cmFpbnQgZ3JhcGgK
KyAqLworQmluYXJ5Q29uc3RyYWludC5wcm90b3R5cGUuYWRkVG9HcmFwaCA9IGZ1bmN0aW9uICgp
IHsKKyAgdGhpcy52MS5hZGRDb25zdHJhaW50KHRoaXMpOworICB0aGlzLnYyLmFkZENvbnN0cmFp
bnQodGhpcyk7CisgIHRoaXMuZGlyZWN0aW9uID0gRGlyZWN0aW9uLk5PTkU7Cit9CisKKy8qKgor
ICogQW5zd2VyIHRydWUgaWYgdGhpcyBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBpbiB0aGUgY3Vy
cmVudCBzb2x1dGlvbi4KKyAqLworQmluYXJ5Q29uc3RyYWludC5wcm90b3R5cGUuaXNTYXRpc2Zp
ZWQgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0aGlzLmRpcmVjdGlvbiAhPSBEaXJlY3Rpb24u
Tk9ORTsKK30KKworLyoqCisgKiBNYXJrIHRoZSBpbnB1dCB2YXJpYWJsZSB3aXRoIHRoZSBnaXZl
biBtYXJrLgorICovCitCaW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5tYXJrSW5wdXRzID0gZnVu
Y3Rpb24gKG1hcmspIHsKKyAgdGhpcy5pbnB1dCgpLm1hcmsgPSBtYXJrOworfQorCisvKioKKyAq
IFJldHVybnMgdGhlIGN1cnJlbnQgaW5wdXQgdmFyaWFibGUKKyAqLworQmluYXJ5Q29uc3RyYWlu
dC5wcm90b3R5cGUuaW5wdXQgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiAodGhpcy5kaXJlY3Rp
b24gPT0gRGlyZWN0aW9uLkZPUldBUkQpID8gdGhpcy52MSA6IHRoaXMudjI7Cit9CisKKy8qKgor
ICogUmV0dXJucyB0aGUgY3VycmVudCBvdXRwdXQgdmFyaWFibGUKKyAqLworQmluYXJ5Q29uc3Ry
YWludC5wcm90b3R5cGUub3V0cHV0ID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gKHRoaXMuZGly
ZWN0aW9uID09IERpcmVjdGlvbi5GT1JXQVJEKSA/IHRoaXMudjIgOiB0aGlzLnYxOworfQorCisv
KioKKyAqIENhbGN1bGF0ZSB0aGUgd2Fsa2Fib3V0IHN0cmVuZ3RoLCB0aGUgc3RheSBmbGFnLCBh
bmQsIGlmIGl0IGlzCisgKiAnc3RheScsIHRoZSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgb3V0cHV0
IG9mIHRoaXMKKyAqIGNvbnN0cmFpbnQuIEFzc3VtZSB0aGlzIGNvbnN0cmFpbnQgaXMgc2F0aXNm
aWVkLgorICovCitCaW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5yZWNhbGN1bGF0ZSA9IGZ1bmN0
aW9uICgpIHsKKyAgdmFyIGlobiA9IHRoaXMuaW5wdXQoKSwgb3V0ID0gdGhpcy5vdXRwdXQoKTsK
KyAgb3V0LndhbGtTdHJlbmd0aCA9IFN0cmVuZ3RoLndlYWtlc3RPZih0aGlzLnN0cmVuZ3RoLCBp
aG4ud2Fsa1N0cmVuZ3RoKTsKKyAgb3V0LnN0YXkgPSBpaG4uc3RheTsKKyAgaWYgKG91dC5zdGF5
KSB0aGlzLmV4ZWN1dGUoKTsKK30KKworLyoqCisgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCB0aGlz
IGNvbnN0cmFpbnQgaXMgdW5zYXRpc2ZpZWQuCisgKi8KK0JpbmFyeUNvbnN0cmFpbnQucHJvdG90
eXBlLm1hcmtVbnNhdGlzZmllZCA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5kaXJlY3Rpb24gPSBE
aXJlY3Rpb24uTk9ORTsKK30KKworQmluYXJ5Q29uc3RyYWludC5wcm90b3R5cGUuaW5wdXRzS25v
d24gPSBmdW5jdGlvbiAobWFyaykgeworICB2YXIgaSA9IHRoaXMuaW5wdXQoKTsKKyAgcmV0dXJu
IGkubWFyayA9PSBtYXJrIHx8IGkuc3RheSB8fCBpLmRldGVybWluZWRCeSA9PSBudWxsOworfQor
CitCaW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5yZW1vdmVGcm9tR3JhcGggPSBmdW5jdGlvbiAo
KSB7CisgIGlmICh0aGlzLnYxICE9IG51bGwpIHRoaXMudjEucmVtb3ZlQ29uc3RyYWludCh0aGlz
KTsKKyAgaWYgKHRoaXMudjIgIT0gbnVsbCkgdGhpcy52Mi5yZW1vdmVDb25zdHJhaW50KHRoaXMp
OworICB0aGlzLmRpcmVjdGlvbiA9IERpcmVjdGlvbi5OT05FOworfQorCisvKiAtLS0gKgorICog
UyBjIGEgbCBlICAgQyBvIG4gcyB0IHIgYSBpIG4gdAorICogLS0tICovCisKKy8qKgorICogUmVs
YXRlcyB0d28gdmFyaWFibGVzIGJ5IHRoZSBsaW5lYXIgc2NhbGluZyByZWxhdGlvbnNoaXA6ICJ2
MiA9CisgKiAodjEgKiBzY2FsZSkgKyBvZmZzZXQiLiBFaXRoZXIgdjEgb3IgdjIgbWF5IGJlIGNo
YW5nZWQgdG8gbWFpbnRhaW4KKyAqIHRoaXMgcmVsYXRpb25zaGlwIGJ1dCB0aGUgc2NhbGUgZmFj
dG9yIGFuZCBvZmZzZXQgYXJlIGNvbnNpZGVyZWQKKyAqIHJlYWQtb25seS4KKyAqLworZnVuY3Rp
b24gU2NhbGVDb25zdHJhaW50KHNyYywgc2NhbGUsIG9mZnNldCwgZGVzdCwgc3RyZW5ndGgpIHsK
KyAgdGhpcy5kaXJlY3Rpb24gPSBEaXJlY3Rpb24uTk9ORTsKKyAgdGhpcy5zY2FsZSA9IHNjYWxl
OworICB0aGlzLm9mZnNldCA9IG9mZnNldDsKKyAgU2NhbGVDb25zdHJhaW50LnN1cGVyQ29uc3Ry
dWN0b3IuY2FsbCh0aGlzLCBzcmMsIGRlc3QsIHN0cmVuZ3RoKTsKK30KKworU2NhbGVDb25zdHJh
aW50LmluaGVyaXRzRnJvbShCaW5hcnlDb25zdHJhaW50KTsKKworLyoqCisgKiBBZGRzIHRoaXMg
Y29uc3RyYWludCB0byB0aGUgY29uc3RyYWludCBncmFwaC4KKyAqLworU2NhbGVDb25zdHJhaW50
LnByb3RvdHlwZS5hZGRUb0dyYXBoID0gZnVuY3Rpb24gKCkgeworICBTY2FsZUNvbnN0cmFpbnQu
c3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5cGUuYWRkVG9HcmFwaC5jYWxsKHRoaXMpOworICB0aGlz
LnNjYWxlLmFkZENvbnN0cmFpbnQodGhpcyk7CisgIHRoaXMub2Zmc2V0LmFkZENvbnN0cmFpbnQo
dGhpcyk7Cit9CisKK1NjYWxlQ29uc3RyYWludC5wcm90b3R5cGUucmVtb3ZlRnJvbUdyYXBoID0g
ZnVuY3Rpb24gKCkgeworICBTY2FsZUNvbnN0cmFpbnQuc3VwZXJDb25zdHJ1Y3Rvci5wcm90b3R5
cGUucmVtb3ZlRnJvbUdyYXBoLmNhbGwodGhpcyk7CisgIGlmICh0aGlzLnNjYWxlICE9IG51bGwp
IHRoaXMuc2NhbGUucmVtb3ZlQ29uc3RyYWludCh0aGlzKTsKKyAgaWYgKHRoaXMub2Zmc2V0ICE9
IG51bGwpIHRoaXMub2Zmc2V0LnJlbW92ZUNvbnN0cmFpbnQodGhpcyk7Cit9CisKK1NjYWxlQ29u
c3RyYWludC5wcm90b3R5cGUubWFya0lucHV0cyA9IGZ1bmN0aW9uIChtYXJrKSB7CisgIFNjYWxl
Q29uc3RyYWludC5zdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZS5tYXJrSW5wdXRzLmNhbGwodGhp
cywgbWFyayk7CisgIHRoaXMuc2NhbGUubWFyayA9IHRoaXMub2Zmc2V0Lm1hcmsgPSBtYXJrOwor
fQorCisvKioKKyAqIEVuZm9yY2UgdGhpcyBjb25zdHJhaW50LiBBc3N1bWUgdGhhdCBpdCBpcyBz
YXRpc2ZpZWQuCisgKi8KK1NjYWxlQ29uc3RyYWludC5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0
aW9uICgpIHsKKyAgaWYgKHRoaXMuZGlyZWN0aW9uID09IERpcmVjdGlvbi5GT1JXQVJEKSB7Cisg
ICAgdGhpcy52Mi52YWx1ZSA9IHRoaXMudjEudmFsdWUgKiB0aGlzLnNjYWxlLnZhbHVlICsgdGhp
cy5vZmZzZXQudmFsdWU7CisgIH0gZWxzZSB7CisgICAgdGhpcy52MS52YWx1ZSA9ICh0aGlzLnYy
LnZhbHVlIC0gdGhpcy5vZmZzZXQudmFsdWUpIC8gdGhpcy5zY2FsZS52YWx1ZTsKKyAgfQorfQor
CisvKioKKyAqIENhbGN1bGF0ZSB0aGUgd2Fsa2Fib3V0IHN0cmVuZ3RoLCB0aGUgc3RheSBmbGFn
LCBhbmQsIGlmIGl0IGlzCisgKiAnc3RheScsIHRoZSB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgb3V0
cHV0IG9mIHRoaXMgY29uc3RyYWludC4gQXNzdW1lCisgKiB0aGlzIGNvbnN0cmFpbnQgaXMgc2F0
aXNmaWVkLgorICovCitTY2FsZUNvbnN0cmFpbnQucHJvdG90eXBlLnJlY2FsY3VsYXRlID0gZnVu
Y3Rpb24gKCkgeworICB2YXIgaWhuID0gdGhpcy5pbnB1dCgpLCBvdXQgPSB0aGlzLm91dHB1dCgp
OworICBvdXQud2Fsa1N0cmVuZ3RoID0gU3RyZW5ndGgud2Vha2VzdE9mKHRoaXMuc3RyZW5ndGgs
IGlobi53YWxrU3RyZW5ndGgpOworICBvdXQuc3RheSA9IGlobi5zdGF5ICYmIHRoaXMuc2NhbGUu
c3RheSAmJiB0aGlzLm9mZnNldC5zdGF5OworICBpZiAob3V0LnN0YXkpIHRoaXMuZXhlY3V0ZSgp
OworfQorCisvKiAtLS0gKgorICogRSBxIHUgYSBsIGkgdCAgeSAgIEMgbyBuIHMgdCByIGEgaSBu
IHQKKyAqIC0tLSAqLworCisvKioKKyAqIENvbnN0cmFpbnMgdHdvIHZhcmlhYmxlcyB0byBoYXZl
IHRoZSBzYW1lIHZhbHVlLgorICovCitmdW5jdGlvbiBFcXVhbGl0eUNvbnN0cmFpbnQodmFyMSwg
dmFyMiwgc3RyZW5ndGgpIHsKKyAgRXF1YWxpdHlDb25zdHJhaW50LnN1cGVyQ29uc3RydWN0b3Iu
Y2FsbCh0aGlzLCB2YXIxLCB2YXIyLCBzdHJlbmd0aCk7Cit9CisKK0VxdWFsaXR5Q29uc3RyYWlu
dC5pbmhlcml0c0Zyb20oQmluYXJ5Q29uc3RyYWludCk7CisKKy8qKgorICogRW5mb3JjZSB0aGlz
IGNvbnN0cmFpbnQuIEFzc3VtZSB0aGF0IGl0IGlzIHNhdGlzZmllZC4KKyAqLworRXF1YWxpdHlD
b25zdHJhaW50LnByb3RvdHlwZS5leGVjdXRlID0gZnVuY3Rpb24gKCkgeworICB0aGlzLm91dHB1
dCgpLnZhbHVlID0gdGhpcy5pbnB1dCgpLnZhbHVlOworfQorCisvKiAtLS0gKgorICogViBhIHIg
aSBhIGIgbCBlCisgKiAtLS0gKi8KKworLyoqCisgKiBBIGNvbnN0cmFpbmVkIHZhcmlhYmxlLiBJ
biBhZGRpdGlvbiB0byBpdHMgdmFsdWUsIGl0IG1haW50YWluIHRoZQorICogc3RydWN0dXJlIG9m
IHRoZSBjb25zdHJhaW50IGdyYXBoLCB0aGUgY3VycmVudCBkYXRhZmxvdyBncmFwaCwgYW5kCisg
KiB2YXJpb3VzIHBhcmFtZXRlcnMgb2YgaW50ZXJlc3QgdG8gdGhlIERlbHRhQmx1ZSBpbmNyZW1l
bnRhbAorICogY29uc3RyYWludCBzb2x2ZXIuCisgKiovCitmdW5jdGlvbiBWYXJpYWJsZShuYW1l
LCBpbml0aWFsVmFsdWUpIHsKKyAgdGhpcy52YWx1ZSA9IGluaXRpYWxWYWx1ZSB8fCAwOworICB0
aGlzLmNvbnN0cmFpbnRzID0gbmV3IE9yZGVyZWRDb2xsZWN0aW9uKCk7CisgIHRoaXMuZGV0ZXJt
aW5lZEJ5ID0gbnVsbDsKKyAgdGhpcy5tYXJrID0gMDsKKyAgdGhpcy53YWxrU3RyZW5ndGggPSBT
dHJlbmd0aC5XRUFLRVNUOworICB0aGlzLnN0YXkgPSB0cnVlOworICB0aGlzLm5hbWUgPSBuYW1l
OworfQorCisvKioKKyAqIEFkZCB0aGUgZ2l2ZW4gY29uc3RyYWludCB0byB0aGUgc2V0IG9mIGFs
bCBjb25zdHJhaW50cyB0aGF0IHJlZmVyCisgKiB0aGlzIHZhcmlhYmxlLgorICovCitWYXJpYWJs
ZS5wcm90b3R5cGUuYWRkQ29uc3RyYWludCA9IGZ1bmN0aW9uIChjKSB7CisgIHRoaXMuY29uc3Ry
YWludHMuYWRkKGMpOworfQorCisvKioKKyAqIFJlbW92ZXMgYWxsIHRyYWNlcyBvZiBjIGZyb20g
dGhpcyB2YXJpYWJsZS4KKyAqLworVmFyaWFibGUucHJvdG90eXBlLnJlbW92ZUNvbnN0cmFpbnQg
PSBmdW5jdGlvbiAoYykgeworICB0aGlzLmNvbnN0cmFpbnRzLnJlbW92ZShjKTsKKyAgaWYgKHRo
aXMuZGV0ZXJtaW5lZEJ5ID09IGMpIHRoaXMuZGV0ZXJtaW5lZEJ5ID0gbnVsbDsKK30KKworLyog
LS0tICoKKyAqIFAgbCBhIG4gbiBlIHIKKyAqIC0tLSAqLworCisvKioKKyAqIFRoZSBEZWx0YUJs
dWUgcGxhbm5lcgorICovCitmdW5jdGlvbiBQbGFubmVyKCkgeworICB0aGlzLmN1cnJlbnRNYXJr
ID0gMDsKK30KKworLyoqCisgKiBBdHRlbXB0IHRvIHNhdGlzZnkgdGhlIGdpdmVuIGNvbnN0cmFp
bnQgYW5kLCBpZiBzdWNjZXNzZnVsLAorICogaW5jcmVtZW50YWxseSB1cGRhdGUgdGhlIGRhdGFm
bG93IGdyYXBoLiAgRGV0YWlsczogSWYgc2F0aWZ5aW5nCisgKiB0aGUgY29uc3RyYWludCBpcyBz
dWNjZXNzZnVsLCBpdCBtYXkgb3ZlcnJpZGUgYSB3ZWFrZXIgY29uc3RyYWludAorICogb24gaXRz
IG91dHB1dC4gVGhlIGFsZ29yaXRobSBhdHRlbXB0cyB0byByZXNhdGlzZnkgdGhhdAorICogY29u
c3RyYWludCB1c2luZyBzb21lIG90aGVyIG1ldGhvZC4gVGhpcyBwcm9jZXNzIGlzIHJlcGVhdGVk
CisgKiB1bnRpbCBlaXRoZXIgYSkgaXQgcmVhY2hlcyBhIHZhcmlhYmxlIHRoYXQgd2FzIG5vdCBw
cmV2aW91c2x5CisgKiBkZXRlcm1pbmVkIGJ5IGFueSBjb25zdHJhaW50IG9yIGIpIGl0IHJlYWNo
ZXMgYSBjb25zdHJhaW50IHRoYXQKKyAqIGlzIHRvbyB3ZWFrIHRvIGJlIHNhdGlzZmllZCB1c2lu
ZyBhbnkgb2YgaXRzIG1ldGhvZHMuIFRoZQorICogdmFyaWFibGVzIG9mIGNvbnN0cmFpbnRzIHRo
YXQgaGF2ZSBiZWVuIHByb2Nlc3NlZCBhcmUgbWFya2VkIHdpdGgKKyAqIGEgdW5pcXVlIG1hcmsg
dmFsdWUgc28gdGhhdCB3ZSBrbm93IHdoZXJlIHdlJ3ZlIGJlZW4uIFRoaXMgYWxsb3dzCisgKiB0
aGUgYWxnb3JpdGhtIHRvIGF2b2lkIGdldHRpbmcgaW50byBhbiBpbmZpbml0ZSBsb29wIGV2ZW4g
aWYgdGhlCisgKiBjb25zdHJhaW50IGdyYXBoIGhhcyBhbiBpbmFkdmVydGVudCBjeWNsZS4KKyAq
LworUGxhbm5lci5wcm90b3R5cGUuaW5jcmVtZW50YWxBZGQgPSBmdW5jdGlvbiAoYykgeworICB2
YXIgbWFyayA9IHRoaXMubmV3TWFyaygpOworICB2YXIgb3ZlcnJpZGRlbiA9IGMuc2F0aXNmeSht
YXJrKTsKKyAgd2hpbGUgKG92ZXJyaWRkZW4gIT0gbnVsbCkKKyAgICBvdmVycmlkZGVuID0gb3Zl
cnJpZGRlbi5zYXRpc2Z5KG1hcmspOworfQorCisvKioKKyAqIEVudHJ5IHBvaW50IGZvciByZXRy
YWN0aW5nIGEgY29uc3RyYWludC4gUmVtb3ZlIHRoZSBnaXZlbgorICogY29uc3RyYWludCBhbmQg
aW5jcmVtZW50YWxseSB1cGRhdGUgdGhlIGRhdGFmbG93IGdyYXBoLgorICogRGV0YWlsczogUmV0
cmFjdGluZyB0aGUgZ2l2ZW4gY29uc3RyYWludCBtYXkgYWxsb3cgc29tZSBjdXJyZW50bHkKKyAq
IHVuc2F0aXNmaWFibGUgZG93bnN0cmVhbSBjb25zdHJhaW50IHRvIGJlIHNhdGlzZmllZC4gV2Ug
dGhlcmVmb3JlIGNvbGxlY3QKKyAqIGEgbGlzdCBvZiB1bnNhdGlzZmllZCBkb3duc3RyZWFtIGNv
bnN0cmFpbnRzIGFuZCBhdHRlbXB0IHRvCisgKiBzYXRpc2Z5IGVhY2ggb25lIGluIHR1cm4uIFRo
aXMgbGlzdCBpcyB0cmF2ZXJzZWQgYnkgY29uc3RyYWludAorICogc3RyZW5ndGgsIHN0cm9uZ2Vz
dCBmaXJzdCwgYXMgYSBoZXVyaXN0aWMgZm9yIGF2b2lkaW5nCisgKiB1bm5lY2Vzc2FyaWx5IGFk
ZGluZyBhbmQgdGhlbiBvdmVycmlkaW5nIHdlYWsgY29uc3RyYWludHMuCisgKiBBc3N1bWU6IGMg
aXMgc2F0aXNmaWVkLgorICovCitQbGFubmVyLnByb3RvdHlwZS5pbmNyZW1lbnRhbFJlbW92ZSA9
IGZ1bmN0aW9uIChjKSB7CisgIHZhciBvdXQgPSBjLm91dHB1dCgpOworICBjLm1hcmtVbnNhdGlz
ZmllZCgpOworICBjLnJlbW92ZUZyb21HcmFwaCgpOworICB2YXIgdW5zYXRpc2ZpZWQgPSB0aGlz
LnJlbW92ZVByb3BhZ2F0ZUZyb20ob3V0KTsKKyAgdmFyIHN0cmVuZ3RoID0gU3RyZW5ndGguUkVR
VUlSRUQ7CisgIGRvIHsKKyAgICBmb3IgKHZhciB1IG9mIHVuc2F0aXNmaWVkLmVsbXMpIHsKKyAg
ICAgIGlmICh1LnN0cmVuZ3RoID09IHN0cmVuZ3RoKQorICAgICAgICB0aGlzLmluY3JlbWVudGFs
QWRkKHUpOworICAgIH0KKyAgICBzdHJlbmd0aCA9IHN0cmVuZ3RoLm5leHRXZWFrZXIoKTsKKyAg
fSB3aGlsZSAoc3RyZW5ndGggIT0gU3RyZW5ndGguV0VBS0VTVCk7Cit9CisKKy8qKgorICogU2Vs
ZWN0IGEgcHJldmlvdXNseSB1bnVzZWQgbWFyayB2YWx1ZS4KKyAqLworUGxhbm5lci5wcm90b3R5
cGUubmV3TWFyayA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuICsrdGhpcy5jdXJyZW50TWFyazsK
K30KKworLyoqCisgKiBFeHRyYWN0IGEgcGxhbiBmb3IgcmVzYXRpc2ZhY3Rpb24gc3RhcnRpbmcg
ZnJvbSB0aGUgZ2l2ZW4gc291cmNlCisgKiBjb25zdHJhaW50cywgdXN1YWxseSBhIHNldCBvZiBp
bnB1dCBjb25zdHJhaW50cy4gVGhpcyBtZXRob2QKKyAqIGFzc3VtZXMgdGhhdCBzdGF5IG9wdGlt
aXphdGlvbiBpcyBkZXNpcmVkOyB0aGUgcGxhbiB3aWxsIGNvbnRhaW4KKyAqIG9ubHkgY29uc3Ry
YWludHMgd2hvc2Ugb3V0cHV0IHZhcmlhYmxlcyBhcmUgbm90IHN0YXkuIENvbnN0cmFpbnRzCisg
KiB0aGF0IGRvIG5vIGNvbXB1dGF0aW9uLCBzdWNoIGFzIHN0YXkgYW5kIGVkaXQgY29uc3RyYWlu
dHMsIGFyZQorICogbm90IGluY2x1ZGVkIGluIHRoZSBwbGFuLgorICogRGV0YWlsczogVGhlIG91
dHB1dHMgb2YgYSBjb25zdHJhaW50IGFyZSBtYXJrZWQgd2hlbiBpdCBpcyBhZGRlZAorICogdG8g
dGhlIHBsYW4gdW5kZXIgY29uc3RydWN0aW9uLiBBIGNvbnN0cmFpbnQgbWF5IGJlIGFwcGVuZGVk
IHRvCisgKiB0aGUgcGxhbiB3aGVuIGFsbCBpdHMgaW5wdXQgdmFyaWFibGVzIGFyZSBrbm93bi4g
QSB2YXJpYWJsZSBpcworICoga25vd24gaWYgZWl0aGVyIGEpIHRoZSB2YXJpYWJsZSBpcyBtYXJr
ZWQgKGluZGljYXRpbmcgdGhhdCBoYXMKKyAqIGJlZW4gY29tcHV0ZWQgYnkgYSBjb25zdHJhaW50
IGFwcGVhcmluZyBlYXJsaWVyIGluIHRoZSBwbGFuKSwgYikKKyAqIHRoZSB2YXJpYWJsZSBpcyAn
c3RheScgKGkuZS4gaXQgaXMgYSBjb25zdGFudCBhdCBwbGFuIGV4ZWN1dGlvbgorICogdGltZSks
IG9yIGMpIHRoZSB2YXJpYWJsZSBpcyBub3QgZGV0ZXJtaW5lZCBieSBhbnkKKyAqIGNvbnN0cmFp
bnQuIFRoZSBsYXN0IHByb3Zpc2lvbiBpcyBmb3IgcGFzdCBzdGF0ZXMgb2YgaGlzdG9yeQorICog
dmFyaWFibGVzLCB3aGljaCBhcmUgbm90IHN0YXkgYnV0IHdoaWNoIGFyZSBhbHNvIG5vdCBjb21w
dXRlZCBieQorICogYW55IGNvbnN0cmFpbnQuCisgKiBBc3N1bWU6IHNvdXJjZXMgYXJlIGFsbCBz
YXRpc2ZpZWQuCisgKi8KK1BsYW5uZXIucHJvdG90eXBlLm1ha2VQbGFuID0gZnVuY3Rpb24gKHNv
dXJjZXMpIHsKKyAgdmFyIG1hcmsgPSB0aGlzLm5ld01hcmsoKTsKKyAgdmFyIHBsYW4gPSBuZXcg
UGxhbigpOworICB2YXIgdG9kbyA9IHNvdXJjZXM7CisgIHdoaWxlICh0b2RvLnNpemUoKSA+IDAp
IHsKKyAgICB2YXIgYyA9IHRvZG8ucmVtb3ZlRmlyc3QoKTsKKyAgICBpZiAoYy5vdXRwdXQoKS5t
YXJrICE9IG1hcmsgJiYgYy5pbnB1dHNLbm93bihtYXJrKSkgeworICAgICAgcGxhbi5hZGRDb25z
dHJhaW50KGMpOworICAgICAgYy5vdXRwdXQoKS5tYXJrID0gbWFyazsKKyAgICAgIHRoaXMuYWRk
Q29uc3RyYWludHNDb25zdW1pbmdUbyhjLm91dHB1dCgpLCB0b2RvKTsKKyAgICB9CisgIH0KKyAg
cmV0dXJuIHBsYW47Cit9CisKKy8qKgorICogRXh0cmFjdCBhIHBsYW4gZm9yIHJlc2F0aXNmeWlu
ZyBzdGFydGluZyBmcm9tIHRoZSBvdXRwdXQgb2YgdGhlCisgKiBnaXZlbiBjb25zdHJhaW50cywg
dXN1YWxseSBhIHNldCBvZiBpbnB1dCBjb25zdHJhaW50cy4KKyAqLworUGxhbm5lci5wcm90b3R5
cGUuZXh0cmFjdFBsYW5Gcm9tQ29uc3RyYWludHMgPSBmdW5jdGlvbiAoY29uc3RyYWludHMpIHsK
KyAgdmFyIHNvdXJjZXMgPSBuZXcgT3JkZXJlZENvbGxlY3Rpb24oKTsKKyAgZm9yICh2YXIgYyBv
ZiBjb25zdHJhaW50cy5lbG1zKSB7CisgICAgaWYgKGMuaXNJbnB1dCgpICYmIGMuaXNTYXRpc2Zp
ZWQoKSkKKyAgICAgIC8vIG5vdCBpbiBwbGFuIGFscmVhZHkgYW5kIGVsaWdpYmxlIGZvciBpbmNs
dXNpb24KKyAgICAgIHNvdXJjZXMuYWRkKGMpOworICB9CisgIHJldHVybiB0aGlzLm1ha2VQbGFu
KHNvdXJjZXMpOworfQorCisvKioKKyAqIFJlY29tcHV0ZSB0aGUgd2Fsa2Fib3V0IHN0cmVuZ3Ro
cyBhbmQgc3RheSBmbGFncyBvZiBhbGwgdmFyaWFibGVzCisgKiBkb3duc3RyZWFtIG9mIHRoZSBn
aXZlbiBjb25zdHJhaW50IGFuZCByZWNvbXB1dGUgdGhlIGFjdHVhbAorICogdmFsdWVzIG9mIGFs
bCB2YXJpYWJsZXMgd2hvc2Ugc3RheSBmbGFnIGlzIHRydWUuIElmIGEgY3ljbGUgaXMKKyAqIGRl
dGVjdGVkLCByZW1vdmUgdGhlIGdpdmVuIGNvbnN0cmFpbnQgYW5kIGFuc3dlcgorICogZmFsc2Uu
IE90aGVyd2lzZSwgYW5zd2VyIHRydWUuCisgKiBEZXRhaWxzOiBDeWNsZXMgYXJlIGRldGVjdGVk
IHdoZW4gYSBtYXJrZWQgdmFyaWFibGUgaXMKKyAqIGVuY291bnRlcmVkIGRvd25zdHJlYW0gb2Yg
dGhlIGdpdmVuIGNvbnN0cmFpbnQuIFRoZSBzZW5kZXIgaXMKKyAqIGFzc3VtZWQgdG8gaGF2ZSBt
YXJrZWQgdGhlIGlucHV0cyBvZiB0aGUgZ2l2ZW4gY29uc3RyYWludCB3aXRoCisgKiB0aGUgZ2l2
ZW4gbWFyay4gVGh1cywgZW5jb3VudGVyaW5nIGEgbWFya2VkIG5vZGUgZG93bnN0cmVhbSBvZgor
ICogdGhlIG91dHB1dCBjb25zdHJhaW50IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBwYXRoIGZyb20g
dGhlCisgKiBjb25zdHJhaW50J3Mgb3V0cHV0IHRvIG9uZSBvZiBpdHMgaW5wdXRzLgorICovCitQ
bGFubmVyLnByb3RvdHlwZS5hZGRQcm9wYWdhdGUgPSBmdW5jdGlvbiAoYywgbWFyaykgeworICB2
YXIgdG9kbyA9IG5ldyBPcmRlcmVkQ29sbGVjdGlvbigpOworICB0b2RvLmFkZChjKTsKKyAgd2hp
bGUgKHRvZG8uc2l6ZSgpID4gMCkgeworICAgIHZhciBkID0gdG9kby5yZW1vdmVGaXJzdCgpOwor
ICAgIGlmIChkLm91dHB1dCgpLm1hcmsgPT0gbWFyaykgeworICAgICAgdGhpcy5pbmNyZW1lbnRh
bFJlbW92ZShjKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC5yZWNhbGN1bGF0
ZSgpOworICAgIHRoaXMuYWRkQ29uc3RyYWludHNDb25zdW1pbmdUbyhkLm91dHB1dCgpLCB0b2Rv
KTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworCisvKioKKyAqIFVwZGF0ZSB0aGUgd2Fsa2Fi
b3V0IHN0cmVuZ3RocyBhbmQgc3RheSBmbGFncyBvZiBhbGwgdmFyaWFibGVzCisgKiBkb3duc3Ry
ZWFtIG9mIHRoZSBnaXZlbiBjb25zdHJhaW50LiBBbnN3ZXIgYSBjb2xsZWN0aW9uIG9mCisgKiB1
bnNhdGlzZmllZCBjb25zdHJhaW50cyBzb3J0ZWQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZyBzdHJl
bmd0aC4KKyAqLworUGxhbm5lci5wcm90b3R5cGUucmVtb3ZlUHJvcGFnYXRlRnJvbSA9IGZ1bmN0
aW9uIChvdXQpIHsKKyAgb3V0LmRldGVybWluZWRCeSA9IG51bGw7CisgIG91dC53YWxrU3RyZW5n
dGggPSBTdHJlbmd0aC5XRUFLRVNUOworICBvdXQuc3RheSA9IHRydWU7CisgIHZhciB1bnNhdGlz
ZmllZCA9IG5ldyBPcmRlcmVkQ29sbGVjdGlvbigpOworICB2YXIgdG9kbyA9IG5ldyBPcmRlcmVk
Q29sbGVjdGlvbigpOworICB0b2RvLmFkZChvdXQpOworICB3aGlsZSAodG9kby5zaXplKCkgPiAw
KSB7CisgICAgdmFyIHYgPSB0b2RvLnJlbW92ZUZpcnN0KCk7CisgICAgZm9yICh2YXIgYyBvZiB2
LmNvbnN0cmFpbnRzLmVsbXMpIHsKKyAgICAgIGlmICghYy5pc1NhdGlzZmllZCgpKQorICAgICAg
ICB1bnNhdGlzZmllZC5hZGQoYyk7CisgICAgfQorICAgIHZhciBkZXRlcm1pbmluZyA9IHYuZGV0
ZXJtaW5lZEJ5OworICAgIGZvciAodmFyIG5leHQgb2Ygdi5jb25zdHJhaW50cy5lbG1zKSB7Cisg
ICAgICBpZiAobmV4dCAhPSBkZXRlcm1pbmluZyAmJiBuZXh0LmlzU2F0aXNmaWVkKCkpIHsKKyAg
ICAgICAgbmV4dC5yZWNhbGN1bGF0ZSgpOworICAgICAgICB0b2RvLmFkZChuZXh0Lm91dHB1dCgp
KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHVuc2F0aXNmaWVkOworfQorCitQbGFu
bmVyLnByb3RvdHlwZS5hZGRDb25zdHJhaW50c0NvbnN1bWluZ1RvID0gZnVuY3Rpb24gKHYsIGNv
bGwpIHsKKyAgdmFyIGRldGVybWluaW5nID0gdi5kZXRlcm1pbmVkQnk7CisgIHZhciBjYyA9IHYu
Y29uc3RyYWludHM7CisgIGZvciAodmFyIGMgb2YgY2MuZWxtcykgeworICAgIGlmIChjICE9IGRl
dGVybWluaW5nICYmIGMuaXNTYXRpc2ZpZWQoKSkKKyAgICAgIGNvbGwuYWRkKGMpOworICB9Cit9
CisKKy8qIC0tLSAqCisgKiBQIGwgYSBuCisgKiAtLS0gKi8KKworLyoqCisgKiBBIFBsYW4gaXMg
YW4gb3JkZXJlZCBsaXN0IG9mIGNvbnN0cmFpbnRzIHRvIGJlIGV4ZWN1dGVkIGluIHNlcXVlbmNl
CisgKiB0byByZXNhdGlzZnkgYWxsIGN1cnJlbnRseSBzYXRpc2ZpYWJsZSBjb25zdHJhaW50cyBp
biB0aGUgZmFjZSBvZgorICogb25lIG9yIG1vcmUgY2hhbmdpbmcgaW5wdXRzLgorICovCitmdW5j
dGlvbiBQbGFuKCkgeworICB0aGlzLnYgPSBuZXcgT3JkZXJlZENvbGxlY3Rpb24oKTsKK30KKwor
UGxhbi5wcm90b3R5cGUuYWRkQ29uc3RyYWludCA9IGZ1bmN0aW9uIChjKSB7CisgIHRoaXMudi5h
ZGQoYyk7Cit9CisKK1BsYW4ucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVy
biB0aGlzLnYuc2l6ZSgpOworfQorCitQbGFuLnByb3RvdHlwZS5jb25zdHJhaW50QXQgPSBmdW5j
dGlvbiAoaW5kZXgpIHsKKyAgcmV0dXJuIHRoaXMudi5hdChpbmRleCk7Cit9CisKK1BsYW4ucHJv
dG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoKSB7CisgIGZvciAodmFyIGMgb2YgdGhpcy52LmVs
bXMpIHsKKyAgICBjLmV4ZWN1dGUoKTsKKyAgfQorfQorCisvKiAtLS0gKgorICogTSBhIGkgbgor
ICogLS0tICovCisKKy8qKgorICogVGhpcyBpcyB0aGUgc3RhbmRhcmQgRGVsdGFCbHVlIGJlbmNo
bWFyay4gQSBsb25nIGNoYWluIG9mIGVxdWFsaXR5CisgKiBjb25zdHJhaW50cyBpcyBjb25zdHJ1
Y3RlZCB3aXRoIGEgc3RheSBjb25zdHJhaW50IG9uIG9uZSBlbmQuIEFuCisgKiBlZGl0IGNvbnN0
cmFpbnQgaXMgdGhlbiBhZGRlZCB0byB0aGUgb3Bwb3NpdGUgZW5kIGFuZCB0aGUgdGltZSBpcwor
ICogbWVhc3VyZWQgZm9yIGFkZGluZyBhbmQgcmVtb3ZpbmcgdGhpcyBjb25zdHJhaW50LCBhbmQg
ZXh0cmFjdGluZworICogYW5kIGV4ZWN1dGluZyBhIGNvbnN0cmFpbnQgc2F0aXNmYWN0aW9uIHBs
YW4uIFRoZXJlIGFyZSB0d28gY2FzZXMuCisgKiBJbiBjYXNlIDEsIHRoZSBhZGRlZCBjb25zdHJh
aW50IGlzIHN0cm9uZ2VyIHRoYW4gdGhlIHN0YXkKKyAqIGNvbnN0cmFpbnQgYW5kIHZhbHVlcyBt
dXN0IHByb3BhZ2F0ZSBkb3duIHRoZSBlbnRpcmUgbGVuZ3RoIG9mIHRoZQorICogY2hhaW4uIElu
IGNhc2UgMiwgdGhlIGFkZGVkIGNvbnN0cmFpbnQgaXMgd2Vha2VyIHRoYW4gdGhlIHN0YXkKKyAq
IGNvbnN0cmFpbnQgc28gaXQgY2Fubm90IGJlIGFjY29tb2RhdGVkLiBUaGUgY29zdCBpbiB0aGlz
IGNhc2UgaXMsCisgKiBvZiBjb3Vyc2UsIHZlcnkgbG93LiBUeXBpY2FsIHNpdHVhdGlvbnMgbGll
IHNvbWV3aGVyZSBiZXR3ZWVuIHRoZXNlCisgKiB0d28gZXh0cmVtZXMuCisgKi8KK2Z1bmN0aW9u
IGNoYWluVGVzdChuKSB7CisgIHBsYW5uZXIgPSBuZXcgUGxhbm5lcigpOworICB2YXIgcHJldiA9
IG51bGwsIGZpcnN0ID0gbnVsbCwgbGFzdCA9IG51bGw7CisKKyAgLy8gQnVpbGQgY2hhaW4gb2Yg
biBlcXVhbGl0eSBjb25zdHJhaW50cworICBmb3IgKHZhciBpID0gMDsgaSA8PSBuOyBpKyspIHsK
KyAgICB2YXIgbmFtZSA9ICJ2IiArIGk7CisgICAgdmFyIHYgPSBuZXcgVmFyaWFibGUobmFtZSk7
CisgICAgaWYgKHByZXYgIT0gbnVsbCkKKyAgICAgIG5ldyBFcXVhbGl0eUNvbnN0cmFpbnQocHJl
diwgdiwgU3RyZW5ndGguUkVRVUlSRUQpOworICAgIGlmIChpID09IDApIGZpcnN0ID0gdjsKKyAg
ICBpZiAoaSA9PSBuKSBsYXN0ID0gdjsKKyAgICBwcmV2ID0gdjsKKyAgfQorCisgIG5ldyBTdGF5
Q29uc3RyYWludChsYXN0LCBTdHJlbmd0aC5TVFJPTkdfREVGQVVMVCk7CisgIHZhciBlZGl0ID0g
bmV3IEVkaXRDb25zdHJhaW50KGZpcnN0LCBTdHJlbmd0aC5QUkVGRVJSRUQpOworICB2YXIgZWRp
dHMgPSBuZXcgT3JkZXJlZENvbGxlY3Rpb24oKTsKKyAgZWRpdHMuYWRkKGVkaXQpOworICB2YXIg
cGxhbiA9IHBsYW5uZXIuZXh0cmFjdFBsYW5Gcm9tQ29uc3RyYWludHMoZWRpdHMpOworICBmb3Ig
KHZhciBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgZmlyc3QudmFsdWUgPSBpOworICAgIHBs
YW4uZXhlY3V0ZSgpOworICAgIGlmIChsYXN0LnZhbHVlICE9IGkpCisgICAgICBhbGVydCgiQ2hh
aW4gdGVzdCBmYWlsZWQuIik7CisgIH0KK30KKworLyoqCisgKiBUaGlzIHRlc3QgY29uc3RydWN0
cyBhIHR3byBzZXRzIG9mIHZhcmlhYmxlcyByZWxhdGVkIHRvIGVhY2gKKyAqIG90aGVyIGJ5IGEg
c2ltcGxlIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiAoc2NhbGUgYW5kIG9mZnNldCkuIFRoZQorICog
dGltZSBpcyBtZWFzdXJlZCB0byBjaGFuZ2UgYSB2YXJpYWJsZSBvbiBlaXRoZXIgc2lkZSBvZiB0
aGUKKyAqIG1hcHBpbmcgYW5kIHRvIGNoYW5nZSB0aGUgc2NhbGUgYW5kIG9mZnNldCBmYWN0b3Jz
LgorICovCitmdW5jdGlvbiBwcm9qZWN0aW9uVGVzdChuKSB7CisgIHBsYW5uZXIgPSBuZXcgUGxh
bm5lcigpOworICB2YXIgc2NhbGUgPSBuZXcgVmFyaWFibGUoInNjYWxlIiwgMTApOworICB2YXIg
b2Zmc2V0ID0gbmV3IFZhcmlhYmxlKCJvZmZzZXQiLCAxMDAwKTsKKyAgdmFyIHNyYyA9IG51bGws
IGRzdCA9IG51bGw7CisKKyAgdmFyIGRlc3RzID0gbmV3IE9yZGVyZWRDb2xsZWN0aW9uKCk7Cisg
IGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgc3JjID0gbmV3IFZhcmlhYmxlKCJz
cmMiICsgaSwgaSk7CisgICAgZHN0ID0gbmV3IFZhcmlhYmxlKCJkc3QiICsgaSwgaSk7CisgICAg
ZGVzdHMuYWRkKGRzdCk7CisgICAgbmV3IFN0YXlDb25zdHJhaW50KHNyYywgU3RyZW5ndGguTk9S
TUFMKTsKKyAgICBuZXcgU2NhbGVDb25zdHJhaW50KHNyYywgc2NhbGUsIG9mZnNldCwgZHN0LCBT
dHJlbmd0aC5SRVFVSVJFRCk7CisgIH0KKworICBjaGFuZ2Uoc3JjLCAxNyk7CisgIGlmIChkc3Qu
dmFsdWUgIT0gMTE3MCkgYWxlcnQoIlByb2plY3Rpb24gMSBmYWlsZWQiKTsKKyAgY2hhbmdlKGRz
dCwgMTA1MCk7CisgIGlmIChzcmMudmFsdWUgIT0gNSkgYWxlcnQoIlByb2plY3Rpb24gMiBmYWls
ZWQiKTsKKyAgY2hhbmdlKHNjYWxlLCA1KTsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBuIC0gMTsg
aSsrKSB7CisgICAgaWYgKGRlc3RzLmF0KGkpLnZhbHVlICE9IGkgKiA1ICsgMTAwMCkKKyAgICAg
IGFsZXJ0KCJQcm9qZWN0aW9uIDMgZmFpbGVkIik7CisgIH0KKyAgY2hhbmdlKG9mZnNldCwgMjAw
MCk7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgbiAtIDE7IGkrKykgeworICAgIGlmIChkZXN0cy5h
dChpKS52YWx1ZSAhPSBpICogNSArIDIwMDApCisgICAgICBhbGVydCgiUHJvamVjdGlvbiA0IGZh
aWxlZCIpOworICB9Cit9CisKK2Z1bmN0aW9uIGNoYW5nZSh2LCBuZXdWYWx1ZSkgeworICB2YXIg
ZWRpdCA9IG5ldyBFZGl0Q29uc3RyYWludCh2LCBTdHJlbmd0aC5QUkVGRVJSRUQpOworICB2YXIg
ZWRpdHMgPSBuZXcgT3JkZXJlZENvbGxlY3Rpb24oKTsKKyAgZWRpdHMuYWRkKGVkaXQpOworICB2
YXIgcGxhbiA9IHBsYW5uZXIuZXh0cmFjdFBsYW5Gcm9tQ29uc3RyYWludHMoZWRpdHMpOworICBm
b3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICB2LnZhbHVlID0gbmV3VmFsdWU7Cisg
ICAgcGxhbi5leGVjdXRlKCk7CisgIH0KKyAgZWRpdC5kZXN0cm95Q29uc3RyYWludCgpOworfQor
CisvLyBHbG9iYWwgdmFyaWFibGUgaG9sZGluZyB0aGUgY3VycmVudCBwbGFubmVyLgordmFyIHBs
YW5uZXIgPSBudWxsOworCitmdW5jdGlvbiBkZWx0YUJsdWUoKSB7CisgIGNoYWluVGVzdCg1MCk7
CisgIHByb2plY3Rpb25UZXN0KDUwKTsKK30KKworZm9yICh2YXIgaSA9IDA7IGkgPCAxMDA7ICsr
aSkKKyAgICBkZWx0YUJsdWUoKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy90
eXBlUHJvZmlsZXIvZ2V0dGVyLXJpY2hhcmRzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS90ZXN0cy90eXBlUHJvZmlsZXIvZ2V0dGVyLXJpY2hhcmRzLmpzCShub25leGlz
dGVudCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy90eXBlUHJvZmlsZXIvZ2V0dGVy
LXJpY2hhcmRzLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTkzIEBACisvLyBDb3B5cmln
aHQgMjAwNi0yMDA4IHRoZSBWOCBwcm9qZWN0IGF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisvLyBDb3B5cmlnaHQgMjAxNCBBcHBsZSBJbmMuCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQorLy8gICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcKKy8vICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorLy8gICAgICAgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhl
IG5hbWVzIG9mIGl0cworLy8gICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisvLyAgICAgICBmcm9tIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8v
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisv
LyBUaGlzIGlzIGEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmljaGFyZHMKKy8v
IGJlbmNobWFyayBmcm9tOgorLy8KKy8vICAgIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tcjEw
L0JlbmNoLmh0bWwKKy8vCisvLyBUaGUgYmVuY2htYXJrIHdhcyBvcmlnaW5hbGx5IGltcGxlbWVu
dGVkIGluIEJDUEwgYnkKKy8vIE1hcnRpbiBSaWNoYXJkcy4gSXQgd2FzIHRoZW4gcG9ydGVkIHRv
IEphdmFTY3JpcHQgYnkgdGhlCisvLyBWOCBwcm9qZWN0IGF1dGhvcnMsIGFuZCB0aGVuIHN1YnNl
cXVlbnRseSBpdCB3YXMgbW9kaWZpZWQKKy8vIHRvIHVzZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGJ5
IFdlYktpdCBhdXRob3JzLgorCisKKy8qKgorICogVGhlIFJpY2hhcmRzIGJlbmNobWFyayBzaW11
bGF0ZXMgdGhlIHRhc2sgZGlzcGF0Y2hlciBvZiBhbgorICogb3BlcmF0aW5nIHN5c3RlbS4KKyAq
Ki8KK2Z1bmN0aW9uIHJ1blJpY2hhcmRzKCkgeworICB2YXIgc2NoZWR1bGVyID0gbmV3IFNjaGVk
dWxlcigpOworICBzY2hlZHVsZXIuYWRkSWRsZVRhc2soSURfSURMRSwgMCwgbnVsbCwgQ09VTlQp
OworCisgIHZhciBxdWV1ZSA9IG5ldyBQYWNrZXQobnVsbCwgSURfV09SS0VSLCBLSU5EX1dPUksp
OworICBxdWV1ZSA9IG5ldyBQYWNrZXQocXVldWUsICBJRF9XT1JLRVIsIEtJTkRfV09SSyk7Cisg
IHNjaGVkdWxlci5hZGRXb3JrZXJUYXNrKElEX1dPUktFUiwgMTAwMCwgcXVldWUpOworCisgIHF1
ZXVlID0gbmV3IFBhY2tldChudWxsLCBJRF9ERVZJQ0VfQSwgS0lORF9ERVZJQ0UpOworICBxdWV1
ZSA9IG5ldyBQYWNrZXQocXVldWUsICBJRF9ERVZJQ0VfQSwgS0lORF9ERVZJQ0UpOworICBxdWV1
ZSA9IG5ldyBQYWNrZXQocXVldWUsICBJRF9ERVZJQ0VfQSwgS0lORF9ERVZJQ0UpOworICBzY2hl
ZHVsZXIuYWRkSGFuZGxlclRhc2soSURfSEFORExFUl9BLCAyMDAwLCBxdWV1ZSk7CisKKyAgcXVl
dWUgPSBuZXcgUGFja2V0KG51bGwsIElEX0RFVklDRV9CLCBLSU5EX0RFVklDRSk7CisgIHF1ZXVl
ID0gbmV3IFBhY2tldChxdWV1ZSwgIElEX0RFVklDRV9CLCBLSU5EX0RFVklDRSk7CisgIHF1ZXVl
ID0gbmV3IFBhY2tldChxdWV1ZSwgIElEX0RFVklDRV9CLCBLSU5EX0RFVklDRSk7CisgIHNjaGVk
dWxlci5hZGRIYW5kbGVyVGFzayhJRF9IQU5ETEVSX0IsIDMwMDAsIHF1ZXVlKTsKKworICBzY2hl
ZHVsZXIuYWRkRGV2aWNlVGFzayhJRF9ERVZJQ0VfQSwgNDAwMCwgbnVsbCk7CisKKyAgc2NoZWR1
bGVyLmFkZERldmljZVRhc2soSURfREVWSUNFX0IsIDUwMDAsIG51bGwpOworCisgIHNjaGVkdWxl
ci5zY2hlZHVsZSgpOworCisgIGlmIChzY2hlZHVsZXIucXVldWVDb3VudCAhPSBFWFBFQ1RFRF9R
VUVVRV9DT1VOVCB8fAorICAgICAgc2NoZWR1bGVyLmhvbGRDb3VudCAhPSBFWFBFQ1RFRF9IT0xE
X0NPVU5UKSB7CisgICAgdmFyIG1zZyA9CisgICAgICAgICJFcnJvciBkdXJpbmcgZXhlY3V0aW9u
OiBxdWV1ZUNvdW50ID0gIiArIHNjaGVkdWxlci5xdWV1ZUNvdW50ICsKKyAgICAgICAgIiwgaG9s
ZENvdW50ID0gIiArIHNjaGVkdWxlci5ob2xkQ291bnQgKyAiLiI7CisgICAgdGhyb3cgbmV3IEVy
cm9yKG1zZyk7CisgIH0KK30KKwordmFyIENPVU5UID0gMTAwMDsKKworLyoqCisgKiBUaGVzZSB0
d28gY29uc3RhbnRzIHNwZWNpZnkgaG93IG1hbnkgdGltZXMgYSBwYWNrZXQgaXMgcXVldWVkIGFu
ZAorICogaG93IG1hbnkgdGltZXMgYSB0YXNrIGlzIHB1dCBvbiBob2xkIGluIGEgY29ycmVjdCBy
dW4gb2YgcmljaGFyZHMuCisgKiBUaGV5IGRvbid0IGhhdmUgYW55IG1lYW5pbmcgYSBzdWNoIGJ1
dCBhcmUgY2hhcmFjdGVyaXN0aWMgb2YgYQorICogY29ycmVjdCBydW4gc28gaWYgdGhlIGFjdHVh
bCBxdWV1ZSBvciBob2xkIGNvdW50IGlzIGRpZmZlcmVudCBmcm9tCisgKiB0aGUgZXhwZWN0ZWQg
dGhlcmUgbXVzdCBiZSBhIGJ1ZyBpbiB0aGUgaW1wbGVtZW50YXRpb24uCisgKiovCit2YXIgRVhQ
RUNURURfUVVFVUVfQ09VTlQgPSAyMzIyOwordmFyIEVYUEVDVEVEX0hPTERfQ09VTlQgPSA5Mjg7
CisKKworLyoqCisgKiBBIHNjaGVkdWxlciBjYW4gYmUgdXNlZCB0byBzY2hlZHVsZSBhIHNldCBv
ZiB0YXNrcyBiYXNlZCBvbiB0aGVpciByZWxhdGl2ZQorICogcHJpb3JpdGllcy4gIFNjaGVkdWxp
bmcgaXMgZG9uZSBieSBtYWludGFpbmluZyBhIGxpc3Qgb2YgdGFzayBjb250cm9sIGJsb2Nrcwor
ICogd2hpY2ggaG9sZHMgdGFza3MgYW5kIHRoZSBkYXRhIHF1ZXVlIHRoZXkgYXJlIHByb2Nlc3Np
bmcuCisgKiBAY29uc3RydWN0b3IKKyAqLworZnVuY3Rpb24gU2NoZWR1bGVyKCkgeworICB0aGlz
Ll9xdWV1ZUNvdW50ID0gMDsKKyAgdGhpcy5faG9sZENvdW50ID0gMDsKKyAgdGhpcy5fYmxvY2tz
ID0gbmV3IEFycmF5KE5VTUJFUl9PRl9JRFMpOworICB0aGlzLl9saXN0ID0gbnVsbDsKKyAgdGhp
cy5fY3VycmVudFRjYiA9IG51bGw7CisgIHRoaXMuX2N1cnJlbnRJZCA9IG51bGw7Cit9CisKK3Zh
ciBJRF9JRExFICAgICAgID0gMDsKK3ZhciBJRF9XT1JLRVIgICAgID0gMTsKK3ZhciBJRF9IQU5E
TEVSX0EgID0gMjsKK3ZhciBJRF9IQU5ETEVSX0IgID0gMzsKK3ZhciBJRF9ERVZJQ0VfQSAgID0g
NDsKK3ZhciBJRF9ERVZJQ0VfQiAgID0gNTsKK3ZhciBOVU1CRVJfT0ZfSURTID0gNjsKKwordmFy
IEtJTkRfREVWSUNFICAgPSAwOwordmFyIEtJTkRfV09SSyAgICAgPSAxOworCitTY2hlZHVsZXIu
cHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oInF1ZXVlQ291bnQiLCBmdW5jdGlvbigpIHsgcmV0
dXJuIHRoaXMuX3F1ZXVlQ291bnQ7IH0pOworU2NoZWR1bGVyLnByb3RvdHlwZS5fX2RlZmluZVNl
dHRlcl9fKCJxdWV1ZUNvdW50IiwgZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5fcXVldWVDb3VudCA9
IHZhbHVlOyB9KTsKK1NjaGVkdWxlci5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygiaG9sZENv
dW50IiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9ob2xkQ291bnQ7IH0pOworU2NoZWR1bGVy
LnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKCJob2xkQ291bnQiLCBmdW5jdGlvbih2YWx1ZSkg
eyB0aGlzLl9ob2xkQ291bnQgPSB2YWx1ZTsgfSk7CitTY2hlZHVsZXIucHJvdG90eXBlLl9fZGVm
aW5lR2V0dGVyX18oImJsb2NrcyIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fYmxvY2tzOyB9
KTsKK1NjaGVkdWxlci5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXygiYmxvY2tzIiwgZnVuY3Rp
b24odmFsdWUpIHsgdGhpcy5fYmxvY2tzID0gdmFsdWU7IH0pOworU2NoZWR1bGVyLnByb3RvdHlw
ZS5fX2RlZmluZUdldHRlcl9fKCJsaXN0IiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9saXN0
OyB9KTsKK1NjaGVkdWxlci5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXygibGlzdCIsIGZ1bmN0
aW9uKHZhbHVlKSB7IHRoaXMuX2xpc3QgPSB2YWx1ZTsgfSk7CitTY2hlZHVsZXIucHJvdG90eXBl
Ll9fZGVmaW5lR2V0dGVyX18oImN1cnJlbnRUY2IiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMu
X2N1cnJlbnRUY2I7IH0pOworU2NoZWR1bGVyLnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKCJj
dXJyZW50VGNiIiwgZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5fY3VycmVudFRjYiA9IHZhbHVlOyB9
KTsKK1NjaGVkdWxlci5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygiY3VycmVudElkIiwgZnVu
Y3Rpb24oKSB7IHJldHVybiB0aGlzLl9jdXJyZW50SWQ7IH0pOworU2NoZWR1bGVyLnByb3RvdHlw
ZS5fX2RlZmluZVNldHRlcl9fKCJjdXJyZW50SWQiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl9j
dXJyZW50SWQgPSB2YWx1ZTsgfSk7CisKKy8qKgorICogQWRkIGFuIGlkbGUgdGFzayB0byB0aGlz
IHNjaGVkdWxlci4KKyAqIEBwYXJhbSB7aW50fSBpZCB0aGUgaWRlbnRpdHkgb2YgdGhlIHRhc2sK
KyAqIEBwYXJhbSB7aW50fSBwcmlvcml0eSB0aGUgdGFzaydzIHByaW9yaXR5CisgKiBAcGFyYW0g
e1BhY2tldH0gcXVldWUgdGhlIHF1ZXVlIG9mIHdvcmsgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0
YXNrCisgKiBAcGFyYW0ge2ludH0gY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0byBzY2hlZHVs
ZSB0aGUgdGFzaworICovCitTY2hlZHVsZXIucHJvdG90eXBlLmFkZElkbGVUYXNrID0gZnVuY3Rp
b24gKGlkLCBwcmlvcml0eSwgcXVldWUsIGNvdW50KSB7CisgIHRoaXMuYWRkUnVubmluZ1Rhc2so
aWQsIHByaW9yaXR5LCBxdWV1ZSwgbmV3IElkbGVUYXNrKHRoaXMsIDEsIGNvdW50KSk7Cit9Owor
CisvKioKKyAqIEFkZCBhIHdvcmsgdGFzayB0byB0aGlzIHNjaGVkdWxlci4KKyAqIEBwYXJhbSB7
aW50fSBpZCB0aGUgaWRlbnRpdHkgb2YgdGhlIHRhc2sKKyAqIEBwYXJhbSB7aW50fSBwcmlvcml0
eSB0aGUgdGFzaydzIHByaW9yaXR5CisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHF1ZXVl
IG9mIHdvcmsgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisgKi8KK1NjaGVkdWxlci5wcm90
b3R5cGUuYWRkV29ya2VyVGFzayA9IGZ1bmN0aW9uIChpZCwgcHJpb3JpdHksIHF1ZXVlKSB7Cisg
IHRoaXMuYWRkVGFzayhpZCwgcHJpb3JpdHksIHF1ZXVlLCBuZXcgV29ya2VyVGFzayh0aGlzLCBJ
RF9IQU5ETEVSX0EsIDApKTsKK307CisKKy8qKgorICogQWRkIGEgaGFuZGxlciB0YXNrIHRvIHRo
aXMgc2NoZWR1bGVyLgorICogQHBhcmFtIHtpbnR9IGlkIHRoZSBpZGVudGl0eSBvZiB0aGUgdGFz
aworICogQHBhcmFtIHtpbnR9IHByaW9yaXR5IHRoZSB0YXNrJ3MgcHJpb3JpdHkKKyAqIEBwYXJh
bSB7UGFja2V0fSBxdWV1ZSB0aGUgcXVldWUgb2Ygd29yayB0byBiZSBwcm9jZXNzZWQgYnkgdGhl
IHRhc2sKKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5hZGRIYW5kbGVyVGFzayA9IGZ1bmN0aW9u
IChpZCwgcHJpb3JpdHksIHF1ZXVlKSB7CisgIHRoaXMuYWRkVGFzayhpZCwgcHJpb3JpdHksIHF1
ZXVlLCBuZXcgSGFuZGxlclRhc2sodGhpcykpOworfTsKKworLyoqCisgKiBBZGQgYSBoYW5kbGVy
IHRhc2sgdG8gdGhpcyBzY2hlZHVsZXIuCisgKiBAcGFyYW0ge2ludH0gaWQgdGhlIGlkZW50aXR5
IG9mIHRoZSB0YXNrCisgKiBAcGFyYW0ge2ludH0gcHJpb3JpdHkgdGhlIHRhc2sncyBwcmlvcml0
eQorICogQHBhcmFtIHtQYWNrZXR9IHF1ZXVlIHRoZSBxdWV1ZSBvZiB3b3JrIHRvIGJlIHByb2Nl
c3NlZCBieSB0aGUgdGFzaworICovCitTY2hlZHVsZXIucHJvdG90eXBlLmFkZERldmljZVRhc2sg
PSBmdW5jdGlvbiAoaWQsIHByaW9yaXR5LCBxdWV1ZSkgeworICB0aGlzLmFkZFRhc2soaWQsIHBy
aW9yaXR5LCBxdWV1ZSwgbmV3IERldmljZVRhc2sodGhpcykpCit9OworCisvKioKKyAqIEFkZCB0
aGUgc3BlY2lmaWVkIHRhc2sgYW5kIG1hcmsgaXQgYXMgcnVubmluZy4KKyAqIEBwYXJhbSB7aW50
fSBpZCB0aGUgaWRlbnRpdHkgb2YgdGhlIHRhc2sKKyAqIEBwYXJhbSB7aW50fSBwcmlvcml0eSB0
aGUgdGFzaydzIHByaW9yaXR5CisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHF1ZXVlIG9m
IHdvcmsgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisgKiBAcGFyYW0ge1Rhc2t9IHRhc2sg
dGhlIHRhc2sgdG8gYWRkCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUuYWRkUnVubmluZ1Rhc2sg
PSBmdW5jdGlvbiAoaWQsIHByaW9yaXR5LCBxdWV1ZSwgdGFzaykgeworICB0aGlzLmFkZFRhc2so
aWQsIHByaW9yaXR5LCBxdWV1ZSwgdGFzayk7CisgIHRoaXMuY3VycmVudFRjYi5zZXRSdW5uaW5n
KCk7Cit9OworCisvKioKKyAqIEFkZCB0aGUgc3BlY2lmaWVkIHRhc2sgdG8gdGhpcyBzY2hlZHVs
ZXIuCisgKiBAcGFyYW0ge2ludH0gaWQgdGhlIGlkZW50aXR5IG9mIHRoZSB0YXNrCisgKiBAcGFy
YW0ge2ludH0gcHJpb3JpdHkgdGhlIHRhc2sncyBwcmlvcml0eQorICogQHBhcmFtIHtQYWNrZXR9
IHF1ZXVlIHRoZSBxdWV1ZSBvZiB3b3JrIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgdGFzaworICog
QHBhcmFtIHtUYXNrfSB0YXNrIHRoZSB0YXNrIHRvIGFkZAorICovCitTY2hlZHVsZXIucHJvdG90
eXBlLmFkZFRhc2sgPSBmdW5jdGlvbiAoaWQsIHByaW9yaXR5LCBxdWV1ZSwgdGFzaykgeworICB0
aGlzLmN1cnJlbnRUY2IgPSBuZXcgVGFza0NvbnRyb2xCbG9jayh0aGlzLmxpc3QsIGlkLCBwcmlv
cml0eSwgcXVldWUsIHRhc2spOworICB0aGlzLmxpc3QgPSB0aGlzLmN1cnJlbnRUY2I7CisgIHRo
aXMuYmxvY2tzW2lkXSA9IHRoaXMuY3VycmVudFRjYjsKK307CisKKy8qKgorICogRXhlY3V0ZSB0
aGUgdGFza3MgbWFuYWdlZCBieSB0aGlzIHNjaGVkdWxlci4KKyAqLworU2NoZWR1bGVyLnByb3Rv
dHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5jdXJyZW50VGNiID0gdGhpcy5s
aXN0OworICB3aGlsZSAodGhpcy5jdXJyZW50VGNiICE9IG51bGwpIHsKKyAgICBpZiAodGhpcy5j
dXJyZW50VGNiLmlzSGVsZE9yU3VzcGVuZGVkKCkpIHsKKyAgICAgIHRoaXMuY3VycmVudFRjYiA9
IHRoaXMuY3VycmVudFRjYi5saW5rOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLmN1cnJlbnRJ
ZCA9IHRoaXMuY3VycmVudFRjYi5pZDsKKyAgICAgIHRoaXMuY3VycmVudFRjYiA9IHRoaXMuY3Vy
cmVudFRjYi5ydW4oKTsKKyAgICB9CisgIH0KK307CisKKy8qKgorICogUmVsZWFzZSBhIHRhc2sg
dGhhdCBpcyBjdXJyZW50bHkgYmxvY2tlZCBhbmQgcmV0dXJuIHRoZSBuZXh0IGJsb2NrIHRvIHJ1
bi4KKyAqIEBwYXJhbSB7aW50fSBpZCB0aGUgaWQgb2YgdGhlIHRhc2sgdG8gc3VzcGVuZAorICov
CitTY2hlZHVsZXIucHJvdG90eXBlLnJlbGVhc2UgPSBmdW5jdGlvbiAoaWQpIHsKKyAgdmFyIHRj
YiA9IHRoaXMuYmxvY2tzW2lkXTsKKyAgaWYgKHRjYiA9PSBudWxsKSByZXR1cm4gdGNiOworICB0
Y2IubWFya0FzTm90SGVsZCgpOworICBpZiAodGNiLnByaW9yaXR5ID4gdGhpcy5jdXJyZW50VGNi
LnByaW9yaXR5KSB7CisgICAgcmV0dXJuIHRjYjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdGhp
cy5jdXJyZW50VGNiOworICB9Cit9OworCisvKioKKyAqIEJsb2NrIHRoZSBjdXJyZW50bHkgZXhl
Y3V0aW5nIHRhc2sgYW5kIHJldHVybiB0aGUgbmV4dCB0YXNrIGNvbnRyb2wgYmxvY2sKKyAqIHRv
IHJ1bi4gIFRoZSBibG9ja2VkIHRhc2sgd2lsbCBub3QgYmUgbWFkZSBydW5uYWJsZSB1bnRpbCBp
dCBpcyBleHBsaWNpdGx5CisgKiByZWxlYXNlZCwgZXZlbiBpZiBuZXcgd29yayBpcyBhZGRlZCB0
byBpdC4KKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5ob2xkQ3VycmVudCA9IGZ1bmN0aW9uICgp
IHsKKyAgdGhpcy5ob2xkQ291bnQrKzsKKyAgdGhpcy5jdXJyZW50VGNiLm1hcmtBc0hlbGQoKTsK
KyAgcmV0dXJuIHRoaXMuY3VycmVudFRjYi5saW5rOworfTsKKworLyoqCisgKiBTdXNwZW5kIHRo
ZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sgYW5kIHJldHVybiB0aGUgbmV4dCB0YXNrIGNvbnRy
b2wgYmxvY2sKKyAqIHRvIHJ1bi4gIElmIG5ldyB3b3JrIGlzIGFkZGVkIHRvIHRoZSBzdXNwZW5k
ZWQgdGFzayBpdCB3aWxsIGJlIG1hZGUgcnVubmFibGUuCisgKi8KK1NjaGVkdWxlci5wcm90b3R5
cGUuc3VzcGVuZEN1cnJlbnQgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMuY3VycmVudFRjYi5tYXJr
QXNTdXNwZW5kZWQoKTsKKyAgcmV0dXJuIHRoaXMuY3VycmVudFRjYjsKK307CisKKy8qKgorICog
QWRkIHRoZSBzcGVjaWZpZWQgcGFja2V0IHRvIHRoZSBlbmQgb2YgdGhlIHdvcmtsaXN0IHVzZWQg
YnkgdGhlIHRhc2sKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2V0IGFuZCBtYWtlIHRoZSB0
YXNrIHJ1bm5hYmxlIGlmIGl0IGlzIGN1cnJlbnRseQorICogc3VzcGVuZGVkLgorICogQHBhcmFt
IHtQYWNrZXR9IHBhY2tldCB0aGUgcGFja2V0IHRvIGFkZAorICovCitTY2hlZHVsZXIucHJvdG90
eXBlLnF1ZXVlID0gZnVuY3Rpb24gKHBhY2tldCkgeworICB2YXIgdCA9IHRoaXMuYmxvY2tzW3Bh
Y2tldC5pZF07CisgIGlmICh0ID09IG51bGwpIHJldHVybiB0OworICB0aGlzLnF1ZXVlQ291bnQr
KzsKKyAgcGFja2V0LmxpbmsgPSBudWxsOworICBwYWNrZXQuaWQgPSB0aGlzLmN1cnJlbnRJZDsK
KyAgcmV0dXJuIHQuY2hlY2tQcmlvcml0eUFkZCh0aGlzLmN1cnJlbnRUY2IsIHBhY2tldCk7Cit9
OworCisvKioKKyAqIEEgdGFzayBjb250cm9sIGJsb2NrIG1hbmFnZXMgYSB0YXNrIGFuZCB0aGUg
cXVldWUgb2Ygd29yayBwYWNrYWdlcyBhc3NvY2lhdGVkCisgKiB3aXRoIGl0LgorICogQHBhcmFt
IHtUYXNrQ29udHJvbEJsb2NrfSBsaW5rIHRoZSBwcmVjZWRpbmcgYmxvY2sgaW4gdGhlIGxpbmtl
ZCBibG9jayBsaXN0CisgKiBAcGFyYW0ge2ludH0gaWQgdGhlIGlkIG9mIHRoaXMgYmxvY2sKKyAq
IEBwYXJhbSB7aW50fSBwcmlvcml0eSB0aGUgcHJpb3JpdHkgb2YgdGhpcyBibG9jaworICogQHBh
cmFtIHtQYWNrZXR9IHF1ZXVlIHRoZSBxdWV1ZSBvZiBwYWNrYWdlcyB0byBiZSBwcm9jZXNzZWQg
YnkgdGhlIHRhc2sKKyAqIEBwYXJhbSB7VGFza30gdGFzayB0aGUgdGFzaworICogQGNvbnN0cnVj
dG9yCisgKi8KK2Z1bmN0aW9uIFRhc2tDb250cm9sQmxvY2sobGluaywgaWQsIHByaW9yaXR5LCBx
dWV1ZSwgdGFzaykgeworICB0aGlzLl9saW5rID0gbGluazsKKyAgdGhpcy5faWQgPSBpZDsKKyAg
dGhpcy5fcHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgdGhpcy5fcXVldWUgPSBxdWV1ZTsKKyAgdGhp
cy5fdGFzayA9IHRhc2s7CisgIGlmIChxdWV1ZSA9PSBudWxsKSB7CisgICAgdGhpcy5zdGF0ZSA9
IFNUQVRFX1NVU1BFTkRFRDsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnN0YXRlID0gU1RBVEVfU1VT
UEVOREVEX1JVTk5BQkxFOworICB9Cit9CisKKy8qKgorICogVGhlIHRhc2sgaXMgcnVubmluZyBh
bmQgaXMgY3VycmVudGx5IHNjaGVkdWxlZC4KKyAqLwordmFyIFNUQVRFX1JVTk5JTkcgPSAwOwor
CisvKioKKyAqIFRoZSB0YXNrIGhhcyBwYWNrZXRzIGxlZnQgdG8gcHJvY2Vzcy4KKyAqLwordmFy
IFNUQVRFX1JVTk5BQkxFID0gMTsKKworLyoqCisgKiBUaGUgdGFzayBpcyBub3QgY3VycmVudGx5
IHJ1bm5pbmcuICBUaGUgdGFzayBpcyBub3QgYmxvY2tlZCBhcyBzdWNoIGFuZCBtYXkKKyogYmUg
c3RhcnRlZCBieSB0aGUgc2NoZWR1bGVyLgorICovCit2YXIgU1RBVEVfU1VTUEVOREVEID0gMjsK
KworLyoqCisgKiBUaGUgdGFzayBpcyBibG9ja2VkIGFuZCBjYW5ub3QgYmUgcnVuIHVudGlsIGl0
IGlzIGV4cGxpY2l0bHkgcmVsZWFzZWQuCisgKi8KK3ZhciBTVEFURV9IRUxEID0gNDsKKwordmFy
IFNUQVRFX1NVU1BFTkRFRF9SVU5OQUJMRSA9IFNUQVRFX1NVU1BFTkRFRCB8IFNUQVRFX1JVTk5B
QkxFOwordmFyIFNUQVRFX05PVF9IRUxEID0gflNUQVRFX0hFTEQ7CisKK1Rhc2tDb250cm9sQmxv
Y2sucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oImxpbmsiLCBmdW5jdGlvbigpIHsgcmV0dXJu
IHRoaXMuX2xpbms7IH0pOworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUuX19kZWZpbmVHZXR0
ZXJfXygiaWQiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2lkOyB9KTsKK1Rhc2tDb250cm9s
QmxvY2sucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oInByaW9yaXR5IiwgZnVuY3Rpb24oKSB7
IHJldHVybiB0aGlzLl9wcmlvcml0eTsgfSk7CitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5f
X2RlZmluZUdldHRlcl9fKCJxdWV1ZSIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fcXVldWU7
IH0pOworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXygicXVldWUi
LCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl9xdWV1ZSA9IHZhbHVlOyB9KTsKK1Rhc2tDb250cm9s
QmxvY2sucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oInRhc2siLCBmdW5jdGlvbigpIHsgcmV0
dXJuIHRoaXMuX3Rhc2s7IH0pOworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUuX19kZWZpbmVH
ZXR0ZXJfXygic3RhdGUiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3N0YXRlOyB9KTsKK1Rh
c2tDb250cm9sQmxvY2sucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oInN0YXRlIiwgZnVuY3Rp
b24odmFsdWUpIHsgdGhpcy5fc3RhdGUgPSB2YWx1ZTsgfSk7CisKK1Rhc2tDb250cm9sQmxvY2su
cHJvdG90eXBlLnNldFJ1bm5pbmcgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMuc3RhdGUgPSBTVEFU
RV9SVU5OSU5HOworfTsKKworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUubWFya0FzTm90SGVs
ZCA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGUgJiBTVEFURV9OT1Rf
SEVMRDsKK307CisKK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLm1hcmtBc0hlbGQgPSBmdW5j
dGlvbiAoKSB7CisgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlIHwgU1RBVEVfSEVMRDsKK307CisK
K1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLmlzSGVsZE9yU3VzcGVuZGVkID0gZnVuY3Rpb24g
KCkgeworICByZXR1cm4gKHRoaXMuc3RhdGUgJiBTVEFURV9IRUxEKSAhPSAwIHx8ICh0aGlzLnN0
YXRlID09IFNUQVRFX1NVU1BFTkRFRCk7Cit9OworCitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlw
ZS5tYXJrQXNTdXNwZW5kZWQgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMuc3RhdGUgPSB0aGlzLnN0
YXRlIHwgU1RBVEVfU1VTUEVOREVEOworfTsKKworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUu
bWFya0FzUnVubmFibGUgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRl
IHwgU1RBVEVfUlVOTkFCTEU7Cit9OworCisvKioKKyAqIFJ1bnMgdGhpcyB0YXNrLCBpZiBpdCBp
cyByZWFkeSB0byBiZSBydW4sIGFuZCByZXR1cm5zIHRoZSBuZXh0IHRhc2sgdG8gcnVuLgorICov
CitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7CisgIHZhciBw
YWNrZXQ7CisgIGlmICh0aGlzLnN0YXRlID09IFNUQVRFX1NVU1BFTkRFRF9SVU5OQUJMRSkgewor
ICAgIHBhY2tldCA9IHRoaXMucXVldWU7CisgICAgdGhpcy5xdWV1ZSA9IHBhY2tldC5saW5rOwor
ICAgIGlmICh0aGlzLnF1ZXVlID09IG51bGwpIHsKKyAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9S
VU5OSU5HOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnN0YXRlID0gU1RBVEVfUlVOTkFCTEU7
CisgICAgfQorICB9IGVsc2UgeworICAgIHBhY2tldCA9IG51bGw7CisgIH0KKyAgcmV0dXJuIHRo
aXMudGFzay5ydW4ocGFja2V0KTsKK307CisKKy8qKgorICogQWRkcyBhIHBhY2tldCB0byB0aGUg
d29ya2xpc3Qgb2YgdGhpcyBibG9jaydzIHRhc2ssIG1hcmtzIHRoaXMgYXMgcnVubmFibGUgaWYK
KyAqIG5lY2Vzc2FyeSwgYW5kIHJldHVybnMgdGhlIG5leHQgcnVubmFibGUgb2JqZWN0IHRvIHJ1
biAodGhlIG9uZQorICogd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSkuCisgKi8KK1Rhc2tDb250
cm9sQmxvY2sucHJvdG90eXBlLmNoZWNrUHJpb3JpdHlBZGQgPSBmdW5jdGlvbiAodGFzaywgcGFj
a2V0KSB7CisgIGlmICh0aGlzLnF1ZXVlID09IG51bGwpIHsKKyAgICB0aGlzLnF1ZXVlID0gcGFj
a2V0OworICAgIHRoaXMubWFya0FzUnVubmFibGUoKTsKKyAgICBpZiAodGhpcy5wcmlvcml0eSA+
IHRhc2sucHJpb3JpdHkpIHJldHVybiB0aGlzOworICB9IGVsc2UgeworICAgIHRoaXMucXVldWUg
PSBwYWNrZXQuYWRkVG8odGhpcy5xdWV1ZSk7CisgIH0KKyAgcmV0dXJuIHRhc2s7Cit9OworCitU
YXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0
dXJuICJ0Y2IgeyAiICsgdGhpcy50YXNrICsgIkAiICsgdGhpcy5zdGF0ZSArICIgfSI7Cit9Owor
CisvKioKKyAqIEFuIGlkbGUgdGFzayBkb2Vzbid0IGRvIGFueSB3b3JrIGl0c2VsZiBidXQgY3lj
bGVzIGNvbnRyb2wgYmV0d2VlbiB0aGUgdHdvCisgKiBkZXZpY2UgdGFza3MuCisgKiBAcGFyYW0g
e1NjaGVkdWxlcn0gc2NoZWR1bGVyIHRoZSBzY2hlZHVsZXIgdGhhdCBtYW5hZ2VzIHRoaXMgdGFz
aworICogQHBhcmFtIHtpbnR9IHYxIGEgc2VlZCB2YWx1ZSB0aGF0IGNvbnRyb2xzIGhvdyB0aGUg
ZGV2aWNlIHRhc2tzIGFyZSBzY2hlZHVsZWQKKyAqIEBwYXJhbSB7aW50fSBjb3VudCB0aGUgbnVt
YmVyIG9mIHRpbWVzIHRoaXMgdGFzayBzaG91bGQgYmUgc2NoZWR1bGVkCisgKiBAY29uc3RydWN0
b3IKKyAqLworZnVuY3Rpb24gSWRsZVRhc2soc2NoZWR1bGVyLCB2MSwgY291bnQpIHsKKyAgdGhp
cy5fc2NoZWR1bGVyID0gc2NoZWR1bGVyOworICB0aGlzLl92MSA9IHYxOworICB0aGlzLl9jb3Vu
dCA9IGNvdW50OworfQorCitJZGxlVGFzay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygic2No
ZWR1bGVyIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zY2hlZHVsZXI7IH0pOworSWRsZVRh
c2sucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oInYxIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0
aGlzLl92MTsgfSk7CitJZGxlVGFzay5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXygidjEiLCBm
dW5jdGlvbih2YWx1ZSkgeyB0aGlzLl92MSA9IHZhbHVlOyB9KTsKK0lkbGVUYXNrLnByb3RvdHlw
ZS5fX2RlZmluZUdldHRlcl9fKCJjb3VudCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fY291
bnQ7IH0pOworSWRsZVRhc2sucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oImNvdW50IiwgZnVu
Y3Rpb24odmFsdWUpIHsgdGhpcy5fY291bnQgPSB2YWx1ZTsgfSk7CisKK0lkbGVUYXNrLnByb3Rv
dHlwZS5ydW4gPSBmdW5jdGlvbiAocGFja2V0KSB7CisgIHRoaXMuY291bnQtLTsKKyAgaWYgKHRo
aXMuY291bnQgPT0gMCkgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLmhvbGRDdXJyZW50KCk7CisgIGlm
ICgodGhpcy52MSAmIDEpID09IDApIHsKKyAgICB0aGlzLnYxID0gdGhpcy52MSA+PiAxOworICAg
IHJldHVybiB0aGlzLnNjaGVkdWxlci5yZWxlYXNlKElEX0RFVklDRV9BKTsKKyAgfSBlbHNlIHsK
KyAgICB0aGlzLnYxID0gKHRoaXMudjEgPj4gMSkgXiAweEQwMDg7CisgICAgcmV0dXJuIHRoaXMu
c2NoZWR1bGVyLnJlbGVhc2UoSURfREVWSUNFX0IpOworICB9Cit9OworCitJZGxlVGFzay5wcm90
b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiAiSWRsZVRhc2siCit9Owor
CisvKioKKyAqIEEgdGFzayB0aGF0IHN1c3BlbmRzIGl0c2VsZiBhZnRlciBlYWNoIHRpbWUgaXQg
aGFzIGJlZW4gcnVuIHRvIHNpbXVsYXRlCisgKiB3YWl0aW5nIGZvciBkYXRhIGZyb20gYW4gZXh0
ZXJuYWwgZGV2aWNlLgorICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciB0aGUgc2NoZWR1
bGVyIHRoYXQgbWFuYWdlcyB0aGlzIHRhc2sKKyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlv
biBEZXZpY2VUYXNrKHNjaGVkdWxlcikgeworICB0aGlzLl9zY2hlZHVsZXIgPSBzY2hlZHVsZXI7
CisgIHRoaXMuX3YxID0gbnVsbDsKK30KKworRGV2aWNlVGFzay5wcm90b3R5cGUuX19kZWZpbmVH
ZXR0ZXJfXygic2NoZWR1bGVyIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zY2hlZHVsZXI7
IH0pOworRGV2aWNlVGFzay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygidjEiLCBmdW5jdGlv
bigpIHsgcmV0dXJuIHRoaXMuX3YxOyB9KTsKK0RldmljZVRhc2sucHJvdG90eXBlLl9fZGVmaW5l
U2V0dGVyX18oInYxIiwgZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5fdjEgPSB2YWx1ZTsgfSk7CisK
K0RldmljZVRhc2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChwYWNrZXQpIHsKKyAgaWYgKHBh
Y2tldCA9PSBudWxsKSB7CisgICAgaWYgKHRoaXMudjEgPT0gbnVsbCkgcmV0dXJuIHRoaXMuc2No
ZWR1bGVyLnN1c3BlbmRDdXJyZW50KCk7CisgICAgdmFyIHYgPSB0aGlzLnYxOworICAgIHRoaXMu
djEgPSBudWxsOworICAgIHJldHVybiB0aGlzLnNjaGVkdWxlci5xdWV1ZSh2KTsKKyAgfSBlbHNl
IHsKKyAgICB0aGlzLnYxID0gcGFja2V0OworICAgIHJldHVybiB0aGlzLnNjaGVkdWxlci5ob2xk
Q3VycmVudCgpOworICB9Cit9OworCitEZXZpY2VUYXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1
bmN0aW9uICgpIHsKKyAgcmV0dXJuICJEZXZpY2VUYXNrIjsKK307CisKKy8qKgorICogQSB0YXNr
IHRoYXQgbWFuaXB1bGF0ZXMgd29yayBwYWNrZXRzLgorICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNj
aGVkdWxlciB0aGUgc2NoZWR1bGVyIHRoYXQgbWFuYWdlcyB0aGlzIHRhc2sKKyAqIEBwYXJhbSB7
aW50fSB2MSBhIHNlZWQgdXNlZCB0byBzcGVjaWZ5IGhvdyB3b3JrIHBhY2tldHMgYXJlIG1hbmlw
dWxhdGVkCisgKiBAcGFyYW0ge2ludH0gdjIgYW5vdGhlciBzZWVkIHVzZWQgdG8gc3BlY2lmeSBo
b3cgd29yayBwYWNrZXRzIGFyZSBtYW5pcHVsYXRlZAorICogQGNvbnN0cnVjdG9yCisgKi8KK2Z1
bmN0aW9uIFdvcmtlclRhc2soc2NoZWR1bGVyLCB2MSwgdjIpIHsKKyAgdGhpcy5fc2NoZWR1bGVy
ID0gc2NoZWR1bGVyOworICB0aGlzLl92MSA9IHYxOworICB0aGlzLl92MiA9IHYyOworfQorCitX
b3JrZXJUYXNrLnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fKCJzY2hlZHVsZXIiLCBmdW5jdGlv
bigpIHsgcmV0dXJuIHRoaXMuX3NjaGVkdWxlcjsgfSk7CitXb3JrZXJUYXNrLnByb3RvdHlwZS5f
X2RlZmluZUdldHRlcl9fKCJ2MSIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fdjE7IH0pOwor
V29ya2VyVGFzay5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXygidjEiLCBmdW5jdGlvbih2YWx1
ZSkgeyB0aGlzLl92MSA9IHZhbHVlOyB9KTsKK1dvcmtlclRhc2sucHJvdG90eXBlLl9fZGVmaW5l
R2V0dGVyX18oInYyIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl92MjsgfSk7CitXb3JrZXJU
YXNrLnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKCJ2MiIsIGZ1bmN0aW9uKHZhbHVlKSB7IHRo
aXMuX3YyID0gdmFsdWU7IH0pOworCitXb3JrZXJUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlv
biAocGFja2V0KSB7CisgIGlmIChwYWNrZXQgPT0gbnVsbCkgeworICAgIHJldHVybiB0aGlzLnNj
aGVkdWxlci5zdXNwZW5kQ3VycmVudCgpOworICB9IGVsc2UgeworICAgIGlmICh0aGlzLnYxID09
IElEX0hBTkRMRVJfQSkgeworICAgICAgdGhpcy52MSA9IElEX0hBTkRMRVJfQjsKKyAgICB9IGVs
c2UgeworICAgICAgdGhpcy52MSA9IElEX0hBTkRMRVJfQTsKKyAgICB9CisgICAgcGFja2V0Lmlk
ID0gdGhpcy52MTsKKyAgICBwYWNrZXQuYTEgPSAwOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwg
REFUQV9TSVpFOyBpKyspIHsKKyAgICAgIHRoaXMudjIrKzsKKyAgICAgIGlmICh0aGlzLnYyID4g
MjYpIHRoaXMudjIgPSAxOworICAgICAgcGFja2V0LmEyW2ldID0gdGhpcy52MjsKKyAgICB9Cisg
ICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnF1ZXVlKHBhY2tldCk7CisgIH0KK307CisKK1dvcmtl
clRhc2sucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gIldvcmtl
clRhc2siOworfTsKKworLyoqCisgKiBBIHRhc2sgdGhhdCBtYW5pcHVsYXRlcyB3b3JrIHBhY2tl
dHMgYW5kIHRoZW4gc3VzcGVuZHMgaXRzZWxmLgorICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVk
dWxlciB0aGUgc2NoZWR1bGVyIHRoYXQgbWFuYWdlcyB0aGlzIHRhc2sKKyAqIEBjb25zdHJ1Y3Rv
cgorICovCitmdW5jdGlvbiBIYW5kbGVyVGFzayhzY2hlZHVsZXIpIHsKKyAgdGhpcy5fc2NoZWR1
bGVyID0gc2NoZWR1bGVyOworICB0aGlzLl92MSA9IG51bGw7CisgIHRoaXMuX3YyID0gbnVsbDsK
K30KKworSGFuZGxlclRhc2sucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oInNjaGVkdWxlciIs
IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fc2NoZWR1bGVyOyB9KTsKK0hhbmRsZXJUYXNrLnBy
b3RvdHlwZS5fX2RlZmluZUdldHRlcl9fKCJ2MSIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5f
djE7IH0pOworSGFuZGxlclRhc2sucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oInYxIiwgZnVu
Y3Rpb24odmFsdWUpIHsgdGhpcy5fdjEgPSB2YWx1ZTsgfSk7CitIYW5kbGVyVGFzay5wcm90b3R5
cGUuX19kZWZpbmVHZXR0ZXJfXygidjIiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3YyOyB9
KTsKK0hhbmRsZXJUYXNrLnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKCJ2MiIsIGZ1bmN0aW9u
KHZhbHVlKSB7IHRoaXMuX3YyID0gdmFsdWU7IH0pOworCitIYW5kbGVyVGFzay5wcm90b3R5cGUu
cnVuID0gZnVuY3Rpb24gKHBhY2tldCkgeworICBpZiAocGFja2V0ICE9IG51bGwpIHsKKyAgICBp
ZiAocGFja2V0LmtpbmQgPT0gS0lORF9XT1JLKSB7CisgICAgICB0aGlzLnYxID0gcGFja2V0LmFk
ZFRvKHRoaXMudjEpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnYyID0gcGFja2V0LmFkZFRv
KHRoaXMudjIpOworICAgIH0KKyAgfQorICBpZiAodGhpcy52MSAhPSBudWxsKSB7CisgICAgdmFy
IGNvdW50ID0gdGhpcy52MS5hMTsKKyAgICB2YXIgdjsKKyAgICBpZiAoY291bnQgPCBEQVRBX1NJ
WkUpIHsKKyAgICAgIGlmICh0aGlzLnYyICE9IG51bGwpIHsKKyAgICAgICAgdiA9IHRoaXMudjI7
CisgICAgICAgIHRoaXMudjIgPSB0aGlzLnYyLmxpbms7CisgICAgICAgIHYuYTEgPSB0aGlzLnYx
LmEyW2NvdW50XTsKKyAgICAgICAgdGhpcy52MS5hMSA9IGNvdW50ICsgMTsKKyAgICAgICAgcmV0
dXJuIHRoaXMuc2NoZWR1bGVyLnF1ZXVlKHYpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAg
ICB2ID0gdGhpcy52MTsKKyAgICAgIHRoaXMudjEgPSB0aGlzLnYxLmxpbms7CisgICAgICByZXR1
cm4gdGhpcy5zY2hlZHVsZXIucXVldWUodik7CisgICAgfQorICB9CisgIHJldHVybiB0aGlzLnNj
aGVkdWxlci5zdXNwZW5kQ3VycmVudCgpOworfTsKKworSGFuZGxlclRhc2sucHJvdG90eXBlLnRv
U3RyaW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gIkhhbmRsZXJUYXNrIjsKK307CisKKy8q
IC0tLSAqCisgKiBQIGEgYyBrIGUgdAorICogLS0tICovCisKK3ZhciBEQVRBX1NJWkUgPSA0Owor
CisvKioKKyAqIEEgc2ltcGxlIHBhY2thZ2Ugb2YgZGF0YSB0aGF0IGlzIG1hbmlwdWxhdGVkIGJ5
IHRoZSB0YXNrcy4gIFRoZSBleGFjdCBsYXlvdXQKKyAqIG9mIHRoZSBwYXlsb2FkIGRhdGEgY2Fy
cmllZCBieSBhIHBhY2tldCBpcyBub3QgaW1wb3J0YWludCwgYW5kIG5laXRoZXIgaXMgdGhlCisg
KiBuYXR1cmUgb2YgdGhlIHdvcmsgcGVyZm9ybWVkIG9uIHBhY2tldHMgYnkgdGhlIHRhc2tzLgor
ICoKKyAqIEJlc2lkZXMgY2FycnlpbmcgZGF0YSwgcGFja2V0cyBmb3JtIGxpbmtlZCBsaXN0cyBh
bmQgYXJlIGhlbmNlIHVzZWQgYm90aCBhcworICogZGF0YSBhbmQgd29ya2xpc3RzLgorICogQHBh
cmFtIHtQYWNrZXR9IGxpbmsgdGhlIHRhaWwgb2YgdGhlIGxpbmtlZCBsaXN0IG9mIHBhY2tldHMK
KyAqIEBwYXJhbSB7aW50fSBpZCBhbiBJRCBmb3IgdGhpcyBwYWNrZXQKKyAqIEBwYXJhbSB7aW50
fSBraW5kIHRoZSB0eXBlIG9mIHRoaXMgcGFja2V0CisgKiBAY29uc3RydWN0b3IKKyAqLworZnVu
Y3Rpb24gUGFja2V0KGxpbmssIGlkLCBraW5kKSB7CisgIHRoaXMuX2xpbmsgPSBsaW5rOworICB0
aGlzLl9pZCA9IGlkOworICB0aGlzLl9raW5kID0ga2luZDsKKyAgdGhpcy5fYTEgPSAwOworICB0
aGlzLl9hMiA9IG5ldyBBcnJheShEQVRBX1NJWkUpOworfQorCitQYWNrZXQucHJvdG90eXBlLl9f
ZGVmaW5lR2V0dGVyX18oImxpbmsiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2xpbms7IH0p
OworUGFja2V0LnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKCJsaW5rIiwgZnVuY3Rpb24odmFs
dWUpIHsgdGhpcy5fbGluayA9IHZhbHVlOyB9KTsKK1BhY2tldC5wcm90b3R5cGUuX19kZWZpbmVH
ZXR0ZXJfXygiaWQiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2lkOyB9KTsKK1BhY2tldC5w
cm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXygiaWQiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl9p
ZCA9IHZhbHVlOyB9KTsKK1BhY2tldC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygia2luZCIs
IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fa2luZDsgfSk7CitQYWNrZXQucHJvdG90eXBlLl9f
ZGVmaW5lR2V0dGVyX18oImExIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9hMTsgfSk7CitQ
YWNrZXQucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oImExIiwgZnVuY3Rpb24odmFsdWUpIHsg
dGhpcy5fYTEgPSB2YWx1ZTsgfSk7CitQYWNrZXQucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18o
ImEyIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9hMjsgfSk7CisKKy8qKgorICogQWRkIHRo
aXMgcGFja2V0IHRvIHRoZSBlbmQgb2YgYSB3b3JrbGlzdCwgYW5kIHJldHVybiB0aGUgd29ya2xp
c3QuCisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHdvcmtsaXN0IHRvIGFkZCB0aGlzIHBh
Y2tldCB0bworICovCitQYWNrZXQucHJvdG90eXBlLmFkZFRvID0gZnVuY3Rpb24gKHF1ZXVlKSB7
CisgIHRoaXMubGluayA9IG51bGw7CisgIGlmIChxdWV1ZSA9PSBudWxsKSByZXR1cm4gdGhpczsK
KyAgdmFyIHBlZWssIG5leHQgPSBxdWV1ZTsKKyAgd2hpbGUgKChwZWVrID0gbmV4dC5saW5rKSAh
PSBudWxsKQorICAgIG5leHQgPSBwZWVrOworICBuZXh0LmxpbmsgPSB0aGlzOworICByZXR1cm4g
cXVldWU7Cit9OworCitQYWNrZXQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewor
ICByZXR1cm4gIlBhY2tldCI7Cit9OworCitmb3IgKHZhciBpID0gMDsgaSA8IDM1MDsgKytpKQor
ICBydW5SaWNoYXJkcygpOwpJbmRleDogVG9vbHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0NoYW5nZUxvZwkocmV2aXNpb24gMjAyMzU1KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTYtMDYtMjIgIFNhYW0gYmFyYXRpICA8c2Jh
cmF0aUBhcHBsZS5jb20+CisKKyAgICAgICAgVHlwZVByb2ZpbGVyIGFuZCBUeXBlUHJvZmlsZXJM
b2cgZG9uJ3QgcGxheSBuaWNlbHkgd2l0aCB0aGUgY29uY3VycmVudCBKSVQKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1OTAzNworICAgICAgICA8cmRh
cjovL3Byb2JsZW0vMjY5MzUzNDk+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgQmVuamFtaW4gUG91
bGFpbi4KKworICAgICAgICBSdW4gdHlwZVByb2ZpbGVyLnlhbWwgdGVzdHMgdW5kZXIgYW4gYWRk
aXRpb25hbCBDSklUIGVuYWJsZWQgbW9kZS4KKworICAgICAgICAqIFNjcmlwdHMvcnVuLWpzYy1z
dHJlc3MtdGVzdHM6CisKIDIwMTYtMDYtMjIgIEpvbiBMZWUgIDxqb25sZWVAYXBwbGUuY29tPgog
CiAgICAgICAgIFVwZGF0ZSBhbmltb21ldGVyLnBsYW4KSW5kZXg6IFRvb2xzL1NjcmlwdHMvcnVu
LWpzYy1zdHJlc3MtdGVzdHMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy9ydW4tanNjLXN0
cmVzcy10ZXN0cwkocmV2aXNpb24gMjAyMzQ4KQorKysgVG9vbHMvU2NyaXB0cy9ydW4tanNjLXN0
cmVzcy10ZXN0cwkod29ya2luZyBjb3B5KQpAQCAtMTAyNSw4ICsxMDI1LDEwIEBAIGRlZiBydW5U
eXBlUHJvZmlsZXIKIAogICAgIGlmICRlbmFibGVGVEwKICAgICAgICAgcnVuKCJmdGwtbm8tY2pp
dC10eXBlLXByb2ZpbGVyIiwgIi0tdXNlVHlwZVByb2ZpbGVyPXRydWUiLCAqKEZUTF9PUFRJT05T
ICsgTk9fQ0pJVF9PUFRJT05TKSkKKyAgICAgICAgcnVuKCJmdGwtdHlwZS1wcm9maWxlciIsICIt
LXVzZVR5cGVQcm9maWxlcj10cnVlIiwgKihGVExfT1BUSU9OUykpCiAgICAgZWxzZQogICAgICAg
ICBydW4oIm5vLWNqaXQtdHlwZS1wcm9maWxlciIsICItLXVzZVR5cGVQcm9maWxlcj10cnVlIiwg
Kk5PX0NKSVRfT1BUSU9OUykKKyAgICAgICAgcnVuKCJ0eXBlLXByb2ZpbGVyIiwgIi0tdXNlVHlw
ZVByb2ZpbGVyPXRydWUiKQogICAgIGVuZAogZW5kCiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>281890</attachid>
            <date>2016-06-22 17:46:14 -0700</date>
            <delta_ts>2016-06-22 20:24:31 -0700</delta_ts>
            <desc>patch for landing that builds</desc>
            <filename>c-backup.diff</filename>
            <type>text/plain</type>
            <size>57389</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjAyMzQ4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU0IEBA
CisyMDE2LTA2LTIyICBTYWFtIGJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAg
IFR5cGVQcm9maWxlciBhbmQgVHlwZVByb2ZpbGVyTG9nIGRvbid0IHBsYXkgbmljZWx5IHdpdGgg
dGhlIGNvbmN1cnJlbnQgSklUCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0xNTkwMzcKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzI2OTM1MzQ5PgorCisg
ICAgICAgIFJldmlld2VkIGJ5IEJlbmphbWluIFBvdWxhaW4uCisKKyAgICAgICAgVGhlIHByaW1h
cnkgZm9jdXMgb2YgdGhpcyBwYXRjaCBpcyB0byBtYWtlIHRoZSBjb25jdXJyZW50CisgICAgICAg
IGJhc2VsaW5lIEpJVCB3b3JrIHdpdGggdGhlIHR5cGUgcHJvZmlsZXIuIFdlIHdlcmUgY2xlYXJp
bmcKKyAgICAgICAgdGhlIHR5cGUgcHJvZmlsZXIgbG9nIG9uIHRoZSBiYWNrZ3JvdW5kIGJhc2Vs
aW5lIGNvbXBpbGVyCisgICAgICAgIHRocmVhZCB3aGljaCBsZWFkIHRvIGJhZCB0aGluZ3MgaGFw
cGVuaW5nLiBUaGlzIHBhdGNoIGZpeGVzCisgICAgICAgIHRoaXMgYnkgcHJvY2Vzc2luZyB0aGUg
bG9nIGJlZm9yZSB3ZSBsYXVuY2ggdGhlIGNvbXBpbGUgb24KKyAgICAgICAgYSBiYWNrZ3JvdW5k
IHRocmVhZC4KKworICAgICAgICBTZWNvbmRseSwgSSBhdWRpdGVkIHRoZSB0eXBlIHByb2ZpbGVy
IGNvZGUgaW5zaWRlIHRoZSBERkcsCisgICAgICAgIGFuZCBmb3VuZCB0aGF0IHdlIHdlcmUgZG9p
bmcgc29tZSByYWN5IHRoaW5ncy4gSSBoYXZlbid0CisgICAgICAgIHNlZW4gYW55IGNyYXNoZXMg
YmVjYXVzZSBvZiB0aGVzZSB0aGluZ3MsIGJ1dCBpdCBpcyBwb3NzaWJsZQorICAgICAgICB0aGF0
IHRoZXkgZXhpc3QuIFdlIHdlcmUgZ3JhYmJpbmcgYSBSZWZQdHIgdG8gYSBUeXBlU2V0LAorICAg
ICAgICBldmVuIHRob3VnaCBUeXBlU2V0IHdhcyBSZWZDb3VudGVkIGFuZCBub3QgVGhyZWFkU2Fm
ZVJlZkNvdW50ZWQuCisgICAgICAgIFRoaXMgcGF0Y2ggbWFrZXMgVHlwZVNldCBUaHJlYWRTYWZl
UmVmQ291bnRlZC4gV2Ugd2VyZQorICAgICAgICBhbHNvIGNvcHlpbmcgYSBTdHJ1Y3R1cmVTZXQg
d2hpbGUgdGhlIGV4ZWN1dGlvbiB0aHJlYWQgY291bGQKKyAgICAgICAgYmUgYXVnbWVudGluZyB0
aGUgU3RydWN0dXJlU2V0LiBUaGlzIHBhdGNoIHB1dHMgY2hhbmdlcyB0byAKKyAgICAgICAgVHlw
ZVNldCdzIFN0cnVjdHVyZVNldCBiZWhpbmQgYSBDb25jdXJyZW50SklUTG9jay4KKworICAgICAg
ICBJJ3ZlIGFsc28gYWRkZWQgdHdvIG1vcmUgbGFyZ2UgcnVubmluZyB0ZXN0cyB0aGF0IHJ1biB3
aXRoIHRoZQorICAgICAgICB0eXBlIHByb2ZpbGVyIGVuYWJsZWQuIFRoZXNlIGFyZSBoZXJlIGp1
c3QgdG8gY2F0Y2ggYW55IG1ham9yIGJ1Z3MKKyAgICAgICAgaW4gdGhlIHR5cGUgcHJvZmlsZXIg
aW1wbGVtZW50YXRpb24uCisKKyAgICAgICAgKiBqaXQvSklULmNwcDoKKyAgICAgICAgKEpTQzo6
SklUOjpjb21waWxlV2l0aG91dExpbmtpbmcpOgorICAgICAgICAoSlNDOjpKSVQ6OnByaXZhdGVD
b21waWxlKToKKyAgICAgICAgKEpTQzo6SklUOjpwcml2YXRlQ29tcGlsZUV4Y2VwdGlvbkhhbmRs
ZXJzKToKKyAgICAgICAgKEpTQzo6SklUOjpkb01haW5UaHJlYWRQcmVwYXJhdGlvbkJlZm9yZUNv
bXBpbGUpOgorICAgICAgICAoSlNDOjpKSVQ6OmZyYW1lUmVnaXN0ZXJDb3VudEZvcik6CisgICAg
ICAgICogaml0L0pJVC5oOgorICAgICAgICAoSlNDOjpKSVQ6OmNvbXBpbGUpOgorICAgICAgICAq
IGppdC9KSVRXb3JrbGlzdC5jcHA6CisgICAgICAgIChKU0M6OkpJVFdvcmtsaXN0OjpQbGFuOjpQ
bGFuKToKKyAgICAgICAgKEpTQzo6SklUV29ya2xpc3Q6OlBsYW46OmNvbXBpbGVJblRocmVhZCk6
CisgICAgICAgICogcnVudGltZS9UeXBlU2V0LmNwcDoKKyAgICAgICAgKEpTQzo6VHlwZVNldDo6
YWRkVHlwZUluZm9ybWF0aW9uKToKKyAgICAgICAgKEpTQzo6VHlwZVNldDo6aW52YWxpZGF0ZUNh
Y2hlKToKKyAgICAgICAgKiBydW50aW1lL1R5cGVTZXQuaDoKKyAgICAgICAgKEpTQzo6VHlwZVNl
dDo6Y3JlYXRlKToKKyAgICAgICAgKEpTQzo6VHlwZVNldDo6aXNFbXB0eSk6CisgICAgICAgIChK
U0M6OlR5cGVTZXQ6OnNlZW5UeXBlcyk6CisgICAgICAgIChKU0M6OlR5cGVTZXQ6OnN0cnVjdHVy
ZVNldCk6CisgICAgICAgICogdGVzdHMvdHlwZVByb2ZpbGVyL2RlbHRhYmx1ZS1mb3Itb2YuanM6
IEFkZGVkLgorICAgICAgICAqIHRlc3RzL3R5cGVQcm9maWxlci9nZXR0ZXItcmljaGFyZHMuanM6
IEFkZGVkLgorCiAyMDE2LTA2LTIxICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBhcHBsZS5j
b20+CiAKICAgICAgICAgRml4IGJ1aWxkLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2Rm
Zy9ERkdGaXh1cFBoYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
ZGZnL0RGR0ZpeHVwUGhhc2UuY3BwCShyZXZpc2lvbiAyMDIzNDgpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR0ZpeHVwUGhhc2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDYxLDcg
KzE0NjEsMTEgQEAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICBmaXhFZGdlPE90aGVyVXNlPihu
b2RlLT5jaGlsZDEoKSk7CiAgICAgICAgICAgICAgICAgbm9kZS0+cmVtb3ZlKCk7CiAgICAgICAg
ICAgICB9IGVsc2UgaWYgKHR5cGVTZXQtPmRvZXNUeXBlQ29uZm9ybVRvKFR5cGVPYmplY3QpKSB7
Ci0gICAgICAgICAgICAgICAgU3RydWN0dXJlU2V0IHNldCA9IHR5cGVTZXQtPnN0cnVjdHVyZVNl
dCgpOworICAgICAgICAgICAgICAgIFN0cnVjdHVyZVNldCBzZXQ7CisgICAgICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgICAgICBDb25jdXJyZW50SklUTG9ja2VyIGxvY2tlcih0eXBlU2V0
LT5tX2xvY2spOworICAgICAgICAgICAgICAgICAgICBzZXQgPSB0eXBlU2V0LT5zdHJ1Y3R1cmVT
ZXQobG9ja2VyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCFzZXQu
aXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpeEVkZ2U8Q2VsbFVzZT4obm9kZS0+
Y2hpbGQxKCkpOwogICAgICAgICAgICAgICAgICAgICBub2RlLT5jb252ZXJ0VG9DaGVja1N0cnVj
dHVyZShtX2dyYXBoLmFkZFN0cnVjdHVyZVNldChzZXQpKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9qaXQvSklULmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
aml0L0pJVC5jcHAJKHJldmlzaW9uIDIwMjM0OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9q
aXQvSklULmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTQ5LDEwICs1NDksNiBAQCB2b2lkIEpJVDo6
Y29tcGlsZVdpdGhvdXRMaW5raW5nKEpJVENvbXBpCiAgICAgICAgIGJyZWFrOwogICAgIH0KIAot
ICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGhhdmUgdGhlIG1vc3QgdXAgdG8gZGF0ZSB0eXBl
IGluZm9ybWF0aW9uIHdoZW4gcGVyZm9ybWluZyB0eXBlY2hlY2sgb3B0aW1pemF0aW9ucyBmb3Ig
b3BfcHJvZmlsZV90eXBlLgotICAgIGlmIChtX3ZtLT50eXBlUHJvZmlsZXIoKSkKLSAgICAgICAg
bV92bS0+dHlwZVByb2ZpbGVyTG9nKCktPnByb2Nlc3NMb2dFbnRyaWVzKEFTQ0lJTGl0ZXJhbCgi
UHJlcGFyaW5nIGZvciBKSVQgY29tcGlsYXRpb24uIikpOwotICAgIAogICAgIGlmIChPcHRpb25z
OjpkdW1wRGlzYXNzZW1ibHkoKSB8fCAobV92bS0+bV9wZXJCeXRlY29kZVByb2ZpbGVyICYmIE9w
dGlvbnM6OmRpc2Fzc2VtYmxlQmFzZWxpbmVGb3JQcm9maWxlcigpKSkKICAgICAgICAgbV9kaXNh
c3NlbWJsZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPEpJVERpc2Fzc2VtYmxlcj4obV9jb2RlQmxvY2sp
OwogICAgIGlmIChtX3ZtLT5tX3BlckJ5dGVjb2RlUHJvZmlsZXIpIHsKQEAgLTgwNCw2ICs4MDAs
NyBAQCBDb21waWxhdGlvblJlc3VsdCBKSVQ6OmxpbmsoKQogCiBDb21waWxhdGlvblJlc3VsdCBK
SVQ6OnByaXZhdGVDb21waWxlKEpJVENvbXBpbGF0aW9uRWZmb3J0IGVmZm9ydCkKIHsKKyAgICBk
b01haW5UaHJlYWRQcmVwYXJhdGlvbkJlZm9yZUNvbXBpbGUoKTsKICAgICBjb21waWxlV2l0aG91
dExpbmtpbmcoZWZmb3J0KTsKICAgICByZXR1cm4gbGluaygpOwogfQpAQCAtODQ4LDYgKzg0NSwx
MyBAQCB2b2lkIEpJVDo6cHJpdmF0ZUNvbXBpbGVFeGNlcHRpb25IYW5kbGVyCiAgICAgfQogfQog
Cit2b2lkIEpJVDo6ZG9NYWluVGhyZWFkUHJlcGFyYXRpb25CZWZvcmVDb21waWxlKCkKK3sKKyAg
ICAvLyBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBoYXZlIHRoZSBtb3N0IHVwIHRvIGRhdGUgdHlwZSBp
bmZvcm1hdGlvbiB3aGVuIHBlcmZvcm1pbmcgdHlwZWNoZWNrIG9wdGltaXphdGlvbnMgZm9yIG9w
X3Byb2ZpbGVfdHlwZS4KKyAgICBpZiAobV92bS0+dHlwZVByb2ZpbGVyKCkpCisgICAgICAgIG1f
dm0tPnR5cGVQcm9maWxlckxvZygpLT5wcm9jZXNzTG9nRW50cmllcyhBU0NJSUxpdGVyYWwoIlBy
ZXBhcmluZyBmb3IgSklUIGNvbXBpbGF0aW9uLiIpKTsKK30KKwogdW5zaWduZWQgSklUOjpmcmFt
ZVJlZ2lzdGVyQ291bnRGb3IoQ29kZUJsb2NrKiBjb2RlQmxvY2spCiB7CiAgICAgQVNTRVJUKHN0
YXRpY19jYXN0PHVuc2lnbmVkPihjb2RlQmxvY2stPm1fbnVtQ2FsbGVlTG9jYWxzKSA9PSBXVEY6
OnJvdW5kVXBUb011bHRpcGxlT2Yoc3RhY2tBbGlnbm1lbnRSZWdpc3RlcnMoKSwgc3RhdGljX2Nh
c3Q8dW5zaWduZWQ+KGNvZGVCbG9jay0+bV9udW1DYWxsZWVMb2NhbHMpKSk7CkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9qaXQvSklULmgJKHJldmlzaW9uIDIwMjM0OCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9qaXQvSklULmgJKHdvcmtpbmcgY29weSkKQEAgLTE5OSw2ICsxOTksOCBAQCBuYW1lc3Bh
Y2UgSlNDIHsKIAogICAgICAgICB2b2lkIGNvbXBpbGVXaXRob3V0TGlua2luZyhKSVRDb21waWxh
dGlvbkVmZm9ydCk7CiAgICAgICAgIENvbXBpbGF0aW9uUmVzdWx0IGxpbmsoKTsKKworICAgICAg
ICB2b2lkIGRvTWFpblRocmVhZFByZXBhcmF0aW9uQmVmb3JlQ29tcGlsZSgpOwogICAgICAgICAK
ICAgICAgICAgc3RhdGljIENvbXBpbGF0aW9uUmVzdWx0IGNvbXBpbGUoVk0qIHZtLCBDb2RlQmxv
Y2sqIGNvZGVCbG9jaywgSklUQ29tcGlsYXRpb25FZmZvcnQgZWZmb3J0KQogICAgICAgICB7Cklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVFdvcmtsaXN0LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVFdvcmtsaXN0LmNwcAkocmV2aXNpb24g
MjAyMzQ4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVRXb3JrbGlzdC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTQwLDYgKzQwLDcgQEAgcHVibGljOgogICAgICAgICA6IG1fY29kZUJs
b2NrKGNvZGVCbG9jaykKICAgICAgICAgLCBtX2ppdChjb2RlQmxvY2stPnZtKCksIGNvZGVCbG9j
aykKICAgICB7CisgICAgICAgIG1faml0LmRvTWFpblRocmVhZFByZXBhcmF0aW9uQmVmb3JlQ29t
cGlsZSgpOwogICAgIH0KICAgICAKICAgICB2b2lkIGNvbXBpbGVJblRocmVhZCgpCkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9UeXBlU2V0LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9UeXBlU2V0LmNwcAkocmV2aXNpb24gMjAyMzQ4
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVHlwZVNldC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTM3LDggKzM3LDggQEAKIG5hbWVzcGFjZSBKU0MgewogCiBUeXBlU2V0OjpUeXBl
U2V0KCkKLSAgICA6IG1fc2VlblR5cGVzKFR5cGVOb3RoaW5nKQotICAgICwgbV9pc092ZXJmbG93
bihmYWxzZSkKKyAgICA6IG1faXNPdmVyZmxvd24oZmFsc2UpCisgICAgLCBtX3NlZW5UeXBlcyhU
eXBlTm90aGluZykKIHsKIH0KIApAQCAtNDksNyArNDksMTAgQEAgdm9pZCBUeXBlU2V0OjphZGRU
eXBlSW5mb3JtYXRpb24oUnVudGltZQogCiAgICAgaWYgKHN0cnVjdHVyZSAmJiBuZXdTaGFwZSAm
JiAhcnVudGltZVR5cGVJc1ByaW1pdGl2ZSh0eXBlKSkgewogICAgICAgICBpZiAoIW1fc3RydWN0
dXJlU2V0LmNvbnRhaW5zKHN0cnVjdHVyZSkpIHsKLSAgICAgICAgICAgIG1fc3RydWN0dXJlU2V0
LmFkZChzdHJ1Y3R1cmUpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbmN1cnJl
bnRKSVRMb2NrZXIgbG9ja2VyKG1fbG9jayk7CisgICAgICAgICAgICAgICAgbV9zdHJ1Y3R1cmVT
ZXQuYWRkKHN0cnVjdHVyZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBNYWtlIG9u
ZSBtb3JlIHBhc3MgbWFraW5nIHN1cmUgdGhhdDogCiAgICAgICAgICAgICAvLyAtIFdlIGRvbid0
IGhhdmUgdHdvIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBzaGFwZS4gKFNhbWUgc2hhcGVzIG1heSBo
YXZlIGRpZmZlcmVudCBTdHJ1Y3R1cmVzKS4KICAgICAgICAgICAgIC8vIC0gV2UgZG9uJ3QgaGF2
ZSB0d28gc2hhcGVzIHRoYXQgc2hhcmUgdGhlIHNhbWUgcHJvdG90eXBlIGNoYWluLiBJZiB0aGVz
ZSBzaGFwZXMgc2hhcmUgdGhlIHNhbWUgCkBAIC04MSw2ICs4NCw3IEBAIHZvaWQgVHlwZVNldDo6
YWRkVHlwZUluZm9ybWF0aW9uKFJ1bnRpbWUKIAogdm9pZCBUeXBlU2V0OjppbnZhbGlkYXRlQ2Fj
aGUoKQogeworICAgIENvbmN1cnJlbnRKSVRMb2NrZXIgbG9ja2VyKG1fbG9jayk7CiAgICAgYXV0
byBrZWVwTWFya2VkU3RydWN0dXJlc0ZpbHRlciA9IFtdIChTdHJ1Y3R1cmUqIHN0cnVjdHVyZSkg
LT4gYm9vbCB7IHJldHVybiBIZWFwOjppc01hcmtlZChzdHJ1Y3R1cmUpOyB9OwogICAgIG1fc3Ry
dWN0dXJlU2V0LmdlbmVyaWNGaWx0ZXIoa2VlcE1hcmtlZFN0cnVjdHVyZXNGaWx0ZXIpOwogfQpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVHlwZVNldC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL1R5cGVTZXQuaAkocmV2aXNpb24gMjAy
MzQ4KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvVHlwZVNldC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0yNiwxMCArMjYsMTIgQEAKICNpZm5kZWYgVHlwZVNldF9oCiAjZGVmaW5lIFR5
cGVTZXRfaAogCisjaW5jbHVkZSAiQ29uY3VycmVudEpJVExvY2suaCIKICNpbmNsdWRlICJSdW50
aW1lVHlwZS5oIgogI2luY2x1ZGUgIlN0cnVjdHVyZVNldC5oIgogI2luY2x1ZGUgPHd0Zi9IYXNo
U2V0Lmg+CiAjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFk
U2FmZVJlZkNvdW50ZWQuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KICNpbmNs
dWRlIDx3dGYvVmVjdG9yLmg+CiAKQEAgLTc5LDcgKzgxLDcgQEAgcHJpdmF0ZToKICAgICBib29s
IG1faXNJbkRpY3Rpb25hcnlNb2RlOwogfTsKIAotY2xhc3MgVHlwZVNldCA6IHB1YmxpYyBSZWZD
b3VudGVkPFR5cGVTZXQ+IHsKK2NsYXNzIFR5cGVTZXQgOiBwdWJsaWMgVGhyZWFkU2FmZVJlZkNv
dW50ZWQ8VHlwZVNldD4gewogCiBwdWJsaWM6CiAgICAgc3RhdGljIFJlZjxUeXBlU2V0PiBjcmVh
dGUoKSB7IHJldHVybiBhZG9wdFJlZigqbmV3IFR5cGVTZXQpOyB9CkBAIC05NiwxMSArOTgsMTIg
QEAgcHVibGljOgogICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fc2VlblR5cGVz
ID09IFR5cGVOb3RoaW5nOyB9CiAgICAgYm9vbCBkb2VzVHlwZUNvbmZvcm1UbyhSdW50aW1lVHlw
ZU1hc2sgdGVzdCkgY29uc3Q7CiAgICAgUnVudGltZVR5cGVNYXNrIHNlZW5UeXBlcygpIGNvbnN0
IHsgcmV0dXJuIG1fc2VlblR5cGVzOyB9Ci0gICAgU3RydWN0dXJlU2V0IHN0cnVjdHVyZVNldCgp
IGNvbnN0IHsgcmV0dXJuIG1fc3RydWN0dXJlU2V0OyB9OworICAgIFN0cnVjdHVyZVNldCBzdHJ1
Y3R1cmVTZXQoY29uc3QgQ29uY3VycmVudEpJVExvY2tlciYpIGNvbnN0IHsgcmV0dXJuIG1fc3Ry
dWN0dXJlU2V0OyB9CiAKKyAgICBDb25jdXJyZW50SklUTG9jayBtX2xvY2s7CiBwcml2YXRlOgot
ICAgIFJ1bnRpbWVUeXBlTWFzayBtX3NlZW5UeXBlczsKICAgICBib29sIG1faXNPdmVyZmxvd247
CisgICAgUnVudGltZVR5cGVNYXNrIG1fc2VlblR5cGVzOwogICAgIFZlY3RvcjxSZWZQdHI8U3Ry
dWN0dXJlU2hhcGU+PiBtX3N0cnVjdHVyZUhpc3Rvcnk7CiAgICAgU3RydWN0dXJlU2V0IG1fc3Ry
dWN0dXJlU2V0OwogfTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS90ZXN0cy90eXBlUHJv
ZmlsZXIvZGVsdGFibHVlLWZvci1vZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvdGVzdHMvdHlwZVByb2ZpbGVyL2RlbHRhYmx1ZS1mb3Itb2YuanMJKG5vbmV4aXN0ZW50
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3R5cGVQcm9maWxlci9kZWx0YWJsdWUt
Zm9yLW9mLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODcwIEBACisvLyBDb3B5cmlnaHQg
MjAwOCB0aGUgVjggcHJvamVjdCBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29w
eXJpZ2h0IDE5OTYgSm9obiBNYWxvbmV5IGFuZCBNYXJpbyBXb2xjemtvLgorCisvLyBUaGlzIHBy
b2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v
ZGlmeQorLy8gaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkKKy8vIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisvLyAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorLy8KKy8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorLy8gYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKy8vIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKy8vIEdO
VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisvLworLy8gWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKy8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVl
IFNvZnR3YXJlCisvLyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMz
MCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKworLy8gVGhpcyBpbXBsZW1lbnRhdGlv
biBvZiB0aGUgRGVsdGFCbHVlIGJlbmNobWFyayBpcyBkZXJpdmVkCisvLyBmcm9tIHRoZSBTbWFs
bHRhbGsgaW1wbGVtZW50YXRpb24gYnkgSm9obiBNYWxvbmV5IGFuZCBNYXJpbworLy8gV29sY3pr
by4gU29tZSBwYXJ0cyBoYXZlIGJlZW4gdHJhbnNsYXRlZCBkaXJlY3RseSwgd2hlcmVhcworLy8g
b3RoZXJzIGhhdmUgYmVlbiBtb2RpZmllZCBtb3JlIGFnZ3Jlc2l2ZWx5IHRvIG1ha2UgaXQgZmVl
bAorLy8gbW9yZSBsaWtlIGEgSmF2YVNjcmlwdCBwcm9ncmFtLgorCisvKioKKyAqIEEgSmF2YVNj
cmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGVsdGFCbHVlIGNvbnN0cmFpbnQtc29sdmluZwor
ICogYWxnb3JpdGhtLCBhcyBkZXNjcmliZWQgaW46CisgKgorICogIlRoZSBEZWx0YUJsdWUgQWxn
b3JpdGhtOiBBbiBJbmNyZW1lbnRhbCBDb25zdHJhaW50IEhpZXJhcmNoeSBTb2x2ZXIiCisgKiAg
IEJqb3JuIE4uIEZyZWVtYW4tQmVuc29uIGFuZCBKb2huIE1hbG9uZXkKKyAqICAgSmFudWFyeSAx
OTkwIENvbW11bmljYXRpb25zIG9mIHRoZSBBQ00sCisgKiAgIGFsc28gYXZhaWxhYmxlIGFzIFVu
aXZlcnNpdHkgb2YgV2FzaGluZ3RvbiBUUiA4OS0wOC0wNi4KKyAqCisgKiBCZXdhcmU6IHRoaXMg
YmVuY2htYXJrIGlzIHdyaXR0ZW4gaW4gYSBncm90ZXNxdWUgc3R5bGUgd2hlcmUKKyAqIHRoZSBj
b25zdHJhaW50IG1vZGVsIGlzIGJ1aWx0IGJ5IHNpZGUtZWZmZWN0cyBmcm9tIGNvbnN0cnVjdG9y
cy4KKyAqIEkndmUga2VwdCBpdCB0aGlzIHdheSB0byBhdm9pZCBkZXZpYXRpbmcgdG9vIG11Y2gg
ZnJvbSB0aGUgb3JpZ2luYWwKKyAqIGltcGxlbWVudGF0aW9uLgorICovCisKKworLyogLS0tIE8g
YiBqIGUgYyB0ICAgTSBvIGQgZSBsIC0tLSAqLworCitPYmplY3QucHJvdG90eXBlLmluaGVyaXRz
RnJvbSA9IGZ1bmN0aW9uIChzaHVwZXIpIHsKKyAgZnVuY3Rpb24gSW5oZXJpdGVyKCkgeyB9Cisg
IEluaGVyaXRlci5wcm90b3R5cGUgPSBzaHVwZXIucHJvdG90eXBlOworICB0aGlzLnByb3RvdHlw
ZSA9IG5ldyBJbmhlcml0ZXIoKTsKKyAgdGhpcy5zdXBlckNvbnN0cnVjdG9yID0gc2h1cGVyOwor
fQorCitmdW5jdGlvbiBPcmRlcmVkQ29sbGVjdGlvbigpIHsKKyAgdGhpcy5lbG1zID0gbmV3IEFy
cmF5KCk7Cit9CisKK09yZGVyZWRDb2xsZWN0aW9uLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAo
ZWxtKSB7CisgIHRoaXMuZWxtcy5wdXNoKGVsbSk7Cit9CisKK09yZGVyZWRDb2xsZWN0aW9uLnBy
b3RvdHlwZS5hdCA9IGZ1bmN0aW9uIChpbmRleCkgeworICByZXR1cm4gdGhpcy5lbG1zW2luZGV4
XTsKK30KKworT3JkZXJlZENvbGxlY3Rpb24ucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoKSB7
CisgIHJldHVybiB0aGlzLmVsbXMubGVuZ3RoOworfQorCitPcmRlcmVkQ29sbGVjdGlvbi5wcm90
b3R5cGUucmVtb3ZlRmlyc3QgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiB0aGlzLmVsbXMucG9w
KCk7Cit9CisKK09yZGVyZWRDb2xsZWN0aW9uLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAo
ZWxtKSB7CisgIHZhciBpbmRleCA9IDAsIHNraXBwZWQgPSAwOworICBmb3IgKHZhciB2YWx1ZSBv
ZiB0aGlzLmVsbXMpIHsKKyAgICBpZiAodmFsdWUgIT0gZWxtKSB7CisgICAgICB0aGlzLmVsbXNb
aW5kZXhdID0gdmFsdWU7CisgICAgICBpbmRleCsrOworICAgIH0gZWxzZSB7CisgICAgICBza2lw
cGVkKys7CisgICAgfQorICB9CisgIGZvciAodmFyIGkgPSAwOyBpIDwgc2tpcHBlZDsgaSsrKQor
ICAgIHRoaXMuZWxtcy5wb3AoKTsKK30KKworLyogLS0tICoKKyAqIFMgdCByIGUgbiBnIHQgaAor
ICogLS0tICovCisKKy8qKgorICogU3RyZW5ndGhzIGFyZSB1c2VkIHRvIG1lYXN1cmUgdGhlIHJl
bGF0aXZlIGltcG9ydGFuY2Ugb2YgY29uc3RyYWludHMuCisgKiBOZXcgc3RyZW5ndGhzIG1heSBi
ZSBpbnNlcnRlZCBpbiB0aGUgc3RyZW5ndGggaGllcmFyY2h5IHdpdGhvdXQKKyAqIGRpc3J1cHRp
bmcgY3VycmVudCBjb25zdHJhaW50cy4gIFN0cmVuZ3RocyBjYW5ub3QgYmUgY3JlYXRlZCBvdXRz
aWRlCisgKiB0aGlzIGNsYXNzLCBzbyBwb2ludGVyIGNvbXBhcmlzb24gY2FuIGJlIHVzZWQgZm9y
IHZhbHVlIGNvbXBhcmlzb24uCisgKi8KK2Z1bmN0aW9uIFN0cmVuZ3RoKHN0cmVuZ3RoVmFsdWUs
IG5hbWUpIHsKKyAgdGhpcy5zdHJlbmd0aFZhbHVlID0gc3RyZW5ndGhWYWx1ZTsKKyAgdGhpcy5u
YW1lID0gbmFtZTsKK30KKworU3RyZW5ndGguc3Ryb25nZXIgPSBmdW5jdGlvbiAoczEsIHMyKSB7
CisgIHJldHVybiBzMS5zdHJlbmd0aFZhbHVlIDwgczIuc3RyZW5ndGhWYWx1ZTsKK30KKworU3Ry
ZW5ndGgud2Vha2VyID0gZnVuY3Rpb24gKHMxLCBzMikgeworICByZXR1cm4gczEuc3RyZW5ndGhW
YWx1ZSA+IHMyLnN0cmVuZ3RoVmFsdWU7Cit9CisKK1N0cmVuZ3RoLndlYWtlc3RPZiA9IGZ1bmN0
aW9uIChzMSwgczIpIHsKKyAgcmV0dXJuIHRoaXMud2Vha2VyKHMxLCBzMikgPyBzMSA6IHMyOwor
fQorCitTdHJlbmd0aC5zdHJvbmdlc3QgPSBmdW5jdGlvbiAoczEsIHMyKSB7CisgIHJldHVybiB0
aGlzLnN0cm9uZ2VyKHMxLCBzMikgPyBzMSA6IHMyOworfQorCitTdHJlbmd0aC5wcm90b3R5cGUu
bmV4dFdlYWtlciA9IGZ1bmN0aW9uICgpIHsKKyAgc3dpdGNoICh0aGlzLnN0cmVuZ3RoVmFsdWUp
IHsKKyAgICBjYXNlIDA6IHJldHVybiBTdHJlbmd0aC5XRUFLRVNUOworICAgIGNhc2UgMTogcmV0
dXJuIFN0cmVuZ3RoLldFQUtfREVGQVVMVDsKKyAgICBjYXNlIDI6IHJldHVybiBTdHJlbmd0aC5O
T1JNQUw7CisgICAgY2FzZSAzOiByZXR1cm4gU3RyZW5ndGguU1RST05HX0RFRkFVTFQ7CisgICAg
Y2FzZSA0OiByZXR1cm4gU3RyZW5ndGguUFJFRkVSUkVEOworICAgIGNhc2UgNTogcmV0dXJuIFN0
cmVuZ3RoLlJFUVVJUkVEOworICB9Cit9CisKKy8vIFN0cmVuZ3RoIGNvbnN0YW50cy4KK1N0cmVu
Z3RoLlJFUVVJUkVEICAgICAgICA9IG5ldyBTdHJlbmd0aCgwLCAicmVxdWlyZWQiKTsKK1N0cmVu
Z3RoLlNUT05HX1BSRUZFUlJFRCA9IG5ldyBTdHJlbmd0aCgxLCAic3Ryb25nUHJlZmVycmVkIik7
CitTdHJlbmd0aC5QUkVGRVJSRUQgICAgICAgPSBuZXcgU3RyZW5ndGgoMiwgInByZWZlcnJlZCIp
OworU3RyZW5ndGguU1RST05HX0RFRkFVTFQgID0gbmV3IFN0cmVuZ3RoKDMsICJzdHJvbmdEZWZh
dWx0Iik7CitTdHJlbmd0aC5OT1JNQUwgICAgICAgICAgPSBuZXcgU3RyZW5ndGgoNCwgIm5vcm1h
bCIpOworU3RyZW5ndGguV0VBS19ERUZBVUxUICAgID0gbmV3IFN0cmVuZ3RoKDUsICJ3ZWFrRGVm
YXVsdCIpOworU3RyZW5ndGguV0VBS0VTVCAgICAgICAgID0gbmV3IFN0cmVuZ3RoKDYsICJ3ZWFr
ZXN0Iik7CisKKy8qIC0tLSAqCisgKiBDIG8gbiBzIHQgciBhIGkgbiB0CisgKiAtLS0gKi8KKwor
LyoqCisgKiBBbiBhYnN0cmFjdCBjbGFzcyByZXByZXNlbnRpbmcgYSBzeXN0ZW0tbWFpbnRhaW5h
YmxlIHJlbGF0aW9uc2hpcAorICogKG9yICJjb25zdHJhaW50IikgYmV0d2VlbiBhIHNldCBvZiB2
YXJpYWJsZXMuIEEgY29uc3RyYWludCBzdXBwbGllcworICogYSBzdHJlbmd0aCBpbnN0YW5jZSB2
YXJpYWJsZTsgY29uY3JldGUgc3ViY2xhc3NlcyBwcm92aWRlIGEgbWVhbnMKKyAqIG9mIHN0b3Jp
bmcgdGhlIGNvbnN0cmFpbmVkIHZhcmlhYmxlcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gcmVxdWly
ZWQKKyAqIHRvIHJlcHJlc2VudCBhIGNvbnN0cmFpbnQuCisgKi8KK2Z1bmN0aW9uIENvbnN0cmFp
bnQoc3RyZW5ndGgpIHsKKyAgdGhpcy5zdHJlbmd0aCA9IHN0cmVuZ3RoOworfQorCisvKioKKyAq
IEFjdGl2YXRlIHRoaXMgY29uc3RyYWludCBhbmQgYXR0ZW1wdCB0byBzYXRpc2Z5IGl0LgorICov
CitDb25zdHJhaW50LnByb3RvdHlwZS5hZGRDb25zdHJhaW50ID0gZnVuY3Rpb24gKCkgeworICB0
aGlzLmFkZFRvR3JhcGgoKTsKKyAgcGxhbm5lci5pbmNyZW1lbnRhbEFkZCh0aGlzKTsKK30KKwor
LyoqCisgKiBBdHRlbXB0IHRvIGZpbmQgYSB3YXkgdG8gZW5mb3JjZSB0aGlzIGNvbnN0cmFpbnQu
IElmIHN1Y2Nlc3NmdWwsCisgKiByZWNvcmQgdGhlIHNvbHV0aW9uLCBwZXJoYXBzIG1vZGlmeWlu
ZyB0aGUgY3VycmVudCBkYXRhZmxvdworICogZ3JhcGguIEFuc3dlciB0aGUgY29uc3RyYWludCB0
aGF0IHRoaXMgY29uc3RyYWludCBvdmVycmlkZXMsIGlmCisgKiB0aGVyZSBpcyBvbmUsIG9yIG5p
bCwgaWYgdGhlcmUgaXNuJ3QuCisgKiBBc3N1bWU6IEkgYW0gbm90IGFscmVhZHkgc2F0aXNmaWVk
LgorICovCitDb25zdHJhaW50LnByb3RvdHlwZS5zYXRpc2Z5ID0gZnVuY3Rpb24gKG1hcmspIHsK
KyAgdGhpcy5jaG9vc2VNZXRob2QobWFyayk7CisgIGlmICghdGhpcy5pc1NhdGlzZmllZCgpKSB7
CisgICAgaWYgKHRoaXMuc3RyZW5ndGggPT0gU3RyZW5ndGguUkVRVUlSRUQpCisgICAgICBhbGVy
dCgiQ291bGQgbm90IHNhdGlzZnkgYSByZXF1aXJlZCBjb25zdHJhaW50ISIpOworICAgIHJldHVy
biBudWxsOworICB9CisgIHRoaXMubWFya0lucHV0cyhtYXJrKTsKKyAgdmFyIG91dCA9IHRoaXMu
b3V0cHV0KCk7CisgIHZhciBvdmVycmlkZGVuID0gb3V0LmRldGVybWluZWRCeTsKKyAgaWYgKG92
ZXJyaWRkZW4gIT0gbnVsbCkgb3ZlcnJpZGRlbi5tYXJrVW5zYXRpc2ZpZWQoKTsKKyAgb3V0LmRl
dGVybWluZWRCeSA9IHRoaXM7CisgIGlmICghcGxhbm5lci5hZGRQcm9wYWdhdGUodGhpcywgbWFy
aykpCisgICAgYWxlcnQoIkN5Y2xlIGVuY291bnRlcmVkIik7CisgIG91dC5tYXJrID0gbWFyazsK
KyAgcmV0dXJuIG92ZXJyaWRkZW47Cit9CisKK0NvbnN0cmFpbnQucHJvdG90eXBlLmRlc3Ryb3lD
b25zdHJhaW50ID0gZnVuY3Rpb24gKCkgeworICBpZiAodGhpcy5pc1NhdGlzZmllZCgpKSBwbGFu
bmVyLmluY3JlbWVudGFsUmVtb3ZlKHRoaXMpOworICBlbHNlIHRoaXMucmVtb3ZlRnJvbUdyYXBo
KCk7Cit9CisKKy8qKgorICogTm9ybWFsIGNvbnN0cmFpbnRzIGFyZSBub3QgaW5wdXQgY29uc3Ry
YWludHMuICBBbiBpbnB1dCBjb25zdHJhaW50CisgKiBpcyBvbmUgdGhhdCBkZXBlbmRzIG9uIGV4
dGVybmFsIHN0YXRlLCBzdWNoIGFzIHRoZSBtb3VzZSwgdGhlCisgKiBrZXlib3JkLCBhIGNsb2Nr
LCBvciBzb21lIGFyYml0cmF0eSBwaWVjZSBvZiBpbXBlcmF0aXZlIGNvZGUuCisgKi8KK0NvbnN0
cmFpbnQucHJvdG90eXBlLmlzSW5wdXQgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiBmYWxzZTsK
K30KKworLyogLS0tICoKKyAqIFUgbiBhIHIgeSAgIEMgbyBuIHMgdCByIGEgaSBuIHQKKyAqIC0t
LSAqLworCisvKioKKyAqIEFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGNvbnN0cmFpbnRzIGhhdmlu
ZyBhIHNpbmdsZSBwb3NzaWJsZSBvdXRwdXQKKyAqIHZhcmlhYmxlLgorICovCitmdW5jdGlvbiBV
bmFyeUNvbnN0cmFpbnQodiwgc3RyZW5ndGgpIHsKKyAgVW5hcnlDb25zdHJhaW50LnN1cGVyQ29u
c3RydWN0b3IuY2FsbCh0aGlzLCBzdHJlbmd0aCk7CisgIHRoaXMubXlPdXRwdXQgPSB2OworICB0
aGlzLnNhdGlzZmllZCA9IGZhbHNlOworICB0aGlzLmFkZENvbnN0cmFpbnQoKTsKK30KKworVW5h
cnlDb25zdHJhaW50LmluaGVyaXRzRnJvbShDb25zdHJhaW50KTsKKworLyoqCisgKiBBZGRzIHRo
aXMgY29uc3RyYWludCB0byB0aGUgY29uc3RyYWludCBncmFwaAorICovCitVbmFyeUNvbnN0cmFp
bnQucHJvdG90eXBlLmFkZFRvR3JhcGggPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMubXlPdXRwdXQu
YWRkQ29uc3RyYWludCh0aGlzKTsKKyAgdGhpcy5zYXRpc2ZpZWQgPSBmYWxzZTsKK30KKworLyoq
CisgKiBEZWNpZGVzIGlmIHRoaXMgY29uc3RyYWludCBjYW4gYmUgc2F0aXNmaWVkIGFuZCByZWNv
cmRzIHRoYXQKKyAqIGRlY2lzaW9uLgorICovCitVbmFyeUNvbnN0cmFpbnQucHJvdG90eXBlLmNo
b29zZU1ldGhvZCA9IGZ1bmN0aW9uIChtYXJrKSB7CisgIHRoaXMuc2F0aXNmaWVkID0gKHRoaXMu
bXlPdXRwdXQubWFyayAhPSBtYXJrKQorICAgICYmIFN0cmVuZ3RoLnN0cm9uZ2VyKHRoaXMuc3Ry
ZW5ndGgsIHRoaXMubXlPdXRwdXQud2Fsa1N0cmVuZ3RoKTsKK30KKworLyoqCisgKiBSZXR1cm5z
IHRydWUgaWYgdGhpcyBjb25zdHJhaW50IGlzIHNhdGlzZmllZCBpbiB0aGUgY3VycmVudCBzb2x1
dGlvbi4KKyAqLworVW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5pc1NhdGlzZmllZCA9IGZ1bmN0
aW9uICgpIHsKKyAgcmV0dXJuIHRoaXMuc2F0aXNmaWVkOworfQorCitVbmFyeUNvbnN0cmFpbnQu
cHJvdG90eXBlLm1hcmtJbnB1dHMgPSBmdW5jdGlvbiAobWFyaykgeworICAvLyBoYXMgbm8gaW5w
dXRzCit9CisKKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVudCBvdXRwdXQgdmFyaWFibGUuCisg
Ki8KK1VuYXJ5Q29uc3RyYWludC5wcm90b3R5cGUub3V0cHV0ID0gZnVuY3Rpb24gKCkgeworICBy
ZXR1cm4gdGhpcy5teU91dHB1dDsKK30KKworLyoqCisgKiBDYWxjdWxhdGUgdGhlIHdhbGthYm91
dCBzdHJlbmd0aCwgdGhlIHN0YXkgZmxhZywgYW5kLCBpZiBpdCBpcworICogJ3N0YXknLCB0aGUg
dmFsdWUgZm9yIHRoZSBjdXJyZW50IG91dHB1dCBvZiB0aGlzIGNvbnN0cmFpbnQuIEFzc3VtZQor
ICogdGhpcyBjb25zdHJhaW50IGlzIHNhdGlzZmllZC4KKyAqLworVW5hcnlDb25zdHJhaW50LnBy
b3RvdHlwZS5yZWNhbGN1bGF0ZSA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5teU91dHB1dC53YWxr
U3RyZW5ndGggPSB0aGlzLnN0cmVuZ3RoOworICB0aGlzLm15T3V0cHV0LnN0YXkgPSAhdGhpcy5p
c0lucHV0KCk7CisgIGlmICh0aGlzLm15T3V0cHV0LnN0YXkpIHRoaXMuZXhlY3V0ZSgpOyAvLyBT
dGF5IG9wdGltaXphdGlvbgorfQorCisvKioKKyAqIFJlY29yZHMgdGhhdCB0aGlzIGNvbnN0cmFp
bnQgaXMgdW5zYXRpc2ZpZWQKKyAqLworVW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5tYXJrVW5z
YXRpc2ZpZWQgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMuc2F0aXNmaWVkID0gZmFsc2U7Cit9CisK
K1VuYXJ5Q29uc3RyYWludC5wcm90b3R5cGUuaW5wdXRzS25vd24gPSBmdW5jdGlvbiAoKSB7Cisg
IHJldHVybiB0cnVlOworfQorCitVbmFyeUNvbnN0cmFpbnQucHJvdG90eXBlLnJlbW92ZUZyb21H
cmFwaCA9IGZ1bmN0aW9uICgpIHsKKyAgaWYgKHRoaXMubXlPdXRwdXQgIT0gbnVsbCkgdGhpcy5t
eU91dHB1dC5yZW1vdmVDb25zdHJhaW50KHRoaXMpOworICB0aGlzLnNhdGlzZmllZCA9IGZhbHNl
OworfQorCisvKiAtLS0gKgorICogUyB0IGEgeSAgIEMgbyBuIHMgdCByIGEgaSBuIHQKKyAqIC0t
LSAqLworCisvKioKKyAqIFZhcmlhYmxlcyB0aGF0IHNob3VsZCwgd2l0aCBzb21lIGxldmVsIG9m
IHByZWZlcmVuY2UsIHN0YXkgdGhlIHNhbWUuCisgKiBQbGFubmVycyBtYXkgZXhwbG9pdCB0aGUg
ZmFjdCB0aGF0IGluc3RhbmNlcywgaWYgc2F0aXNmaWVkLCB3aWxsIG5vdAorICogY2hhbmdlIHRo
ZWlyIG91dHB1dCBkdXJpbmcgcGxhbiBleGVjdXRpb24uICBUaGlzIGlzIGNhbGxlZCAic3RheQor
ICogb3B0aW1pemF0aW9uIi4KKyAqLworZnVuY3Rpb24gU3RheUNvbnN0cmFpbnQodiwgc3RyKSB7
CisgIFN0YXlDb25zdHJhaW50LnN1cGVyQ29uc3RydWN0b3IuY2FsbCh0aGlzLCB2LCBzdHIpOwor
fQorCitTdGF5Q29uc3RyYWludC5pbmhlcml0c0Zyb20oVW5hcnlDb25zdHJhaW50KTsKKworU3Rh
eUNvbnN0cmFpbnQucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoKSB7CisgIC8vIFN0YXkg
Y29uc3RyYWludHMgZG8gbm90aGluZworfQorCisvKiAtLS0gKgorICogRSBkIGkgdCAgIEMgbyBu
IHMgdCByIGEgaSBuIHQKKyAqIC0tLSAqLworCisvKioKKyAqIEEgdW5hcnkgaW5wdXQgY29uc3Ry
YWludCB1c2VkIHRvIG1hcmsgYSB2YXJpYWJsZSB0aGF0IHRoZSBjbGllbnQKKyAqIHdpc2hlcyB0
byBjaGFuZ2UuCisgKi8KK2Z1bmN0aW9uIEVkaXRDb25zdHJhaW50KHYsIHN0cikgeworICBFZGl0
Q29uc3RyYWludC5zdXBlckNvbnN0cnVjdG9yLmNhbGwodGhpcywgdiwgc3RyKTsKK30KKworRWRp
dENvbnN0cmFpbnQuaW5oZXJpdHNGcm9tKFVuYXJ5Q29uc3RyYWludCk7CisKKy8qKgorICogRWRp
dHMgaW5kaWNhdGUgdGhhdCBhIHZhcmlhYmxlIGlzIHRvIGJlIGNoYW5nZWQgYnkgaW1wZXJhdGl2
ZSBjb2RlLgorICovCitFZGl0Q29uc3RyYWludC5wcm90b3R5cGUuaXNJbnB1dCA9IGZ1bmN0aW9u
ICgpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0VkaXRDb25zdHJhaW50LnByb3RvdHlwZS5leGVj
dXRlID0gZnVuY3Rpb24gKCkgeworICAvLyBFZGl0IGNvbnN0cmFpbnRzIGRvIG5vdGhpbmcKK30K
KworLyogLS0tICoKKyAqIEIgaSBuIGEgciB5ICAgQyBvIG4gcyB0IHIgYSBpIG4gdAorICogLS0t
ICovCisKK3ZhciBEaXJlY3Rpb24gPSBuZXcgT2JqZWN0KCk7CitEaXJlY3Rpb24uTk9ORSAgICAg
PSAwOworRGlyZWN0aW9uLkZPUldBUkQgID0gMTsKK0RpcmVjdGlvbi5CQUNLV0FSRCA9IC0xOwor
CisvKioKKyAqIEFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGNvbnN0cmFpbnRzIGhhdmluZyB0d28g
cG9zc2libGUgb3V0cHV0CisgKiB2YXJpYWJsZXMuCisgKi8KK2Z1bmN0aW9uIEJpbmFyeUNvbnN0
cmFpbnQodmFyMSwgdmFyMiwgc3RyZW5ndGgpIHsKKyAgQmluYXJ5Q29uc3RyYWludC5zdXBlckNv
bnN0cnVjdG9yLmNhbGwodGhpcywgc3RyZW5ndGgpOworICB0aGlzLnYxID0gdmFyMTsKKyAgdGhp
cy52MiA9IHZhcjI7CisgIHRoaXMuZGlyZWN0aW9uID0gRGlyZWN0aW9uLk5PTkU7CisgIHRoaXMu
YWRkQ29uc3RyYWludCgpOworfQorCitCaW5hcnlDb25zdHJhaW50LmluaGVyaXRzRnJvbShDb25z
dHJhaW50KTsKKworLyoqCisgKiBEZWNpZGVzIGlmIHRoaXMgY29uc3RyYWludCBjYW4gYmUgc2F0
aXNmaWVkIGFuZCB3aGljaCB3YXkgaXQKKyAqIHNob3VsZCBmbG93IGJhc2VkIG9uIHRoZSByZWxh
dGl2ZSBzdHJlbmd0aCBvZiB0aGUgdmFyaWFibGVzIHJlbGF0ZWQsCisgKiBhbmQgcmVjb3JkIHRo
YXQgZGVjaXNpb24uCisgKi8KK0JpbmFyeUNvbnN0cmFpbnQucHJvdG90eXBlLmNob29zZU1ldGhv
ZCA9IGZ1bmN0aW9uIChtYXJrKSB7CisgIGlmICh0aGlzLnYxLm1hcmsgPT0gbWFyaykgeworICAg
IHRoaXMuZGlyZWN0aW9uID0gKHRoaXMudjIubWFyayAhPSBtYXJrICYmIFN0cmVuZ3RoLnN0cm9u
Z2VyKHRoaXMuc3RyZW5ndGgsIHRoaXMudjIud2Fsa1N0cmVuZ3RoKSkKKyAgICAgID8gRGlyZWN0
aW9uLkZPUldBUkQKKyAgICAgIDogRGlyZWN0aW9uLk5PTkU7CisgIH0KKyAgaWYgKHRoaXMudjIu
bWFyayA9PSBtYXJrKSB7CisgICAgdGhpcy5kaXJlY3Rpb24gPSAodGhpcy52MS5tYXJrICE9IG1h
cmsgJiYgU3RyZW5ndGguc3Ryb25nZXIodGhpcy5zdHJlbmd0aCwgdGhpcy52MS53YWxrU3RyZW5n
dGgpKQorICAgICAgPyBEaXJlY3Rpb24uQkFDS1dBUkQKKyAgICAgIDogRGlyZWN0aW9uLk5PTkU7
CisgIH0KKyAgaWYgKFN0cmVuZ3RoLndlYWtlcih0aGlzLnYxLndhbGtTdHJlbmd0aCwgdGhpcy52
Mi53YWxrU3RyZW5ndGgpKSB7CisgICAgdGhpcy5kaXJlY3Rpb24gPSBTdHJlbmd0aC5zdHJvbmdl
cih0aGlzLnN0cmVuZ3RoLCB0aGlzLnYxLndhbGtTdHJlbmd0aCkKKyAgICAgID8gRGlyZWN0aW9u
LkJBQ0tXQVJECisgICAgICA6IERpcmVjdGlvbi5OT05FOworICB9IGVsc2UgeworICAgIHRoaXMu
ZGlyZWN0aW9uID0gU3RyZW5ndGguc3Ryb25nZXIodGhpcy5zdHJlbmd0aCwgdGhpcy52Mi53YWxr
U3RyZW5ndGgpCisgICAgICA/IERpcmVjdGlvbi5GT1JXQVJECisgICAgICA6IERpcmVjdGlvbi5C
QUNLV0FSRAorICB9Cit9CisKKy8qKgorICogQWRkIHRoaXMgY29uc3RyYWludCB0byB0aGUgY29u
c3RyYWludCBncmFwaAorICovCitCaW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5hZGRUb0dyYXBo
ID0gZnVuY3Rpb24gKCkgeworICB0aGlzLnYxLmFkZENvbnN0cmFpbnQodGhpcyk7CisgIHRoaXMu
djIuYWRkQ29uc3RyYWludCh0aGlzKTsKKyAgdGhpcy5kaXJlY3Rpb24gPSBEaXJlY3Rpb24uTk9O
RTsKK30KKworLyoqCisgKiBBbnN3ZXIgdHJ1ZSBpZiB0aGlzIGNvbnN0cmFpbnQgaXMgc2F0aXNm
aWVkIGluIHRoZSBjdXJyZW50IHNvbHV0aW9uLgorICovCitCaW5hcnlDb25zdHJhaW50LnByb3Rv
dHlwZS5pc1NhdGlzZmllZCA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuIHRoaXMuZGlyZWN0aW9u
ICE9IERpcmVjdGlvbi5OT05FOworfQorCisvKioKKyAqIE1hcmsgdGhlIGlucHV0IHZhcmlhYmxl
IHdpdGggdGhlIGdpdmVuIG1hcmsuCisgKi8KK0JpbmFyeUNvbnN0cmFpbnQucHJvdG90eXBlLm1h
cmtJbnB1dHMgPSBmdW5jdGlvbiAobWFyaykgeworICB0aGlzLmlucHV0KCkubWFyayA9IG1hcms7
Cit9CisKKy8qKgorICogUmV0dXJucyB0aGUgY3VycmVudCBpbnB1dCB2YXJpYWJsZQorICovCitC
aW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5pbnB1dCA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJu
ICh0aGlzLmRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uRk9SV0FSRCkgPyB0aGlzLnYxIDogdGhpcy52
MjsKK30KKworLyoqCisgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG91dHB1dCB2YXJpYWJsZQorICov
CitCaW5hcnlDb25zdHJhaW50LnByb3RvdHlwZS5vdXRwdXQgPSBmdW5jdGlvbiAoKSB7CisgIHJl
dHVybiAodGhpcy5kaXJlY3Rpb24gPT0gRGlyZWN0aW9uLkZPUldBUkQpID8gdGhpcy52MiA6IHRo
aXMudjE7Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSB3YWxrYWJvdXQgc3RyZW5ndGgsIHRo
ZSBzdGF5IGZsYWcsIGFuZCwgaWYgaXQgaXMKKyAqICdzdGF5JywgdGhlIHZhbHVlIGZvciB0aGUg
Y3VycmVudCBvdXRwdXQgb2YgdGhpcworICogY29uc3RyYWludC4gQXNzdW1lIHRoaXMgY29uc3Ry
YWludCBpcyBzYXRpc2ZpZWQuCisgKi8KK0JpbmFyeUNvbnN0cmFpbnQucHJvdG90eXBlLnJlY2Fs
Y3VsYXRlID0gZnVuY3Rpb24gKCkgeworICB2YXIgaWhuID0gdGhpcy5pbnB1dCgpLCBvdXQgPSB0
aGlzLm91dHB1dCgpOworICBvdXQud2Fsa1N0cmVuZ3RoID0gU3RyZW5ndGgud2Vha2VzdE9mKHRo
aXMuc3RyZW5ndGgsIGlobi53YWxrU3RyZW5ndGgpOworICBvdXQuc3RheSA9IGlobi5zdGF5Owor
ICBpZiAob3V0LnN0YXkpIHRoaXMuZXhlY3V0ZSgpOworfQorCisvKioKKyAqIFJlY29yZCB0aGUg
ZmFjdCB0aGF0IHRoaXMgY29uc3RyYWludCBpcyB1bnNhdGlzZmllZC4KKyAqLworQmluYXJ5Q29u
c3RyYWludC5wcm90b3R5cGUubWFya1Vuc2F0aXNmaWVkID0gZnVuY3Rpb24gKCkgeworICB0aGlz
LmRpcmVjdGlvbiA9IERpcmVjdGlvbi5OT05FOworfQorCitCaW5hcnlDb25zdHJhaW50LnByb3Rv
dHlwZS5pbnB1dHNLbm93biA9IGZ1bmN0aW9uIChtYXJrKSB7CisgIHZhciBpID0gdGhpcy5pbnB1
dCgpOworICByZXR1cm4gaS5tYXJrID09IG1hcmsgfHwgaS5zdGF5IHx8IGkuZGV0ZXJtaW5lZEJ5
ID09IG51bGw7Cit9CisKK0JpbmFyeUNvbnN0cmFpbnQucHJvdG90eXBlLnJlbW92ZUZyb21HcmFw
aCA9IGZ1bmN0aW9uICgpIHsKKyAgaWYgKHRoaXMudjEgIT0gbnVsbCkgdGhpcy52MS5yZW1vdmVD
b25zdHJhaW50KHRoaXMpOworICBpZiAodGhpcy52MiAhPSBudWxsKSB0aGlzLnYyLnJlbW92ZUNv
bnN0cmFpbnQodGhpcyk7CisgIHRoaXMuZGlyZWN0aW9uID0gRGlyZWN0aW9uLk5PTkU7Cit9CisK
Ky8qIC0tLSAqCisgKiBTIGMgYSBsIGUgICBDIG8gbiBzIHQgciBhIGkgbiB0CisgKiAtLS0gKi8K
KworLyoqCisgKiBSZWxhdGVzIHR3byB2YXJpYWJsZXMgYnkgdGhlIGxpbmVhciBzY2FsaW5nIHJl
bGF0aW9uc2hpcDogInYyID0KKyAqICh2MSAqIHNjYWxlKSArIG9mZnNldCIuIEVpdGhlciB2MSBv
ciB2MiBtYXkgYmUgY2hhbmdlZCB0byBtYWludGFpbgorICogdGhpcyByZWxhdGlvbnNoaXAgYnV0
IHRoZSBzY2FsZSBmYWN0b3IgYW5kIG9mZnNldCBhcmUgY29uc2lkZXJlZAorICogcmVhZC1vbmx5
LgorICovCitmdW5jdGlvbiBTY2FsZUNvbnN0cmFpbnQoc3JjLCBzY2FsZSwgb2Zmc2V0LCBkZXN0
LCBzdHJlbmd0aCkgeworICB0aGlzLmRpcmVjdGlvbiA9IERpcmVjdGlvbi5OT05FOworICB0aGlz
LnNjYWxlID0gc2NhbGU7CisgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OworICBTY2FsZUNvbnN0cmFp
bnQuc3VwZXJDb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHNyYywgZGVzdCwgc3RyZW5ndGgpOworfQor
CitTY2FsZUNvbnN0cmFpbnQuaW5oZXJpdHNGcm9tKEJpbmFyeUNvbnN0cmFpbnQpOworCisvKioK
KyAqIEFkZHMgdGhpcyBjb25zdHJhaW50IHRvIHRoZSBjb25zdHJhaW50IGdyYXBoLgorICovCitT
Y2FsZUNvbnN0cmFpbnQucHJvdG90eXBlLmFkZFRvR3JhcGggPSBmdW5jdGlvbiAoKSB7CisgIFNj
YWxlQ29uc3RyYWludC5zdXBlckNvbnN0cnVjdG9yLnByb3RvdHlwZS5hZGRUb0dyYXBoLmNhbGwo
dGhpcyk7CisgIHRoaXMuc2NhbGUuYWRkQ29uc3RyYWludCh0aGlzKTsKKyAgdGhpcy5vZmZzZXQu
YWRkQ29uc3RyYWludCh0aGlzKTsKK30KKworU2NhbGVDb25zdHJhaW50LnByb3RvdHlwZS5yZW1v
dmVGcm9tR3JhcGggPSBmdW5jdGlvbiAoKSB7CisgIFNjYWxlQ29uc3RyYWludC5zdXBlckNvbnN0
cnVjdG9yLnByb3RvdHlwZS5yZW1vdmVGcm9tR3JhcGguY2FsbCh0aGlzKTsKKyAgaWYgKHRoaXMu
c2NhbGUgIT0gbnVsbCkgdGhpcy5zY2FsZS5yZW1vdmVDb25zdHJhaW50KHRoaXMpOworICBpZiAo
dGhpcy5vZmZzZXQgIT0gbnVsbCkgdGhpcy5vZmZzZXQucmVtb3ZlQ29uc3RyYWludCh0aGlzKTsK
K30KKworU2NhbGVDb25zdHJhaW50LnByb3RvdHlwZS5tYXJrSW5wdXRzID0gZnVuY3Rpb24gKG1h
cmspIHsKKyAgU2NhbGVDb25zdHJhaW50LnN1cGVyQ29uc3RydWN0b3IucHJvdG90eXBlLm1hcmtJ
bnB1dHMuY2FsbCh0aGlzLCBtYXJrKTsKKyAgdGhpcy5zY2FsZS5tYXJrID0gdGhpcy5vZmZzZXQu
bWFyayA9IG1hcms7Cit9CisKKy8qKgorICogRW5mb3JjZSB0aGlzIGNvbnN0cmFpbnQuIEFzc3Vt
ZSB0aGF0IGl0IGlzIHNhdGlzZmllZC4KKyAqLworU2NhbGVDb25zdHJhaW50LnByb3RvdHlwZS5l
eGVjdXRlID0gZnVuY3Rpb24gKCkgeworICBpZiAodGhpcy5kaXJlY3Rpb24gPT0gRGlyZWN0aW9u
LkZPUldBUkQpIHsKKyAgICB0aGlzLnYyLnZhbHVlID0gdGhpcy52MS52YWx1ZSAqIHRoaXMuc2Nh
bGUudmFsdWUgKyB0aGlzLm9mZnNldC52YWx1ZTsKKyAgfSBlbHNlIHsKKyAgICB0aGlzLnYxLnZh
bHVlID0gKHRoaXMudjIudmFsdWUgLSB0aGlzLm9mZnNldC52YWx1ZSkgLyB0aGlzLnNjYWxlLnZh
bHVlOworICB9Cit9CisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSB3YWxrYWJvdXQgc3RyZW5ndGgs
IHRoZSBzdGF5IGZsYWcsIGFuZCwgaWYgaXQgaXMKKyAqICdzdGF5JywgdGhlIHZhbHVlIGZvciB0
aGUgY3VycmVudCBvdXRwdXQgb2YgdGhpcyBjb25zdHJhaW50LiBBc3N1bWUKKyAqIHRoaXMgY29u
c3RyYWludCBpcyBzYXRpc2ZpZWQuCisgKi8KK1NjYWxlQ29uc3RyYWludC5wcm90b3R5cGUucmVj
YWxjdWxhdGUgPSBmdW5jdGlvbiAoKSB7CisgIHZhciBpaG4gPSB0aGlzLmlucHV0KCksIG91dCA9
IHRoaXMub3V0cHV0KCk7CisgIG91dC53YWxrU3RyZW5ndGggPSBTdHJlbmd0aC53ZWFrZXN0T2Yo
dGhpcy5zdHJlbmd0aCwgaWhuLndhbGtTdHJlbmd0aCk7CisgIG91dC5zdGF5ID0gaWhuLnN0YXkg
JiYgdGhpcy5zY2FsZS5zdGF5ICYmIHRoaXMub2Zmc2V0LnN0YXk7CisgIGlmIChvdXQuc3RheSkg
dGhpcy5leGVjdXRlKCk7Cit9CisKKy8qIC0tLSAqCisgKiBFIHEgdSBhIGwgaSB0ICB5ICAgQyBv
IG4gcyB0IHIgYSBpIG4gdAorICogLS0tICovCisKKy8qKgorICogQ29uc3RyYWlucyB0d28gdmFy
aWFibGVzIHRvIGhhdmUgdGhlIHNhbWUgdmFsdWUuCisgKi8KK2Z1bmN0aW9uIEVxdWFsaXR5Q29u
c3RyYWludCh2YXIxLCB2YXIyLCBzdHJlbmd0aCkgeworICBFcXVhbGl0eUNvbnN0cmFpbnQuc3Vw
ZXJDb25zdHJ1Y3Rvci5jYWxsKHRoaXMsIHZhcjEsIHZhcjIsIHN0cmVuZ3RoKTsKK30KKworRXF1
YWxpdHlDb25zdHJhaW50LmluaGVyaXRzRnJvbShCaW5hcnlDb25zdHJhaW50KTsKKworLyoqCisg
KiBFbmZvcmNlIHRoaXMgY29uc3RyYWludC4gQXNzdW1lIHRoYXQgaXQgaXMgc2F0aXNmaWVkLgor
ICovCitFcXVhbGl0eUNvbnN0cmFpbnQucHJvdG90eXBlLmV4ZWN1dGUgPSBmdW5jdGlvbiAoKSB7
CisgIHRoaXMub3V0cHV0KCkudmFsdWUgPSB0aGlzLmlucHV0KCkudmFsdWU7Cit9CisKKy8qIC0t
LSAqCisgKiBWIGEgciBpIGEgYiBsIGUKKyAqIC0tLSAqLworCisvKioKKyAqIEEgY29uc3RyYWlu
ZWQgdmFyaWFibGUuIEluIGFkZGl0aW9uIHRvIGl0cyB2YWx1ZSwgaXQgbWFpbnRhaW4gdGhlCisg
KiBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnN0cmFpbnQgZ3JhcGgsIHRoZSBjdXJyZW50IGRhdGFmbG93
IGdyYXBoLCBhbmQKKyAqIHZhcmlvdXMgcGFyYW1ldGVycyBvZiBpbnRlcmVzdCB0byB0aGUgRGVs
dGFCbHVlIGluY3JlbWVudGFsCisgKiBjb25zdHJhaW50IHNvbHZlci4KKyAqKi8KK2Z1bmN0aW9u
IFZhcmlhYmxlKG5hbWUsIGluaXRpYWxWYWx1ZSkgeworICB0aGlzLnZhbHVlID0gaW5pdGlhbFZh
bHVlIHx8IDA7CisgIHRoaXMuY29uc3RyYWludHMgPSBuZXcgT3JkZXJlZENvbGxlY3Rpb24oKTsK
KyAgdGhpcy5kZXRlcm1pbmVkQnkgPSBudWxsOworICB0aGlzLm1hcmsgPSAwOworICB0aGlzLndh
bGtTdHJlbmd0aCA9IFN0cmVuZ3RoLldFQUtFU1Q7CisgIHRoaXMuc3RheSA9IHRydWU7CisgIHRo
aXMubmFtZSA9IG5hbWU7Cit9CisKKy8qKgorICogQWRkIHRoZSBnaXZlbiBjb25zdHJhaW50IHRv
IHRoZSBzZXQgb2YgYWxsIGNvbnN0cmFpbnRzIHRoYXQgcmVmZXIKKyAqIHRoaXMgdmFyaWFibGUu
CisgKi8KK1ZhcmlhYmxlLnByb3RvdHlwZS5hZGRDb25zdHJhaW50ID0gZnVuY3Rpb24gKGMpIHsK
KyAgdGhpcy5jb25zdHJhaW50cy5hZGQoYyk7Cit9CisKKy8qKgorICogUmVtb3ZlcyBhbGwgdHJh
Y2VzIG9mIGMgZnJvbSB0aGlzIHZhcmlhYmxlLgorICovCitWYXJpYWJsZS5wcm90b3R5cGUucmVt
b3ZlQ29uc3RyYWludCA9IGZ1bmN0aW9uIChjKSB7CisgIHRoaXMuY29uc3RyYWludHMucmVtb3Zl
KGMpOworICBpZiAodGhpcy5kZXRlcm1pbmVkQnkgPT0gYykgdGhpcy5kZXRlcm1pbmVkQnkgPSBu
dWxsOworfQorCisvKiAtLS0gKgorICogUCBsIGEgbiBuIGUgcgorICogLS0tICovCisKKy8qKgor
ICogVGhlIERlbHRhQmx1ZSBwbGFubmVyCisgKi8KK2Z1bmN0aW9uIFBsYW5uZXIoKSB7CisgIHRo
aXMuY3VycmVudE1hcmsgPSAwOworfQorCisvKioKKyAqIEF0dGVtcHQgdG8gc2F0aXNmeSB0aGUg
Z2l2ZW4gY29uc3RyYWludCBhbmQsIGlmIHN1Y2Nlc3NmdWwsCisgKiBpbmNyZW1lbnRhbGx5IHVw
ZGF0ZSB0aGUgZGF0YWZsb3cgZ3JhcGguICBEZXRhaWxzOiBJZiBzYXRpZnlpbmcKKyAqIHRoZSBj
b25zdHJhaW50IGlzIHN1Y2Nlc3NmdWwsIGl0IG1heSBvdmVycmlkZSBhIHdlYWtlciBjb25zdHJh
aW50CisgKiBvbiBpdHMgb3V0cHV0LiBUaGUgYWxnb3JpdGhtIGF0dGVtcHRzIHRvIHJlc2F0aXNm
eSB0aGF0CisgKiBjb25zdHJhaW50IHVzaW5nIHNvbWUgb3RoZXIgbWV0aG9kLiBUaGlzIHByb2Nl
c3MgaXMgcmVwZWF0ZWQKKyAqIHVudGlsIGVpdGhlciBhKSBpdCByZWFjaGVzIGEgdmFyaWFibGUg
dGhhdCB3YXMgbm90IHByZXZpb3VzbHkKKyAqIGRldGVybWluZWQgYnkgYW55IGNvbnN0cmFpbnQg
b3IgYikgaXQgcmVhY2hlcyBhIGNvbnN0cmFpbnQgdGhhdAorICogaXMgdG9vIHdlYWsgdG8gYmUg
c2F0aXNmaWVkIHVzaW5nIGFueSBvZiBpdHMgbWV0aG9kcy4gVGhlCisgKiB2YXJpYWJsZXMgb2Yg
Y29uc3RyYWludHMgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkIGFyZSBtYXJrZWQgd2l0aAorICog
YSB1bmlxdWUgbWFyayB2YWx1ZSBzbyB0aGF0IHdlIGtub3cgd2hlcmUgd2UndmUgYmVlbi4gVGhp
cyBhbGxvd3MKKyAqIHRoZSBhbGdvcml0aG0gdG8gYXZvaWQgZ2V0dGluZyBpbnRvIGFuIGluZmlu
aXRlIGxvb3AgZXZlbiBpZiB0aGUKKyAqIGNvbnN0cmFpbnQgZ3JhcGggaGFzIGFuIGluYWR2ZXJ0
ZW50IGN5Y2xlLgorICovCitQbGFubmVyLnByb3RvdHlwZS5pbmNyZW1lbnRhbEFkZCA9IGZ1bmN0
aW9uIChjKSB7CisgIHZhciBtYXJrID0gdGhpcy5uZXdNYXJrKCk7CisgIHZhciBvdmVycmlkZGVu
ID0gYy5zYXRpc2Z5KG1hcmspOworICB3aGlsZSAob3ZlcnJpZGRlbiAhPSBudWxsKQorICAgIG92
ZXJyaWRkZW4gPSBvdmVycmlkZGVuLnNhdGlzZnkobWFyayk7Cit9CisKKy8qKgorICogRW50cnkg
cG9pbnQgZm9yIHJldHJhY3RpbmcgYSBjb25zdHJhaW50LiBSZW1vdmUgdGhlIGdpdmVuCisgKiBj
b25zdHJhaW50IGFuZCBpbmNyZW1lbnRhbGx5IHVwZGF0ZSB0aGUgZGF0YWZsb3cgZ3JhcGguCisg
KiBEZXRhaWxzOiBSZXRyYWN0aW5nIHRoZSBnaXZlbiBjb25zdHJhaW50IG1heSBhbGxvdyBzb21l
IGN1cnJlbnRseQorICogdW5zYXRpc2ZpYWJsZSBkb3duc3RyZWFtIGNvbnN0cmFpbnQgdG8gYmUg
c2F0aXNmaWVkLiBXZSB0aGVyZWZvcmUgY29sbGVjdAorICogYSBsaXN0IG9mIHVuc2F0aXNmaWVk
IGRvd25zdHJlYW0gY29uc3RyYWludHMgYW5kIGF0dGVtcHQgdG8KKyAqIHNhdGlzZnkgZWFjaCBv
bmUgaW4gdHVybi4gVGhpcyBsaXN0IGlzIHRyYXZlcnNlZCBieSBjb25zdHJhaW50CisgKiBzdHJl
bmd0aCwgc3Ryb25nZXN0IGZpcnN0LCBhcyBhIGhldXJpc3RpYyBmb3IgYXZvaWRpbmcKKyAqIHVu
bmVjZXNzYXJpbHkgYWRkaW5nIGFuZCB0aGVuIG92ZXJyaWRpbmcgd2VhayBjb25zdHJhaW50cy4K
KyAqIEFzc3VtZTogYyBpcyBzYXRpc2ZpZWQuCisgKi8KK1BsYW5uZXIucHJvdG90eXBlLmluY3Jl
bWVudGFsUmVtb3ZlID0gZnVuY3Rpb24gKGMpIHsKKyAgdmFyIG91dCA9IGMub3V0cHV0KCk7Cisg
IGMubWFya1Vuc2F0aXNmaWVkKCk7CisgIGMucmVtb3ZlRnJvbUdyYXBoKCk7CisgIHZhciB1bnNh
dGlzZmllZCA9IHRoaXMucmVtb3ZlUHJvcGFnYXRlRnJvbShvdXQpOworICB2YXIgc3RyZW5ndGgg
PSBTdHJlbmd0aC5SRVFVSVJFRDsKKyAgZG8geworICAgIGZvciAodmFyIHUgb2YgdW5zYXRpc2Zp
ZWQuZWxtcykgeworICAgICAgaWYgKHUuc3RyZW5ndGggPT0gc3RyZW5ndGgpCisgICAgICAgIHRo
aXMuaW5jcmVtZW50YWxBZGQodSk7CisgICAgfQorICAgIHN0cmVuZ3RoID0gc3RyZW5ndGgubmV4
dFdlYWtlcigpOworICB9IHdoaWxlIChzdHJlbmd0aCAhPSBTdHJlbmd0aC5XRUFLRVNUKTsKK30K
KworLyoqCisgKiBTZWxlY3QgYSBwcmV2aW91c2x5IHVudXNlZCBtYXJrIHZhbHVlLgorICovCitQ
bGFubmVyLnByb3RvdHlwZS5uZXdNYXJrID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gKyt0aGlz
LmN1cnJlbnRNYXJrOworfQorCisvKioKKyAqIEV4dHJhY3QgYSBwbGFuIGZvciByZXNhdGlzZmFj
dGlvbiBzdGFydGluZyBmcm9tIHRoZSBnaXZlbiBzb3VyY2UKKyAqIGNvbnN0cmFpbnRzLCB1c3Vh
bGx5IGEgc2V0IG9mIGlucHV0IGNvbnN0cmFpbnRzLiBUaGlzIG1ldGhvZAorICogYXNzdW1lcyB0
aGF0IHN0YXkgb3B0aW1pemF0aW9uIGlzIGRlc2lyZWQ7IHRoZSBwbGFuIHdpbGwgY29udGFpbgor
ICogb25seSBjb25zdHJhaW50cyB3aG9zZSBvdXRwdXQgdmFyaWFibGVzIGFyZSBub3Qgc3RheS4g
Q29uc3RyYWludHMKKyAqIHRoYXQgZG8gbm8gY29tcHV0YXRpb24sIHN1Y2ggYXMgc3RheSBhbmQg
ZWRpdCBjb25zdHJhaW50cywgYXJlCisgKiBub3QgaW5jbHVkZWQgaW4gdGhlIHBsYW4uCisgKiBE
ZXRhaWxzOiBUaGUgb3V0cHV0cyBvZiBhIGNvbnN0cmFpbnQgYXJlIG1hcmtlZCB3aGVuIGl0IGlz
IGFkZGVkCisgKiB0byB0aGUgcGxhbiB1bmRlciBjb25zdHJ1Y3Rpb24uIEEgY29uc3RyYWludCBt
YXkgYmUgYXBwZW5kZWQgdG8KKyAqIHRoZSBwbGFuIHdoZW4gYWxsIGl0cyBpbnB1dCB2YXJpYWJs
ZXMgYXJlIGtub3duLiBBIHZhcmlhYmxlIGlzCisgKiBrbm93biBpZiBlaXRoZXIgYSkgdGhlIHZh
cmlhYmxlIGlzIG1hcmtlZCAoaW5kaWNhdGluZyB0aGF0IGhhcworICogYmVlbiBjb21wdXRlZCBi
eSBhIGNvbnN0cmFpbnQgYXBwZWFyaW5nIGVhcmxpZXIgaW4gdGhlIHBsYW4pLCBiKQorICogdGhl
IHZhcmlhYmxlIGlzICdzdGF5JyAoaS5lLiBpdCBpcyBhIGNvbnN0YW50IGF0IHBsYW4gZXhlY3V0
aW9uCisgKiB0aW1lKSwgb3IgYykgdGhlIHZhcmlhYmxlIGlzIG5vdCBkZXRlcm1pbmVkIGJ5IGFu
eQorICogY29uc3RyYWludC4gVGhlIGxhc3QgcHJvdmlzaW9uIGlzIGZvciBwYXN0IHN0YXRlcyBv
ZiBoaXN0b3J5CisgKiB2YXJpYWJsZXMsIHdoaWNoIGFyZSBub3Qgc3RheSBidXQgd2hpY2ggYXJl
IGFsc28gbm90IGNvbXB1dGVkIGJ5CisgKiBhbnkgY29uc3RyYWludC4KKyAqIEFzc3VtZTogc291
cmNlcyBhcmUgYWxsIHNhdGlzZmllZC4KKyAqLworUGxhbm5lci5wcm90b3R5cGUubWFrZVBsYW4g
PSBmdW5jdGlvbiAoc291cmNlcykgeworICB2YXIgbWFyayA9IHRoaXMubmV3TWFyaygpOworICB2
YXIgcGxhbiA9IG5ldyBQbGFuKCk7CisgIHZhciB0b2RvID0gc291cmNlczsKKyAgd2hpbGUgKHRv
ZG8uc2l6ZSgpID4gMCkgeworICAgIHZhciBjID0gdG9kby5yZW1vdmVGaXJzdCgpOworICAgIGlm
IChjLm91dHB1dCgpLm1hcmsgIT0gbWFyayAmJiBjLmlucHV0c0tub3duKG1hcmspKSB7CisgICAg
ICBwbGFuLmFkZENvbnN0cmFpbnQoYyk7CisgICAgICBjLm91dHB1dCgpLm1hcmsgPSBtYXJrOwor
ICAgICAgdGhpcy5hZGRDb25zdHJhaW50c0NvbnN1bWluZ1RvKGMub3V0cHV0KCksIHRvZG8pOwor
ICAgIH0KKyAgfQorICByZXR1cm4gcGxhbjsKK30KKworLyoqCisgKiBFeHRyYWN0IGEgcGxhbiBm
b3IgcmVzYXRpc2Z5aW5nIHN0YXJ0aW5nIGZyb20gdGhlIG91dHB1dCBvZiB0aGUKKyAqIGdpdmVu
IGNvbnN0cmFpbnRzLCB1c3VhbGx5IGEgc2V0IG9mIGlucHV0IGNvbnN0cmFpbnRzLgorICovCitQ
bGFubmVyLnByb3RvdHlwZS5leHRyYWN0UGxhbkZyb21Db25zdHJhaW50cyA9IGZ1bmN0aW9uIChj
b25zdHJhaW50cykgeworICB2YXIgc291cmNlcyA9IG5ldyBPcmRlcmVkQ29sbGVjdGlvbigpOwor
ICBmb3IgKHZhciBjIG9mIGNvbnN0cmFpbnRzLmVsbXMpIHsKKyAgICBpZiAoYy5pc0lucHV0KCkg
JiYgYy5pc1NhdGlzZmllZCgpKQorICAgICAgLy8gbm90IGluIHBsYW4gYWxyZWFkeSBhbmQgZWxp
Z2libGUgZm9yIGluY2x1c2lvbgorICAgICAgc291cmNlcy5hZGQoYyk7CisgIH0KKyAgcmV0dXJu
IHRoaXMubWFrZVBsYW4oc291cmNlcyk7Cit9CisKKy8qKgorICogUmVjb21wdXRlIHRoZSB3YWxr
YWJvdXQgc3RyZW5ndGhzIGFuZCBzdGF5IGZsYWdzIG9mIGFsbCB2YXJpYWJsZXMKKyAqIGRvd25z
dHJlYW0gb2YgdGhlIGdpdmVuIGNvbnN0cmFpbnQgYW5kIHJlY29tcHV0ZSB0aGUgYWN0dWFsCisg
KiB2YWx1ZXMgb2YgYWxsIHZhcmlhYmxlcyB3aG9zZSBzdGF5IGZsYWcgaXMgdHJ1ZS4gSWYgYSBj
eWNsZSBpcworICogZGV0ZWN0ZWQsIHJlbW92ZSB0aGUgZ2l2ZW4gY29uc3RyYWludCBhbmQgYW5z
d2VyCisgKiBmYWxzZS4gT3RoZXJ3aXNlLCBhbnN3ZXIgdHJ1ZS4KKyAqIERldGFpbHM6IEN5Y2xl
cyBhcmUgZGV0ZWN0ZWQgd2hlbiBhIG1hcmtlZCB2YXJpYWJsZSBpcworICogZW5jb3VudGVyZWQg
ZG93bnN0cmVhbSBvZiB0aGUgZ2l2ZW4gY29uc3RyYWludC4gVGhlIHNlbmRlciBpcworICogYXNz
dW1lZCB0byBoYXZlIG1hcmtlZCB0aGUgaW5wdXRzIG9mIHRoZSBnaXZlbiBjb25zdHJhaW50IHdp
dGgKKyAqIHRoZSBnaXZlbiBtYXJrLiBUaHVzLCBlbmNvdW50ZXJpbmcgYSBtYXJrZWQgbm9kZSBk
b3duc3RyZWFtIG9mCisgKiB0aGUgb3V0cHV0IGNvbnN0cmFpbnQgbWVhbnMgdGhhdCB0aGVyZSBp
cyBhIHBhdGggZnJvbSB0aGUKKyAqIGNvbnN0cmFpbnQncyBvdXRwdXQgdG8gb25lIG9mIGl0cyBp
bnB1dHMuCisgKi8KK1BsYW5uZXIucHJvdG90eXBlLmFkZFByb3BhZ2F0ZSA9IGZ1bmN0aW9uIChj
LCBtYXJrKSB7CisgIHZhciB0b2RvID0gbmV3IE9yZGVyZWRDb2xsZWN0aW9uKCk7CisgIHRvZG8u
YWRkKGMpOworICB3aGlsZSAodG9kby5zaXplKCkgPiAwKSB7CisgICAgdmFyIGQgPSB0b2RvLnJl
bW92ZUZpcnN0KCk7CisgICAgaWYgKGQub3V0cHV0KCkubWFyayA9PSBtYXJrKSB7CisgICAgICB0
aGlzLmluY3JlbWVudGFsUmVtb3ZlKGMpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAg
ICBkLnJlY2FsY3VsYXRlKCk7CisgICAgdGhpcy5hZGRDb25zdHJhaW50c0NvbnN1bWluZ1RvKGQu
b3V0cHV0KCksIHRvZG8pOworICB9CisgIHJldHVybiB0cnVlOworfQorCisKKy8qKgorICogVXBk
YXRlIHRoZSB3YWxrYWJvdXQgc3RyZW5ndGhzIGFuZCBzdGF5IGZsYWdzIG9mIGFsbCB2YXJpYWJs
ZXMKKyAqIGRvd25zdHJlYW0gb2YgdGhlIGdpdmVuIGNvbnN0cmFpbnQuIEFuc3dlciBhIGNvbGxl
Y3Rpb24gb2YKKyAqIHVuc2F0aXNmaWVkIGNvbnN0cmFpbnRzIHNvcnRlZCBpbiBvcmRlciBvZiBk
ZWNyZWFzaW5nIHN0cmVuZ3RoLgorICovCitQbGFubmVyLnByb3RvdHlwZS5yZW1vdmVQcm9wYWdh
dGVGcm9tID0gZnVuY3Rpb24gKG91dCkgeworICBvdXQuZGV0ZXJtaW5lZEJ5ID0gbnVsbDsKKyAg
b3V0LndhbGtTdHJlbmd0aCA9IFN0cmVuZ3RoLldFQUtFU1Q7CisgIG91dC5zdGF5ID0gdHJ1ZTsK
KyAgdmFyIHVuc2F0aXNmaWVkID0gbmV3IE9yZGVyZWRDb2xsZWN0aW9uKCk7CisgIHZhciB0b2Rv
ID0gbmV3IE9yZGVyZWRDb2xsZWN0aW9uKCk7CisgIHRvZG8uYWRkKG91dCk7CisgIHdoaWxlICh0
b2RvLnNpemUoKSA+IDApIHsKKyAgICB2YXIgdiA9IHRvZG8ucmVtb3ZlRmlyc3QoKTsKKyAgICBm
b3IgKHZhciBjIG9mIHYuY29uc3RyYWludHMuZWxtcykgeworICAgICAgaWYgKCFjLmlzU2F0aXNm
aWVkKCkpCisgICAgICAgIHVuc2F0aXNmaWVkLmFkZChjKTsKKyAgICB9CisgICAgdmFyIGRldGVy
bWluaW5nID0gdi5kZXRlcm1pbmVkQnk7CisgICAgZm9yICh2YXIgbmV4dCBvZiB2LmNvbnN0cmFp
bnRzLmVsbXMpIHsKKyAgICAgIGlmIChuZXh0ICE9IGRldGVybWluaW5nICYmIG5leHQuaXNTYXRp
c2ZpZWQoKSkgeworICAgICAgICBuZXh0LnJlY2FsY3VsYXRlKCk7CisgICAgICAgIHRvZG8uYWRk
KG5leHQub3V0cHV0KCkpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gdW5zYXRpc2Zp
ZWQ7Cit9CisKK1BsYW5uZXIucHJvdG90eXBlLmFkZENvbnN0cmFpbnRzQ29uc3VtaW5nVG8gPSBm
dW5jdGlvbiAodiwgY29sbCkgeworICB2YXIgZGV0ZXJtaW5pbmcgPSB2LmRldGVybWluZWRCeTsK
KyAgdmFyIGNjID0gdi5jb25zdHJhaW50czsKKyAgZm9yICh2YXIgYyBvZiBjYy5lbG1zKSB7Cisg
ICAgaWYgKGMgIT0gZGV0ZXJtaW5pbmcgJiYgYy5pc1NhdGlzZmllZCgpKQorICAgICAgY29sbC5h
ZGQoYyk7CisgIH0KK30KKworLyogLS0tICoKKyAqIFAgbCBhIG4KKyAqIC0tLSAqLworCisvKioK
KyAqIEEgUGxhbiBpcyBhbiBvcmRlcmVkIGxpc3Qgb2YgY29uc3RyYWludHMgdG8gYmUgZXhlY3V0
ZWQgaW4gc2VxdWVuY2UKKyAqIHRvIHJlc2F0aXNmeSBhbGwgY3VycmVudGx5IHNhdGlzZmlhYmxl
IGNvbnN0cmFpbnRzIGluIHRoZSBmYWNlIG9mCisgKiBvbmUgb3IgbW9yZSBjaGFuZ2luZyBpbnB1
dHMuCisgKi8KK2Z1bmN0aW9uIFBsYW4oKSB7CisgIHRoaXMudiA9IG5ldyBPcmRlcmVkQ29sbGVj
dGlvbigpOworfQorCitQbGFuLnByb3RvdHlwZS5hZGRDb25zdHJhaW50ID0gZnVuY3Rpb24gKGMp
IHsKKyAgdGhpcy52LmFkZChjKTsKK30KKworUGxhbi5wcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9u
ICgpIHsKKyAgcmV0dXJuIHRoaXMudi5zaXplKCk7Cit9CisKK1BsYW4ucHJvdG90eXBlLmNvbnN0
cmFpbnRBdCA9IGZ1bmN0aW9uIChpbmRleCkgeworICByZXR1cm4gdGhpcy52LmF0KGluZGV4KTsK
K30KKworUGxhbi5wcm90b3R5cGUuZXhlY3V0ZSA9IGZ1bmN0aW9uICgpIHsKKyAgZm9yICh2YXIg
YyBvZiB0aGlzLnYuZWxtcykgeworICAgIGMuZXhlY3V0ZSgpOworICB9Cit9CisKKy8qIC0tLSAq
CisgKiBNIGEgaSBuCisgKiAtLS0gKi8KKworLyoqCisgKiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBE
ZWx0YUJsdWUgYmVuY2htYXJrLiBBIGxvbmcgY2hhaW4gb2YgZXF1YWxpdHkKKyAqIGNvbnN0cmFp
bnRzIGlzIGNvbnN0cnVjdGVkIHdpdGggYSBzdGF5IGNvbnN0cmFpbnQgb24gb25lIGVuZC4gQW4K
KyAqIGVkaXQgY29uc3RyYWludCBpcyB0aGVuIGFkZGVkIHRvIHRoZSBvcHBvc2l0ZSBlbmQgYW5k
IHRoZSB0aW1lIGlzCisgKiBtZWFzdXJlZCBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyB0aGlzIGNv
bnN0cmFpbnQsIGFuZCBleHRyYWN0aW5nCisgKiBhbmQgZXhlY3V0aW5nIGEgY29uc3RyYWludCBz
YXRpc2ZhY3Rpb24gcGxhbi4gVGhlcmUgYXJlIHR3byBjYXNlcy4KKyAqIEluIGNhc2UgMSwgdGhl
IGFkZGVkIGNvbnN0cmFpbnQgaXMgc3Ryb25nZXIgdGhhbiB0aGUgc3RheQorICogY29uc3RyYWlu
dCBhbmQgdmFsdWVzIG11c3QgcHJvcGFnYXRlIGRvd24gdGhlIGVudGlyZSBsZW5ndGggb2YgdGhl
CisgKiBjaGFpbi4gSW4gY2FzZSAyLCB0aGUgYWRkZWQgY29uc3RyYWludCBpcyB3ZWFrZXIgdGhh
biB0aGUgc3RheQorICogY29uc3RyYWludCBzbyBpdCBjYW5ub3QgYmUgYWNjb21vZGF0ZWQuIFRo
ZSBjb3N0IGluIHRoaXMgY2FzZSBpcywKKyAqIG9mIGNvdXJzZSwgdmVyeSBsb3cuIFR5cGljYWwg
c2l0dWF0aW9ucyBsaWUgc29tZXdoZXJlIGJldHdlZW4gdGhlc2UKKyAqIHR3byBleHRyZW1lcy4K
KyAqLworZnVuY3Rpb24gY2hhaW5UZXN0KG4pIHsKKyAgcGxhbm5lciA9IG5ldyBQbGFubmVyKCk7
CisgIHZhciBwcmV2ID0gbnVsbCwgZmlyc3QgPSBudWxsLCBsYXN0ID0gbnVsbDsKKworICAvLyBC
dWlsZCBjaGFpbiBvZiBuIGVxdWFsaXR5IGNvbnN0cmFpbnRzCisgIGZvciAodmFyIGkgPSAwOyBp
IDw9IG47IGkrKykgeworICAgIHZhciBuYW1lID0gInYiICsgaTsKKyAgICB2YXIgdiA9IG5ldyBW
YXJpYWJsZShuYW1lKTsKKyAgICBpZiAocHJldiAhPSBudWxsKQorICAgICAgbmV3IEVxdWFsaXR5
Q29uc3RyYWludChwcmV2LCB2LCBTdHJlbmd0aC5SRVFVSVJFRCk7CisgICAgaWYgKGkgPT0gMCkg
Zmlyc3QgPSB2OworICAgIGlmIChpID09IG4pIGxhc3QgPSB2OworICAgIHByZXYgPSB2OworICB9
CisKKyAgbmV3IFN0YXlDb25zdHJhaW50KGxhc3QsIFN0cmVuZ3RoLlNUUk9OR19ERUZBVUxUKTsK
KyAgdmFyIGVkaXQgPSBuZXcgRWRpdENvbnN0cmFpbnQoZmlyc3QsIFN0cmVuZ3RoLlBSRUZFUlJF
RCk7CisgIHZhciBlZGl0cyA9IG5ldyBPcmRlcmVkQ29sbGVjdGlvbigpOworICBlZGl0cy5hZGQo
ZWRpdCk7CisgIHZhciBwbGFuID0gcGxhbm5lci5leHRyYWN0UGxhbkZyb21Db25zdHJhaW50cyhl
ZGl0cyk7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICBmaXJzdC52YWx1
ZSA9IGk7CisgICAgcGxhbi5leGVjdXRlKCk7CisgICAgaWYgKGxhc3QudmFsdWUgIT0gaSkKKyAg
ICAgIGFsZXJ0KCJDaGFpbiB0ZXN0IGZhaWxlZC4iKTsKKyAgfQorfQorCisvKioKKyAqIFRoaXMg
dGVzdCBjb25zdHJ1Y3RzIGEgdHdvIHNldHMgb2YgdmFyaWFibGVzIHJlbGF0ZWQgdG8gZWFjaAor
ICogb3RoZXIgYnkgYSBzaW1wbGUgbGluZWFyIHRyYW5zZm9ybWF0aW9uIChzY2FsZSBhbmQgb2Zm
c2V0KS4gVGhlCisgKiB0aW1lIGlzIG1lYXN1cmVkIHRvIGNoYW5nZSBhIHZhcmlhYmxlIG9uIGVp
dGhlciBzaWRlIG9mIHRoZQorICogbWFwcGluZyBhbmQgdG8gY2hhbmdlIHRoZSBzY2FsZSBhbmQg
b2Zmc2V0IGZhY3RvcnMuCisgKi8KK2Z1bmN0aW9uIHByb2plY3Rpb25UZXN0KG4pIHsKKyAgcGxh
bm5lciA9IG5ldyBQbGFubmVyKCk7CisgIHZhciBzY2FsZSA9IG5ldyBWYXJpYWJsZSgic2NhbGUi
LCAxMCk7CisgIHZhciBvZmZzZXQgPSBuZXcgVmFyaWFibGUoIm9mZnNldCIsIDEwMDApOworICB2
YXIgc3JjID0gbnVsbCwgZHN0ID0gbnVsbDsKKworICB2YXIgZGVzdHMgPSBuZXcgT3JkZXJlZENv
bGxlY3Rpb24oKTsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICBzcmMgPSBu
ZXcgVmFyaWFibGUoInNyYyIgKyBpLCBpKTsKKyAgICBkc3QgPSBuZXcgVmFyaWFibGUoImRzdCIg
KyBpLCBpKTsKKyAgICBkZXN0cy5hZGQoZHN0KTsKKyAgICBuZXcgU3RheUNvbnN0cmFpbnQoc3Jj
LCBTdHJlbmd0aC5OT1JNQUwpOworICAgIG5ldyBTY2FsZUNvbnN0cmFpbnQoc3JjLCBzY2FsZSwg
b2Zmc2V0LCBkc3QsIFN0cmVuZ3RoLlJFUVVJUkVEKTsKKyAgfQorCisgIGNoYW5nZShzcmMsIDE3
KTsKKyAgaWYgKGRzdC52YWx1ZSAhPSAxMTcwKSBhbGVydCgiUHJvamVjdGlvbiAxIGZhaWxlZCIp
OworICBjaGFuZ2UoZHN0LCAxMDUwKTsKKyAgaWYgKHNyYy52YWx1ZSAhPSA1KSBhbGVydCgiUHJv
amVjdGlvbiAyIGZhaWxlZCIpOworICBjaGFuZ2Uoc2NhbGUsIDUpOworICBmb3IgKHZhciBpID0g
MDsgaSA8IG4gLSAxOyBpKyspIHsKKyAgICBpZiAoZGVzdHMuYXQoaSkudmFsdWUgIT0gaSAqIDUg
KyAxMDAwKQorICAgICAgYWxlcnQoIlByb2plY3Rpb24gMyBmYWlsZWQiKTsKKyAgfQorICBjaGFu
Z2Uob2Zmc2V0LCAyMDAwKTsKKyAgZm9yICh2YXIgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7Cisg
ICAgaWYgKGRlc3RzLmF0KGkpLnZhbHVlICE9IGkgKiA1ICsgMjAwMCkKKyAgICAgIGFsZXJ0KCJQ
cm9qZWN0aW9uIDQgZmFpbGVkIik7CisgIH0KK30KKworZnVuY3Rpb24gY2hhbmdlKHYsIG5ld1Zh
bHVlKSB7CisgIHZhciBlZGl0ID0gbmV3IEVkaXRDb25zdHJhaW50KHYsIFN0cmVuZ3RoLlBSRUZF
UlJFRCk7CisgIHZhciBlZGl0cyA9IG5ldyBPcmRlcmVkQ29sbGVjdGlvbigpOworICBlZGl0cy5h
ZGQoZWRpdCk7CisgIHZhciBwbGFuID0gcGxhbm5lci5leHRyYWN0UGxhbkZyb21Db25zdHJhaW50
cyhlZGl0cyk7CisgIGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgIHYudmFsdWUg
PSBuZXdWYWx1ZTsKKyAgICBwbGFuLmV4ZWN1dGUoKTsKKyAgfQorICBlZGl0LmRlc3Ryb3lDb25z
dHJhaW50KCk7Cit9CisKKy8vIEdsb2JhbCB2YXJpYWJsZSBob2xkaW5nIHRoZSBjdXJyZW50IHBs
YW5uZXIuCit2YXIgcGxhbm5lciA9IG51bGw7CisKK2Z1bmN0aW9uIGRlbHRhQmx1ZSgpIHsKKyAg
Y2hhaW5UZXN0KDUwKTsKKyAgcHJvamVjdGlvblRlc3QoNTApOworfQorCitmb3IgKHZhciBpID0g
MDsgaSA8IDEwMDsgKytpKQorICAgIGRlbHRhQmx1ZSgpOwpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL3Rlc3RzL3R5cGVQcm9maWxlci9nZXR0ZXItcmljaGFyZHMuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3R5cGVQcm9maWxlci9nZXR0ZXItcmljaGFy
ZHMuanMJKG5vbmV4aXN0ZW50KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Rlc3RzL3R5cGVQ
cm9maWxlci9nZXR0ZXItcmljaGFyZHMuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OTMg
QEAKKy8vIENvcHlyaWdodCAyMDA2LTIwMDggdGhlIFY4IHByb2plY3QgYXV0aG9ycy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE0IEFwcGxlIEluYy4KKy8vIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlCisvLyAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworLy8gICAgICAgZGlzY2xhaW1lciBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisvLyAgICAgICB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyAgICAgICBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKy8vICAgICAgIGZy
b20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwK
Ky8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorCisKKy8vIFRoaXMgaXMgYSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRo
ZSBSaWNoYXJkcworLy8gYmVuY2htYXJrIGZyb206CisvLworLy8gICAgaHR0cDovL3d3dy5jbC5j
YW0uYWMudWsvfm1yMTAvQmVuY2guaHRtbAorLy8KKy8vIFRoZSBiZW5jaG1hcmsgd2FzIG9yaWdp
bmFsbHkgaW1wbGVtZW50ZWQgaW4gQkNQTCBieQorLy8gTWFydGluIFJpY2hhcmRzLiBJdCB3YXMg
dGhlbiBwb3J0ZWQgdG8gSmF2YVNjcmlwdCBieSB0aGUKKy8vIFY4IHByb2plY3QgYXV0aG9ycywg
YW5kIHRoZW4gc3Vic2VxdWVudGx5IGl0IHdhcyBtb2RpZmllZAorLy8gdG8gdXNlIGdldHRlcnMg
YW5kIHNldHRlcnMgYnkgV2ViS2l0IGF1dGhvcnMuCisKKworLyoqCisgKiBUaGUgUmljaGFyZHMg
YmVuY2htYXJrIHNpbXVsYXRlcyB0aGUgdGFzayBkaXNwYXRjaGVyIG9mIGFuCisgKiBvcGVyYXRp
bmcgc3lzdGVtLgorICoqLworZnVuY3Rpb24gcnVuUmljaGFyZHMoKSB7CisgIHZhciBzY2hlZHVs
ZXIgPSBuZXcgU2NoZWR1bGVyKCk7CisgIHNjaGVkdWxlci5hZGRJZGxlVGFzayhJRF9JRExFLCAw
LCBudWxsLCBDT1VOVCk7CisKKyAgdmFyIHF1ZXVlID0gbmV3IFBhY2tldChudWxsLCBJRF9XT1JL
RVIsIEtJTkRfV09SSyk7CisgIHF1ZXVlID0gbmV3IFBhY2tldChxdWV1ZSwgIElEX1dPUktFUiwg
S0lORF9XT1JLKTsKKyAgc2NoZWR1bGVyLmFkZFdvcmtlclRhc2soSURfV09SS0VSLCAxMDAwLCBx
dWV1ZSk7CisKKyAgcXVldWUgPSBuZXcgUGFja2V0KG51bGwsIElEX0RFVklDRV9BLCBLSU5EX0RF
VklDRSk7CisgIHF1ZXVlID0gbmV3IFBhY2tldChxdWV1ZSwgIElEX0RFVklDRV9BLCBLSU5EX0RF
VklDRSk7CisgIHF1ZXVlID0gbmV3IFBhY2tldChxdWV1ZSwgIElEX0RFVklDRV9BLCBLSU5EX0RF
VklDRSk7CisgIHNjaGVkdWxlci5hZGRIYW5kbGVyVGFzayhJRF9IQU5ETEVSX0EsIDIwMDAsIHF1
ZXVlKTsKKworICBxdWV1ZSA9IG5ldyBQYWNrZXQobnVsbCwgSURfREVWSUNFX0IsIEtJTkRfREVW
SUNFKTsKKyAgcXVldWUgPSBuZXcgUGFja2V0KHF1ZXVlLCAgSURfREVWSUNFX0IsIEtJTkRfREVW
SUNFKTsKKyAgcXVldWUgPSBuZXcgUGFja2V0KHF1ZXVlLCAgSURfREVWSUNFX0IsIEtJTkRfREVW
SUNFKTsKKyAgc2NoZWR1bGVyLmFkZEhhbmRsZXJUYXNrKElEX0hBTkRMRVJfQiwgMzAwMCwgcXVl
dWUpOworCisgIHNjaGVkdWxlci5hZGREZXZpY2VUYXNrKElEX0RFVklDRV9BLCA0MDAwLCBudWxs
KTsKKworICBzY2hlZHVsZXIuYWRkRGV2aWNlVGFzayhJRF9ERVZJQ0VfQiwgNTAwMCwgbnVsbCk7
CisKKyAgc2NoZWR1bGVyLnNjaGVkdWxlKCk7CisKKyAgaWYgKHNjaGVkdWxlci5xdWV1ZUNvdW50
ICE9IEVYUEVDVEVEX1FVRVVFX0NPVU5UIHx8CisgICAgICBzY2hlZHVsZXIuaG9sZENvdW50ICE9
IEVYUEVDVEVEX0hPTERfQ09VTlQpIHsKKyAgICB2YXIgbXNnID0KKyAgICAgICAgIkVycm9yIGR1
cmluZyBleGVjdXRpb246IHF1ZXVlQ291bnQgPSAiICsgc2NoZWR1bGVyLnF1ZXVlQ291bnQgKwor
ICAgICAgICAiLCBob2xkQ291bnQgPSAiICsgc2NoZWR1bGVyLmhvbGRDb3VudCArICIuIjsKKyAg
ICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKKyAgfQorfQorCit2YXIgQ09VTlQgPSAxMDAwOworCisv
KioKKyAqIFRoZXNlIHR3byBjb25zdGFudHMgc3BlY2lmeSBob3cgbWFueSB0aW1lcyBhIHBhY2tl
dCBpcyBxdWV1ZWQgYW5kCisgKiBob3cgbWFueSB0aW1lcyBhIHRhc2sgaXMgcHV0IG9uIGhvbGQg
aW4gYSBjb3JyZWN0IHJ1biBvZiByaWNoYXJkcy4KKyAqIFRoZXkgZG9uJ3QgaGF2ZSBhbnkgbWVh
bmluZyBhIHN1Y2ggYnV0IGFyZSBjaGFyYWN0ZXJpc3RpYyBvZiBhCisgKiBjb3JyZWN0IHJ1biBz
byBpZiB0aGUgYWN0dWFsIHF1ZXVlIG9yIGhvbGQgY291bnQgaXMgZGlmZmVyZW50IGZyb20KKyAq
IHRoZSBleHBlY3RlZCB0aGVyZSBtdXN0IGJlIGEgYnVnIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4K
KyAqKi8KK3ZhciBFWFBFQ1RFRF9RVUVVRV9DT1VOVCA9IDIzMjI7Cit2YXIgRVhQRUNURURfSE9M
RF9DT1VOVCA9IDkyODsKKworCisvKioKKyAqIEEgc2NoZWR1bGVyIGNhbiBiZSB1c2VkIHRvIHNj
aGVkdWxlIGEgc2V0IG9mIHRhc2tzIGJhc2VkIG9uIHRoZWlyIHJlbGF0aXZlCisgKiBwcmlvcml0
aWVzLiAgU2NoZWR1bGluZyBpcyBkb25lIGJ5IG1haW50YWluaW5nIGEgbGlzdCBvZiB0YXNrIGNv
bnRyb2wgYmxvY2tzCisgKiB3aGljaCBob2xkcyB0YXNrcyBhbmQgdGhlIGRhdGEgcXVldWUgdGhl
eSBhcmUgcHJvY2Vzc2luZy4KKyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBTY2hlZHVs
ZXIoKSB7CisgIHRoaXMuX3F1ZXVlQ291bnQgPSAwOworICB0aGlzLl9ob2xkQ291bnQgPSAwOwor
ICB0aGlzLl9ibG9ja3MgPSBuZXcgQXJyYXkoTlVNQkVSX09GX0lEUyk7CisgIHRoaXMuX2xpc3Qg
PSBudWxsOworICB0aGlzLl9jdXJyZW50VGNiID0gbnVsbDsKKyAgdGhpcy5fY3VycmVudElkID0g
bnVsbDsKK30KKwordmFyIElEX0lETEUgICAgICAgPSAwOwordmFyIElEX1dPUktFUiAgICAgPSAx
OwordmFyIElEX0hBTkRMRVJfQSAgPSAyOwordmFyIElEX0hBTkRMRVJfQiAgPSAzOwordmFyIElE
X0RFVklDRV9BICAgPSA0OwordmFyIElEX0RFVklDRV9CICAgPSA1OwordmFyIE5VTUJFUl9PRl9J
RFMgPSA2OworCit2YXIgS0lORF9ERVZJQ0UgICA9IDA7Cit2YXIgS0lORF9XT1JLICAgICA9IDE7
CisKK1NjaGVkdWxlci5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygicXVldWVDb3VudCIsIGZ1
bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fcXVldWVDb3VudDsgfSk7CitTY2hlZHVsZXIucHJvdG90
eXBlLl9fZGVmaW5lU2V0dGVyX18oInF1ZXVlQ291bnQiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlz
Ll9xdWV1ZUNvdW50ID0gdmFsdWU7IH0pOworU2NoZWR1bGVyLnByb3RvdHlwZS5fX2RlZmluZUdl
dHRlcl9fKCJob2xkQ291bnQiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2hvbGRDb3VudDsg
fSk7CitTY2hlZHVsZXIucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oImhvbGRDb3VudCIsIGZ1
bmN0aW9uKHZhbHVlKSB7IHRoaXMuX2hvbGRDb3VudCA9IHZhbHVlOyB9KTsKK1NjaGVkdWxlci5w
cm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygiYmxvY2tzIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0
aGlzLl9ibG9ja3M7IH0pOworU2NoZWR1bGVyLnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKCJi
bG9ja3MiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl9ibG9ja3MgPSB2YWx1ZTsgfSk7CitTY2hl
ZHVsZXIucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oImxpc3QiLCBmdW5jdGlvbigpIHsgcmV0
dXJuIHRoaXMuX2xpc3Q7IH0pOworU2NoZWR1bGVyLnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9f
KCJsaXN0IiwgZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5fbGlzdCA9IHZhbHVlOyB9KTsKK1NjaGVk
dWxlci5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygiY3VycmVudFRjYiIsIGZ1bmN0aW9uKCkg
eyByZXR1cm4gdGhpcy5fY3VycmVudFRjYjsgfSk7CitTY2hlZHVsZXIucHJvdG90eXBlLl9fZGVm
aW5lU2V0dGVyX18oImN1cnJlbnRUY2IiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl9jdXJyZW50
VGNiID0gdmFsdWU7IH0pOworU2NoZWR1bGVyLnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fKCJj
dXJyZW50SWQiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2N1cnJlbnRJZDsgfSk7CitTY2hl
ZHVsZXIucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oImN1cnJlbnRJZCIsIGZ1bmN0aW9uKHZh
bHVlKSB7IHRoaXMuX2N1cnJlbnRJZCA9IHZhbHVlOyB9KTsKKworLyoqCisgKiBBZGQgYW4gaWRs
ZSB0YXNrIHRvIHRoaXMgc2NoZWR1bGVyLgorICogQHBhcmFtIHtpbnR9IGlkIHRoZSBpZGVudGl0
eSBvZiB0aGUgdGFzaworICogQHBhcmFtIHtpbnR9IHByaW9yaXR5IHRoZSB0YXNrJ3MgcHJpb3Jp
dHkKKyAqIEBwYXJhbSB7UGFja2V0fSBxdWV1ZSB0aGUgcXVldWUgb2Ygd29yayB0byBiZSBwcm9j
ZXNzZWQgYnkgdGhlIHRhc2sKKyAqIEBwYXJhbSB7aW50fSBjb3VudCB0aGUgbnVtYmVyIG9mIHRp
bWVzIHRvIHNjaGVkdWxlIHRoZSB0YXNrCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUuYWRkSWRs
ZVRhc2sgPSBmdW5jdGlvbiAoaWQsIHByaW9yaXR5LCBxdWV1ZSwgY291bnQpIHsKKyAgdGhpcy5h
ZGRSdW5uaW5nVGFzayhpZCwgcHJpb3JpdHksIHF1ZXVlLCBuZXcgSWRsZVRhc2sodGhpcywgMSwg
Y291bnQpKTsKK307CisKKy8qKgorICogQWRkIGEgd29yayB0YXNrIHRvIHRoaXMgc2NoZWR1bGVy
LgorICogQHBhcmFtIHtpbnR9IGlkIHRoZSBpZGVudGl0eSBvZiB0aGUgdGFzaworICogQHBhcmFt
IHtpbnR9IHByaW9yaXR5IHRoZSB0YXNrJ3MgcHJpb3JpdHkKKyAqIEBwYXJhbSB7UGFja2V0fSBx
dWV1ZSB0aGUgcXVldWUgb2Ygd29yayB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHRhc2sKKyAqLwor
U2NoZWR1bGVyLnByb3RvdHlwZS5hZGRXb3JrZXJUYXNrID0gZnVuY3Rpb24gKGlkLCBwcmlvcml0
eSwgcXVldWUpIHsKKyAgdGhpcy5hZGRUYXNrKGlkLCBwcmlvcml0eSwgcXVldWUsIG5ldyBXb3Jr
ZXJUYXNrKHRoaXMsIElEX0hBTkRMRVJfQSwgMCkpOworfTsKKworLyoqCisgKiBBZGQgYSBoYW5k
bGVyIHRhc2sgdG8gdGhpcyBzY2hlZHVsZXIuCisgKiBAcGFyYW0ge2ludH0gaWQgdGhlIGlkZW50
aXR5IG9mIHRoZSB0YXNrCisgKiBAcGFyYW0ge2ludH0gcHJpb3JpdHkgdGhlIHRhc2sncyBwcmlv
cml0eQorICogQHBhcmFtIHtQYWNrZXR9IHF1ZXVlIHRoZSBxdWV1ZSBvZiB3b3JrIHRvIGJlIHBy
b2Nlc3NlZCBieSB0aGUgdGFzaworICovCitTY2hlZHVsZXIucHJvdG90eXBlLmFkZEhhbmRsZXJU
YXNrID0gZnVuY3Rpb24gKGlkLCBwcmlvcml0eSwgcXVldWUpIHsKKyAgdGhpcy5hZGRUYXNrKGlk
LCBwcmlvcml0eSwgcXVldWUsIG5ldyBIYW5kbGVyVGFzayh0aGlzKSk7Cit9OworCisvKioKKyAq
IEFkZCBhIGhhbmRsZXIgdGFzayB0byB0aGlzIHNjaGVkdWxlci4KKyAqIEBwYXJhbSB7aW50fSBp
ZCB0aGUgaWRlbnRpdHkgb2YgdGhlIHRhc2sKKyAqIEBwYXJhbSB7aW50fSBwcmlvcml0eSB0aGUg
dGFzaydzIHByaW9yaXR5CisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHF1ZXVlIG9mIHdv
cmsgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUu
YWRkRGV2aWNlVGFzayA9IGZ1bmN0aW9uIChpZCwgcHJpb3JpdHksIHF1ZXVlKSB7CisgIHRoaXMu
YWRkVGFzayhpZCwgcHJpb3JpdHksIHF1ZXVlLCBuZXcgRGV2aWNlVGFzayh0aGlzKSkKK307CisK
Ky8qKgorICogQWRkIHRoZSBzcGVjaWZpZWQgdGFzayBhbmQgbWFyayBpdCBhcyBydW5uaW5nLgor
ICogQHBhcmFtIHtpbnR9IGlkIHRoZSBpZGVudGl0eSBvZiB0aGUgdGFzaworICogQHBhcmFtIHtp
bnR9IHByaW9yaXR5IHRoZSB0YXNrJ3MgcHJpb3JpdHkKKyAqIEBwYXJhbSB7UGFja2V0fSBxdWV1
ZSB0aGUgcXVldWUgb2Ygd29yayB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHRhc2sKKyAqIEBwYXJh
bSB7VGFza30gdGFzayB0aGUgdGFzayB0byBhZGQKKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5h
ZGRSdW5uaW5nVGFzayA9IGZ1bmN0aW9uIChpZCwgcHJpb3JpdHksIHF1ZXVlLCB0YXNrKSB7Cisg
IHRoaXMuYWRkVGFzayhpZCwgcHJpb3JpdHksIHF1ZXVlLCB0YXNrKTsKKyAgdGhpcy5jdXJyZW50
VGNiLnNldFJ1bm5pbmcoKTsKK307CisKKy8qKgorICogQWRkIHRoZSBzcGVjaWZpZWQgdGFzayB0
byB0aGlzIHNjaGVkdWxlci4KKyAqIEBwYXJhbSB7aW50fSBpZCB0aGUgaWRlbnRpdHkgb2YgdGhl
IHRhc2sKKyAqIEBwYXJhbSB7aW50fSBwcmlvcml0eSB0aGUgdGFzaydzIHByaW9yaXR5CisgKiBA
cGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHF1ZXVlIG9mIHdvcmsgdG8gYmUgcHJvY2Vzc2VkIGJ5
IHRoZSB0YXNrCisgKiBAcGFyYW0ge1Rhc2t9IHRhc2sgdGhlIHRhc2sgdG8gYWRkCisgKi8KK1Nj
aGVkdWxlci5wcm90b3R5cGUuYWRkVGFzayA9IGZ1bmN0aW9uIChpZCwgcHJpb3JpdHksIHF1ZXVl
LCB0YXNrKSB7CisgIHRoaXMuY3VycmVudFRjYiA9IG5ldyBUYXNrQ29udHJvbEJsb2NrKHRoaXMu
bGlzdCwgaWQsIHByaW9yaXR5LCBxdWV1ZSwgdGFzayk7CisgIHRoaXMubGlzdCA9IHRoaXMuY3Vy
cmVudFRjYjsKKyAgdGhpcy5ibG9ja3NbaWRdID0gdGhpcy5jdXJyZW50VGNiOworfTsKKworLyoq
CisgKiBFeGVjdXRlIHRoZSB0YXNrcyBtYW5hZ2VkIGJ5IHRoaXMgc2NoZWR1bGVyLgorICovCitT
Y2hlZHVsZXIucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24gKCkgeworICB0aGlzLmN1cnJl
bnRUY2IgPSB0aGlzLmxpc3Q7CisgIHdoaWxlICh0aGlzLmN1cnJlbnRUY2IgIT0gbnVsbCkgewor
ICAgIGlmICh0aGlzLmN1cnJlbnRUY2IuaXNIZWxkT3JTdXNwZW5kZWQoKSkgeworICAgICAgdGhp
cy5jdXJyZW50VGNiID0gdGhpcy5jdXJyZW50VGNiLmxpbms7CisgICAgfSBlbHNlIHsKKyAgICAg
IHRoaXMuY3VycmVudElkID0gdGhpcy5jdXJyZW50VGNiLmlkOworICAgICAgdGhpcy5jdXJyZW50
VGNiID0gdGhpcy5jdXJyZW50VGNiLnJ1bigpOworICAgIH0KKyAgfQorfTsKKworLyoqCisgKiBS
ZWxlYXNlIGEgdGFzayB0aGF0IGlzIGN1cnJlbnRseSBibG9ja2VkIGFuZCByZXR1cm4gdGhlIG5l
eHQgYmxvY2sgdG8gcnVuLgorICogQHBhcmFtIHtpbnR9IGlkIHRoZSBpZCBvZiB0aGUgdGFzayB0
byBzdXNwZW5kCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uIChp
ZCkgeworICB2YXIgdGNiID0gdGhpcy5ibG9ja3NbaWRdOworICBpZiAodGNiID09IG51bGwpIHJl
dHVybiB0Y2I7CisgIHRjYi5tYXJrQXNOb3RIZWxkKCk7CisgIGlmICh0Y2IucHJpb3JpdHkgPiB0
aGlzLmN1cnJlbnRUY2IucHJpb3JpdHkpIHsKKyAgICByZXR1cm4gdGNiOworICB9IGVsc2Ugewor
ICAgIHJldHVybiB0aGlzLmN1cnJlbnRUY2I7CisgIH0KK307CisKKy8qKgorICogQmxvY2sgdGhl
IGN1cnJlbnRseSBleGVjdXRpbmcgdGFzayBhbmQgcmV0dXJuIHRoZSBuZXh0IHRhc2sgY29udHJv
bCBibG9jaworICogdG8gcnVuLiAgVGhlIGJsb2NrZWQgdGFzayB3aWxsIG5vdCBiZSBtYWRlIHJ1
bm5hYmxlIHVudGlsIGl0IGlzIGV4cGxpY2l0bHkKKyAqIHJlbGVhc2VkLCBldmVuIGlmIG5ldyB3
b3JrIGlzIGFkZGVkIHRvIGl0LgorICovCitTY2hlZHVsZXIucHJvdG90eXBlLmhvbGRDdXJyZW50
ID0gZnVuY3Rpb24gKCkgeworICB0aGlzLmhvbGRDb3VudCsrOworICB0aGlzLmN1cnJlbnRUY2Iu
bWFya0FzSGVsZCgpOworICByZXR1cm4gdGhpcy5jdXJyZW50VGNiLmxpbms7Cit9OworCisvKioK
KyAqIFN1c3BlbmQgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGFzayBhbmQgcmV0dXJuIHRoZSBu
ZXh0IHRhc2sgY29udHJvbCBibG9jaworICogdG8gcnVuLiAgSWYgbmV3IHdvcmsgaXMgYWRkZWQg
dG8gdGhlIHN1c3BlbmRlZCB0YXNrIGl0IHdpbGwgYmUgbWFkZSBydW5uYWJsZS4KKyAqLworU2No
ZWR1bGVyLnByb3RvdHlwZS5zdXNwZW5kQ3VycmVudCA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5j
dXJyZW50VGNiLm1hcmtBc1N1c3BlbmRlZCgpOworICByZXR1cm4gdGhpcy5jdXJyZW50VGNiOwor
fTsKKworLyoqCisgKiBBZGQgdGhlIHNwZWNpZmllZCBwYWNrZXQgdG8gdGhlIGVuZCBvZiB0aGUg
d29ya2xpc3QgdXNlZCBieSB0aGUgdGFzaworICogYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWNrZXQg
YW5kIG1ha2UgdGhlIHRhc2sgcnVubmFibGUgaWYgaXQgaXMgY3VycmVudGx5CisgKiBzdXNwZW5k
ZWQuCisgKiBAcGFyYW0ge1BhY2tldH0gcGFja2V0IHRoZSBwYWNrZXQgdG8gYWRkCisgKi8KK1Nj
aGVkdWxlci5wcm90b3R5cGUucXVldWUgPSBmdW5jdGlvbiAocGFja2V0KSB7CisgIHZhciB0ID0g
dGhpcy5ibG9ja3NbcGFja2V0LmlkXTsKKyAgaWYgKHQgPT0gbnVsbCkgcmV0dXJuIHQ7CisgIHRo
aXMucXVldWVDb3VudCsrOworICBwYWNrZXQubGluayA9IG51bGw7CisgIHBhY2tldC5pZCA9IHRo
aXMuY3VycmVudElkOworICByZXR1cm4gdC5jaGVja1ByaW9yaXR5QWRkKHRoaXMuY3VycmVudFRj
YiwgcGFja2V0KTsKK307CisKKy8qKgorICogQSB0YXNrIGNvbnRyb2wgYmxvY2sgbWFuYWdlcyBh
IHRhc2sgYW5kIHRoZSBxdWV1ZSBvZiB3b3JrIHBhY2thZ2VzIGFzc29jaWF0ZWQKKyAqIHdpdGgg
aXQuCisgKiBAcGFyYW0ge1Rhc2tDb250cm9sQmxvY2t9IGxpbmsgdGhlIHByZWNlZGluZyBibG9j
ayBpbiB0aGUgbGlua2VkIGJsb2NrIGxpc3QKKyAqIEBwYXJhbSB7aW50fSBpZCB0aGUgaWQgb2Yg
dGhpcyBibG9jaworICogQHBhcmFtIHtpbnR9IHByaW9yaXR5IHRoZSBwcmlvcml0eSBvZiB0aGlz
IGJsb2NrCisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHF1ZXVlIG9mIHBhY2thZ2VzIHRv
IGJlIHByb2Nlc3NlZCBieSB0aGUgdGFzaworICogQHBhcmFtIHtUYXNrfSB0YXNrIHRoZSB0YXNr
CisgKiBAY29uc3RydWN0b3IKKyAqLworZnVuY3Rpb24gVGFza0NvbnRyb2xCbG9jayhsaW5rLCBp
ZCwgcHJpb3JpdHksIHF1ZXVlLCB0YXNrKSB7CisgIHRoaXMuX2xpbmsgPSBsaW5rOworICB0aGlz
Ll9pZCA9IGlkOworICB0aGlzLl9wcmlvcml0eSA9IHByaW9yaXR5OworICB0aGlzLl9xdWV1ZSA9
IHF1ZXVlOworICB0aGlzLl90YXNrID0gdGFzazsKKyAgaWYgKHF1ZXVlID09IG51bGwpIHsKKyAg
ICB0aGlzLnN0YXRlID0gU1RBVEVfU1VTUEVOREVEOworICB9IGVsc2UgeworICAgIHRoaXMuc3Rh
dGUgPSBTVEFURV9TVVNQRU5ERURfUlVOTkFCTEU7CisgIH0KK30KKworLyoqCisgKiBUaGUgdGFz
ayBpcyBydW5uaW5nIGFuZCBpcyBjdXJyZW50bHkgc2NoZWR1bGVkLgorICovCit2YXIgU1RBVEVf
UlVOTklORyA9IDA7CisKKy8qKgorICogVGhlIHRhc2sgaGFzIHBhY2tldHMgbGVmdCB0byBwcm9j
ZXNzLgorICovCit2YXIgU1RBVEVfUlVOTkFCTEUgPSAxOworCisvKioKKyAqIFRoZSB0YXNrIGlz
IG5vdCBjdXJyZW50bHkgcnVubmluZy4gIFRoZSB0YXNrIGlzIG5vdCBibG9ja2VkIGFzIHN1Y2gg
YW5kIG1heQorKiBiZSBzdGFydGVkIGJ5IHRoZSBzY2hlZHVsZXIuCisgKi8KK3ZhciBTVEFURV9T
VVNQRU5ERUQgPSAyOworCisvKioKKyAqIFRoZSB0YXNrIGlzIGJsb2NrZWQgYW5kIGNhbm5vdCBi
ZSBydW4gdW50aWwgaXQgaXMgZXhwbGljaXRseSByZWxlYXNlZC4KKyAqLwordmFyIFNUQVRFX0hF
TEQgPSA0OworCit2YXIgU1RBVEVfU1VTUEVOREVEX1JVTk5BQkxFID0gU1RBVEVfU1VTUEVOREVE
IHwgU1RBVEVfUlVOTkFCTEU7Cit2YXIgU1RBVEVfTk9UX0hFTEQgPSB+U1RBVEVfSEVMRDsKKwor
VGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygibGluayIsIGZ1bmN0
aW9uKCkgeyByZXR1cm4gdGhpcy5fbGluazsgfSk7CitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlw
ZS5fX2RlZmluZUdldHRlcl9fKCJpZCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5faWQ7IH0p
OworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygicHJpb3JpdHki
LCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3ByaW9yaXR5OyB9KTsKK1Rhc2tDb250cm9sQmxv
Y2sucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oInF1ZXVlIiwgZnVuY3Rpb24oKSB7IHJldHVy
biB0aGlzLl9xdWV1ZTsgfSk7CitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5fX2RlZmluZVNl
dHRlcl9fKCJxdWV1ZSIsIGZ1bmN0aW9uKHZhbHVlKSB7IHRoaXMuX3F1ZXVlID0gdmFsdWU7IH0p
OworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygidGFzayIsIGZ1
bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fdGFzazsgfSk7CitUYXNrQ29udHJvbEJsb2NrLnByb3Rv
dHlwZS5fX2RlZmluZUdldHRlcl9fKCJzdGF0ZSIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5f
c3RhdGU7IH0pOworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXygi
c3RhdGUiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl9zdGF0ZSA9IHZhbHVlOyB9KTsKKworVGFz
a0NvbnRyb2xCbG9jay5wcm90b3R5cGUuc2V0UnVubmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgdGhp
cy5zdGF0ZSA9IFNUQVRFX1JVTk5JTkc7Cit9OworCitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlw
ZS5tYXJrQXNOb3RIZWxkID0gZnVuY3Rpb24gKCkgeworICB0aGlzLnN0YXRlID0gdGhpcy5zdGF0
ZSAmIFNUQVRFX05PVF9IRUxEOworfTsKKworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUubWFy
a0FzSGVsZCA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGUgfCBTVEFU
RV9IRUxEOworfTsKKworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUuaXNIZWxkT3JTdXNwZW5k
ZWQgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiAodGhpcy5zdGF0ZSAmIFNUQVRFX0hFTEQpICE9
IDAgfHwgKHRoaXMuc3RhdGUgPT0gU1RBVEVfU1VTUEVOREVEKTsKK307CisKK1Rhc2tDb250cm9s
QmxvY2sucHJvdG90eXBlLm1hcmtBc1N1c3BlbmRlZCA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5z
dGF0ZSA9IHRoaXMuc3RhdGUgfCBTVEFURV9TVVNQRU5ERUQ7Cit9OworCitUYXNrQ29udHJvbEJs
b2NrLnByb3RvdHlwZS5tYXJrQXNSdW5uYWJsZSA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5zdGF0
ZSA9IHRoaXMuc3RhdGUgfCBTVEFURV9SVU5OQUJMRTsKK307CisKKy8qKgorICogUnVucyB0aGlz
IHRhc2ssIGlmIGl0IGlzIHJlYWR5IHRvIGJlIHJ1biwgYW5kIHJldHVybnMgdGhlIG5leHQgdGFz
ayB0byBydW4uCisgKi8KK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9u
ICgpIHsKKyAgdmFyIHBhY2tldDsKKyAgaWYgKHRoaXMuc3RhdGUgPT0gU1RBVEVfU1VTUEVOREVE
X1JVTk5BQkxFKSB7CisgICAgcGFja2V0ID0gdGhpcy5xdWV1ZTsKKyAgICB0aGlzLnF1ZXVlID0g
cGFja2V0Lmxpbms7CisgICAgaWYgKHRoaXMucXVldWUgPT0gbnVsbCkgeworICAgICAgdGhpcy5z
dGF0ZSA9IFNUQVRFX1JVTk5JTkc7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuc3RhdGUgPSBT
VEFURV9SVU5OQUJMRTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcGFja2V0ID0gbnVsbDsKKyAg
fQorICByZXR1cm4gdGhpcy50YXNrLnJ1bihwYWNrZXQpOworfTsKKworLyoqCisgKiBBZGRzIGEg
cGFja2V0IHRvIHRoZSB3b3JrbGlzdCBvZiB0aGlzIGJsb2NrJ3MgdGFzaywgbWFya3MgdGhpcyBh
cyBydW5uYWJsZSBpZgorICogbmVjZXNzYXJ5LCBhbmQgcmV0dXJucyB0aGUgbmV4dCBydW5uYWJs
ZSBvYmplY3QgdG8gcnVuICh0aGUgb25lCisgKiB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5KS4K
KyAqLworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUuY2hlY2tQcmlvcml0eUFkZCA9IGZ1bmN0
aW9uICh0YXNrLCBwYWNrZXQpIHsKKyAgaWYgKHRoaXMucXVldWUgPT0gbnVsbCkgeworICAgIHRo
aXMucXVldWUgPSBwYWNrZXQ7CisgICAgdGhpcy5tYXJrQXNSdW5uYWJsZSgpOworICAgIGlmICh0
aGlzLnByaW9yaXR5ID4gdGFzay5wcmlvcml0eSkgcmV0dXJuIHRoaXM7CisgIH0gZWxzZSB7Cisg
ICAgdGhpcy5xdWV1ZSA9IHBhY2tldC5hZGRUbyh0aGlzLnF1ZXVlKTsKKyAgfQorICByZXR1cm4g
dGFzazsKK307CisKK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rp
b24gKCkgeworICByZXR1cm4gInRjYiB7ICIgKyB0aGlzLnRhc2sgKyAiQCIgKyB0aGlzLnN0YXRl
ICsgIiB9IjsKK307CisKKy8qKgorICogQW4gaWRsZSB0YXNrIGRvZXNuJ3QgZG8gYW55IHdvcmsg
aXRzZWxmIGJ1dCBjeWNsZXMgY29udHJvbCBiZXR3ZWVuIHRoZSB0d28KKyAqIGRldmljZSB0YXNr
cy4KKyAqIEBwYXJhbSB7U2NoZWR1bGVyfSBzY2hlZHVsZXIgdGhlIHNjaGVkdWxlciB0aGF0IG1h
bmFnZXMgdGhpcyB0YXNrCisgKiBAcGFyYW0ge2ludH0gdjEgYSBzZWVkIHZhbHVlIHRoYXQgY29u
dHJvbHMgaG93IHRoZSBkZXZpY2UgdGFza3MgYXJlIHNjaGVkdWxlZAorICogQHBhcmFtIHtpbnR9
IGNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyB0YXNrIHNob3VsZCBiZSBzY2hlZHVsZWQK
KyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBJZGxlVGFzayhzY2hlZHVsZXIsIHYxLCBj
b3VudCkgeworICB0aGlzLl9zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CisgIHRoaXMuX3YxID0gdjE7
CisgIHRoaXMuX2NvdW50ID0gY291bnQ7Cit9CisKK0lkbGVUYXNrLnByb3RvdHlwZS5fX2RlZmlu
ZUdldHRlcl9fKCJzY2hlZHVsZXIiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3NjaGVkdWxl
cjsgfSk7CitJZGxlVGFzay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygidjEiLCBmdW5jdGlv
bigpIHsgcmV0dXJuIHRoaXMuX3YxOyB9KTsKK0lkbGVUYXNrLnByb3RvdHlwZS5fX2RlZmluZVNl
dHRlcl9fKCJ2MSIsIGZ1bmN0aW9uKHZhbHVlKSB7IHRoaXMuX3YxID0gdmFsdWU7IH0pOworSWRs
ZVRhc2sucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oImNvdW50IiwgZnVuY3Rpb24oKSB7IHJl
dHVybiB0aGlzLl9jb3VudDsgfSk7CitJZGxlVGFzay5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJf
XygiY291bnQiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl9jb3VudCA9IHZhbHVlOyB9KTsKKwor
SWRsZVRhc2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChwYWNrZXQpIHsKKyAgdGhpcy5jb3Vu
dC0tOworICBpZiAodGhpcy5jb3VudCA9PSAwKSByZXR1cm4gdGhpcy5zY2hlZHVsZXIuaG9sZEN1
cnJlbnQoKTsKKyAgaWYgKCh0aGlzLnYxICYgMSkgPT0gMCkgeworICAgIHRoaXMudjEgPSB0aGlz
LnYxID4+IDE7CisgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnJlbGVhc2UoSURfREVWSUNFX0Ep
OworICB9IGVsc2UgeworICAgIHRoaXMudjEgPSAodGhpcy52MSA+PiAxKSBeIDB4RDAwODsKKyAg
ICByZXR1cm4gdGhpcy5zY2hlZHVsZXIucmVsZWFzZShJRF9ERVZJQ0VfQik7CisgIH0KK307CisK
K0lkbGVUYXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuICJJ
ZGxlVGFzayIKK307CisKKy8qKgorICogQSB0YXNrIHRoYXQgc3VzcGVuZHMgaXRzZWxmIGFmdGVy
IGVhY2ggdGltZSBpdCBoYXMgYmVlbiBydW4gdG8gc2ltdWxhdGUKKyAqIHdhaXRpbmcgZm9yIGRh
dGEgZnJvbSBhbiBleHRlcm5hbCBkZXZpY2UuCisgKiBAcGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1
bGVyIHRoZSBzY2hlZHVsZXIgdGhhdCBtYW5hZ2VzIHRoaXMgdGFzaworICogQGNvbnN0cnVjdG9y
CisgKi8KK2Z1bmN0aW9uIERldmljZVRhc2soc2NoZWR1bGVyKSB7CisgIHRoaXMuX3NjaGVkdWxl
ciA9IHNjaGVkdWxlcjsKKyAgdGhpcy5fdjEgPSBudWxsOworfQorCitEZXZpY2VUYXNrLnByb3Rv
dHlwZS5fX2RlZmluZUdldHRlcl9fKCJzY2hlZHVsZXIiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRo
aXMuX3NjaGVkdWxlcjsgfSk7CitEZXZpY2VUYXNrLnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9f
KCJ2MSIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fdjE7IH0pOworRGV2aWNlVGFzay5wcm90
b3R5cGUuX19kZWZpbmVTZXR0ZXJfXygidjEiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl92MSA9
IHZhbHVlOyB9KTsKKworRGV2aWNlVGFzay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKHBhY2tl
dCkgeworICBpZiAocGFja2V0ID09IG51bGwpIHsKKyAgICBpZiAodGhpcy52MSA9PSBudWxsKSBy
ZXR1cm4gdGhpcy5zY2hlZHVsZXIuc3VzcGVuZEN1cnJlbnQoKTsKKyAgICB2YXIgdiA9IHRoaXMu
djE7CisgICAgdGhpcy52MSA9IG51bGw7CisgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnF1ZXVl
KHYpOworICB9IGVsc2UgeworICAgIHRoaXMudjEgPSBwYWNrZXQ7CisgICAgcmV0dXJuIHRoaXMu
c2NoZWR1bGVyLmhvbGRDdXJyZW50KCk7CisgIH0KK307CisKK0RldmljZVRhc2sucHJvdG90eXBl
LnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gIkRldmljZVRhc2siOworfTsKKwor
LyoqCisgKiBBIHRhc2sgdGhhdCBtYW5pcHVsYXRlcyB3b3JrIHBhY2tldHMuCisgKiBAcGFyYW0g
e1NjaGVkdWxlcn0gc2NoZWR1bGVyIHRoZSBzY2hlZHVsZXIgdGhhdCBtYW5hZ2VzIHRoaXMgdGFz
aworICogQHBhcmFtIHtpbnR9IHYxIGEgc2VlZCB1c2VkIHRvIHNwZWNpZnkgaG93IHdvcmsgcGFj
a2V0cyBhcmUgbWFuaXB1bGF0ZWQKKyAqIEBwYXJhbSB7aW50fSB2MiBhbm90aGVyIHNlZWQgdXNl
ZCB0byBzcGVjaWZ5IGhvdyB3b3JrIHBhY2tldHMgYXJlIG1hbmlwdWxhdGVkCisgKiBAY29uc3Ry
dWN0b3IKKyAqLworZnVuY3Rpb24gV29ya2VyVGFzayhzY2hlZHVsZXIsIHYxLCB2MikgeworICB0
aGlzLl9zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CisgIHRoaXMuX3YxID0gdjE7CisgIHRoaXMuX3Yy
ID0gdjI7Cit9CisKK1dvcmtlclRhc2sucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oInNjaGVk
dWxlciIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5fc2NoZWR1bGVyOyB9KTsKK1dvcmtlclRh
c2sucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oInYxIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0
aGlzLl92MTsgfSk7CitXb3JrZXJUYXNrLnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKCJ2MSIs
IGZ1bmN0aW9uKHZhbHVlKSB7IHRoaXMuX3YxID0gdmFsdWU7IH0pOworV29ya2VyVGFzay5wcm90
b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygidjIiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX3Yy
OyB9KTsKK1dvcmtlclRhc2sucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oInYyIiwgZnVuY3Rp
b24odmFsdWUpIHsgdGhpcy5fdjIgPSB2YWx1ZTsgfSk7CisKK1dvcmtlclRhc2sucHJvdG90eXBl
LnJ1biA9IGZ1bmN0aW9uIChwYWNrZXQpIHsKKyAgaWYgKHBhY2tldCA9PSBudWxsKSB7CisgICAg
cmV0dXJuIHRoaXMuc2NoZWR1bGVyLnN1c3BlbmRDdXJyZW50KCk7CisgIH0gZWxzZSB7CisgICAg
aWYgKHRoaXMudjEgPT0gSURfSEFORExFUl9BKSB7CisgICAgICB0aGlzLnYxID0gSURfSEFORExF
Ul9COworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnYxID0gSURfSEFORExFUl9BOworICAgIH0K
KyAgICBwYWNrZXQuaWQgPSB0aGlzLnYxOworICAgIHBhY2tldC5hMSA9IDA7CisgICAgZm9yICh2
YXIgaSA9IDA7IGkgPCBEQVRBX1NJWkU7IGkrKykgeworICAgICAgdGhpcy52MisrOworICAgICAg
aWYgKHRoaXMudjIgPiAyNikgdGhpcy52MiA9IDE7CisgICAgICBwYWNrZXQuYTJbaV0gPSB0aGlz
LnYyOworICAgIH0KKyAgICByZXR1cm4gdGhpcy5zY2hlZHVsZXIucXVldWUocGFja2V0KTsKKyAg
fQorfTsKKworV29ya2VyVGFzay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7Cisg
IHJldHVybiAiV29ya2VyVGFzayI7Cit9OworCisvKioKKyAqIEEgdGFzayB0aGF0IG1hbmlwdWxh
dGVzIHdvcmsgcGFja2V0cyBhbmQgdGhlbiBzdXNwZW5kcyBpdHNlbGYuCisgKiBAcGFyYW0ge1Nj
aGVkdWxlcn0gc2NoZWR1bGVyIHRoZSBzY2hlZHVsZXIgdGhhdCBtYW5hZ2VzIHRoaXMgdGFzawor
ICogQGNvbnN0cnVjdG9yCisgKi8KK2Z1bmN0aW9uIEhhbmRsZXJUYXNrKHNjaGVkdWxlcikgewor
ICB0aGlzLl9zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CisgIHRoaXMuX3YxID0gbnVsbDsKKyAgdGhp
cy5fdjIgPSBudWxsOworfQorCitIYW5kbGVyVGFzay5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJf
Xygic2NoZWR1bGVyIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zY2hlZHVsZXI7IH0pOwor
SGFuZGxlclRhc2sucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18oInYxIiwgZnVuY3Rpb24oKSB7
IHJldHVybiB0aGlzLl92MTsgfSk7CitIYW5kbGVyVGFzay5wcm90b3R5cGUuX19kZWZpbmVTZXR0
ZXJfXygidjEiLCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl92MSA9IHZhbHVlOyB9KTsKK0hhbmRs
ZXJUYXNrLnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fKCJ2MiIsIGZ1bmN0aW9uKCkgeyByZXR1
cm4gdGhpcy5fdjI7IH0pOworSGFuZGxlclRhc2sucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18o
InYyIiwgZnVuY3Rpb24odmFsdWUpIHsgdGhpcy5fdjIgPSB2YWx1ZTsgfSk7CisKK0hhbmRsZXJU
YXNrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAocGFja2V0KSB7CisgIGlmIChwYWNrZXQgIT0g
bnVsbCkgeworICAgIGlmIChwYWNrZXQua2luZCA9PSBLSU5EX1dPUkspIHsKKyAgICAgIHRoaXMu
djEgPSBwYWNrZXQuYWRkVG8odGhpcy52MSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRoaXMudjIg
PSBwYWNrZXQuYWRkVG8odGhpcy52Mik7CisgICAgfQorICB9CisgIGlmICh0aGlzLnYxICE9IG51
bGwpIHsKKyAgICB2YXIgY291bnQgPSB0aGlzLnYxLmExOworICAgIHZhciB2OworICAgIGlmIChj
b3VudCA8IERBVEFfU0laRSkgeworICAgICAgaWYgKHRoaXMudjIgIT0gbnVsbCkgeworICAgICAg
ICB2ID0gdGhpcy52MjsKKyAgICAgICAgdGhpcy52MiA9IHRoaXMudjIubGluazsKKyAgICAgICAg
di5hMSA9IHRoaXMudjEuYTJbY291bnRdOworICAgICAgICB0aGlzLnYxLmExID0gY291bnQgKyAx
OworICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZXIucXVldWUodik7CisgICAgICB9CisgICAg
fSBlbHNlIHsKKyAgICAgIHYgPSB0aGlzLnYxOworICAgICAgdGhpcy52MSA9IHRoaXMudjEubGlu
azsKKyAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlci5xdWV1ZSh2KTsKKyAgICB9CisgIH0KKyAg
cmV0dXJuIHRoaXMuc2NoZWR1bGVyLnN1c3BlbmRDdXJyZW50KCk7Cit9OworCitIYW5kbGVyVGFz
ay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiAiSGFuZGxlclRh
c2siOworfTsKKworLyogLS0tICoKKyAqIFAgYSBjIGsgZSB0CisgKiAtLS0gKi8KKwordmFyIERB
VEFfU0laRSA9IDQ7CisKKy8qKgorICogQSBzaW1wbGUgcGFja2FnZSBvZiBkYXRhIHRoYXQgaXMg
bWFuaXB1bGF0ZWQgYnkgdGhlIHRhc2tzLiAgVGhlIGV4YWN0IGxheW91dAorICogb2YgdGhlIHBh
eWxvYWQgZGF0YSBjYXJyaWVkIGJ5IGEgcGFja2V0IGlzIG5vdCBpbXBvcnRhaW50LCBhbmQgbmVp
dGhlciBpcyB0aGUKKyAqIG5hdHVyZSBvZiB0aGUgd29yayBwZXJmb3JtZWQgb24gcGFja2V0cyBi
eSB0aGUgdGFza3MuCisgKgorICogQmVzaWRlcyBjYXJyeWluZyBkYXRhLCBwYWNrZXRzIGZvcm0g
bGlua2VkIGxpc3RzIGFuZCBhcmUgaGVuY2UgdXNlZCBib3RoIGFzCisgKiBkYXRhIGFuZCB3b3Jr
bGlzdHMuCisgKiBAcGFyYW0ge1BhY2tldH0gbGluayB0aGUgdGFpbCBvZiB0aGUgbGlua2VkIGxp
c3Qgb2YgcGFja2V0cworICogQHBhcmFtIHtpbnR9IGlkIGFuIElEIGZvciB0aGlzIHBhY2tldAor
ICogQHBhcmFtIHtpbnR9IGtpbmQgdGhlIHR5cGUgb2YgdGhpcyBwYWNrZXQKKyAqIEBjb25zdHJ1
Y3RvcgorICovCitmdW5jdGlvbiBQYWNrZXQobGluaywgaWQsIGtpbmQpIHsKKyAgdGhpcy5fbGlu
ayA9IGxpbms7CisgIHRoaXMuX2lkID0gaWQ7CisgIHRoaXMuX2tpbmQgPSBraW5kOworICB0aGlz
Ll9hMSA9IDA7CisgIHRoaXMuX2EyID0gbmV3IEFycmF5KERBVEFfU0laRSk7Cit9CisKK1BhY2tl
dC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygibGluayIsIGZ1bmN0aW9uKCkgeyByZXR1cm4g
dGhpcy5fbGluazsgfSk7CitQYWNrZXQucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oImxpbmsi
LCBmdW5jdGlvbih2YWx1ZSkgeyB0aGlzLl9saW5rID0gdmFsdWU7IH0pOworUGFja2V0LnByb3Rv
dHlwZS5fX2RlZmluZUdldHRlcl9fKCJpZCIsIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5faWQ7
IH0pOworUGFja2V0LnByb3RvdHlwZS5fX2RlZmluZVNldHRlcl9fKCJpZCIsIGZ1bmN0aW9uKHZh
bHVlKSB7IHRoaXMuX2lkID0gdmFsdWU7IH0pOworUGFja2V0LnByb3RvdHlwZS5fX2RlZmluZUdl
dHRlcl9fKCJraW5kIiwgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLl9raW5kOyB9KTsKK1BhY2tl
dC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXygiYTEiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRo
aXMuX2ExOyB9KTsKK1BhY2tldC5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXygiYTEiLCBmdW5j
dGlvbih2YWx1ZSkgeyB0aGlzLl9hMSA9IHZhbHVlOyB9KTsKK1BhY2tldC5wcm90b3R5cGUuX19k
ZWZpbmVHZXR0ZXJfXygiYTIiLCBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuX2EyOyB9KTsKKwor
LyoqCisgKiBBZGQgdGhpcyBwYWNrZXQgdG8gdGhlIGVuZCBvZiBhIHdvcmtsaXN0LCBhbmQgcmV0
dXJuIHRoZSB3b3JrbGlzdC4KKyAqIEBwYXJhbSB7UGFja2V0fSBxdWV1ZSB0aGUgd29ya2xpc3Qg
dG8gYWRkIHRoaXMgcGFja2V0IHRvCisgKi8KK1BhY2tldC5wcm90b3R5cGUuYWRkVG8gPSBmdW5j
dGlvbiAocXVldWUpIHsKKyAgdGhpcy5saW5rID0gbnVsbDsKKyAgaWYgKHF1ZXVlID09IG51bGwp
IHJldHVybiB0aGlzOworICB2YXIgcGVlaywgbmV4dCA9IHF1ZXVlOworICB3aGlsZSAoKHBlZWsg
PSBuZXh0LmxpbmspICE9IG51bGwpCisgICAgbmV4dCA9IHBlZWs7CisgIG5leHQubGluayA9IHRo
aXM7CisgIHJldHVybiBxdWV1ZTsKK307CisKK1BhY2tldC5wcm90b3R5cGUudG9TdHJpbmcgPSBm
dW5jdGlvbiAoKSB7CisgIHJldHVybiAiUGFja2V0IjsKK307CisKK2ZvciAodmFyIGkgPSAwOyBp
IDwgMzUwOyArK2kpCisgIHJ1blJpY2hhcmRzKCk7CkluZGV4OiBUb29scy9DaGFuZ2VMb2cKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAyMDIzNTUpCisrKyBUb29scy9D
aGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNSBAQAorMjAxNi0wNi0yMiAgU2Fh
bSBiYXJhdGkgIDxzYmFyYXRpQGFwcGxlLmNvbT4KKworICAgICAgICBUeXBlUHJvZmlsZXIgYW5k
IFR5cGVQcm9maWxlckxvZyBkb24ndCBwbGF5IG5pY2VseSB3aXRoIHRoZSBjb25jdXJyZW50IEpJ
VAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTU5MDM3
CisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS8yNjkzNTM0OT4KKworICAgICAgICBSZXZpZXdlZCBi
eSBCZW5qYW1pbiBQb3VsYWluLgorCisgICAgICAgIFJ1biB0eXBlUHJvZmlsZXIueWFtbCB0ZXN0
cyB1bmRlciBhbiBhZGRpdGlvbmFsIENKSVQgZW5hYmxlZCBtb2RlLgorCisgICAgICAgICogU2Ny
aXB0cy9ydW4tanNjLXN0cmVzcy10ZXN0czoKKwogMjAxNi0wNi0yMiAgSm9uIExlZSAgPGpvbmxl
ZUBhcHBsZS5jb20+CiAKICAgICAgICAgVXBkYXRlIGFuaW1vbWV0ZXIucGxhbgpJbmRleDogVG9v
bHMvU2NyaXB0cy9ydW4tanNjLXN0cmVzcy10ZXN0cwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9TY3Jp
cHRzL3J1bi1qc2Mtc3RyZXNzLXRlc3RzCShyZXZpc2lvbiAyMDIzNDgpCisrKyBUb29scy9TY3Jp
cHRzL3J1bi1qc2Mtc3RyZXNzLXRlc3RzCSh3b3JraW5nIGNvcHkpCkBAIC0xMDI1LDggKzEwMjUs
MTAgQEAgZGVmIHJ1blR5cGVQcm9maWxlcgogCiAgICAgaWYgJGVuYWJsZUZUTAogICAgICAgICBy
dW4oImZ0bC1uby1jaml0LXR5cGUtcHJvZmlsZXIiLCAiLS11c2VUeXBlUHJvZmlsZXI9dHJ1ZSIs
ICooRlRMX09QVElPTlMgKyBOT19DSklUX09QVElPTlMpKQorICAgICAgICBydW4oImZ0bC10eXBl
LXByb2ZpbGVyIiwgIi0tdXNlVHlwZVByb2ZpbGVyPXRydWUiLCAqKEZUTF9PUFRJT05TKSkKICAg
ICBlbHNlCiAgICAgICAgIHJ1bigibm8tY2ppdC10eXBlLXByb2ZpbGVyIiwgIi0tdXNlVHlwZVBy
b2ZpbGVyPXRydWUiLCAqTk9fQ0pJVF9PUFRJT05TKQorICAgICAgICBydW4oInR5cGUtcHJvZmls
ZXIiLCAiLS11c2VUeXBlUHJvZmlsZXI9dHJ1ZSIpCiAgICAgZW5kCiBlbmQKIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>